Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
fcx.h
Go to the documentation of this file.
1 /*
2  * Functions for assembling fcx enabled I/O control blocks.
3  *
4  * Copyright IBM Corp. 2008
5  * Author(s): Peter Oberparleiter <[email protected]>
6  */
7 
8 #ifndef _ASM_S390_FCX_H
9 #define _ASM_S390_FCX_H _ASM_S390_FCX_H
10 
11 #include <linux/types.h>
12 
13 #define TCW_FORMAT_DEFAULT 0
14 #define TCW_TIDAW_FORMAT_DEFAULT 0
15 #define TCW_FLAGS_INPUT_TIDA 1 << (23 - 5)
16 #define TCW_FLAGS_TCCB_TIDA 1 << (23 - 6)
17 #define TCW_FLAGS_OUTPUT_TIDA 1 << (23 - 7)
18 #define TCW_FLAGS_TIDAW_FORMAT(x) ((x) & 3) << (23 - 9)
19 #define TCW_FLAGS_GET_TIDAW_FORMAT(x) (((x) >> (23 - 9)) & 3)
20 
36 struct tcw {
38  u32 :6;
39  u32 flags:24;
40  u32 :8;
42  u32 r:1;
43  u32 w:1;
44  u32 :16;
51  u32 :32;
52  u32 :32;
53  u32 :32;
55 } __attribute__ ((packed, aligned(64)));
56 
57 #define TIDAW_FLAGS_LAST 1 << (7 - 0)
58 #define TIDAW_FLAGS_SKIP 1 << (7 - 1)
59 #define TIDAW_FLAGS_DATA_INT 1 << (7 - 2)
60 #define TIDAW_FLAGS_TTIC 1 << (7 - 3)
61 #define TIDAW_FLAGS_INSERT_CBC 1 << (7 - 4)
62 
71 struct tidaw {
73  u32 :24;
76 } __attribute__ ((packed, aligned(16)));
77 
87 struct tsa_iostat {
93  u8 sense[32];
94 } __attribute__ ((packed));
95 
102 struct tsa_ddpc {
103  u32 :24;
104  u32 rc:8;
105  u8 rcq[16];
106  u8 sense[32];
107 } __attribute__ ((packed));
108 
109 #define TSA_INTRG_FLAGS_CU_STATE_VALID 1 << (7 - 0)
110 #define TSA_INTRG_FLAGS_DEV_STATE_VALID 1 << (7 - 1)
111 #define TSA_INTRG_FLAGS_OP_STATE_VALID 1 << (7 - 2)
112 
126 struct tsa_intrg {
132  u32 :24;
133  u8 sd_info[12];
135  u8 dd_data[28];
136 } __attribute__ ((packed));
137 
138 #define TSB_FORMAT_NONE 0
139 #define TSB_FORMAT_IOSTAT 1
140 #define TSB_FORMAT_DDPC 2
141 #define TSB_FORMAT_INTRG 3
142 
143 #define TSB_FLAGS_DCW_OFFSET_VALID 1 << (7 - 0)
144 #define TSB_FLAGS_COUNT_VALID 1 << (7 - 1)
145 #define TSB_FLAGS_CACHE_MISS 1 << (7 - 2)
146 #define TSB_FLAGS_TIME_VALID 1 << (7 - 3)
147 #define TSB_FLAGS_FORMAT(x) ((x) & 7)
148 #define TSB_FORMAT(t) ((t)->flags & 7)
149 
160 struct tsb {
165  u32 :32;
166  union {
168  struct tsa_ddpc ddpc;
169  struct tsa_intrg intrg;
170  } __attribute__ ((packed)) tsa;
171 } __attribute__ ((packed, aligned(8)));
173 #define DCW_INTRG_FORMAT_DEFAULT 0
175 #define DCW_INTRG_RC_UNSPECIFIED 0
176 #define DCW_INTRG_RC_TIMEOUT 1
177 
178 #define DCW_INTRG_RCQ_UNSPECIFIED 0
179 #define DCW_INTRG_RCQ_PRIMARY 1
180 #define DCW_INTRG_RCQ_SECONDARY 2
181 
182 #define DCW_INTRG_FLAGS_MPM 1 < (7 - 0)
183 #define DCW_INTRG_FLAGS_PPR 1 < (7 - 1)
184 #define DCW_INTRG_FLAGS_CRIT 1 < (7 - 2)
185 
205  u32 rc:8;
206  u32 rcq:8;
207  u32 lpm:8;
208  u32 pam:8;
209  u32 pim:8;
212  u32 :24;
213  u32 :32;
217 } __attribute__ ((packed));
218 
219 #define DCW_FLAGS_CC 1 << (7 - 1)
220 
221 #define DCW_CMD_WRITE 0x01
222 #define DCW_CMD_READ 0x02
223 #define DCW_CMD_CONTROL 0x03
224 #define DCW_CMD_SENSE 0x04
225 #define DCW_CMD_SENSE_ID 0xe4
226 #define DCW_CMD_INTRG 0x40
227 
237 struct dcw {
238  u32 cmd:8;
240  u32 :8;
243  u8 cd[0];
244 } __attribute__ ((packed));
246 #define TCCB_FORMAT_DEFAULT 0x7f
247 #define TCCB_MAX_DCW 30
248 #define TCCB_MAX_SIZE (sizeof(struct tccb_tcah) + \
249  TCCB_MAX_DCW * sizeof(struct dcw) + \
250  sizeof(struct tccb_tcat))
251 #define TCCB_SAC_DEFAULT 0x1ffe
252 #define TCCB_SAC_INTRG 0x1fff
253 
261 struct tccb_tcah {
263  u32 :24;
264  u32 :24;
266  u32 sac:16;
267  u32 :8;
269  u32 :32;
270 } __attribute__ ((packed));
271 
276 struct tccb_tcat {
277  u32 :32;
279 } __attribute__ ((packed));
280 
286 struct tccb {
287  struct tccb_tcah tcah;
288  u8 tca[0];
289 } __attribute__ ((packed, aligned(8)));
291 struct tcw *tcw_get_intrg(struct tcw *tcw);
292 void *tcw_get_data(struct tcw *tcw);
293 struct tccb *tcw_get_tccb(struct tcw *tcw);
294 struct tsb *tcw_get_tsb(struct tcw *tcw);
295 
296 void tcw_init(struct tcw *tcw, int r, int w);
297 void tcw_finalize(struct tcw *tcw, int num_tidaws);
298 
299 void tcw_set_intrg(struct tcw *tcw, struct tcw *intrg_tcw);
300 void tcw_set_data(struct tcw *tcw, void *data, int use_tidal);
301 void tcw_set_tccb(struct tcw *tcw, struct tccb *tccb);
302 void tcw_set_tsb(struct tcw *tcw, struct tsb *tsb);
303 
304 void tccb_init(struct tccb *tccb, size_t tccb_size, u32 sac);
305 void tsb_init(struct tsb *tsb);
306 struct dcw *tccb_add_dcw(struct tccb *tccb, size_t tccb_size, u8 cmd, u8 flags,
307  void *cd, u8 cd_count, u32 count);
308 struct tidaw *tcw_add_tidaw(struct tcw *tcw, int num_tidaws, u8 flags,
309  void *addr, u32 count);
310 
311 #endif /* _ASM_S390_FCX_H */