Commit | Line | Data |
---|---|---|
1da177e4 | 1 | /* |
1da177e4 LT |
2 | * Common interface for I/O on S/390 |
3 | */ | |
4 | #ifndef _ASM_S390_CIO_H_ | |
5 | #define _ASM_S390_CIO_H_ | |
6 | ||
7 | #include <linux/spinlock.h> | |
8 | #include <asm/types.h> | |
9 | ||
1da177e4 | 10 | #define LPM_ANYPATH 0xff |
e5854a58 | 11 | #define __MAX_CSSID 0 |
619506d5 CH |
12 | #define __MAX_SUBCHANNEL 65535 |
13 | #define __MAX_SSID 3 | |
1da177e4 | 14 | |
62733e5a | 15 | #include <asm/scsw.h> |
1da177e4 | 16 | |
b2ffd8e9 CH |
17 | /** |
18 | * struct ccw1 - channel command word | |
19 | * @cmd_code: command code | |
3ad2f3fb | 20 | * @flags: flags, like IDA addressing, etc. |
b2ffd8e9 CH |
21 | * @count: byte count |
22 | * @cda: data address | |
23 | * | |
24 | * The ccw is the basic structure to build channel programs that perform | |
25 | * operations with the device or the control unit. Only Format-1 channel | |
26 | * command words are supported. | |
27 | */ | |
1da177e4 | 28 | struct ccw1 { |
b2ffd8e9 CH |
29 | __u8 cmd_code; |
30 | __u8 flags; | |
31 | __u16 count; | |
32 | __u32 cda; | |
1da177e4 LT |
33 | } __attribute__ ((packed,aligned(8))); |
34 | ||
35 | #define CCW_FLAG_DC 0x80 | |
36 | #define CCW_FLAG_CC 0x40 | |
37 | #define CCW_FLAG_SLI 0x20 | |
38 | #define CCW_FLAG_SKIP 0x10 | |
39 | #define CCW_FLAG_PCI 0x08 | |
40 | #define CCW_FLAG_IDA 0x04 | |
41 | #define CCW_FLAG_SUSPEND 0x02 | |
42 | ||
43 | #define CCW_CMD_READ_IPL 0x02 | |
44 | #define CCW_CMD_NOOP 0x03 | |
45 | #define CCW_CMD_BASIC_SENSE 0x04 | |
46 | #define CCW_CMD_TIC 0x08 | |
47 | #define CCW_CMD_STLCK 0x14 | |
48 | #define CCW_CMD_SENSE_PGID 0x34 | |
49 | #define CCW_CMD_SUSPEND_RECONN 0x5B | |
50 | #define CCW_CMD_RDC 0x64 | |
51 | #define CCW_CMD_RELEASE 0x94 | |
52 | #define CCW_CMD_SET_PGID 0xAF | |
53 | #define CCW_CMD_SENSE_ID 0xE4 | |
54 | #define CCW_CMD_DCTL 0xF3 | |
55 | ||
56 | #define SENSE_MAX_COUNT 0x20 | |
57 | ||
b2ffd8e9 CH |
58 | /** |
59 | * struct erw - extended report word | |
60 | * @res0: reserved | |
61 | * @auth: authorization check | |
62 | * @pvrf: path-verification-required flag | |
63 | * @cpt: channel-path timeout | |
64 | * @fsavf: failing storage address validity flag | |
65 | * @cons: concurrent sense | |
66 | * @scavf: secondary ccw address validity flag | |
67 | * @fsaf: failing storage address format | |
68 | * @scnt: sense count, if @cons == %1 | |
69 | * @res16: reserved | |
70 | */ | |
1da177e4 | 71 | struct erw { |
b2ffd8e9 CH |
72 | __u32 res0 : 3; |
73 | __u32 auth : 1; | |
74 | __u32 pvrf : 1; | |
75 | __u32 cpt : 1; | |
76 | __u32 fsavf : 1; | |
77 | __u32 cons : 1; | |
78 | __u32 scavf : 1; | |
79 | __u32 fsaf : 1; | |
80 | __u32 scnt : 6; | |
81 | __u32 res16 : 16; | |
1da177e4 LT |
82 | } __attribute__ ((packed)); |
83 | ||
d2fc439b SO |
84 | /** |
85 | * struct erw_eadm - EADM Subchannel extended report word | |
86 | * @b: aob error | |
87 | * @r: arsb error | |
88 | */ | |
89 | struct erw_eadm { | |
90 | __u32 : 16; | |
91 | __u32 b : 1; | |
92 | __u32 r : 1; | |
93 | __u32 : 14; | |
94 | } __packed; | |
95 | ||
b2ffd8e9 CH |
96 | /** |
97 | * struct sublog - subchannel logout area | |
98 | * @res0: reserved | |
99 | * @esf: extended status flags | |
100 | * @lpum: last path used mask | |
101 | * @arep: ancillary report | |
102 | * @fvf: field-validity flags | |
103 | * @sacc: storage access code | |
104 | * @termc: termination code | |
105 | * @devsc: device-status check | |
106 | * @serr: secondary error | |
107 | * @ioerr: i/o-error alert | |
108 | * @seqc: sequence code | |
1da177e4 LT |
109 | */ |
110 | struct sublog { | |
b2ffd8e9 CH |
111 | __u32 res0 : 1; |
112 | __u32 esf : 7; | |
113 | __u32 lpum : 8; | |
114 | __u32 arep : 1; | |
115 | __u32 fvf : 5; | |
116 | __u32 sacc : 2; | |
117 | __u32 termc : 2; | |
118 | __u32 devsc : 1; | |
119 | __u32 serr : 1; | |
120 | __u32 ioerr : 1; | |
121 | __u32 seqc : 3; | |
1da177e4 LT |
122 | } __attribute__ ((packed)); |
123 | ||
b2ffd8e9 CH |
124 | /** |
125 | * struct esw0 - Format 0 Extended Status Word (ESW) | |
126 | * @sublog: subchannel logout | |
127 | * @erw: extended report word | |
128 | * @faddr: failing storage address | |
129 | * @saddr: secondary ccw address | |
1da177e4 LT |
130 | */ |
131 | struct esw0 { | |
b2ffd8e9 CH |
132 | struct sublog sublog; |
133 | struct erw erw; | |
134 | __u32 faddr[2]; | |
135 | __u32 saddr; | |
1da177e4 LT |
136 | } __attribute__ ((packed)); |
137 | ||
b2ffd8e9 CH |
138 | /** |
139 | * struct esw1 - Format 1 Extended Status Word (ESW) | |
140 | * @zero0: reserved zeros | |
141 | * @lpum: last path used mask | |
142 | * @zero16: reserved zeros | |
143 | * @erw: extended report word | |
144 | * @zeros: three fullwords of zeros | |
1da177e4 LT |
145 | */ |
146 | struct esw1 { | |
b2ffd8e9 CH |
147 | __u8 zero0; |
148 | __u8 lpum; | |
149 | __u16 zero16; | |
150 | struct erw erw; | |
151 | __u32 zeros[3]; | |
1da177e4 LT |
152 | } __attribute__ ((packed)); |
153 | ||
b2ffd8e9 CH |
154 | /** |
155 | * struct esw2 - Format 2 Extended Status Word (ESW) | |
156 | * @zero0: reserved zeros | |
157 | * @lpum: last path used mask | |
158 | * @dcti: device-connect-time interval | |
159 | * @erw: extended report word | |
160 | * @zeros: three fullwords of zeros | |
1da177e4 LT |
161 | */ |
162 | struct esw2 { | |
b2ffd8e9 CH |
163 | __u8 zero0; |
164 | __u8 lpum; | |
165 | __u16 dcti; | |
166 | struct erw erw; | |
167 | __u32 zeros[3]; | |
1da177e4 LT |
168 | } __attribute__ ((packed)); |
169 | ||
b2ffd8e9 CH |
170 | /** |
171 | * struct esw3 - Format 3 Extended Status Word (ESW) | |
172 | * @zero0: reserved zeros | |
173 | * @lpum: last path used mask | |
174 | * @res: reserved | |
175 | * @erw: extended report word | |
176 | * @zeros: three fullwords of zeros | |
1da177e4 LT |
177 | */ |
178 | struct esw3 { | |
b2ffd8e9 CH |
179 | __u8 zero0; |
180 | __u8 lpum; | |
181 | __u16 res; | |
182 | struct erw erw; | |
183 | __u32 zeros[3]; | |
1da177e4 LT |
184 | } __attribute__ ((packed)); |
185 | ||
d2fc439b SO |
186 | /** |
187 | * struct esw_eadm - EADM Subchannel Extended Status Word (ESW) | |
188 | * @sublog: subchannel logout | |
189 | * @erw: extended report word | |
190 | */ | |
191 | struct esw_eadm { | |
192 | __u32 sublog; | |
193 | struct erw_eadm erw; | |
194 | __u32 : 32; | |
195 | __u32 : 32; | |
196 | __u32 : 32; | |
197 | } __packed; | |
198 | ||
b2ffd8e9 CH |
199 | /** |
200 | * struct irb - interruption response block | |
201 | * @scsw: subchannel status word | |
e227867f | 202 | * @esw: extended status word |
b2ffd8e9 CH |
203 | * @ecw: extended control word |
204 | * | |
205 | * The irb that is handed to the device driver when an interrupt occurs. For | |
206 | * solicited interrupts, the common I/O layer already performs checks whether | |
207 | * a field is valid; a field not being valid is always passed as %0. | |
25985edc | 208 | * If a unit check occurred, @ecw may contain sense data; this is retrieved |
b2ffd8e9 CH |
209 | * by the common I/O layer itself if the device doesn't support concurrent |
210 | * sense (so that the device driver never needs to perform basic sene itself). | |
211 | * For unsolicited interrupts, the irb is passed as-is (expect for sense data, | |
212 | * if applicable). | |
1da177e4 LT |
213 | */ |
214 | struct irb { | |
23d805b6 | 215 | union scsw scsw; |
b2ffd8e9 | 216 | union { |
1da177e4 LT |
217 | struct esw0 esw0; |
218 | struct esw1 esw1; | |
219 | struct esw2 esw2; | |
220 | struct esw3 esw3; | |
d2fc439b | 221 | struct esw_eadm eadm; |
1da177e4 | 222 | } esw; |
b2ffd8e9 | 223 | __u8 ecw[32]; |
1da177e4 LT |
224 | } __attribute__ ((packed,aligned(4))); |
225 | ||
b2ffd8e9 CH |
226 | /** |
227 | * struct ciw - command information word (CIW) layout | |
228 | * @et: entry type | |
229 | * @reserved: reserved bits | |
230 | * @ct: command type | |
231 | * @cmd: command code | |
232 | * @count: command count | |
1da177e4 LT |
233 | */ |
234 | struct ciw { | |
b2ffd8e9 CH |
235 | __u32 et : 2; |
236 | __u32 reserved : 2; | |
237 | __u32 ct : 4; | |
238 | __u32 cmd : 8; | |
239 | __u32 count : 16; | |
1da177e4 LT |
240 | } __attribute__ ((packed)); |
241 | ||
242 | #define CIW_TYPE_RCD 0x0 /* read configuration data */ | |
243 | #define CIW_TYPE_SII 0x1 /* set interface identifier */ | |
244 | #define CIW_TYPE_RNI 0x2 /* read node identifier */ | |
245 | ||
246 | /* | |
247 | * Flags used as input parameters for do_IO() | |
248 | */ | |
249 | #define DOIO_ALLOW_SUSPEND 0x0001 /* allow for channel prog. suspend */ | |
250 | #define DOIO_DENY_PREFETCH 0x0002 /* don't allow for CCW prefetch */ | |
251 | #define DOIO_SUPPRESS_INTER 0x0004 /* suppress intermediate inter. */ | |
252 | /* ... for suspended CCWs */ | |
253 | /* Device or subchannel gone. */ | |
254 | #define CIO_GONE 0x0001 | |
255 | /* No path to device. */ | |
256 | #define CIO_NO_PATH 0x0002 | |
257 | /* Device has appeared. */ | |
258 | #define CIO_OPER 0x0004 | |
259 | /* Sick revalidation of device. */ | |
260 | #define CIO_REVALIDATE 0x0008 | |
47593bfa SO |
261 | /* Device did not respond in time. */ |
262 | #define CIO_BOXED 0x0010 | |
1da177e4 | 263 | |
b2ffd8e9 CH |
264 | /** |
265 | * struct ccw_dev_id - unique identifier for ccw devices | |
266 | * @ssid: subchannel set id | |
267 | * @devno: device number | |
268 | * | |
269 | * This structure is not directly based on any hardware structure. The | |
270 | * hardware identifies a device by its device number and its subchannel, | |
271 | * which is in turn identified by its id. In order to get a unique identifier | |
272 | * for ccw devices across subchannel sets, @struct ccw_dev_id has been | |
273 | * introduced. | |
274 | */ | |
ff6b8ea6 MH |
275 | struct ccw_dev_id { |
276 | u8 ssid; | |
277 | u16 devno; | |
278 | }; | |
279 | ||
b2ffd8e9 CH |
280 | /** |
281 | * ccw_device_id_is_equal() - compare two ccw_dev_ids | |
282 | * @dev_id1: a ccw_dev_id | |
283 | * @dev_id2: another ccw_dev_id | |
284 | * Returns: | |
285 | * %1 if the two structures are equal field-by-field, | |
286 | * %0 if not. | |
287 | * Context: | |
288 | * any | |
289 | */ | |
78964268 CH |
290 | static inline int ccw_dev_id_is_equal(struct ccw_dev_id *dev_id1, |
291 | struct ccw_dev_id *dev_id2) | |
292 | { | |
ce26a853 CH |
293 | if ((dev_id1->ssid == dev_id2->ssid) && |
294 | (dev_id1->devno == dev_id2->devno)) | |
295 | return 1; | |
296 | return 0; | |
78964268 CH |
297 | } |
298 | ||
77e844b9 | 299 | void channel_subsystem_reinit(void); |
40154b82 PO |
300 | extern void css_schedule_reprobe(void); |
301 | ||
ff6b8ea6 MH |
302 | extern void reipl_ccw_dev(struct ccw_dev_id *id); |
303 | ||
6fc321fd HC |
304 | struct cio_iplinfo { |
305 | u16 devno; | |
306 | int is_qdio; | |
307 | }; | |
308 | ||
309 | extern int cio_get_iplinfo(struct cio_iplinfo *iplinfo); | |
310 | ||
a806170e HC |
311 | /* Function from drivers/s390/cio/chsc.c */ |
312 | int chsc_sstpc(void *page, unsigned int op, u16 ctrl); | |
313 | int chsc_sstpi(void *page, void *result, size_t size); | |
314 | ||
1da177e4 | 315 | #endif |