Merge branch 'linus' of master.kernel.org:/pub/scm/linux/kernel/git/perex/alsa
[linux-2.6] / include / asm-s390 / cio.h
1 /*
2  *  include/asm-s390/cio.h
3  *  include/asm-s390x/cio.h
4  *
5  * Common interface for I/O on S/390
6  */
7 #ifndef _ASM_S390_CIO_H_
8 #define _ASM_S390_CIO_H_
9
10 #include <linux/spinlock.h>
11 #include <asm/types.h>
12
13 #ifdef __KERNEL__
14
15 #define LPM_ANYPATH 0xff
16 #define __MAX_CSSID 0
17
18 /*
19  * subchannel status word
20  */
21 struct scsw {
22         __u32 key  : 4;         /* subchannel key */
23         __u32 sctl : 1;         /* suspend control */
24         __u32 eswf : 1;         /* ESW format */
25         __u32 cc   : 2;         /* deferred condition code */
26         __u32 fmt  : 1;         /* format */
27         __u32 pfch : 1;         /* prefetch */
28         __u32 isic : 1;         /* initial-status interruption control */
29         __u32 alcc : 1;         /* address-limit checking control */
30         __u32 ssi  : 1;         /* supress-suspended interruption */
31         __u32 zcc  : 1;         /* zero condition code */
32         __u32 ectl : 1;         /* extended control */
33         __u32 pno  : 1;         /* path not operational */
34         __u32 res  : 1;         /* reserved */
35         __u32 fctl : 3;         /* function control */
36         __u32 actl : 7;         /* activity control */
37         __u32 stctl : 5;        /* status control */
38         __u32 cpa;              /* channel program address */
39         __u32 dstat : 8;        /* device status */
40         __u32 cstat : 8;        /* subchannel status */
41         __u32 count : 16;       /* residual count */
42 } __attribute__ ((packed));
43
44 #define SCSW_FCTL_CLEAR_FUNC     0x1
45 #define SCSW_FCTL_HALT_FUNC      0x2
46 #define SCSW_FCTL_START_FUNC     0x4
47
48 #define SCSW_ACTL_SUSPENDED      0x1
49 #define SCSW_ACTL_DEVACT         0x2
50 #define SCSW_ACTL_SCHACT         0x4
51 #define SCSW_ACTL_CLEAR_PEND     0x8
52 #define SCSW_ACTL_HALT_PEND      0x10
53 #define SCSW_ACTL_START_PEND     0x20
54 #define SCSW_ACTL_RESUME_PEND    0x40
55
56 #define SCSW_STCTL_STATUS_PEND   0x1
57 #define SCSW_STCTL_SEC_STATUS    0x2
58 #define SCSW_STCTL_PRIM_STATUS   0x4
59 #define SCSW_STCTL_INTER_STATUS  0x8
60 #define SCSW_STCTL_ALERT_STATUS  0x10
61
62 #define DEV_STAT_ATTENTION       0x80
63 #define DEV_STAT_STAT_MOD        0x40
64 #define DEV_STAT_CU_END          0x20
65 #define DEV_STAT_BUSY            0x10
66 #define DEV_STAT_CHN_END         0x08
67 #define DEV_STAT_DEV_END         0x04
68 #define DEV_STAT_UNIT_CHECK      0x02
69 #define DEV_STAT_UNIT_EXCEP      0x01
70
71 #define SCHN_STAT_PCI            0x80
72 #define SCHN_STAT_INCORR_LEN     0x40
73 #define SCHN_STAT_PROG_CHECK     0x20
74 #define SCHN_STAT_PROT_CHECK     0x10
75 #define SCHN_STAT_CHN_DATA_CHK   0x08
76 #define SCHN_STAT_CHN_CTRL_CHK   0x04
77 #define SCHN_STAT_INTF_CTRL_CHK  0x02
78 #define SCHN_STAT_CHAIN_CHECK    0x01
79
80 /*
81  * architectured values for first sense byte
82  */
83 #define SNS0_CMD_REJECT         0x80
84 #define SNS_CMD_REJECT          SNS0_CMD_REJEC
85 #define SNS0_INTERVENTION_REQ   0x40
86 #define SNS0_BUS_OUT_CHECK      0x20
87 #define SNS0_EQUIPMENT_CHECK    0x10
88 #define SNS0_DATA_CHECK         0x08
89 #define SNS0_OVERRUN            0x04
90 #define SNS0_INCOMPL_DOMAIN     0x01
91
92 /*
93  * architectured values for second sense byte
94  */
95 #define SNS1_PERM_ERR           0x80
96 #define SNS1_INV_TRACK_FORMAT   0x40
97 #define SNS1_EOC                0x20
98 #define SNS1_MESSAGE_TO_OPER    0x10
99 #define SNS1_NO_REC_FOUND       0x08
100 #define SNS1_FILE_PROTECTED     0x04
101 #define SNS1_WRITE_INHIBITED    0x02
102 #define SNS1_INPRECISE_END      0x01
103
104 /*
105  * architectured values for third sense byte
106  */
107 #define SNS2_REQ_INH_WRITE      0x80
108 #define SNS2_CORRECTABLE        0x40
109 #define SNS2_FIRST_LOG_ERR      0x20
110 #define SNS2_ENV_DATA_PRESENT   0x10
111 #define SNS2_INPRECISE_END      0x04
112
113 struct ccw1 {
114         __u8  cmd_code;         /* command code */
115         __u8  flags;            /* flags, like IDA addressing, etc. */
116         __u16 count;            /* byte count */
117         __u32 cda;              /* data address */
118 } __attribute__ ((packed,aligned(8)));
119
120 #define CCW_FLAG_DC             0x80
121 #define CCW_FLAG_CC             0x40
122 #define CCW_FLAG_SLI            0x20
123 #define CCW_FLAG_SKIP           0x10
124 #define CCW_FLAG_PCI            0x08
125 #define CCW_FLAG_IDA            0x04
126 #define CCW_FLAG_SUSPEND        0x02
127
128 #define CCW_CMD_READ_IPL        0x02
129 #define CCW_CMD_NOOP            0x03
130 #define CCW_CMD_BASIC_SENSE     0x04
131 #define CCW_CMD_TIC             0x08
132 #define CCW_CMD_STLCK           0x14
133 #define CCW_CMD_SENSE_PGID      0x34
134 #define CCW_CMD_SUSPEND_RECONN  0x5B
135 #define CCW_CMD_RDC             0x64
136 #define CCW_CMD_RELEASE         0x94
137 #define CCW_CMD_SET_PGID        0xAF
138 #define CCW_CMD_SENSE_ID        0xE4
139 #define CCW_CMD_DCTL            0xF3
140
141 #define SENSE_MAX_COUNT         0x20
142
143 struct erw {
144         __u32 res0  : 3;        /* reserved */
145         __u32 auth  : 1;        /* Authorization check */
146         __u32 pvrf  : 1;        /* path-verification-required flag */
147         __u32 cpt   : 1;        /* channel-path timeout */
148         __u32 fsavf : 1;        /* Failing storage address validity flag */
149         __u32 cons  : 1;        /* concurrent-sense */
150         __u32 scavf : 1;        /* Secondary ccw address validity flag */
151         __u32 fsaf  : 1;        /* Failing storage address format */
152         __u32 scnt  : 6;        /* sense count if cons == 1 */
153         __u32 res16 : 16;       /* reserved */
154 } __attribute__ ((packed));
155
156 /*
157  * subchannel logout area
158  */
159 struct sublog {
160         __u32 res0  : 1;        /* reserved */
161         __u32 esf   : 7;        /* extended status flags */
162         __u32 lpum  : 8;        /* last path used mask */
163         __u32 arep  : 1;        /* ancillary report */
164         __u32 fvf   : 5;        /* field-validity flags */
165         __u32 sacc  : 2;        /* storage access code */
166         __u32 termc : 2;        /* termination code */
167         __u32 devsc : 1;        /* device-status check */
168         __u32 serr  : 1;        /* secondary error */
169         __u32 ioerr : 1;        /* i/o-error alert */
170         __u32 seqc  : 3;        /* sequence code */
171 } __attribute__ ((packed));
172
173 /*
174  * Format 0 Extended Status Word (ESW)
175  */
176 struct esw0 {
177         struct sublog sublog;   /* subchannel logout */
178         struct erw erw;         /* extended report word */
179         __u32  faddr[2];        /* failing storage address */
180         __u32  saddr;           /* secondary ccw address */
181 } __attribute__ ((packed));
182
183 /*
184  * Format 1 Extended Status Word (ESW)
185  */
186 struct esw1 {
187         __u8  zero0;            /* reserved zeros */
188         __u8  lpum;             /* last path used mask */
189         __u16 zero16;           /* reserved zeros */
190         struct erw erw;         /* extended report word */
191         __u32 zeros[3];         /* 2 fullwords of zeros */
192 } __attribute__ ((packed));
193
194 /*
195  * Format 2 Extended Status Word (ESW)
196  */
197 struct esw2 {
198         __u8  zero0;            /* reserved zeros */
199         __u8  lpum;             /* last path used mask */
200         __u16 dcti;             /* device-connect-time interval */
201         struct erw erw;         /* extended report word */
202         __u32 zeros[3];         /* 2 fullwords of zeros */
203 } __attribute__ ((packed));
204
205 /*
206  * Format 3 Extended Status Word (ESW)
207  */
208 struct esw3 {
209         __u8  zero0;            /* reserved zeros */
210         __u8  lpum;             /* last path used mask */
211         __u16 res;              /* reserved */
212         struct erw erw;         /* extended report word */
213         __u32 zeros[3];         /* 2 fullwords of zeros */
214 } __attribute__ ((packed));
215
216 /*
217  * interruption response block
218  */
219 struct irb {
220         struct scsw scsw;       /* subchannel status word */
221         union {                 /* extended status word, 4 formats */
222                 struct esw0 esw0;
223                 struct esw1 esw1;
224                 struct esw2 esw2;
225                 struct esw3 esw3;
226         } esw;
227         __u8   ecw[32];         /* extended control word */
228 } __attribute__ ((packed,aligned(4)));
229
230 /*
231  * command information word  (CIW) layout
232  */
233 struct ciw {
234         __u32 et       :  2;    /* entry type */
235         __u32 reserved :  2;    /* reserved */
236         __u32 ct       :  4;    /* command type */
237         __u32 cmd      :  8;    /* command */
238         __u32 count    : 16;    /* coun */
239 } __attribute__ ((packed));
240
241 #define CIW_TYPE_RCD    0x0     /* read configuration data */
242 #define CIW_TYPE_SII    0x1     /* set interface identifier */
243 #define CIW_TYPE_RNI    0x2     /* read node identifier */
244
245 /*
246  * Flags used as input parameters for do_IO()
247  */
248 #define DOIO_ALLOW_SUSPEND       0x0001 /* allow for channel prog. suspend */
249 #define DOIO_DENY_PREFETCH       0x0002 /* don't allow for CCW prefetch */
250 #define DOIO_SUPPRESS_INTER      0x0004 /* suppress intermediate inter. */
251                                         /* ... for suspended CCWs */
252 /* Device or subchannel gone. */
253 #define CIO_GONE       0x0001
254 /* No path to device. */
255 #define CIO_NO_PATH    0x0002
256 /* Device has appeared. */
257 #define CIO_OPER       0x0004
258 /* Sick revalidation of device. */
259 #define CIO_REVALIDATE 0x0008
260
261 struct diag210 {
262         __u16 vrdcdvno : 16;   /* device number (input) */
263         __u16 vrdclen  : 16;   /* data block length (input) */
264         __u32 vrdcvcla : 8;    /* virtual device class (output) */
265         __u32 vrdcvtyp : 8;    /* virtual device type (output) */
266         __u32 vrdcvsta : 8;    /* virtual device status (output) */
267         __u32 vrdcvfla : 8;    /* virtual device flags (output) */
268         __u32 vrdcrccl : 8;    /* real device class (output) */
269         __u32 vrdccrty : 8;    /* real device type (output) */
270         __u32 vrdccrmd : 8;    /* real device model (output) */
271         __u32 vrdccrft : 8;    /* real device feature (output) */
272 } __attribute__ ((packed,aligned(4)));
273
274 struct ccw_dev_id {
275         u8 ssid;
276         u16 devno;
277 };
278
279 static inline int ccw_dev_id_is_equal(struct ccw_dev_id *dev_id1,
280                                       struct ccw_dev_id *dev_id2)
281 {
282         if ((dev_id1->ssid == dev_id2->ssid) &&
283             (dev_id1->devno == dev_id2->devno))
284                 return 1;
285         return 0;
286 }
287
288 extern int diag210(struct diag210 *addr);
289
290 extern void wait_cons_dev(void);
291
292 extern void css_schedule_reprobe(void);
293
294 extern void reipl_ccw_dev(struct ccw_dev_id *id);
295
296 struct cio_iplinfo {
297         u16 devno;
298         int is_qdio;
299 };
300
301 extern int cio_get_iplinfo(struct cio_iplinfo *iplinfo);
302
303 #endif
304
305 #endif