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