Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
[linux-2.6-microblaze.git] / drivers / infiniband / hw / cxgb4 / t4fw_ri_api.h
1 /*
2  * Copyright (c) 2009-2010 Chelsio, Inc. All rights reserved.
3  *
4  * This software is available to you under a choice of one of two
5  * licenses.  You may choose to be licensed under the terms of the GNU
6  * General Public License (GPL) Version 2, available from the file
7  * COPYING in the main directory of this source tree, or the
8  * OpenIB.org BSD license below:
9  *
10  *     Redistribution and use in source and binary forms, with or
11  *     without modification, are permitted provided that the following
12  *     conditions are met:
13  *
14  *      - Redistributions of source code must retain the above
15  *        copyright notice, this list of conditions and the following
16  *        disclaimer.
17  *      - Redistributions in binary form must reproduce the above
18  *        copyright notice, this list of conditions and the following
19  *        disclaimer in the documentation and/or other materials
20  *        provided with the distribution.
21  *
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
26  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
27  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
28  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29  * SOFTWARE.
30  */
31 #ifndef _T4FW_RI_API_H_
32 #define _T4FW_RI_API_H_
33
34 #include "t4fw_api.h"
35
36 enum fw_ri_wr_opcode {
37         FW_RI_RDMA_WRITE                = 0x0,  /* IETF RDMAP v1.0 ... */
38         FW_RI_READ_REQ                  = 0x1,
39         FW_RI_READ_RESP                 = 0x2,
40         FW_RI_SEND                      = 0x3,
41         FW_RI_SEND_WITH_INV             = 0x4,
42         FW_RI_SEND_WITH_SE              = 0x5,
43         FW_RI_SEND_WITH_SE_INV          = 0x6,
44         FW_RI_TERMINATE                 = 0x7,
45         FW_RI_RDMA_INIT                 = 0x8,  /* CHELSIO RI specific ... */
46         FW_RI_BIND_MW                   = 0x9,
47         FW_RI_FAST_REGISTER             = 0xa,
48         FW_RI_LOCAL_INV                 = 0xb,
49         FW_RI_QP_MODIFY                 = 0xc,
50         FW_RI_BYPASS                    = 0xd,
51         FW_RI_RECEIVE                   = 0xe,
52
53         FW_RI_SGE_EC_CR_RETURN          = 0xf,
54         FW_RI_WRITE_IMMEDIATE           = FW_RI_RDMA_INIT
55 };
56
57 enum fw_ri_wr_flags {
58         FW_RI_COMPLETION_FLAG           = 0x01,
59         FW_RI_NOTIFICATION_FLAG         = 0x02,
60         FW_RI_SOLICITED_EVENT_FLAG      = 0x04,
61         FW_RI_READ_FENCE_FLAG           = 0x08,
62         FW_RI_LOCAL_FENCE_FLAG          = 0x10,
63         FW_RI_RDMA_READ_INVALIDATE      = 0x20,
64         FW_RI_RDMA_WRITE_WITH_IMMEDIATE = 0x40
65 };
66
67 enum fw_ri_mpa_attrs {
68         FW_RI_MPA_RX_MARKER_ENABLE      = 0x01,
69         FW_RI_MPA_TX_MARKER_ENABLE      = 0x02,
70         FW_RI_MPA_CRC_ENABLE            = 0x04,
71         FW_RI_MPA_IETF_ENABLE           = 0x08
72 };
73
74 enum fw_ri_qp_caps {
75         FW_RI_QP_RDMA_READ_ENABLE       = 0x01,
76         FW_RI_QP_RDMA_WRITE_ENABLE      = 0x02,
77         FW_RI_QP_BIND_ENABLE            = 0x04,
78         FW_RI_QP_FAST_REGISTER_ENABLE   = 0x08,
79         FW_RI_QP_STAG0_ENABLE           = 0x10
80 };
81
82 enum fw_ri_addr_type {
83         FW_RI_ZERO_BASED_TO             = 0x00,
84         FW_RI_VA_BASED_TO               = 0x01
85 };
86
87 enum fw_ri_mem_perms {
88         FW_RI_MEM_ACCESS_REM_WRITE      = 0x01,
89         FW_RI_MEM_ACCESS_REM_READ       = 0x02,
90         FW_RI_MEM_ACCESS_REM            = 0x03,
91         FW_RI_MEM_ACCESS_LOCAL_WRITE    = 0x04,
92         FW_RI_MEM_ACCESS_LOCAL_READ     = 0x08,
93         FW_RI_MEM_ACCESS_LOCAL          = 0x0C
94 };
95
96 enum fw_ri_stag_type {
97         FW_RI_STAG_NSMR                 = 0x00,
98         FW_RI_STAG_SMR                  = 0x01,
99         FW_RI_STAG_MW                   = 0x02,
100         FW_RI_STAG_MW_RELAXED           = 0x03
101 };
102
103 enum fw_ri_data_op {
104         FW_RI_DATA_IMMD                 = 0x81,
105         FW_RI_DATA_DSGL                 = 0x82,
106         FW_RI_DATA_ISGL                 = 0x83
107 };
108
109 enum fw_ri_sgl_depth {
110         FW_RI_SGL_DEPTH_MAX_SQ          = 16,
111         FW_RI_SGL_DEPTH_MAX_RQ          = 4
112 };
113
114 struct fw_ri_dsge_pair {
115         __be32  len[2];
116         __be64  addr[2];
117 };
118
119 struct fw_ri_dsgl {
120         __u8    op;
121         __u8    r1;
122         __be16  nsge;
123         __be32  len0;
124         __be64  addr0;
125 #ifndef C99_NOT_SUPPORTED
126         struct fw_ri_dsge_pair sge[];
127 #endif
128 };
129
130 struct fw_ri_sge {
131         __be32 stag;
132         __be32 len;
133         __be64 to;
134 };
135
136 struct fw_ri_isgl {
137         __u8    op;
138         __u8    r1;
139         __be16  nsge;
140         __be32  r2;
141 #ifndef C99_NOT_SUPPORTED
142         struct fw_ri_sge sge[];
143 #endif
144 };
145
146 struct fw_ri_immd {
147         __u8    op;
148         __u8    r1;
149         __be16  r2;
150         __be32  immdlen;
151 #ifndef C99_NOT_SUPPORTED
152         __u8    data[];
153 #endif
154 };
155
156 struct fw_ri_tpte {
157         __be32 valid_to_pdid;
158         __be32 locread_to_qpid;
159         __be32 nosnoop_pbladdr;
160         __be32 len_lo;
161         __be32 va_hi;
162         __be32 va_lo_fbo;
163         __be32 dca_mwbcnt_pstag;
164         __be32 len_hi;
165 };
166
167 #define FW_RI_TPTE_VALID_S              31
168 #define FW_RI_TPTE_VALID_M              0x1
169 #define FW_RI_TPTE_VALID_V(x)           ((x) << FW_RI_TPTE_VALID_S)
170 #define FW_RI_TPTE_VALID_G(x)           \
171         (((x) >> FW_RI_TPTE_VALID_S) & FW_RI_TPTE_VALID_M)
172 #define FW_RI_TPTE_VALID_F              FW_RI_TPTE_VALID_V(1U)
173
174 #define FW_RI_TPTE_STAGKEY_S            23
175 #define FW_RI_TPTE_STAGKEY_M            0xff
176 #define FW_RI_TPTE_STAGKEY_V(x)         ((x) << FW_RI_TPTE_STAGKEY_S)
177 #define FW_RI_TPTE_STAGKEY_G(x)         \
178         (((x) >> FW_RI_TPTE_STAGKEY_S) & FW_RI_TPTE_STAGKEY_M)
179
180 #define FW_RI_TPTE_STAGSTATE_S          22
181 #define FW_RI_TPTE_STAGSTATE_M          0x1
182 #define FW_RI_TPTE_STAGSTATE_V(x)       ((x) << FW_RI_TPTE_STAGSTATE_S)
183 #define FW_RI_TPTE_STAGSTATE_G(x)       \
184         (((x) >> FW_RI_TPTE_STAGSTATE_S) & FW_RI_TPTE_STAGSTATE_M)
185 #define FW_RI_TPTE_STAGSTATE_F          FW_RI_TPTE_STAGSTATE_V(1U)
186
187 #define FW_RI_TPTE_STAGTYPE_S           20
188 #define FW_RI_TPTE_STAGTYPE_M           0x3
189 #define FW_RI_TPTE_STAGTYPE_V(x)        ((x) << FW_RI_TPTE_STAGTYPE_S)
190 #define FW_RI_TPTE_STAGTYPE_G(x)        \
191         (((x) >> FW_RI_TPTE_STAGTYPE_S) & FW_RI_TPTE_STAGTYPE_M)
192
193 #define FW_RI_TPTE_PDID_S               0
194 #define FW_RI_TPTE_PDID_M               0xfffff
195 #define FW_RI_TPTE_PDID_V(x)            ((x) << FW_RI_TPTE_PDID_S)
196 #define FW_RI_TPTE_PDID_G(x)            \
197         (((x) >> FW_RI_TPTE_PDID_S) & FW_RI_TPTE_PDID_M)
198
199 #define FW_RI_TPTE_PERM_S               28
200 #define FW_RI_TPTE_PERM_M               0xf
201 #define FW_RI_TPTE_PERM_V(x)            ((x) << FW_RI_TPTE_PERM_S)
202 #define FW_RI_TPTE_PERM_G(x)            \
203         (((x) >> FW_RI_TPTE_PERM_S) & FW_RI_TPTE_PERM_M)
204
205 #define FW_RI_TPTE_REMINVDIS_S          27
206 #define FW_RI_TPTE_REMINVDIS_M          0x1
207 #define FW_RI_TPTE_REMINVDIS_V(x)       ((x) << FW_RI_TPTE_REMINVDIS_S)
208 #define FW_RI_TPTE_REMINVDIS_G(x)       \
209         (((x) >> FW_RI_TPTE_REMINVDIS_S) & FW_RI_TPTE_REMINVDIS_M)
210 #define FW_RI_TPTE_REMINVDIS_F          FW_RI_TPTE_REMINVDIS_V(1U)
211
212 #define FW_RI_TPTE_ADDRTYPE_S           26
213 #define FW_RI_TPTE_ADDRTYPE_M           1
214 #define FW_RI_TPTE_ADDRTYPE_V(x)        ((x) << FW_RI_TPTE_ADDRTYPE_S)
215 #define FW_RI_TPTE_ADDRTYPE_G(x)        \
216         (((x) >> FW_RI_TPTE_ADDRTYPE_S) & FW_RI_TPTE_ADDRTYPE_M)
217 #define FW_RI_TPTE_ADDRTYPE_F           FW_RI_TPTE_ADDRTYPE_V(1U)
218
219 #define FW_RI_TPTE_MWBINDEN_S           25
220 #define FW_RI_TPTE_MWBINDEN_M           0x1
221 #define FW_RI_TPTE_MWBINDEN_V(x)        ((x) << FW_RI_TPTE_MWBINDEN_S)
222 #define FW_RI_TPTE_MWBINDEN_G(x)        \
223         (((x) >> FW_RI_TPTE_MWBINDEN_S) & FW_RI_TPTE_MWBINDEN_M)
224 #define FW_RI_TPTE_MWBINDEN_F           FW_RI_TPTE_MWBINDEN_V(1U)
225
226 #define FW_RI_TPTE_PS_S                 20
227 #define FW_RI_TPTE_PS_M                 0x1f
228 #define FW_RI_TPTE_PS_V(x)              ((x) << FW_RI_TPTE_PS_S)
229 #define FW_RI_TPTE_PS_G(x)              \
230         (((x) >> FW_RI_TPTE_PS_S) & FW_RI_TPTE_PS_M)
231
232 #define FW_RI_TPTE_QPID_S               0
233 #define FW_RI_TPTE_QPID_M               0xfffff
234 #define FW_RI_TPTE_QPID_V(x)            ((x) << FW_RI_TPTE_QPID_S)
235 #define FW_RI_TPTE_QPID_G(x)            \
236         (((x) >> FW_RI_TPTE_QPID_S) & FW_RI_TPTE_QPID_M)
237
238 #define FW_RI_TPTE_NOSNOOP_S            30
239 #define FW_RI_TPTE_NOSNOOP_M            0x1
240 #define FW_RI_TPTE_NOSNOOP_V(x)         ((x) << FW_RI_TPTE_NOSNOOP_S)
241 #define FW_RI_TPTE_NOSNOOP_G(x)         \
242         (((x) >> FW_RI_TPTE_NOSNOOP_S) & FW_RI_TPTE_NOSNOOP_M)
243 #define FW_RI_TPTE_NOSNOOP_F            FW_RI_TPTE_NOSNOOP_V(1U)
244
245 #define FW_RI_TPTE_PBLADDR_S            0
246 #define FW_RI_TPTE_PBLADDR_M            0x1fffffff
247 #define FW_RI_TPTE_PBLADDR_V(x)         ((x) << FW_RI_TPTE_PBLADDR_S)
248 #define FW_RI_TPTE_PBLADDR_G(x)         \
249         (((x) >> FW_RI_TPTE_PBLADDR_S) & FW_RI_TPTE_PBLADDR_M)
250
251 #define FW_RI_TPTE_DCA_S                24
252 #define FW_RI_TPTE_DCA_M                0x1f
253 #define FW_RI_TPTE_DCA_V(x)             ((x) << FW_RI_TPTE_DCA_S)
254 #define FW_RI_TPTE_DCA_G(x)             \
255         (((x) >> FW_RI_TPTE_DCA_S) & FW_RI_TPTE_DCA_M)
256
257 #define FW_RI_TPTE_MWBCNT_PSTAG_S       0
258 #define FW_RI_TPTE_MWBCNT_PSTAG_M       0xffffff
259 #define FW_RI_TPTE_MWBCNT_PSTAT_V(x)    \
260         ((x) << FW_RI_TPTE_MWBCNT_PSTAG_S)
261 #define FW_RI_TPTE_MWBCNT_PSTAG_G(x)    \
262         (((x) >> FW_RI_TPTE_MWBCNT_PSTAG_S) & FW_RI_TPTE_MWBCNT_PSTAG_M)
263
264 enum fw_ri_res_type {
265         FW_RI_RES_TYPE_SQ,
266         FW_RI_RES_TYPE_RQ,
267         FW_RI_RES_TYPE_CQ,
268         FW_RI_RES_TYPE_SRQ,
269 };
270
271 enum fw_ri_res_op {
272         FW_RI_RES_OP_WRITE,
273         FW_RI_RES_OP_RESET,
274 };
275
276 struct fw_ri_res {
277         union fw_ri_restype {
278                 struct fw_ri_res_sqrq {
279                         __u8   restype;
280                         __u8   op;
281                         __be16 r3;
282                         __be32 eqid;
283                         __be32 r4[2];
284                         __be32 fetchszm_to_iqid;
285                         __be32 dcaen_to_eqsize;
286                         __be64 eqaddr;
287                 } sqrq;
288                 struct fw_ri_res_cq {
289                         __u8   restype;
290                         __u8   op;
291                         __be16 r3;
292                         __be32 iqid;
293                         __be32 r4[2];
294                         __be32 iqandst_to_iqandstindex;
295                         __be16 iqdroprss_to_iqesize;
296                         __be16 iqsize;
297                         __be64 iqaddr;
298                         __be32 iqns_iqro;
299                         __be32 r6_lo;
300                         __be64 r7;
301                 } cq;
302                 struct fw_ri_res_srq {
303                         __u8   restype;
304                         __u8   op;
305                         __be16 r3;
306                         __be32 eqid;
307                         __be32 r4[2];
308                         __be32 fetchszm_to_iqid;
309                         __be32 dcaen_to_eqsize;
310                         __be64 eqaddr;
311                         __be32 srqid;
312                         __be32 pdid;
313                         __be32 hwsrqsize;
314                         __be32 hwsrqaddr;
315                 } srq;
316         } u;
317 };
318
319 struct fw_ri_res_wr {
320         __be32 op_nres;
321         __be32 len16_pkd;
322         __u64  cookie;
323 #ifndef C99_NOT_SUPPORTED
324         struct fw_ri_res res[];
325 #endif
326 };
327
328 #define FW_RI_RES_WR_NRES_S     0
329 #define FW_RI_RES_WR_NRES_M     0xff
330 #define FW_RI_RES_WR_NRES_V(x)  ((x) << FW_RI_RES_WR_NRES_S)
331 #define FW_RI_RES_WR_NRES_G(x)  \
332         (((x) >> FW_RI_RES_WR_NRES_S) & FW_RI_RES_WR_NRES_M)
333
334 #define FW_RI_RES_WR_FETCHSZM_S         26
335 #define FW_RI_RES_WR_FETCHSZM_M         0x1
336 #define FW_RI_RES_WR_FETCHSZM_V(x)      ((x) << FW_RI_RES_WR_FETCHSZM_S)
337 #define FW_RI_RES_WR_FETCHSZM_G(x)      \
338         (((x) >> FW_RI_RES_WR_FETCHSZM_S) & FW_RI_RES_WR_FETCHSZM_M)
339 #define FW_RI_RES_WR_FETCHSZM_F FW_RI_RES_WR_FETCHSZM_V(1U)
340
341 #define FW_RI_RES_WR_STATUSPGNS_S       25
342 #define FW_RI_RES_WR_STATUSPGNS_M       0x1
343 #define FW_RI_RES_WR_STATUSPGNS_V(x)    ((x) << FW_RI_RES_WR_STATUSPGNS_S)
344 #define FW_RI_RES_WR_STATUSPGNS_G(x)    \
345         (((x) >> FW_RI_RES_WR_STATUSPGNS_S) & FW_RI_RES_WR_STATUSPGNS_M)
346 #define FW_RI_RES_WR_STATUSPGNS_F       FW_RI_RES_WR_STATUSPGNS_V(1U)
347
348 #define FW_RI_RES_WR_STATUSPGRO_S       24
349 #define FW_RI_RES_WR_STATUSPGRO_M       0x1
350 #define FW_RI_RES_WR_STATUSPGRO_V(x)    ((x) << FW_RI_RES_WR_STATUSPGRO_S)
351 #define FW_RI_RES_WR_STATUSPGRO_G(x)    \
352         (((x) >> FW_RI_RES_WR_STATUSPGRO_S) & FW_RI_RES_WR_STATUSPGRO_M)
353 #define FW_RI_RES_WR_STATUSPGRO_F       FW_RI_RES_WR_STATUSPGRO_V(1U)
354
355 #define FW_RI_RES_WR_FETCHNS_S          23
356 #define FW_RI_RES_WR_FETCHNS_M          0x1
357 #define FW_RI_RES_WR_FETCHNS_V(x)       ((x) << FW_RI_RES_WR_FETCHNS_S)
358 #define FW_RI_RES_WR_FETCHNS_G(x)       \
359         (((x) >> FW_RI_RES_WR_FETCHNS_S) & FW_RI_RES_WR_FETCHNS_M)
360 #define FW_RI_RES_WR_FETCHNS_F  FW_RI_RES_WR_FETCHNS_V(1U)
361
362 #define FW_RI_RES_WR_FETCHRO_S          22
363 #define FW_RI_RES_WR_FETCHRO_M          0x1
364 #define FW_RI_RES_WR_FETCHRO_V(x)       ((x) << FW_RI_RES_WR_FETCHRO_S)
365 #define FW_RI_RES_WR_FETCHRO_G(x)       \
366         (((x) >> FW_RI_RES_WR_FETCHRO_S) & FW_RI_RES_WR_FETCHRO_M)
367 #define FW_RI_RES_WR_FETCHRO_F  FW_RI_RES_WR_FETCHRO_V(1U)
368
369 #define FW_RI_RES_WR_HOSTFCMODE_S       20
370 #define FW_RI_RES_WR_HOSTFCMODE_M       0x3
371 #define FW_RI_RES_WR_HOSTFCMODE_V(x)    ((x) << FW_RI_RES_WR_HOSTFCMODE_S)
372 #define FW_RI_RES_WR_HOSTFCMODE_G(x)    \
373         (((x) >> FW_RI_RES_WR_HOSTFCMODE_S) & FW_RI_RES_WR_HOSTFCMODE_M)
374
375 #define FW_RI_RES_WR_CPRIO_S    19
376 #define FW_RI_RES_WR_CPRIO_M    0x1
377 #define FW_RI_RES_WR_CPRIO_V(x) ((x) << FW_RI_RES_WR_CPRIO_S)
378 #define FW_RI_RES_WR_CPRIO_G(x) \
379         (((x) >> FW_RI_RES_WR_CPRIO_S) & FW_RI_RES_WR_CPRIO_M)
380 #define FW_RI_RES_WR_CPRIO_F    FW_RI_RES_WR_CPRIO_V(1U)
381
382 #define FW_RI_RES_WR_ONCHIP_S           18
383 #define FW_RI_RES_WR_ONCHIP_M           0x1
384 #define FW_RI_RES_WR_ONCHIP_V(x)        ((x) << FW_RI_RES_WR_ONCHIP_S)
385 #define FW_RI_RES_WR_ONCHIP_G(x)        \
386         (((x) >> FW_RI_RES_WR_ONCHIP_S) & FW_RI_RES_WR_ONCHIP_M)
387 #define FW_RI_RES_WR_ONCHIP_F   FW_RI_RES_WR_ONCHIP_V(1U)
388
389 #define FW_RI_RES_WR_PCIECHN_S          16
390 #define FW_RI_RES_WR_PCIECHN_M          0x3
391 #define FW_RI_RES_WR_PCIECHN_V(x)       ((x) << FW_RI_RES_WR_PCIECHN_S)
392 #define FW_RI_RES_WR_PCIECHN_G(x)       \
393         (((x) >> FW_RI_RES_WR_PCIECHN_S) & FW_RI_RES_WR_PCIECHN_M)
394
395 #define FW_RI_RES_WR_IQID_S     0
396 #define FW_RI_RES_WR_IQID_M     0xffff
397 #define FW_RI_RES_WR_IQID_V(x)  ((x) << FW_RI_RES_WR_IQID_S)
398 #define FW_RI_RES_WR_IQID_G(x)  \
399         (((x) >> FW_RI_RES_WR_IQID_S) & FW_RI_RES_WR_IQID_M)
400
401 #define FW_RI_RES_WR_DCAEN_S    31
402 #define FW_RI_RES_WR_DCAEN_M    0x1
403 #define FW_RI_RES_WR_DCAEN_V(x) ((x) << FW_RI_RES_WR_DCAEN_S)
404 #define FW_RI_RES_WR_DCAEN_G(x) \
405         (((x) >> FW_RI_RES_WR_DCAEN_S) & FW_RI_RES_WR_DCAEN_M)
406 #define FW_RI_RES_WR_DCAEN_F    FW_RI_RES_WR_DCAEN_V(1U)
407
408 #define FW_RI_RES_WR_DCACPU_S           26
409 #define FW_RI_RES_WR_DCACPU_M           0x1f
410 #define FW_RI_RES_WR_DCACPU_V(x)        ((x) << FW_RI_RES_WR_DCACPU_S)
411 #define FW_RI_RES_WR_DCACPU_G(x)        \
412         (((x) >> FW_RI_RES_WR_DCACPU_S) & FW_RI_RES_WR_DCACPU_M)
413
414 #define FW_RI_RES_WR_FBMIN_S    23
415 #define FW_RI_RES_WR_FBMIN_M    0x7
416 #define FW_RI_RES_WR_FBMIN_V(x) ((x) << FW_RI_RES_WR_FBMIN_S)
417 #define FW_RI_RES_WR_FBMIN_G(x) \
418         (((x) >> FW_RI_RES_WR_FBMIN_S) & FW_RI_RES_WR_FBMIN_M)
419
420 #define FW_RI_RES_WR_FBMAX_S    20
421 #define FW_RI_RES_WR_FBMAX_M    0x7
422 #define FW_RI_RES_WR_FBMAX_V(x) ((x) << FW_RI_RES_WR_FBMAX_S)
423 #define FW_RI_RES_WR_FBMAX_G(x) \
424         (((x) >> FW_RI_RES_WR_FBMAX_S) & FW_RI_RES_WR_FBMAX_M)
425
426 #define FW_RI_RES_WR_CIDXFTHRESHO_S     19
427 #define FW_RI_RES_WR_CIDXFTHRESHO_M     0x1
428 #define FW_RI_RES_WR_CIDXFTHRESHO_V(x)  ((x) << FW_RI_RES_WR_CIDXFTHRESHO_S)
429 #define FW_RI_RES_WR_CIDXFTHRESHO_G(x)  \
430         (((x) >> FW_RI_RES_WR_CIDXFTHRESHO_S) & FW_RI_RES_WR_CIDXFTHRESHO_M)
431 #define FW_RI_RES_WR_CIDXFTHRESHO_F     FW_RI_RES_WR_CIDXFTHRESHO_V(1U)
432
433 #define FW_RI_RES_WR_CIDXFTHRESH_S      16
434 #define FW_RI_RES_WR_CIDXFTHRESH_M      0x7
435 #define FW_RI_RES_WR_CIDXFTHRESH_V(x)   ((x) << FW_RI_RES_WR_CIDXFTHRESH_S)
436 #define FW_RI_RES_WR_CIDXFTHRESH_G(x)   \
437         (((x) >> FW_RI_RES_WR_CIDXFTHRESH_S) & FW_RI_RES_WR_CIDXFTHRESH_M)
438
439 #define FW_RI_RES_WR_EQSIZE_S           0
440 #define FW_RI_RES_WR_EQSIZE_M           0xffff
441 #define FW_RI_RES_WR_EQSIZE_V(x)        ((x) << FW_RI_RES_WR_EQSIZE_S)
442 #define FW_RI_RES_WR_EQSIZE_G(x)        \
443         (((x) >> FW_RI_RES_WR_EQSIZE_S) & FW_RI_RES_WR_EQSIZE_M)
444
445 #define FW_RI_RES_WR_IQANDST_S          15
446 #define FW_RI_RES_WR_IQANDST_M          0x1
447 #define FW_RI_RES_WR_IQANDST_V(x)       ((x) << FW_RI_RES_WR_IQANDST_S)
448 #define FW_RI_RES_WR_IQANDST_G(x)       \
449         (((x) >> FW_RI_RES_WR_IQANDST_S) & FW_RI_RES_WR_IQANDST_M)
450 #define FW_RI_RES_WR_IQANDST_F  FW_RI_RES_WR_IQANDST_V(1U)
451
452 #define FW_RI_RES_WR_IQANUS_S           14
453 #define FW_RI_RES_WR_IQANUS_M           0x1
454 #define FW_RI_RES_WR_IQANUS_V(x)        ((x) << FW_RI_RES_WR_IQANUS_S)
455 #define FW_RI_RES_WR_IQANUS_G(x)        \
456         (((x) >> FW_RI_RES_WR_IQANUS_S) & FW_RI_RES_WR_IQANUS_M)
457 #define FW_RI_RES_WR_IQANUS_F   FW_RI_RES_WR_IQANUS_V(1U)
458
459 #define FW_RI_RES_WR_IQANUD_S           12
460 #define FW_RI_RES_WR_IQANUD_M           0x3
461 #define FW_RI_RES_WR_IQANUD_V(x)        ((x) << FW_RI_RES_WR_IQANUD_S)
462 #define FW_RI_RES_WR_IQANUD_G(x)        \
463         (((x) >> FW_RI_RES_WR_IQANUD_S) & FW_RI_RES_WR_IQANUD_M)
464
465 #define FW_RI_RES_WR_IQANDSTINDEX_S     0
466 #define FW_RI_RES_WR_IQANDSTINDEX_M     0xfff
467 #define FW_RI_RES_WR_IQANDSTINDEX_V(x)  ((x) << FW_RI_RES_WR_IQANDSTINDEX_S)
468 #define FW_RI_RES_WR_IQANDSTINDEX_G(x)  \
469         (((x) >> FW_RI_RES_WR_IQANDSTINDEX_S) & FW_RI_RES_WR_IQANDSTINDEX_M)
470
471 #define FW_RI_RES_WR_IQDROPRSS_S        15
472 #define FW_RI_RES_WR_IQDROPRSS_M        0x1
473 #define FW_RI_RES_WR_IQDROPRSS_V(x)     ((x) << FW_RI_RES_WR_IQDROPRSS_S)
474 #define FW_RI_RES_WR_IQDROPRSS_G(x)     \
475         (((x) >> FW_RI_RES_WR_IQDROPRSS_S) & FW_RI_RES_WR_IQDROPRSS_M)
476 #define FW_RI_RES_WR_IQDROPRSS_F        FW_RI_RES_WR_IQDROPRSS_V(1U)
477
478 #define FW_RI_RES_WR_IQGTSMODE_S        14
479 #define FW_RI_RES_WR_IQGTSMODE_M        0x1
480 #define FW_RI_RES_WR_IQGTSMODE_V(x)     ((x) << FW_RI_RES_WR_IQGTSMODE_S)
481 #define FW_RI_RES_WR_IQGTSMODE_G(x)     \
482         (((x) >> FW_RI_RES_WR_IQGTSMODE_S) & FW_RI_RES_WR_IQGTSMODE_M)
483 #define FW_RI_RES_WR_IQGTSMODE_F        FW_RI_RES_WR_IQGTSMODE_V(1U)
484
485 #define FW_RI_RES_WR_IQPCIECH_S         12
486 #define FW_RI_RES_WR_IQPCIECH_M         0x3
487 #define FW_RI_RES_WR_IQPCIECH_V(x)      ((x) << FW_RI_RES_WR_IQPCIECH_S)
488 #define FW_RI_RES_WR_IQPCIECH_G(x)      \
489         (((x) >> FW_RI_RES_WR_IQPCIECH_S) & FW_RI_RES_WR_IQPCIECH_M)
490
491 #define FW_RI_RES_WR_IQDCAEN_S          11
492 #define FW_RI_RES_WR_IQDCAEN_M          0x1
493 #define FW_RI_RES_WR_IQDCAEN_V(x)       ((x) << FW_RI_RES_WR_IQDCAEN_S)
494 #define FW_RI_RES_WR_IQDCAEN_G(x)       \
495         (((x) >> FW_RI_RES_WR_IQDCAEN_S) & FW_RI_RES_WR_IQDCAEN_M)
496 #define FW_RI_RES_WR_IQDCAEN_F  FW_RI_RES_WR_IQDCAEN_V(1U)
497
498 #define FW_RI_RES_WR_IQDCACPU_S         6
499 #define FW_RI_RES_WR_IQDCACPU_M         0x1f
500 #define FW_RI_RES_WR_IQDCACPU_V(x)      ((x) << FW_RI_RES_WR_IQDCACPU_S)
501 #define FW_RI_RES_WR_IQDCACPU_G(x)      \
502         (((x) >> FW_RI_RES_WR_IQDCACPU_S) & FW_RI_RES_WR_IQDCACPU_M)
503
504 #define FW_RI_RES_WR_IQINTCNTTHRESH_S           4
505 #define FW_RI_RES_WR_IQINTCNTTHRESH_M           0x3
506 #define FW_RI_RES_WR_IQINTCNTTHRESH_V(x)        \
507         ((x) << FW_RI_RES_WR_IQINTCNTTHRESH_S)
508 #define FW_RI_RES_WR_IQINTCNTTHRESH_G(x)        \
509         (((x) >> FW_RI_RES_WR_IQINTCNTTHRESH_S) & FW_RI_RES_WR_IQINTCNTTHRESH_M)
510
511 #define FW_RI_RES_WR_IQO_S      3
512 #define FW_RI_RES_WR_IQO_M      0x1
513 #define FW_RI_RES_WR_IQO_V(x)   ((x) << FW_RI_RES_WR_IQO_S)
514 #define FW_RI_RES_WR_IQO_G(x)   \
515         (((x) >> FW_RI_RES_WR_IQO_S) & FW_RI_RES_WR_IQO_M)
516 #define FW_RI_RES_WR_IQO_F      FW_RI_RES_WR_IQO_V(1U)
517
518 #define FW_RI_RES_WR_IQCPRIO_S          2
519 #define FW_RI_RES_WR_IQCPRIO_M          0x1
520 #define FW_RI_RES_WR_IQCPRIO_V(x)       ((x) << FW_RI_RES_WR_IQCPRIO_S)
521 #define FW_RI_RES_WR_IQCPRIO_G(x)       \
522         (((x) >> FW_RI_RES_WR_IQCPRIO_S) & FW_RI_RES_WR_IQCPRIO_M)
523 #define FW_RI_RES_WR_IQCPRIO_F  FW_RI_RES_WR_IQCPRIO_V(1U)
524
525 #define FW_RI_RES_WR_IQESIZE_S          0
526 #define FW_RI_RES_WR_IQESIZE_M          0x3
527 #define FW_RI_RES_WR_IQESIZE_V(x)       ((x) << FW_RI_RES_WR_IQESIZE_S)
528 #define FW_RI_RES_WR_IQESIZE_G(x)       \
529         (((x) >> FW_RI_RES_WR_IQESIZE_S) & FW_RI_RES_WR_IQESIZE_M)
530
531 #define FW_RI_RES_WR_IQNS_S     31
532 #define FW_RI_RES_WR_IQNS_M     0x1
533 #define FW_RI_RES_WR_IQNS_V(x)  ((x) << FW_RI_RES_WR_IQNS_S)
534 #define FW_RI_RES_WR_IQNS_G(x)  \
535         (((x) >> FW_RI_RES_WR_IQNS_S) & FW_RI_RES_WR_IQNS_M)
536 #define FW_RI_RES_WR_IQNS_F     FW_RI_RES_WR_IQNS_V(1U)
537
538 #define FW_RI_RES_WR_IQRO_S     30
539 #define FW_RI_RES_WR_IQRO_M     0x1
540 #define FW_RI_RES_WR_IQRO_V(x)  ((x) << FW_RI_RES_WR_IQRO_S)
541 #define FW_RI_RES_WR_IQRO_G(x)  \
542         (((x) >> FW_RI_RES_WR_IQRO_S) & FW_RI_RES_WR_IQRO_M)
543 #define FW_RI_RES_WR_IQRO_F     FW_RI_RES_WR_IQRO_V(1U)
544
545 struct fw_ri_rdma_write_wr {
546         __u8   opcode;
547         __u8   flags;
548         __u16  wrid;
549         __u8   r1[3];
550         __u8   len16;
551         /*
552          * Use union for immediate data to be consistent with stack's 32 bit
553          * data and iWARP spec's 64 bit data.
554          */
555         union {
556                 struct {
557                         __be32 imm_data32;
558                         u32 reserved;
559                 } ib_imm_data;
560                 __be64 imm_data64;
561         } iw_imm_data;
562         __be32 plen;
563         __be32 stag_sink;
564         __be64 to_sink;
565 #ifndef C99_NOT_SUPPORTED
566         union {
567                 struct fw_ri_immd immd_src[0];
568                 struct fw_ri_isgl isgl_src[0];
569         } u;
570 #endif
571 };
572
573 struct fw_ri_send_wr {
574         __u8   opcode;
575         __u8   flags;
576         __u16  wrid;
577         __u8   r1[3];
578         __u8   len16;
579         __be32 sendop_pkd;
580         __be32 stag_inv;
581         __be32 plen;
582         __be32 r3;
583         __be64 r4;
584 #ifndef C99_NOT_SUPPORTED
585         union {
586                 struct fw_ri_immd immd_src[0];
587                 struct fw_ri_isgl isgl_src[0];
588         } u;
589 #endif
590 };
591
592 #define FW_RI_SEND_WR_SENDOP_S          0
593 #define FW_RI_SEND_WR_SENDOP_M          0xf
594 #define FW_RI_SEND_WR_SENDOP_V(x)       ((x) << FW_RI_SEND_WR_SENDOP_S)
595 #define FW_RI_SEND_WR_SENDOP_G(x)       \
596         (((x) >> FW_RI_SEND_WR_SENDOP_S) & FW_RI_SEND_WR_SENDOP_M)
597
598 struct fw_ri_rdma_write_cmpl_wr {
599         __u8   opcode;
600         __u8   flags;
601         __u16  wrid;
602         __u8   r1[3];
603         __u8   len16;
604         __u8   r2;
605         __u8   flags_send;
606         __u16  wrid_send;
607         __be32 stag_inv;
608         __be32 plen;
609         __be32 stag_sink;
610         __be64 to_sink;
611         union fw_ri_cmpl {
612                 struct fw_ri_immd_cmpl {
613                         __u8   op;
614                         __u8   r1[6];
615                         __u8   immdlen;
616                         __u8   data[16];
617                 } immd_src;
618                 struct fw_ri_isgl isgl_src;
619         } u_cmpl;
620         __be64 r3;
621 #ifndef C99_NOT_SUPPORTED
622         union fw_ri_write {
623                 struct fw_ri_immd immd_src[0];
624                 struct fw_ri_isgl isgl_src[0];
625         } u;
626 #endif
627 };
628
629 struct fw_ri_rdma_read_wr {
630         __u8   opcode;
631         __u8   flags;
632         __u16  wrid;
633         __u8   r1[3];
634         __u8   len16;
635         __be64 r2;
636         __be32 stag_sink;
637         __be32 to_sink_hi;
638         __be32 to_sink_lo;
639         __be32 plen;
640         __be32 stag_src;
641         __be32 to_src_hi;
642         __be32 to_src_lo;
643         __be32 r5;
644 };
645
646 struct fw_ri_recv_wr {
647         __u8   opcode;
648         __u8   r1;
649         __u16  wrid;
650         __u8   r2[3];
651         __u8   len16;
652         struct fw_ri_isgl isgl;
653 };
654
655 struct fw_ri_bind_mw_wr {
656         __u8   opcode;
657         __u8   flags;
658         __u16  wrid;
659         __u8   r1[3];
660         __u8   len16;
661         __u8   qpbinde_to_dcacpu;
662         __u8   pgsz_shift;
663         __u8   addr_type;
664         __u8   mem_perms;
665         __be32 stag_mr;
666         __be32 stag_mw;
667         __be32 r3;
668         __be64 len_mw;
669         __be64 va_fbo;
670         __be64 r4;
671 };
672
673 #define FW_RI_BIND_MW_WR_QPBINDE_S      6
674 #define FW_RI_BIND_MW_WR_QPBINDE_M      0x1
675 #define FW_RI_BIND_MW_WR_QPBINDE_V(x)   ((x) << FW_RI_BIND_MW_WR_QPBINDE_S)
676 #define FW_RI_BIND_MW_WR_QPBINDE_G(x)   \
677         (((x) >> FW_RI_BIND_MW_WR_QPBINDE_S) & FW_RI_BIND_MW_WR_QPBINDE_M)
678 #define FW_RI_BIND_MW_WR_QPBINDE_F      FW_RI_BIND_MW_WR_QPBINDE_V(1U)
679
680 #define FW_RI_BIND_MW_WR_NS_S           5
681 #define FW_RI_BIND_MW_WR_NS_M           0x1
682 #define FW_RI_BIND_MW_WR_NS_V(x)        ((x) << FW_RI_BIND_MW_WR_NS_S)
683 #define FW_RI_BIND_MW_WR_NS_G(x)        \
684         (((x) >> FW_RI_BIND_MW_WR_NS_S) & FW_RI_BIND_MW_WR_NS_M)
685 #define FW_RI_BIND_MW_WR_NS_F   FW_RI_BIND_MW_WR_NS_V(1U)
686
687 #define FW_RI_BIND_MW_WR_DCACPU_S       0
688 #define FW_RI_BIND_MW_WR_DCACPU_M       0x1f
689 #define FW_RI_BIND_MW_WR_DCACPU_V(x)    ((x) << FW_RI_BIND_MW_WR_DCACPU_S)
690 #define FW_RI_BIND_MW_WR_DCACPU_G(x)    \
691         (((x) >> FW_RI_BIND_MW_WR_DCACPU_S) & FW_RI_BIND_MW_WR_DCACPU_M)
692
693 struct fw_ri_fr_nsmr_wr {
694         __u8   opcode;
695         __u8   flags;
696         __u16  wrid;
697         __u8   r1[3];
698         __u8   len16;
699         __u8   qpbinde_to_dcacpu;
700         __u8   pgsz_shift;
701         __u8   addr_type;
702         __u8   mem_perms;
703         __be32 stag;
704         __be32 len_hi;
705         __be32 len_lo;
706         __be32 va_hi;
707         __be32 va_lo_fbo;
708 };
709
710 #define FW_RI_FR_NSMR_WR_QPBINDE_S      6
711 #define FW_RI_FR_NSMR_WR_QPBINDE_M      0x1
712 #define FW_RI_FR_NSMR_WR_QPBINDE_V(x)   ((x) << FW_RI_FR_NSMR_WR_QPBINDE_S)
713 #define FW_RI_FR_NSMR_WR_QPBINDE_G(x)   \
714         (((x) >> FW_RI_FR_NSMR_WR_QPBINDE_S) & FW_RI_FR_NSMR_WR_QPBINDE_M)
715 #define FW_RI_FR_NSMR_WR_QPBINDE_F      FW_RI_FR_NSMR_WR_QPBINDE_V(1U)
716
717 #define FW_RI_FR_NSMR_WR_NS_S           5
718 #define FW_RI_FR_NSMR_WR_NS_M           0x1
719 #define FW_RI_FR_NSMR_WR_NS_V(x)        ((x) << FW_RI_FR_NSMR_WR_NS_S)
720 #define FW_RI_FR_NSMR_WR_NS_G(x)        \
721         (((x) >> FW_RI_FR_NSMR_WR_NS_S) & FW_RI_FR_NSMR_WR_NS_M)
722 #define FW_RI_FR_NSMR_WR_NS_F   FW_RI_FR_NSMR_WR_NS_V(1U)
723
724 #define FW_RI_FR_NSMR_WR_DCACPU_S       0
725 #define FW_RI_FR_NSMR_WR_DCACPU_M       0x1f
726 #define FW_RI_FR_NSMR_WR_DCACPU_V(x)    ((x) << FW_RI_FR_NSMR_WR_DCACPU_S)
727 #define FW_RI_FR_NSMR_WR_DCACPU_G(x)    \
728         (((x) >> FW_RI_FR_NSMR_WR_DCACPU_S) & FW_RI_FR_NSMR_WR_DCACPU_M)
729
730 struct fw_ri_fr_nsmr_tpte_wr {
731         __u8    opcode;
732         __u8   flags;
733         __u16  wrid;
734         __u8   r1[3];
735         __u8   len16;
736         __be32  r2;
737         __be32  stag;
738         struct fw_ri_tpte tpte;
739         __u64  pbl[2];
740 };
741
742 struct fw_ri_inv_lstag_wr {
743         __u8   opcode;
744         __u8   flags;
745         __u16  wrid;
746         __u8   r1[3];
747         __u8   len16;
748         __be32 r2;
749         __be32 stag_inv;
750 };
751
752 enum fw_ri_type {
753         FW_RI_TYPE_INIT,
754         FW_RI_TYPE_FINI,
755         FW_RI_TYPE_TERMINATE
756 };
757
758 enum fw_ri_init_p2ptype {
759         FW_RI_INIT_P2PTYPE_RDMA_WRITE           = FW_RI_RDMA_WRITE,
760         FW_RI_INIT_P2PTYPE_READ_REQ             = FW_RI_READ_REQ,
761         FW_RI_INIT_P2PTYPE_SEND                 = FW_RI_SEND,
762         FW_RI_INIT_P2PTYPE_SEND_WITH_INV        = FW_RI_SEND_WITH_INV,
763         FW_RI_INIT_P2PTYPE_SEND_WITH_SE         = FW_RI_SEND_WITH_SE,
764         FW_RI_INIT_P2PTYPE_SEND_WITH_SE_INV     = FW_RI_SEND_WITH_SE_INV,
765         FW_RI_INIT_P2PTYPE_DISABLED             = 0xf,
766 };
767
768 enum fw_ri_init_rqeqid_srq {
769         FW_RI_INIT_RQEQID_SRQ                   = 1 << 31,
770 };
771
772 struct fw_ri_wr {
773         __be32 op_compl;
774         __be32 flowid_len16;
775         __u64  cookie;
776         union fw_ri {
777                 struct fw_ri_init {
778                         __u8   type;
779                         __u8   mpareqbit_p2ptype;
780                         __u8   r4[2];
781                         __u8   mpa_attrs;
782                         __u8   qp_caps;
783                         __be16 nrqe;
784                         __be32 pdid;
785                         __be32 qpid;
786                         __be32 sq_eqid;
787                         __be32 rq_eqid;
788                         __be32 scqid;
789                         __be32 rcqid;
790                         __be32 ord_max;
791                         __be32 ird_max;
792                         __be32 iss;
793                         __be32 irs;
794                         __be32 hwrqsize;
795                         __be32 hwrqaddr;
796                         __be64 r5;
797                         union fw_ri_init_p2p {
798                                 struct fw_ri_rdma_write_wr write;
799                                 struct fw_ri_rdma_read_wr read;
800                                 struct fw_ri_send_wr send;
801                         } u;
802                 } init;
803                 struct fw_ri_fini {
804                         __u8   type;
805                         __u8   r3[7];
806                         __be64 r4;
807                 } fini;
808                 struct fw_ri_terminate {
809                         __u8   type;
810                         __u8   r3[3];
811                         __be32 immdlen;
812                         __u8   termmsg[40];
813                 } terminate;
814         } u;
815 };
816
817 #define FW_RI_WR_MPAREQBIT_S    7
818 #define FW_RI_WR_MPAREQBIT_M    0x1
819 #define FW_RI_WR_MPAREQBIT_V(x) ((x) << FW_RI_WR_MPAREQBIT_S)
820 #define FW_RI_WR_MPAREQBIT_G(x) \
821         (((x) >> FW_RI_WR_MPAREQBIT_S) & FW_RI_WR_MPAREQBIT_M)
822 #define FW_RI_WR_MPAREQBIT_F    FW_RI_WR_MPAREQBIT_V(1U)
823
824 #define FW_RI_WR_P2PTYPE_S      0
825 #define FW_RI_WR_P2PTYPE_M      0xf
826 #define FW_RI_WR_P2PTYPE_V(x)   ((x) << FW_RI_WR_P2PTYPE_S)
827 #define FW_RI_WR_P2PTYPE_G(x)   \
828         (((x) >> FW_RI_WR_P2PTYPE_S) & FW_RI_WR_P2PTYPE_M)
829
830 #endif /* _T4FW_RI_API_H_ */