1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef S390_CHSC_H
3*4882a593Smuzhiyun #define S390_CHSC_H
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun #include <linux/types.h>
6*4882a593Smuzhiyun #include <linux/device.h>
7*4882a593Smuzhiyun #include <asm/css_chars.h>
8*4882a593Smuzhiyun #include <asm/chpid.h>
9*4882a593Smuzhiyun #include <asm/chsc.h>
10*4882a593Smuzhiyun #include <asm/schid.h>
11*4882a593Smuzhiyun #include <asm/qdio.h>
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #define CHSC_SDA_OC_MSS 0x2
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #define NR_MEASUREMENT_CHARS 5
16*4882a593Smuzhiyun struct cmg_chars {
17*4882a593Smuzhiyun u32 values[NR_MEASUREMENT_CHARS];
18*4882a593Smuzhiyun };
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun #define NR_MEASUREMENT_ENTRIES 8
21*4882a593Smuzhiyun struct cmg_entry {
22*4882a593Smuzhiyun u32 values[NR_MEASUREMENT_ENTRIES];
23*4882a593Smuzhiyun };
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun struct channel_path_desc_fmt1 {
26*4882a593Smuzhiyun u8 flags;
27*4882a593Smuzhiyun u8 lsn;
28*4882a593Smuzhiyun u8 desc;
29*4882a593Smuzhiyun u8 chpid;
30*4882a593Smuzhiyun u32:24;
31*4882a593Smuzhiyun u8 chpp;
32*4882a593Smuzhiyun u32 unused[2];
33*4882a593Smuzhiyun u16 chid;
34*4882a593Smuzhiyun u32:16;
35*4882a593Smuzhiyun u16 mdc;
36*4882a593Smuzhiyun u16:13;
37*4882a593Smuzhiyun u8 r:1;
38*4882a593Smuzhiyun u8 s:1;
39*4882a593Smuzhiyun u8 f:1;
40*4882a593Smuzhiyun u32 zeros[2];
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun struct channel_path_desc_fmt3 {
44*4882a593Smuzhiyun struct channel_path_desc_fmt1 fmt1_desc;
45*4882a593Smuzhiyun u8 util_str[64];
46*4882a593Smuzhiyun };
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun struct channel_path;
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun struct css_chsc_char {
51*4882a593Smuzhiyun u64 res;
52*4882a593Smuzhiyun u64 : 20;
53*4882a593Smuzhiyun u32 secm : 1; /* bit 84 */
54*4882a593Smuzhiyun u32 : 1;
55*4882a593Smuzhiyun u32 scmc : 1; /* bit 86 */
56*4882a593Smuzhiyun u32 : 20;
57*4882a593Smuzhiyun u32 scssc : 1; /* bit 107 */
58*4882a593Smuzhiyun u32 scsscf : 1; /* bit 108 */
59*4882a593Smuzhiyun u32:7;
60*4882a593Smuzhiyun u32 pnso:1; /* bit 116 */
61*4882a593Smuzhiyun u32:11;
62*4882a593Smuzhiyun } __packed;
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun extern struct css_chsc_char css_chsc_characteristics;
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun struct chsc_ssd_info {
67*4882a593Smuzhiyun u8 path_mask;
68*4882a593Smuzhiyun u8 fla_valid_mask;
69*4882a593Smuzhiyun struct chp_id chpid[8];
70*4882a593Smuzhiyun u16 fla[8];
71*4882a593Smuzhiyun };
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun struct chsc_ssqd_area {
74*4882a593Smuzhiyun struct chsc_header request;
75*4882a593Smuzhiyun u16:10;
76*4882a593Smuzhiyun u8 ssid:2;
77*4882a593Smuzhiyun u8 fmt:4;
78*4882a593Smuzhiyun u16 first_sch;
79*4882a593Smuzhiyun u16:16;
80*4882a593Smuzhiyun u16 last_sch;
81*4882a593Smuzhiyun u32:32;
82*4882a593Smuzhiyun struct chsc_header response;
83*4882a593Smuzhiyun u32:32;
84*4882a593Smuzhiyun struct qdio_ssqd_desc qdio_ssqd;
85*4882a593Smuzhiyun } __packed __aligned(PAGE_SIZE);
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun struct chsc_scssc_area {
88*4882a593Smuzhiyun struct chsc_header request;
89*4882a593Smuzhiyun u16 operation_code;
90*4882a593Smuzhiyun u16:16;
91*4882a593Smuzhiyun u32:32;
92*4882a593Smuzhiyun u32:32;
93*4882a593Smuzhiyun u64 summary_indicator_addr;
94*4882a593Smuzhiyun u64 subchannel_indicator_addr;
95*4882a593Smuzhiyun u32 ks:4;
96*4882a593Smuzhiyun u32 kc:4;
97*4882a593Smuzhiyun u32:21;
98*4882a593Smuzhiyun u32 isc:3;
99*4882a593Smuzhiyun u32 word_with_d_bit;
100*4882a593Smuzhiyun u32:32;
101*4882a593Smuzhiyun struct subchannel_id schid;
102*4882a593Smuzhiyun u32 reserved[1004];
103*4882a593Smuzhiyun struct chsc_header response;
104*4882a593Smuzhiyun u32:32;
105*4882a593Smuzhiyun } __packed __aligned(PAGE_SIZE);
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun struct chsc_scpd {
108*4882a593Smuzhiyun struct chsc_header request;
109*4882a593Smuzhiyun u32:2;
110*4882a593Smuzhiyun u32 m:1;
111*4882a593Smuzhiyun u32 c:1;
112*4882a593Smuzhiyun u32 fmt:4;
113*4882a593Smuzhiyun u32 cssid:8;
114*4882a593Smuzhiyun u32:4;
115*4882a593Smuzhiyun u32 rfmt:4;
116*4882a593Smuzhiyun u32 first_chpid:8;
117*4882a593Smuzhiyun u32:24;
118*4882a593Smuzhiyun u32 last_chpid:8;
119*4882a593Smuzhiyun u32 zeroes1;
120*4882a593Smuzhiyun struct chsc_header response;
121*4882a593Smuzhiyun u32:32;
122*4882a593Smuzhiyun u8 data[0];
123*4882a593Smuzhiyun } __packed __aligned(PAGE_SIZE);
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun struct chsc_sda_area {
126*4882a593Smuzhiyun struct chsc_header request;
127*4882a593Smuzhiyun u8 :4;
128*4882a593Smuzhiyun u8 format:4;
129*4882a593Smuzhiyun u8 :8;
130*4882a593Smuzhiyun u16 operation_code;
131*4882a593Smuzhiyun u32 :32;
132*4882a593Smuzhiyun u32 :32;
133*4882a593Smuzhiyun u32 operation_data_area[252];
134*4882a593Smuzhiyun struct chsc_header response;
135*4882a593Smuzhiyun u32 :4;
136*4882a593Smuzhiyun u32 format2:4;
137*4882a593Smuzhiyun u32 :24;
138*4882a593Smuzhiyun } __packed __aligned(PAGE_SIZE);
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun extern int chsc_get_ssd_info(struct subchannel_id schid,
141*4882a593Smuzhiyun struct chsc_ssd_info *ssd);
142*4882a593Smuzhiyun extern int chsc_determine_css_characteristics(void);
143*4882a593Smuzhiyun extern int chsc_init(void);
144*4882a593Smuzhiyun extern void chsc_init_cleanup(void);
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun int __chsc_enable_facility(struct chsc_sda_area *sda_area, int operation_code);
147*4882a593Smuzhiyun extern int chsc_enable_facility(int);
148*4882a593Smuzhiyun struct channel_subsystem;
149*4882a593Smuzhiyun extern int chsc_secm(struct channel_subsystem *, int);
150*4882a593Smuzhiyun int __chsc_do_secm(struct channel_subsystem *css, int enable);
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun int chsc_chp_vary(struct chp_id chpid, int on);
153*4882a593Smuzhiyun int chsc_determine_channel_path_desc(struct chp_id chpid, int fmt, int rfmt,
154*4882a593Smuzhiyun int c, int m, void *page);
155*4882a593Smuzhiyun int chsc_determine_fmt0_channel_path_desc(struct chp_id chpid,
156*4882a593Smuzhiyun struct channel_path_desc_fmt0 *desc);
157*4882a593Smuzhiyun int chsc_determine_fmt1_channel_path_desc(struct chp_id chpid,
158*4882a593Smuzhiyun struct channel_path_desc_fmt1 *desc);
159*4882a593Smuzhiyun int chsc_determine_fmt3_channel_path_desc(struct chp_id chpid,
160*4882a593Smuzhiyun struct channel_path_desc_fmt3 *desc);
161*4882a593Smuzhiyun void chsc_chp_online(struct chp_id chpid);
162*4882a593Smuzhiyun void chsc_chp_offline(struct chp_id chpid);
163*4882a593Smuzhiyun int chsc_get_channel_measurement_chars(struct channel_path *chp);
164*4882a593Smuzhiyun int chsc_ssqd(struct subchannel_id schid, struct chsc_ssqd_area *ssqd);
165*4882a593Smuzhiyun int chsc_sadc(struct subchannel_id schid, struct chsc_scssc_area *scssc,
166*4882a593Smuzhiyun u64 summary_indicator_addr, u64 subchannel_indicator_addr,
167*4882a593Smuzhiyun u8 isc);
168*4882a593Smuzhiyun int chsc_sgib(u32 origin);
169*4882a593Smuzhiyun int chsc_error_from_response(int response);
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun int chsc_siosl(struct subchannel_id schid);
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun /* Functions and definitions to query storage-class memory. */
174*4882a593Smuzhiyun struct sale {
175*4882a593Smuzhiyun u64 sa;
176*4882a593Smuzhiyun u32 p:4;
177*4882a593Smuzhiyun u32 op_state:4;
178*4882a593Smuzhiyun u32 data_state:4;
179*4882a593Smuzhiyun u32 rank:4;
180*4882a593Smuzhiyun u32 r:1;
181*4882a593Smuzhiyun u32:7;
182*4882a593Smuzhiyun u32 rid:8;
183*4882a593Smuzhiyun u32:32;
184*4882a593Smuzhiyun } __packed;
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun struct chsc_scm_info {
187*4882a593Smuzhiyun struct chsc_header request;
188*4882a593Smuzhiyun u32:32;
189*4882a593Smuzhiyun u64 reqtok;
190*4882a593Smuzhiyun u32 reserved1[4];
191*4882a593Smuzhiyun struct chsc_header response;
192*4882a593Smuzhiyun u64:56;
193*4882a593Smuzhiyun u8 rq;
194*4882a593Smuzhiyun u32 mbc;
195*4882a593Smuzhiyun u64 msa;
196*4882a593Smuzhiyun u16 is;
197*4882a593Smuzhiyun u16 mmc;
198*4882a593Smuzhiyun u32 mci;
199*4882a593Smuzhiyun u64 nr_scm_ini;
200*4882a593Smuzhiyun u64 nr_scm_unini;
201*4882a593Smuzhiyun u32 reserved2[10];
202*4882a593Smuzhiyun u64 restok;
203*4882a593Smuzhiyun struct sale scmal[248];
204*4882a593Smuzhiyun } __packed __aligned(PAGE_SIZE);
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun int chsc_scm_info(struct chsc_scm_info *scm_area, u64 token);
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun int chsc_pnso(struct subchannel_id schid, struct chsc_pnso_area *pnso_area,
209*4882a593Smuzhiyun u8 oc, struct chsc_pnso_resume_token resume_token, int cnc);
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun int __init chsc_get_cssid_iid(int idx, u8 *cssid, u8 *iid);
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun #ifdef CONFIG_SCM_BUS
214*4882a593Smuzhiyun int scm_update_information(void);
215*4882a593Smuzhiyun int scm_process_availability_information(void);
216*4882a593Smuzhiyun #else /* CONFIG_SCM_BUS */
scm_update_information(void)217*4882a593Smuzhiyun static inline int scm_update_information(void) { return 0; }
scm_process_availability_information(void)218*4882a593Smuzhiyun static inline int scm_process_availability_information(void) { return 0; }
219*4882a593Smuzhiyun #endif /* CONFIG_SCM_BUS */
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun #endif
223