xref: /openbmc/linux/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
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  	struct fw_ri_dsge_pair sge[];
126  };
127  
128  struct fw_ri_sge {
129  	__be32 stag;
130  	__be32 len;
131  	__be64 to;
132  };
133  
134  struct fw_ri_isgl {
135  	__u8	op;
136  	__u8	r1;
137  	__be16	nsge;
138  	__be32	r2;
139  	struct fw_ri_sge sge[];
140  };
141  
142  struct fw_ri_immd {
143  	__u8	op;
144  	__u8	r1;
145  	__be16	r2;
146  	__be32	immdlen;
147  	__u8	data[];
148  };
149  
150  struct fw_ri_tpte {
151  	__be32 valid_to_pdid;
152  	__be32 locread_to_qpid;
153  	__be32 nosnoop_pbladdr;
154  	__be32 len_lo;
155  	__be32 va_hi;
156  	__be32 va_lo_fbo;
157  	__be32 dca_mwbcnt_pstag;
158  	__be32 len_hi;
159  };
160  
161  #define FW_RI_TPTE_VALID_S		31
162  #define FW_RI_TPTE_VALID_M		0x1
163  #define FW_RI_TPTE_VALID_V(x)		((x) << FW_RI_TPTE_VALID_S)
164  #define FW_RI_TPTE_VALID_G(x)		\
165  	(((x) >> FW_RI_TPTE_VALID_S) & FW_RI_TPTE_VALID_M)
166  #define FW_RI_TPTE_VALID_F		FW_RI_TPTE_VALID_V(1U)
167  
168  #define FW_RI_TPTE_STAGKEY_S		23
169  #define FW_RI_TPTE_STAGKEY_M		0xff
170  #define FW_RI_TPTE_STAGKEY_V(x)		((x) << FW_RI_TPTE_STAGKEY_S)
171  #define FW_RI_TPTE_STAGKEY_G(x)		\
172  	(((x) >> FW_RI_TPTE_STAGKEY_S) & FW_RI_TPTE_STAGKEY_M)
173  
174  #define FW_RI_TPTE_STAGSTATE_S		22
175  #define FW_RI_TPTE_STAGSTATE_M		0x1
176  #define FW_RI_TPTE_STAGSTATE_V(x)	((x) << FW_RI_TPTE_STAGSTATE_S)
177  #define FW_RI_TPTE_STAGSTATE_G(x)	\
178  	(((x) >> FW_RI_TPTE_STAGSTATE_S) & FW_RI_TPTE_STAGSTATE_M)
179  #define FW_RI_TPTE_STAGSTATE_F		FW_RI_TPTE_STAGSTATE_V(1U)
180  
181  #define FW_RI_TPTE_STAGTYPE_S		20
182  #define FW_RI_TPTE_STAGTYPE_M		0x3
183  #define FW_RI_TPTE_STAGTYPE_V(x)	((x) << FW_RI_TPTE_STAGTYPE_S)
184  #define FW_RI_TPTE_STAGTYPE_G(x)	\
185  	(((x) >> FW_RI_TPTE_STAGTYPE_S) & FW_RI_TPTE_STAGTYPE_M)
186  
187  #define FW_RI_TPTE_PDID_S		0
188  #define FW_RI_TPTE_PDID_M		0xfffff
189  #define FW_RI_TPTE_PDID_V(x)		((x) << FW_RI_TPTE_PDID_S)
190  #define FW_RI_TPTE_PDID_G(x)		\
191  	(((x) >> FW_RI_TPTE_PDID_S) & FW_RI_TPTE_PDID_M)
192  
193  #define FW_RI_TPTE_PERM_S		28
194  #define FW_RI_TPTE_PERM_M		0xf
195  #define FW_RI_TPTE_PERM_V(x)		((x) << FW_RI_TPTE_PERM_S)
196  #define FW_RI_TPTE_PERM_G(x)		\
197  	(((x) >> FW_RI_TPTE_PERM_S) & FW_RI_TPTE_PERM_M)
198  
199  #define FW_RI_TPTE_REMINVDIS_S		27
200  #define FW_RI_TPTE_REMINVDIS_M		0x1
201  #define FW_RI_TPTE_REMINVDIS_V(x)	((x) << FW_RI_TPTE_REMINVDIS_S)
202  #define FW_RI_TPTE_REMINVDIS_G(x)	\
203  	(((x) >> FW_RI_TPTE_REMINVDIS_S) & FW_RI_TPTE_REMINVDIS_M)
204  #define FW_RI_TPTE_REMINVDIS_F		FW_RI_TPTE_REMINVDIS_V(1U)
205  
206  #define FW_RI_TPTE_ADDRTYPE_S		26
207  #define FW_RI_TPTE_ADDRTYPE_M		1
208  #define FW_RI_TPTE_ADDRTYPE_V(x)	((x) << FW_RI_TPTE_ADDRTYPE_S)
209  #define FW_RI_TPTE_ADDRTYPE_G(x)	\
210  	(((x) >> FW_RI_TPTE_ADDRTYPE_S) & FW_RI_TPTE_ADDRTYPE_M)
211  #define FW_RI_TPTE_ADDRTYPE_F		FW_RI_TPTE_ADDRTYPE_V(1U)
212  
213  #define FW_RI_TPTE_MWBINDEN_S		25
214  #define FW_RI_TPTE_MWBINDEN_M		0x1
215  #define FW_RI_TPTE_MWBINDEN_V(x)	((x) << FW_RI_TPTE_MWBINDEN_S)
216  #define FW_RI_TPTE_MWBINDEN_G(x)	\
217  	(((x) >> FW_RI_TPTE_MWBINDEN_S) & FW_RI_TPTE_MWBINDEN_M)
218  #define FW_RI_TPTE_MWBINDEN_F		FW_RI_TPTE_MWBINDEN_V(1U)
219  
220  #define FW_RI_TPTE_PS_S			20
221  #define FW_RI_TPTE_PS_M			0x1f
222  #define FW_RI_TPTE_PS_V(x)		((x) << FW_RI_TPTE_PS_S)
223  #define FW_RI_TPTE_PS_G(x)		\
224  	(((x) >> FW_RI_TPTE_PS_S) & FW_RI_TPTE_PS_M)
225  
226  #define FW_RI_TPTE_QPID_S		0
227  #define FW_RI_TPTE_QPID_M		0xfffff
228  #define FW_RI_TPTE_QPID_V(x)		((x) << FW_RI_TPTE_QPID_S)
229  #define FW_RI_TPTE_QPID_G(x)		\
230  	(((x) >> FW_RI_TPTE_QPID_S) & FW_RI_TPTE_QPID_M)
231  
232  #define FW_RI_TPTE_NOSNOOP_S		30
233  #define FW_RI_TPTE_NOSNOOP_M		0x1
234  #define FW_RI_TPTE_NOSNOOP_V(x)		((x) << FW_RI_TPTE_NOSNOOP_S)
235  #define FW_RI_TPTE_NOSNOOP_G(x)		\
236  	(((x) >> FW_RI_TPTE_NOSNOOP_S) & FW_RI_TPTE_NOSNOOP_M)
237  #define FW_RI_TPTE_NOSNOOP_F		FW_RI_TPTE_NOSNOOP_V(1U)
238  
239  #define FW_RI_TPTE_PBLADDR_S		0
240  #define FW_RI_TPTE_PBLADDR_M		0x1fffffff
241  #define FW_RI_TPTE_PBLADDR_V(x)		((x) << FW_RI_TPTE_PBLADDR_S)
242  #define FW_RI_TPTE_PBLADDR_G(x)		\
243  	(((x) >> FW_RI_TPTE_PBLADDR_S) & FW_RI_TPTE_PBLADDR_M)
244  
245  #define FW_RI_TPTE_DCA_S		24
246  #define FW_RI_TPTE_DCA_M		0x1f
247  #define FW_RI_TPTE_DCA_V(x)		((x) << FW_RI_TPTE_DCA_S)
248  #define FW_RI_TPTE_DCA_G(x)		\
249  	(((x) >> FW_RI_TPTE_DCA_S) & FW_RI_TPTE_DCA_M)
250  
251  #define FW_RI_TPTE_MWBCNT_PSTAG_S	0
252  #define FW_RI_TPTE_MWBCNT_PSTAG_M	0xffffff
253  #define FW_RI_TPTE_MWBCNT_PSTAT_V(x)	\
254  	((x) << FW_RI_TPTE_MWBCNT_PSTAG_S)
255  #define FW_RI_TPTE_MWBCNT_PSTAG_G(x)	\
256  	(((x) >> FW_RI_TPTE_MWBCNT_PSTAG_S) & FW_RI_TPTE_MWBCNT_PSTAG_M)
257  
258  enum fw_ri_res_type {
259  	FW_RI_RES_TYPE_SQ,
260  	FW_RI_RES_TYPE_RQ,
261  	FW_RI_RES_TYPE_CQ,
262  	FW_RI_RES_TYPE_SRQ,
263  };
264  
265  enum fw_ri_res_op {
266  	FW_RI_RES_OP_WRITE,
267  	FW_RI_RES_OP_RESET,
268  };
269  
270  struct fw_ri_res {
271  	union fw_ri_restype {
272  		struct fw_ri_res_sqrq {
273  			__u8   restype;
274  			__u8   op;
275  			__be16 r3;
276  			__be32 eqid;
277  			__be32 r4[2];
278  			__be32 fetchszm_to_iqid;
279  			__be32 dcaen_to_eqsize;
280  			__be64 eqaddr;
281  		} sqrq;
282  		struct fw_ri_res_cq {
283  			__u8   restype;
284  			__u8   op;
285  			__be16 r3;
286  			__be32 iqid;
287  			__be32 r4[2];
288  			__be32 iqandst_to_iqandstindex;
289  			__be16 iqdroprss_to_iqesize;
290  			__be16 iqsize;
291  			__be64 iqaddr;
292  			__be32 iqns_iqro;
293  			__be32 r6_lo;
294  			__be64 r7;
295  		} cq;
296  		struct fw_ri_res_srq {
297  			__u8   restype;
298  			__u8   op;
299  			__be16 r3;
300  			__be32 eqid;
301  			__be32 r4[2];
302  			__be32 fetchszm_to_iqid;
303  			__be32 dcaen_to_eqsize;
304  			__be64 eqaddr;
305  			__be32 srqid;
306  			__be32 pdid;
307  			__be32 hwsrqsize;
308  			__be32 hwsrqaddr;
309  		} srq;
310  	} u;
311  };
312  
313  struct fw_ri_res_wr {
314  	__be32 op_nres;
315  	__be32 len16_pkd;
316  	__u64  cookie;
317  	struct fw_ri_res res[];
318  };
319  
320  #define FW_RI_RES_WR_NRES_S	0
321  #define FW_RI_RES_WR_NRES_M	0xff
322  #define FW_RI_RES_WR_NRES_V(x)	((x) << FW_RI_RES_WR_NRES_S)
323  #define FW_RI_RES_WR_NRES_G(x)	\
324  	(((x) >> FW_RI_RES_WR_NRES_S) & FW_RI_RES_WR_NRES_M)
325  
326  #define FW_RI_RES_WR_FETCHSZM_S		26
327  #define FW_RI_RES_WR_FETCHSZM_M		0x1
328  #define FW_RI_RES_WR_FETCHSZM_V(x)	((x) << FW_RI_RES_WR_FETCHSZM_S)
329  #define FW_RI_RES_WR_FETCHSZM_G(x)	\
330  	(((x) >> FW_RI_RES_WR_FETCHSZM_S) & FW_RI_RES_WR_FETCHSZM_M)
331  #define FW_RI_RES_WR_FETCHSZM_F	FW_RI_RES_WR_FETCHSZM_V(1U)
332  
333  #define FW_RI_RES_WR_STATUSPGNS_S	25
334  #define FW_RI_RES_WR_STATUSPGNS_M	0x1
335  #define FW_RI_RES_WR_STATUSPGNS_V(x)	((x) << FW_RI_RES_WR_STATUSPGNS_S)
336  #define FW_RI_RES_WR_STATUSPGNS_G(x)	\
337  	(((x) >> FW_RI_RES_WR_STATUSPGNS_S) & FW_RI_RES_WR_STATUSPGNS_M)
338  #define FW_RI_RES_WR_STATUSPGNS_F	FW_RI_RES_WR_STATUSPGNS_V(1U)
339  
340  #define FW_RI_RES_WR_STATUSPGRO_S	24
341  #define FW_RI_RES_WR_STATUSPGRO_M	0x1
342  #define FW_RI_RES_WR_STATUSPGRO_V(x)	((x) << FW_RI_RES_WR_STATUSPGRO_S)
343  #define FW_RI_RES_WR_STATUSPGRO_G(x)	\
344  	(((x) >> FW_RI_RES_WR_STATUSPGRO_S) & FW_RI_RES_WR_STATUSPGRO_M)
345  #define FW_RI_RES_WR_STATUSPGRO_F	FW_RI_RES_WR_STATUSPGRO_V(1U)
346  
347  #define FW_RI_RES_WR_FETCHNS_S		23
348  #define FW_RI_RES_WR_FETCHNS_M		0x1
349  #define FW_RI_RES_WR_FETCHNS_V(x)	((x) << FW_RI_RES_WR_FETCHNS_S)
350  #define FW_RI_RES_WR_FETCHNS_G(x)	\
351  	(((x) >> FW_RI_RES_WR_FETCHNS_S) & FW_RI_RES_WR_FETCHNS_M)
352  #define FW_RI_RES_WR_FETCHNS_F	FW_RI_RES_WR_FETCHNS_V(1U)
353  
354  #define FW_RI_RES_WR_FETCHRO_S		22
355  #define FW_RI_RES_WR_FETCHRO_M		0x1
356  #define FW_RI_RES_WR_FETCHRO_V(x)	((x) << FW_RI_RES_WR_FETCHRO_S)
357  #define FW_RI_RES_WR_FETCHRO_G(x)	\
358  	(((x) >> FW_RI_RES_WR_FETCHRO_S) & FW_RI_RES_WR_FETCHRO_M)
359  #define FW_RI_RES_WR_FETCHRO_F	FW_RI_RES_WR_FETCHRO_V(1U)
360  
361  #define FW_RI_RES_WR_HOSTFCMODE_S	20
362  #define FW_RI_RES_WR_HOSTFCMODE_M	0x3
363  #define FW_RI_RES_WR_HOSTFCMODE_V(x)	((x) << FW_RI_RES_WR_HOSTFCMODE_S)
364  #define FW_RI_RES_WR_HOSTFCMODE_G(x)	\
365  	(((x) >> FW_RI_RES_WR_HOSTFCMODE_S) & FW_RI_RES_WR_HOSTFCMODE_M)
366  
367  #define FW_RI_RES_WR_CPRIO_S	19
368  #define FW_RI_RES_WR_CPRIO_M	0x1
369  #define FW_RI_RES_WR_CPRIO_V(x)	((x) << FW_RI_RES_WR_CPRIO_S)
370  #define FW_RI_RES_WR_CPRIO_G(x)	\
371  	(((x) >> FW_RI_RES_WR_CPRIO_S) & FW_RI_RES_WR_CPRIO_M)
372  #define FW_RI_RES_WR_CPRIO_F	FW_RI_RES_WR_CPRIO_V(1U)
373  
374  #define FW_RI_RES_WR_ONCHIP_S		18
375  #define FW_RI_RES_WR_ONCHIP_M		0x1
376  #define FW_RI_RES_WR_ONCHIP_V(x)	((x) << FW_RI_RES_WR_ONCHIP_S)
377  #define FW_RI_RES_WR_ONCHIP_G(x)	\
378  	(((x) >> FW_RI_RES_WR_ONCHIP_S) & FW_RI_RES_WR_ONCHIP_M)
379  #define FW_RI_RES_WR_ONCHIP_F	FW_RI_RES_WR_ONCHIP_V(1U)
380  
381  #define FW_RI_RES_WR_PCIECHN_S		16
382  #define FW_RI_RES_WR_PCIECHN_M		0x3
383  #define FW_RI_RES_WR_PCIECHN_V(x)	((x) << FW_RI_RES_WR_PCIECHN_S)
384  #define FW_RI_RES_WR_PCIECHN_G(x)	\
385  	(((x) >> FW_RI_RES_WR_PCIECHN_S) & FW_RI_RES_WR_PCIECHN_M)
386  
387  #define FW_RI_RES_WR_IQID_S	0
388  #define FW_RI_RES_WR_IQID_M	0xffff
389  #define FW_RI_RES_WR_IQID_V(x)	((x) << FW_RI_RES_WR_IQID_S)
390  #define FW_RI_RES_WR_IQID_G(x)	\
391  	(((x) >> FW_RI_RES_WR_IQID_S) & FW_RI_RES_WR_IQID_M)
392  
393  #define FW_RI_RES_WR_DCAEN_S	31
394  #define FW_RI_RES_WR_DCAEN_M	0x1
395  #define FW_RI_RES_WR_DCAEN_V(x)	((x) << FW_RI_RES_WR_DCAEN_S)
396  #define FW_RI_RES_WR_DCAEN_G(x)	\
397  	(((x) >> FW_RI_RES_WR_DCAEN_S) & FW_RI_RES_WR_DCAEN_M)
398  #define FW_RI_RES_WR_DCAEN_F	FW_RI_RES_WR_DCAEN_V(1U)
399  
400  #define FW_RI_RES_WR_DCACPU_S		26
401  #define FW_RI_RES_WR_DCACPU_M		0x1f
402  #define FW_RI_RES_WR_DCACPU_V(x)	((x) << FW_RI_RES_WR_DCACPU_S)
403  #define FW_RI_RES_WR_DCACPU_G(x)	\
404  	(((x) >> FW_RI_RES_WR_DCACPU_S) & FW_RI_RES_WR_DCACPU_M)
405  
406  #define FW_RI_RES_WR_FBMIN_S	23
407  #define FW_RI_RES_WR_FBMIN_M	0x7
408  #define FW_RI_RES_WR_FBMIN_V(x)	((x) << FW_RI_RES_WR_FBMIN_S)
409  #define FW_RI_RES_WR_FBMIN_G(x)	\
410  	(((x) >> FW_RI_RES_WR_FBMIN_S) & FW_RI_RES_WR_FBMIN_M)
411  
412  #define FW_RI_RES_WR_FBMAX_S	20
413  #define FW_RI_RES_WR_FBMAX_M	0x7
414  #define FW_RI_RES_WR_FBMAX_V(x)	((x) << FW_RI_RES_WR_FBMAX_S)
415  #define FW_RI_RES_WR_FBMAX_G(x)	\
416  	(((x) >> FW_RI_RES_WR_FBMAX_S) & FW_RI_RES_WR_FBMAX_M)
417  
418  #define FW_RI_RES_WR_CIDXFTHRESHO_S	19
419  #define FW_RI_RES_WR_CIDXFTHRESHO_M	0x1
420  #define FW_RI_RES_WR_CIDXFTHRESHO_V(x)	((x) << FW_RI_RES_WR_CIDXFTHRESHO_S)
421  #define FW_RI_RES_WR_CIDXFTHRESHO_G(x)	\
422  	(((x) >> FW_RI_RES_WR_CIDXFTHRESHO_S) & FW_RI_RES_WR_CIDXFTHRESHO_M)
423  #define FW_RI_RES_WR_CIDXFTHRESHO_F	FW_RI_RES_WR_CIDXFTHRESHO_V(1U)
424  
425  #define FW_RI_RES_WR_CIDXFTHRESH_S	16
426  #define FW_RI_RES_WR_CIDXFTHRESH_M	0x7
427  #define FW_RI_RES_WR_CIDXFTHRESH_V(x)	((x) << FW_RI_RES_WR_CIDXFTHRESH_S)
428  #define FW_RI_RES_WR_CIDXFTHRESH_G(x)	\
429  	(((x) >> FW_RI_RES_WR_CIDXFTHRESH_S) & FW_RI_RES_WR_CIDXFTHRESH_M)
430  
431  #define FW_RI_RES_WR_EQSIZE_S		0
432  #define FW_RI_RES_WR_EQSIZE_M		0xffff
433  #define FW_RI_RES_WR_EQSIZE_V(x)	((x) << FW_RI_RES_WR_EQSIZE_S)
434  #define FW_RI_RES_WR_EQSIZE_G(x)	\
435  	(((x) >> FW_RI_RES_WR_EQSIZE_S) & FW_RI_RES_WR_EQSIZE_M)
436  
437  #define FW_RI_RES_WR_IQANDST_S		15
438  #define FW_RI_RES_WR_IQANDST_M		0x1
439  #define FW_RI_RES_WR_IQANDST_V(x)	((x) << FW_RI_RES_WR_IQANDST_S)
440  #define FW_RI_RES_WR_IQANDST_G(x)	\
441  	(((x) >> FW_RI_RES_WR_IQANDST_S) & FW_RI_RES_WR_IQANDST_M)
442  #define FW_RI_RES_WR_IQANDST_F	FW_RI_RES_WR_IQANDST_V(1U)
443  
444  #define FW_RI_RES_WR_IQANUS_S		14
445  #define FW_RI_RES_WR_IQANUS_M		0x1
446  #define FW_RI_RES_WR_IQANUS_V(x)	((x) << FW_RI_RES_WR_IQANUS_S)
447  #define FW_RI_RES_WR_IQANUS_G(x)	\
448  	(((x) >> FW_RI_RES_WR_IQANUS_S) & FW_RI_RES_WR_IQANUS_M)
449  #define FW_RI_RES_WR_IQANUS_F	FW_RI_RES_WR_IQANUS_V(1U)
450  
451  #define FW_RI_RES_WR_IQANUD_S		12
452  #define FW_RI_RES_WR_IQANUD_M		0x3
453  #define FW_RI_RES_WR_IQANUD_V(x)	((x) << FW_RI_RES_WR_IQANUD_S)
454  #define FW_RI_RES_WR_IQANUD_G(x)	\
455  	(((x) >> FW_RI_RES_WR_IQANUD_S) & FW_RI_RES_WR_IQANUD_M)
456  
457  #define FW_RI_RES_WR_IQANDSTINDEX_S	0
458  #define FW_RI_RES_WR_IQANDSTINDEX_M	0xfff
459  #define FW_RI_RES_WR_IQANDSTINDEX_V(x)	((x) << FW_RI_RES_WR_IQANDSTINDEX_S)
460  #define FW_RI_RES_WR_IQANDSTINDEX_G(x)	\
461  	(((x) >> FW_RI_RES_WR_IQANDSTINDEX_S) & FW_RI_RES_WR_IQANDSTINDEX_M)
462  
463  #define FW_RI_RES_WR_IQDROPRSS_S	15
464  #define FW_RI_RES_WR_IQDROPRSS_M	0x1
465  #define FW_RI_RES_WR_IQDROPRSS_V(x)	((x) << FW_RI_RES_WR_IQDROPRSS_S)
466  #define FW_RI_RES_WR_IQDROPRSS_G(x)	\
467  	(((x) >> FW_RI_RES_WR_IQDROPRSS_S) & FW_RI_RES_WR_IQDROPRSS_M)
468  #define FW_RI_RES_WR_IQDROPRSS_F	FW_RI_RES_WR_IQDROPRSS_V(1U)
469  
470  #define FW_RI_RES_WR_IQGTSMODE_S	14
471  #define FW_RI_RES_WR_IQGTSMODE_M	0x1
472  #define FW_RI_RES_WR_IQGTSMODE_V(x)	((x) << FW_RI_RES_WR_IQGTSMODE_S)
473  #define FW_RI_RES_WR_IQGTSMODE_G(x)	\
474  	(((x) >> FW_RI_RES_WR_IQGTSMODE_S) & FW_RI_RES_WR_IQGTSMODE_M)
475  #define FW_RI_RES_WR_IQGTSMODE_F	FW_RI_RES_WR_IQGTSMODE_V(1U)
476  
477  #define FW_RI_RES_WR_IQPCIECH_S		12
478  #define FW_RI_RES_WR_IQPCIECH_M		0x3
479  #define FW_RI_RES_WR_IQPCIECH_V(x)	((x) << FW_RI_RES_WR_IQPCIECH_S)
480  #define FW_RI_RES_WR_IQPCIECH_G(x)	\
481  	(((x) >> FW_RI_RES_WR_IQPCIECH_S) & FW_RI_RES_WR_IQPCIECH_M)
482  
483  #define FW_RI_RES_WR_IQDCAEN_S		11
484  #define FW_RI_RES_WR_IQDCAEN_M		0x1
485  #define FW_RI_RES_WR_IQDCAEN_V(x)	((x) << FW_RI_RES_WR_IQDCAEN_S)
486  #define FW_RI_RES_WR_IQDCAEN_G(x)	\
487  	(((x) >> FW_RI_RES_WR_IQDCAEN_S) & FW_RI_RES_WR_IQDCAEN_M)
488  #define FW_RI_RES_WR_IQDCAEN_F	FW_RI_RES_WR_IQDCAEN_V(1U)
489  
490  #define FW_RI_RES_WR_IQDCACPU_S		6
491  #define FW_RI_RES_WR_IQDCACPU_M		0x1f
492  #define FW_RI_RES_WR_IQDCACPU_V(x)	((x) << FW_RI_RES_WR_IQDCACPU_S)
493  #define FW_RI_RES_WR_IQDCACPU_G(x)	\
494  	(((x) >> FW_RI_RES_WR_IQDCACPU_S) & FW_RI_RES_WR_IQDCACPU_M)
495  
496  #define FW_RI_RES_WR_IQINTCNTTHRESH_S		4
497  #define FW_RI_RES_WR_IQINTCNTTHRESH_M		0x3
498  #define FW_RI_RES_WR_IQINTCNTTHRESH_V(x)	\
499  	((x) << FW_RI_RES_WR_IQINTCNTTHRESH_S)
500  #define FW_RI_RES_WR_IQINTCNTTHRESH_G(x)	\
501  	(((x) >> FW_RI_RES_WR_IQINTCNTTHRESH_S) & FW_RI_RES_WR_IQINTCNTTHRESH_M)
502  
503  #define FW_RI_RES_WR_IQO_S	3
504  #define FW_RI_RES_WR_IQO_M	0x1
505  #define FW_RI_RES_WR_IQO_V(x)	((x) << FW_RI_RES_WR_IQO_S)
506  #define FW_RI_RES_WR_IQO_G(x)	\
507  	(((x) >> FW_RI_RES_WR_IQO_S) & FW_RI_RES_WR_IQO_M)
508  #define FW_RI_RES_WR_IQO_F	FW_RI_RES_WR_IQO_V(1U)
509  
510  #define FW_RI_RES_WR_IQCPRIO_S		2
511  #define FW_RI_RES_WR_IQCPRIO_M		0x1
512  #define FW_RI_RES_WR_IQCPRIO_V(x)	((x) << FW_RI_RES_WR_IQCPRIO_S)
513  #define FW_RI_RES_WR_IQCPRIO_G(x)	\
514  	(((x) >> FW_RI_RES_WR_IQCPRIO_S) & FW_RI_RES_WR_IQCPRIO_M)
515  #define FW_RI_RES_WR_IQCPRIO_F	FW_RI_RES_WR_IQCPRIO_V(1U)
516  
517  #define FW_RI_RES_WR_IQESIZE_S		0
518  #define FW_RI_RES_WR_IQESIZE_M		0x3
519  #define FW_RI_RES_WR_IQESIZE_V(x)	((x) << FW_RI_RES_WR_IQESIZE_S)
520  #define FW_RI_RES_WR_IQESIZE_G(x)	\
521  	(((x) >> FW_RI_RES_WR_IQESIZE_S) & FW_RI_RES_WR_IQESIZE_M)
522  
523  #define FW_RI_RES_WR_IQNS_S	31
524  #define FW_RI_RES_WR_IQNS_M	0x1
525  #define FW_RI_RES_WR_IQNS_V(x)	((x) << FW_RI_RES_WR_IQNS_S)
526  #define FW_RI_RES_WR_IQNS_G(x)	\
527  	(((x) >> FW_RI_RES_WR_IQNS_S) & FW_RI_RES_WR_IQNS_M)
528  #define FW_RI_RES_WR_IQNS_F	FW_RI_RES_WR_IQNS_V(1U)
529  
530  #define FW_RI_RES_WR_IQRO_S	30
531  #define FW_RI_RES_WR_IQRO_M	0x1
532  #define FW_RI_RES_WR_IQRO_V(x)	((x) << FW_RI_RES_WR_IQRO_S)
533  #define FW_RI_RES_WR_IQRO_G(x)	\
534  	(((x) >> FW_RI_RES_WR_IQRO_S) & FW_RI_RES_WR_IQRO_M)
535  #define FW_RI_RES_WR_IQRO_F	FW_RI_RES_WR_IQRO_V(1U)
536  
537  struct fw_ri_rdma_write_wr {
538  	__u8   opcode;
539  	__u8   flags;
540  	__u16  wrid;
541  	__u8   r1[3];
542  	__u8   len16;
543  	/*
544  	 * Use union for immediate data to be consistent with stack's 32 bit
545  	 * data and iWARP spec's 64 bit data.
546  	 */
547  	union {
548  		struct {
549  			__be32 imm_data32;
550  			u32 reserved;
551  		} ib_imm_data;
552  		__be64 imm_data64;
553  	} iw_imm_data;
554  	__be32 plen;
555  	__be32 stag_sink;
556  	__be64 to_sink;
557  	union {
558  		DECLARE_FLEX_ARRAY(struct fw_ri_immd, immd_src);
559  		DECLARE_FLEX_ARRAY(struct fw_ri_isgl, isgl_src);
560  	} u;
561  };
562  
563  struct fw_ri_send_wr {
564  	__u8   opcode;
565  	__u8   flags;
566  	__u16  wrid;
567  	__u8   r1[3];
568  	__u8   len16;
569  	__be32 sendop_pkd;
570  	__be32 stag_inv;
571  	__be32 plen;
572  	__be32 r3;
573  	__be64 r4;
574  	union {
575  		DECLARE_FLEX_ARRAY(struct fw_ri_immd, immd_src);
576  		DECLARE_FLEX_ARRAY(struct fw_ri_isgl, isgl_src);
577  	} u;
578  };
579  
580  #define FW_RI_SEND_WR_SENDOP_S		0
581  #define FW_RI_SEND_WR_SENDOP_M		0xf
582  #define FW_RI_SEND_WR_SENDOP_V(x)	((x) << FW_RI_SEND_WR_SENDOP_S)
583  #define FW_RI_SEND_WR_SENDOP_G(x)	\
584  	(((x) >> FW_RI_SEND_WR_SENDOP_S) & FW_RI_SEND_WR_SENDOP_M)
585  
586  struct fw_ri_rdma_write_cmpl_wr {
587  	__u8   opcode;
588  	__u8   flags;
589  	__u16  wrid;
590  	__u8   r1[3];
591  	__u8   len16;
592  	__u8   r2;
593  	__u8   flags_send;
594  	__u16  wrid_send;
595  	__be32 stag_inv;
596  	__be32 plen;
597  	__be32 stag_sink;
598  	__be64 to_sink;
599  	union fw_ri_cmpl {
600  		struct fw_ri_immd_cmpl {
601  			__u8   op;
602  			__u8   r1[6];
603  			__u8   immdlen;
604  			__u8   data[16];
605  		} immd_src;
606  		struct fw_ri_isgl isgl_src;
607  	} u_cmpl;
608  	__be64 r3;
609  	union fw_ri_write {
610  		DECLARE_FLEX_ARRAY(struct fw_ri_immd, immd_src);
611  		DECLARE_FLEX_ARRAY(struct fw_ri_isgl, isgl_src);
612  	} u;
613  };
614  
615  struct fw_ri_rdma_read_wr {
616  	__u8   opcode;
617  	__u8   flags;
618  	__u16  wrid;
619  	__u8   r1[3];
620  	__u8   len16;
621  	__be64 r2;
622  	__be32 stag_sink;
623  	__be32 to_sink_hi;
624  	__be32 to_sink_lo;
625  	__be32 plen;
626  	__be32 stag_src;
627  	__be32 to_src_hi;
628  	__be32 to_src_lo;
629  	__be32 r5;
630  };
631  
632  struct fw_ri_recv_wr {
633  	__u8   opcode;
634  	__u8   r1;
635  	__u16  wrid;
636  	__u8   r2[3];
637  	__u8   len16;
638  	struct fw_ri_isgl isgl;
639  };
640  
641  struct fw_ri_bind_mw_wr {
642  	__u8   opcode;
643  	__u8   flags;
644  	__u16  wrid;
645  	__u8   r1[3];
646  	__u8   len16;
647  	__u8   qpbinde_to_dcacpu;
648  	__u8   pgsz_shift;
649  	__u8   addr_type;
650  	__u8   mem_perms;
651  	__be32 stag_mr;
652  	__be32 stag_mw;
653  	__be32 r3;
654  	__be64 len_mw;
655  	__be64 va_fbo;
656  	__be64 r4;
657  };
658  
659  #define FW_RI_BIND_MW_WR_QPBINDE_S	6
660  #define FW_RI_BIND_MW_WR_QPBINDE_M	0x1
661  #define FW_RI_BIND_MW_WR_QPBINDE_V(x)	((x) << FW_RI_BIND_MW_WR_QPBINDE_S)
662  #define FW_RI_BIND_MW_WR_QPBINDE_G(x)	\
663  	(((x) >> FW_RI_BIND_MW_WR_QPBINDE_S) & FW_RI_BIND_MW_WR_QPBINDE_M)
664  #define FW_RI_BIND_MW_WR_QPBINDE_F	FW_RI_BIND_MW_WR_QPBINDE_V(1U)
665  
666  #define FW_RI_BIND_MW_WR_NS_S		5
667  #define FW_RI_BIND_MW_WR_NS_M		0x1
668  #define FW_RI_BIND_MW_WR_NS_V(x)	((x) << FW_RI_BIND_MW_WR_NS_S)
669  #define FW_RI_BIND_MW_WR_NS_G(x)	\
670  	(((x) >> FW_RI_BIND_MW_WR_NS_S) & FW_RI_BIND_MW_WR_NS_M)
671  #define FW_RI_BIND_MW_WR_NS_F	FW_RI_BIND_MW_WR_NS_V(1U)
672  
673  #define FW_RI_BIND_MW_WR_DCACPU_S	0
674  #define FW_RI_BIND_MW_WR_DCACPU_M	0x1f
675  #define FW_RI_BIND_MW_WR_DCACPU_V(x)	((x) << FW_RI_BIND_MW_WR_DCACPU_S)
676  #define FW_RI_BIND_MW_WR_DCACPU_G(x)	\
677  	(((x) >> FW_RI_BIND_MW_WR_DCACPU_S) & FW_RI_BIND_MW_WR_DCACPU_M)
678  
679  struct fw_ri_fr_nsmr_wr {
680  	__u8   opcode;
681  	__u8   flags;
682  	__u16  wrid;
683  	__u8   r1[3];
684  	__u8   len16;
685  	__u8   qpbinde_to_dcacpu;
686  	__u8   pgsz_shift;
687  	__u8   addr_type;
688  	__u8   mem_perms;
689  	__be32 stag;
690  	__be32 len_hi;
691  	__be32 len_lo;
692  	__be32 va_hi;
693  	__be32 va_lo_fbo;
694  };
695  
696  #define FW_RI_FR_NSMR_WR_QPBINDE_S	6
697  #define FW_RI_FR_NSMR_WR_QPBINDE_M	0x1
698  #define FW_RI_FR_NSMR_WR_QPBINDE_V(x)	((x) << FW_RI_FR_NSMR_WR_QPBINDE_S)
699  #define FW_RI_FR_NSMR_WR_QPBINDE_G(x)	\
700  	(((x) >> FW_RI_FR_NSMR_WR_QPBINDE_S) & FW_RI_FR_NSMR_WR_QPBINDE_M)
701  #define FW_RI_FR_NSMR_WR_QPBINDE_F	FW_RI_FR_NSMR_WR_QPBINDE_V(1U)
702  
703  #define FW_RI_FR_NSMR_WR_NS_S		5
704  #define FW_RI_FR_NSMR_WR_NS_M		0x1
705  #define FW_RI_FR_NSMR_WR_NS_V(x)	((x) << FW_RI_FR_NSMR_WR_NS_S)
706  #define FW_RI_FR_NSMR_WR_NS_G(x)	\
707  	(((x) >> FW_RI_FR_NSMR_WR_NS_S) & FW_RI_FR_NSMR_WR_NS_M)
708  #define FW_RI_FR_NSMR_WR_NS_F	FW_RI_FR_NSMR_WR_NS_V(1U)
709  
710  #define FW_RI_FR_NSMR_WR_DCACPU_S	0
711  #define FW_RI_FR_NSMR_WR_DCACPU_M	0x1f
712  #define FW_RI_FR_NSMR_WR_DCACPU_V(x)	((x) << FW_RI_FR_NSMR_WR_DCACPU_S)
713  #define FW_RI_FR_NSMR_WR_DCACPU_G(x)	\
714  	(((x) >> FW_RI_FR_NSMR_WR_DCACPU_S) & FW_RI_FR_NSMR_WR_DCACPU_M)
715  
716  struct fw_ri_fr_nsmr_tpte_wr {
717  	__u8	opcode;
718  	__u8   flags;
719  	__u16  wrid;
720  	__u8   r1[3];
721  	__u8   len16;
722  	__be32  r2;
723  	__be32  stag;
724  	struct fw_ri_tpte tpte;
725  	__u64  pbl[2];
726  };
727  
728  struct fw_ri_inv_lstag_wr {
729  	__u8   opcode;
730  	__u8   flags;
731  	__u16  wrid;
732  	__u8   r1[3];
733  	__u8   len16;
734  	__be32 r2;
735  	__be32 stag_inv;
736  };
737  
738  enum fw_ri_type {
739  	FW_RI_TYPE_INIT,
740  	FW_RI_TYPE_FINI,
741  	FW_RI_TYPE_TERMINATE
742  };
743  
744  enum fw_ri_init_p2ptype {
745  	FW_RI_INIT_P2PTYPE_RDMA_WRITE		= FW_RI_RDMA_WRITE,
746  	FW_RI_INIT_P2PTYPE_READ_REQ		= FW_RI_READ_REQ,
747  	FW_RI_INIT_P2PTYPE_SEND			= FW_RI_SEND,
748  	FW_RI_INIT_P2PTYPE_SEND_WITH_INV	= FW_RI_SEND_WITH_INV,
749  	FW_RI_INIT_P2PTYPE_SEND_WITH_SE		= FW_RI_SEND_WITH_SE,
750  	FW_RI_INIT_P2PTYPE_SEND_WITH_SE_INV	= FW_RI_SEND_WITH_SE_INV,
751  	FW_RI_INIT_P2PTYPE_DISABLED		= 0xf,
752  };
753  
754  enum fw_ri_init_rqeqid_srq {
755  	FW_RI_INIT_RQEQID_SRQ			= 1 << 31,
756  };
757  
758  struct fw_ri_wr {
759  	__be32 op_compl;
760  	__be32 flowid_len16;
761  	__u64  cookie;
762  	union fw_ri {
763  		struct fw_ri_init {
764  			__u8   type;
765  			__u8   mpareqbit_p2ptype;
766  			__u8   r4[2];
767  			__u8   mpa_attrs;
768  			__u8   qp_caps;
769  			__be16 nrqe;
770  			__be32 pdid;
771  			__be32 qpid;
772  			__be32 sq_eqid;
773  			__be32 rq_eqid;
774  			__be32 scqid;
775  			__be32 rcqid;
776  			__be32 ord_max;
777  			__be32 ird_max;
778  			__be32 iss;
779  			__be32 irs;
780  			__be32 hwrqsize;
781  			__be32 hwrqaddr;
782  			__be64 r5;
783  			union fw_ri_init_p2p {
784  				struct fw_ri_rdma_write_wr write;
785  				struct fw_ri_rdma_read_wr read;
786  				struct fw_ri_send_wr send;
787  			} u;
788  		} init;
789  		struct fw_ri_fini {
790  			__u8   type;
791  			__u8   r3[7];
792  			__be64 r4;
793  		} fini;
794  		struct fw_ri_terminate {
795  			__u8   type;
796  			__u8   r3[3];
797  			__be32 immdlen;
798  			__u8   termmsg[40];
799  		} terminate;
800  	} u;
801  };
802  
803  #define FW_RI_WR_MPAREQBIT_S	7
804  #define FW_RI_WR_MPAREQBIT_M	0x1
805  #define FW_RI_WR_MPAREQBIT_V(x)	((x) << FW_RI_WR_MPAREQBIT_S)
806  #define FW_RI_WR_MPAREQBIT_G(x)	\
807  	(((x) >> FW_RI_WR_MPAREQBIT_S) & FW_RI_WR_MPAREQBIT_M)
808  #define FW_RI_WR_MPAREQBIT_F	FW_RI_WR_MPAREQBIT_V(1U)
809  
810  #define FW_RI_WR_P2PTYPE_S	0
811  #define FW_RI_WR_P2PTYPE_M	0xf
812  #define FW_RI_WR_P2PTYPE_V(x)	((x) << FW_RI_WR_P2PTYPE_S)
813  #define FW_RI_WR_P2PTYPE_G(x)	\
814  	(((x) >> FW_RI_WR_P2PTYPE_S) & FW_RI_WR_P2PTYPE_M)
815  
816  #endif /* _T4FW_RI_API_H_ */
817