2 * Functions for assembling fcx enabled I/O control blocks.
4 * Copyright IBM Corp. 2008
5 * Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
8 #ifndef _ASM_S390_FCX_H
9 #define _ASM_S390_FCX_H _ASM_S390_FCX_H
11 #include <linux/types.h>
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)
22 * struct tcw - Transport Control Word (TCW)
25 * @tccbl: Transport-Command-Control-Block Length
27 * @w: Write Operations
28 * @output: Output-Data Address
29 * @input: Input-Data Address
30 * @tsb: Transport-Status-Block Address
31 * @tccb: Transport-Command-Control-Block Address
32 * @output_count: Output Count
33 * @input_count: Input Count
34 * @intrg: Interrogate TCW Address
55 } __attribute__ ((packed, aligned(64)));
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)
64 * struct tidaw - Transport-Indirect-Addressing Word (TIDAW)
65 * @flags: TIDAW flags. Can be an arithmetic OR of the following constants:
66 * %TIDAW_FLAGS_LAST, %TIDAW_FLAGS_SKIP, %TIDAW_FLAGS_DATA_INT,
67 * %TIDAW_FLAGS_TTIC, %TIDAW_FLAGS_INSERT_CBC
76 } __attribute__ ((packed, aligned(16)));
79 * struct tsa_iostat - I/O-Status Transport-Status Area (IO-Stat TSA)
80 * @dev_time: Device Time
81 * @def_time: Defer Time
82 * @queue_time: Queue Time
83 * @dev_busy_time: Device-Busy Time
84 * @dev_act_time: Device-Active-Only Time
85 * @sense: Sense Data (if present)
94 } __attribute__ ((packed));
97 * struct tsa_ddpcs - Device-Detected-Program-Check Transport-Status Area (DDPC TSA)
99 * @rcq: Reason Code Qualifier
100 * @sense: Sense Data (if present)
107 } __attribute__ ((packed));
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)
114 * struct tsa_intrg - Interrogate Transport-Status Area (Intrg. TSA)
116 * @flags: Flags. Can be an arithmetic OR of the following constants:
117 * %TSA_INTRG_FLAGS_CU_STATE_VALID, %TSA_INTRG_FLAGS_DEV_STATE_VALID,
118 * %TSA_INTRG_FLAGS_OP_STATE_VALID
119 * @cu_state: Controle-Unit State
120 * @dev_state: Device State
121 * @op_state: Operation State
122 * @sd_info: State-Dependent Information
123 * @dl_id: Device-Level Identifier
124 * @dd_data: Device-Dependent Data
136 } __attribute__ ((packed));
138 #define TSB_FORMAT_NONE 0
139 #define TSB_FORMAT_IOSTAT 1
140 #define TSB_FORMAT_DDPC 2
141 #define TSB_FORMAT_INTRG 3
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)
151 * struct tsb - Transport-Status Block (TSB)
153 * @flags: Flags. Can be an arithmetic OR of the following constants:
154 * %TSB_FLAGS_DCW_OFFSET_VALID, %TSB_FLAGS_COUNT_VALID, %TSB_FLAGS_CACHE_MISS,
155 * %TSB_FLAGS_TIME_VALID
156 * @dcw_offset: DCW Offset
158 * @tsa: Transport-Status-Area
167 struct tsa_iostat iostat;
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
178 #define DCW_INTRG_RCQ_UNSPECIFIED 0
179 #define DCW_INTRG_RCQ_PRIMARY 1
180 #define DCW_INTRG_RCQ_SECONDARY 2
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)
187 * struct dcw_intrg_data - Interrogate DCW data
188 * @format: Format. Should be %DCW_INTRG_FORMAT_DEFAULT
189 * @rc: Reason Code. Can be one of %DCW_INTRG_RC_UNSPECIFIED,
190 * %DCW_INTRG_RC_TIMEOUT
191 * @rcq: Reason Code Qualifier: Can be one of %DCW_INTRG_RCQ_UNSPECIFIED,
192 * %DCW_INTRG_RCQ_PRIMARY, %DCW_INTRG_RCQ_SECONDARY
193 * @lpm: Logical-Path Mask
194 * @pam: Path-Available Mask
195 * @pim: Path-Installed Mask
197 * @flags: Flags. Can be an arithmetic OR of %DCW_INTRG_FLAGS_MPM,
198 * %DCW_INTRG_FLAGS_PPR, %DCW_INTRG_FLAGS_CRIT
200 * @prog_id: Program Identifier
201 * @prog_data: Program-Dependent Data
203 struct dcw_intrg_data {
217 } __attribute__ ((packed));
219 #define DCW_FLAGS_CC 1 << (7 - 1)
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
229 * struct dcw - Device-Command Word (DCW)
230 * @cmd: Command Code. Can be one of %DCW_CMD_WRITE, %DCW_CMD_READ,
231 * %DCW_CMD_CONTROL, %DCW_CMD_SENSE, %DCW_CMD_SENSE_ID, %DCW_CMD_INTRG
232 * @flags: Flags. Can be an arithmetic OR of %DCW_FLAGS_CC
233 * @cd_count: Control-Data Count
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
255 * struct tccb_tcah - Transport-Command-Area Header (TCAH)
256 * @format: Format. Should be %TCCB_FORMAT_DEFAULT
257 * @tcal: Transport-Command-Area Length
258 * @sac: Service-Action Code. Can be one of %TCCB_SAC_DEFAULT, %TCCB_SAC_INTRG
270 } __attribute__ ((packed));
273 * struct tccb_tcat - Transport-Command-Area Trailer (TCAT)
274 * @count: Transport Count
279 } __attribute__ ((packed));
282 * struct tccb - (partial) Transport-Command-Control Block (TCCB)
284 * @tca: Transport-Command Area
287 struct tccb_tcah tcah;
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);
296 void tcw_init(struct tcw *tcw, int r, int w);
297 void tcw_finalize(struct tcw *tcw, int num_tidaws);
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);
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);
311 #endif /* _ASM_S390_FCX_H */