1
2
3
4
5
6
7
8#ifndef __QDIO_H__
9#define __QDIO_H__
10
11#include <linux/interrupt.h>
12#include <asm/cio.h>
13#include <asm/ccwdev.h>
14
15
16#define QDIO_MAX_QUEUES_PER_IRQ 4
17#define QDIO_MAX_BUFFERS_PER_Q 128
18#define QDIO_MAX_BUFFERS_MASK (QDIO_MAX_BUFFERS_PER_Q - 1)
19#define QDIO_BUFNR(num) ((num) & QDIO_MAX_BUFFERS_MASK)
20#define QDIO_MAX_ELEMENTS_PER_BUFFER 16
21#define QDIO_SBAL_SIZE 256
22
23#define QDIO_QETH_QFMT 0
24#define QDIO_ZFCP_QFMT 1
25#define QDIO_IQDIO_QFMT 2
26
27
28
29
30
31
32
33
34
35
36
37struct qdesfmt0 {
38 u64 sliba;
39 u64 sla;
40 u64 slsba;
41 u32 : 32;
42 u32 akey : 4;
43 u32 bkey : 4;
44 u32 ckey : 4;
45 u32 dkey : 4;
46 u32 : 16;
47} __attribute__ ((packed));
48
49#define QDR_AC_MULTI_BUFFER_ENABLE 0x01
50
51
52
53
54
55
56
57
58
59
60
61
62
63struct qdr {
64 u32 qfmt : 8;
65 u32 : 16;
66 u32 ac : 8;
67 u32 : 8;
68 u32 iqdcnt : 8;
69 u32 : 8;
70 u32 oqdcnt : 8;
71 u32 : 8;
72 u32 iqdsz : 8;
73 u32 : 8;
74 u32 oqdsz : 8;
75
76 u32 res[9];
77
78 u64 qiba;
79 u32 : 32;
80 u32 qkey : 4;
81 u32 : 28;
82 struct qdesfmt0 qdf0[126];
83} __packed __aligned(PAGE_SIZE);
84
85#define QIB_AC_OUTBOUND_PCI_SUPPORTED 0x40
86#define QIB_RFLAGS_ENABLE_QEBSM 0x80
87#define QIB_RFLAGS_ENABLE_DATA_DIV 0x02
88
89
90
91
92
93
94
95
96
97
98
99
100struct qib {
101 u32 qfmt : 8;
102 u32 pfmt : 8;
103 u32 rflags : 8;
104 u32 ac : 8;
105 u32 : 32;
106 u64 isliba;
107 u64 osliba;
108 u32 : 32;
109 u32 : 32;
110 u8 ebcnam[8];
111
112 u8 res[88];
113
114 u8 parm[128];
115} __attribute__ ((packed, aligned(256)));
116
117
118
119
120
121struct slibe {
122 u64 parms;
123};
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141struct qaob {
142 u64 res0[6];
143 u8 res1;
144 u8 res2;
145 u8 res3;
146 u8 aorc;
147 u8 flags;
148 u16 cbtbs;
149 u8 sb_count;
150 u64 sba[QDIO_MAX_ELEMENTS_PER_BUFFER];
151 u16 dcount[QDIO_MAX_ELEMENTS_PER_BUFFER];
152 u64 user0;
153 u64 res4[2];
154 u8 user1[16];
155} __attribute__ ((packed, aligned(256)));
156
157
158
159
160
161
162
163
164struct slib {
165 u64 nsliba;
166 u64 sla;
167 u64 slsba;
168
169 u8 res[1000];
170
171 struct slibe slibe[QDIO_MAX_BUFFERS_PER_Q];
172} __attribute__ ((packed, aligned(2048)));
173
174#define SBAL_EFLAGS_LAST_ENTRY 0x40
175#define SBAL_EFLAGS_CONTIGUOUS 0x20
176#define SBAL_EFLAGS_FIRST_FRAG 0x04
177#define SBAL_EFLAGS_MIDDLE_FRAG 0x08
178#define SBAL_EFLAGS_LAST_FRAG 0x0c
179#define SBAL_EFLAGS_MASK 0x6f
180
181#define SBAL_SFLAGS0_PCI_REQ 0x40
182#define SBAL_SFLAGS0_DATA_CONTINUATION 0x20
183
184
185#define SBAL_SFLAGS0_TYPE_STATUS 0x00
186#define SBAL_SFLAGS0_TYPE_WRITE 0x08
187#define SBAL_SFLAGS0_TYPE_READ 0x10
188#define SBAL_SFLAGS0_TYPE_WRITE_READ 0x18
189#define SBAL_SFLAGS0_MORE_SBALS 0x04
190#define SBAL_SFLAGS0_COMMAND 0x02
191#define SBAL_SFLAGS0_LAST_SBAL 0x00
192#define SBAL_SFLAGS0_ONLY_SBAL SBAL_SFLAGS0_COMMAND
193#define SBAL_SFLAGS0_MIDDLE_SBAL SBAL_SFLAGS0_MORE_SBALS
194#define SBAL_SFLAGS0_FIRST_SBAL (SBAL_SFLAGS0_MORE_SBALS | SBAL_SFLAGS0_COMMAND)
195
196
197
198
199
200
201
202
203
204struct qdio_buffer_element {
205 u8 eflags;
206
207 u8 res1;
208
209 u8 scount;
210 u8 sflags;
211 u32 length;
212 u64 addr;
213} __attribute__ ((packed, aligned(16)));
214
215
216
217
218
219struct qdio_buffer {
220 struct qdio_buffer_element element[QDIO_MAX_ELEMENTS_PER_BUFFER];
221} __attribute__ ((packed, aligned(256)));
222
223
224
225
226
227struct sl_element {
228 u64 sbal;
229} __attribute__ ((packed));
230
231
232
233
234
235struct sl {
236 struct sl_element element[QDIO_MAX_BUFFERS_PER_Q];
237} __attribute__ ((packed, aligned(1024)));
238
239
240
241
242
243struct slsb {
244 u8 val[QDIO_MAX_BUFFERS_PER_Q];
245} __attribute__ ((packed, aligned(256)));
246
247
248#define CHSC_AC1_INITIATE_INPUTQ 0x80
249#define AC1_SIGA_INPUT_NEEDED 0x40
250#define AC1_SIGA_OUTPUT_NEEDED 0x20
251#define AC1_SIGA_SYNC_NEEDED 0x10
252#define AC1_AUTOMATIC_SYNC_ON_THININT 0x08
253#define AC1_AUTOMATIC_SYNC_ON_OUT_PCI 0x04
254#define AC1_SC_QEBSM_AVAILABLE 0x02
255#define AC1_SC_QEBSM_ENABLED 0x01
256
257#define CHSC_AC2_MULTI_BUFFER_AVAILABLE 0x0080
258#define CHSC_AC2_MULTI_BUFFER_ENABLED 0x0040
259#define CHSC_AC2_DATA_DIV_AVAILABLE 0x0010
260#define CHSC_AC2_SNIFFER_AVAILABLE 0x0008
261#define CHSC_AC2_DATA_DIV_ENABLED 0x0002
262
263#define CHSC_AC3_FORMAT2_CQ_AVAILABLE 0x8000
264
265struct qdio_ssqd_desc {
266 u8 flags;
267 u8:8;
268 u16 sch;
269 u8 qfmt;
270 u8 parm;
271 u8 qdioac1;
272 u8 sch_class;
273 u8 pcnt;
274 u8 icnt;
275 u8:8;
276 u8 ocnt;
277 u8:8;
278 u8 mbccnt;
279 u16 qdioac2;
280 u64 sch_token;
281 u8 mro;
282 u8 mri;
283 u16 qdioac3;
284 u16:16;
285 u8:8;
286 u8 mmwc;
287} __attribute__ ((packed));
288
289
290
291typedef void qdio_handler_t(struct ccw_device *, unsigned int, int,
292 int, int, unsigned long);
293
294
295#define QDIO_ERROR_ACTIVATE 0x0001
296#define QDIO_ERROR_GET_BUF_STATE 0x0002
297#define QDIO_ERROR_SET_BUF_STATE 0x0004
298#define QDIO_ERROR_SLSB_STATE 0x0100
299#define QDIO_ERROR_SLSB_PENDING 0x0200
300
301#define QDIO_ERROR_FATAL 0x00ff
302#define QDIO_ERROR_TEMPORARY 0xff00
303
304
305#define QDIO_FLAG_CLEANUP_USING_CLEAR 0x01
306#define QDIO_FLAG_CLEANUP_USING_HALT 0x02
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327struct qdio_initialize {
328 unsigned char q_format;
329 unsigned char qdr_ac;
330 unsigned int qib_param_field_format;
331 unsigned char *qib_param_field;
332 unsigned char qib_rflags;
333 unsigned long *input_slib_elements;
334 unsigned long *output_slib_elements;
335 unsigned int no_input_qs;
336 unsigned int no_output_qs;
337 qdio_handler_t *input_handler;
338 qdio_handler_t *output_handler;
339 void (*irq_poll)(struct ccw_device *cdev, unsigned long data);
340 unsigned int scan_threshold;
341 unsigned long int_parm;
342 struct qdio_buffer ***input_sbal_addr_array;
343 struct qdio_buffer ***output_sbal_addr_array;
344};
345
346#define QDIO_STATE_INACTIVE 0x00000002
347#define QDIO_STATE_ESTABLISHED 0x00000004
348#define QDIO_STATE_ACTIVE 0x00000008
349#define QDIO_STATE_STOPPED 0x00000010
350
351#define QDIO_FLAG_SYNC_INPUT 0x01
352#define QDIO_FLAG_SYNC_OUTPUT 0x02
353#define QDIO_FLAG_PCI_OUT 0x10
354
355int qdio_alloc_buffers(struct qdio_buffer **buf, unsigned int count);
356void qdio_free_buffers(struct qdio_buffer **buf, unsigned int count);
357void qdio_reset_buffers(struct qdio_buffer **buf, unsigned int count);
358
359extern int qdio_allocate(struct ccw_device *cdev, unsigned int no_input_qs,
360 unsigned int no_output_qs);
361extern int qdio_establish(struct ccw_device *cdev,
362 struct qdio_initialize *init_data);
363extern int qdio_activate(struct ccw_device *);
364extern struct qaob *qdio_allocate_aob(void);
365extern void qdio_release_aob(struct qaob *);
366extern int do_QDIO(struct ccw_device *cdev, unsigned int callflags, int q_nr,
367 unsigned int bufnr, unsigned int count, struct qaob *aob);
368extern int qdio_start_irq(struct ccw_device *cdev);
369extern int qdio_stop_irq(struct ccw_device *cdev);
370extern int qdio_get_next_buffers(struct ccw_device *, int, int *, int *);
371extern int qdio_inspect_queue(struct ccw_device *cdev, unsigned int nr,
372 bool is_input, unsigned int *bufnr,
373 unsigned int *error);
374extern int qdio_shutdown(struct ccw_device *, int);
375extern int qdio_free(struct ccw_device *);
376extern int qdio_get_ssqd_desc(struct ccw_device *, struct qdio_ssqd_desc *);
377
378#endif
379