xref: /linux/drivers/infiniband/hw/ionic/ionic_fw.h (revision e8521822c733c6deab0f339843cd37cd62c12795)
1f3bdbd42SAbhijit Gangurde /* SPDX-License-Identifier: GPL-2.0 */
2f3bdbd42SAbhijit Gangurde /* Copyright (C) 2018-2025, Advanced Micro Devices, Inc. */
3f3bdbd42SAbhijit Gangurde 
4f3bdbd42SAbhijit Gangurde #ifndef _IONIC_FW_H_
5f3bdbd42SAbhijit Gangurde #define _IONIC_FW_H_
6f3bdbd42SAbhijit Gangurde 
7f3bdbd42SAbhijit Gangurde #include <linux/kernel.h>
8*e8521822SAbhijit Gangurde #include <rdma/ib_verbs.h>
9*e8521822SAbhijit Gangurde 
10*e8521822SAbhijit Gangurde /* common for ib spec */
11*e8521822SAbhijit Gangurde 
12*e8521822SAbhijit Gangurde #define IONIC_EXP_DBELL_SZ		8
13*e8521822SAbhijit Gangurde 
14*e8521822SAbhijit Gangurde enum ionic_mrid_bits {
15*e8521822SAbhijit Gangurde 	IONIC_MRID_INDEX_SHIFT		= 8,
16*e8521822SAbhijit Gangurde };
17*e8521822SAbhijit Gangurde 
18*e8521822SAbhijit Gangurde static inline u32 ionic_mrid(u32 index, u8 key)
19*e8521822SAbhijit Gangurde {
20*e8521822SAbhijit Gangurde 	return (index << IONIC_MRID_INDEX_SHIFT) | key;
21*e8521822SAbhijit Gangurde }
22*e8521822SAbhijit Gangurde 
23*e8521822SAbhijit Gangurde static inline u32 ionic_mrid_index(u32 lrkey)
24*e8521822SAbhijit Gangurde {
25*e8521822SAbhijit Gangurde 	return lrkey >> IONIC_MRID_INDEX_SHIFT;
26*e8521822SAbhijit Gangurde }
27*e8521822SAbhijit Gangurde 
28*e8521822SAbhijit Gangurde /* common to all versions */
29*e8521822SAbhijit Gangurde 
30*e8521822SAbhijit Gangurde /* wqe scatter gather element */
31*e8521822SAbhijit Gangurde struct ionic_sge {
32*e8521822SAbhijit Gangurde 	__be64				va;
33*e8521822SAbhijit Gangurde 	__be32				len;
34*e8521822SAbhijit Gangurde 	__be32				lkey;
35*e8521822SAbhijit Gangurde };
36*e8521822SAbhijit Gangurde 
37*e8521822SAbhijit Gangurde /* admin queue mr type */
38*e8521822SAbhijit Gangurde enum ionic_mr_flags {
39*e8521822SAbhijit Gangurde 	/* bits that determine mr access */
40*e8521822SAbhijit Gangurde 	IONIC_MRF_LOCAL_WRITE		= BIT(0),
41*e8521822SAbhijit Gangurde 	IONIC_MRF_REMOTE_WRITE		= BIT(1),
42*e8521822SAbhijit Gangurde 	IONIC_MRF_REMOTE_READ		= BIT(2),
43*e8521822SAbhijit Gangurde 	IONIC_MRF_REMOTE_ATOMIC		= BIT(3),
44*e8521822SAbhijit Gangurde 	IONIC_MRF_MW_BIND		= BIT(4),
45*e8521822SAbhijit Gangurde 	IONIC_MRF_ZERO_BASED		= BIT(5),
46*e8521822SAbhijit Gangurde 	IONIC_MRF_ON_DEMAND		= BIT(6),
47*e8521822SAbhijit Gangurde 	IONIC_MRF_PB			= BIT(7),
48*e8521822SAbhijit Gangurde 	IONIC_MRF_ACCESS_MASK		= BIT(12) - 1,
49*e8521822SAbhijit Gangurde 
50*e8521822SAbhijit Gangurde 	/* bits that determine mr type */
51*e8521822SAbhijit Gangurde 	IONIC_MRF_UKEY_EN		= BIT(13),
52*e8521822SAbhijit Gangurde 	IONIC_MRF_IS_MW			= BIT(14),
53*e8521822SAbhijit Gangurde 	IONIC_MRF_INV_EN		= BIT(15),
54*e8521822SAbhijit Gangurde 
55*e8521822SAbhijit Gangurde 	/* base flags combinations for mr types */
56*e8521822SAbhijit Gangurde 	IONIC_MRF_USER_MR		= 0,
57*e8521822SAbhijit Gangurde 	IONIC_MRF_PHYS_MR		= (IONIC_MRF_UKEY_EN |
58*e8521822SAbhijit Gangurde 					   IONIC_MRF_INV_EN),
59*e8521822SAbhijit Gangurde 	IONIC_MRF_MW_1			= (IONIC_MRF_UKEY_EN |
60*e8521822SAbhijit Gangurde 					   IONIC_MRF_IS_MW),
61*e8521822SAbhijit Gangurde 	IONIC_MRF_MW_2			= (IONIC_MRF_UKEY_EN |
62*e8521822SAbhijit Gangurde 					   IONIC_MRF_IS_MW |
63*e8521822SAbhijit Gangurde 					   IONIC_MRF_INV_EN),
64*e8521822SAbhijit Gangurde };
65*e8521822SAbhijit Gangurde 
66*e8521822SAbhijit Gangurde static inline int to_ionic_mr_flags(int access)
67*e8521822SAbhijit Gangurde {
68*e8521822SAbhijit Gangurde 	int flags = 0;
69*e8521822SAbhijit Gangurde 
70*e8521822SAbhijit Gangurde 	if (access & IB_ACCESS_LOCAL_WRITE)
71*e8521822SAbhijit Gangurde 		flags |= IONIC_MRF_LOCAL_WRITE;
72*e8521822SAbhijit Gangurde 
73*e8521822SAbhijit Gangurde 	if (access & IB_ACCESS_REMOTE_READ)
74*e8521822SAbhijit Gangurde 		flags |= IONIC_MRF_REMOTE_READ;
75*e8521822SAbhijit Gangurde 
76*e8521822SAbhijit Gangurde 	if (access & IB_ACCESS_REMOTE_WRITE)
77*e8521822SAbhijit Gangurde 		flags |= IONIC_MRF_REMOTE_WRITE;
78*e8521822SAbhijit Gangurde 
79*e8521822SAbhijit Gangurde 	if (access & IB_ACCESS_REMOTE_ATOMIC)
80*e8521822SAbhijit Gangurde 		flags |= IONIC_MRF_REMOTE_ATOMIC;
81*e8521822SAbhijit Gangurde 
82*e8521822SAbhijit Gangurde 	if (access & IB_ACCESS_MW_BIND)
83*e8521822SAbhijit Gangurde 		flags |= IONIC_MRF_MW_BIND;
84*e8521822SAbhijit Gangurde 
85*e8521822SAbhijit Gangurde 	if (access & IB_ZERO_BASED)
86*e8521822SAbhijit Gangurde 		flags |= IONIC_MRF_ZERO_BASED;
87*e8521822SAbhijit Gangurde 
88*e8521822SAbhijit Gangurde 	return flags;
89*e8521822SAbhijit Gangurde }
90*e8521822SAbhijit Gangurde 
91*e8521822SAbhijit Gangurde enum ionic_qp_flags {
92*e8521822SAbhijit Gangurde 	/* bits that determine qp access */
93*e8521822SAbhijit Gangurde 	IONIC_QPF_REMOTE_WRITE		= BIT(0),
94*e8521822SAbhijit Gangurde 	IONIC_QPF_REMOTE_READ		= BIT(1),
95*e8521822SAbhijit Gangurde 	IONIC_QPF_REMOTE_ATOMIC		= BIT(2),
96*e8521822SAbhijit Gangurde 
97*e8521822SAbhijit Gangurde 	/* bits that determine other qp behavior */
98*e8521822SAbhijit Gangurde 	IONIC_QPF_SQ_PB			= BIT(6),
99*e8521822SAbhijit Gangurde 	IONIC_QPF_RQ_PB			= BIT(7),
100*e8521822SAbhijit Gangurde 	IONIC_QPF_SQ_SPEC		= BIT(8),
101*e8521822SAbhijit Gangurde 	IONIC_QPF_RQ_SPEC		= BIT(9),
102*e8521822SAbhijit Gangurde 	IONIC_QPF_REMOTE_PRIVILEGED	= BIT(10),
103*e8521822SAbhijit Gangurde 	IONIC_QPF_SQ_DRAINING		= BIT(11),
104*e8521822SAbhijit Gangurde 	IONIC_QPF_SQD_NOTIFY		= BIT(12),
105*e8521822SAbhijit Gangurde 	IONIC_QPF_SQ_CMB		= BIT(13),
106*e8521822SAbhijit Gangurde 	IONIC_QPF_RQ_CMB		= BIT(14),
107*e8521822SAbhijit Gangurde 	IONIC_QPF_PRIVILEGED		= BIT(15),
108*e8521822SAbhijit Gangurde };
109*e8521822SAbhijit Gangurde 
110*e8521822SAbhijit Gangurde static inline int from_ionic_qp_flags(int flags)
111*e8521822SAbhijit Gangurde {
112*e8521822SAbhijit Gangurde 	int access_flags = 0;
113*e8521822SAbhijit Gangurde 
114*e8521822SAbhijit Gangurde 	if (flags & IONIC_QPF_REMOTE_WRITE)
115*e8521822SAbhijit Gangurde 		access_flags |= IB_ACCESS_REMOTE_WRITE;
116*e8521822SAbhijit Gangurde 
117*e8521822SAbhijit Gangurde 	if (flags & IONIC_QPF_REMOTE_READ)
118*e8521822SAbhijit Gangurde 		access_flags |= IB_ACCESS_REMOTE_READ;
119*e8521822SAbhijit Gangurde 
120*e8521822SAbhijit Gangurde 	if (flags & IONIC_QPF_REMOTE_ATOMIC)
121*e8521822SAbhijit Gangurde 		access_flags |= IB_ACCESS_REMOTE_ATOMIC;
122*e8521822SAbhijit Gangurde 
123*e8521822SAbhijit Gangurde 	return access_flags;
124*e8521822SAbhijit Gangurde }
125*e8521822SAbhijit Gangurde 
126*e8521822SAbhijit Gangurde static inline int to_ionic_qp_flags(int access, bool sqd_notify,
127*e8521822SAbhijit Gangurde 				    bool sq_is_cmb, bool rq_is_cmb,
128*e8521822SAbhijit Gangurde 				    bool sq_spec, bool rq_spec,
129*e8521822SAbhijit Gangurde 				    bool privileged, bool remote_privileged)
130*e8521822SAbhijit Gangurde {
131*e8521822SAbhijit Gangurde 	int flags = 0;
132*e8521822SAbhijit Gangurde 
133*e8521822SAbhijit Gangurde 	if (access & IB_ACCESS_REMOTE_WRITE)
134*e8521822SAbhijit Gangurde 		flags |= IONIC_QPF_REMOTE_WRITE;
135*e8521822SAbhijit Gangurde 
136*e8521822SAbhijit Gangurde 	if (access & IB_ACCESS_REMOTE_READ)
137*e8521822SAbhijit Gangurde 		flags |= IONIC_QPF_REMOTE_READ;
138*e8521822SAbhijit Gangurde 
139*e8521822SAbhijit Gangurde 	if (access & IB_ACCESS_REMOTE_ATOMIC)
140*e8521822SAbhijit Gangurde 		flags |= IONIC_QPF_REMOTE_ATOMIC;
141*e8521822SAbhijit Gangurde 
142*e8521822SAbhijit Gangurde 	if (sqd_notify)
143*e8521822SAbhijit Gangurde 		flags |= IONIC_QPF_SQD_NOTIFY;
144*e8521822SAbhijit Gangurde 
145*e8521822SAbhijit Gangurde 	if (sq_is_cmb)
146*e8521822SAbhijit Gangurde 		flags |= IONIC_QPF_SQ_CMB;
147*e8521822SAbhijit Gangurde 
148*e8521822SAbhijit Gangurde 	if (rq_is_cmb)
149*e8521822SAbhijit Gangurde 		flags |= IONIC_QPF_RQ_CMB;
150*e8521822SAbhijit Gangurde 
151*e8521822SAbhijit Gangurde 	if (sq_spec)
152*e8521822SAbhijit Gangurde 		flags |= IONIC_QPF_SQ_SPEC;
153*e8521822SAbhijit Gangurde 
154*e8521822SAbhijit Gangurde 	if (rq_spec)
155*e8521822SAbhijit Gangurde 		flags |= IONIC_QPF_RQ_SPEC;
156*e8521822SAbhijit Gangurde 
157*e8521822SAbhijit Gangurde 	if (privileged)
158*e8521822SAbhijit Gangurde 		flags |= IONIC_QPF_PRIVILEGED;
159*e8521822SAbhijit Gangurde 
160*e8521822SAbhijit Gangurde 	if (remote_privileged)
161*e8521822SAbhijit Gangurde 		flags |= IONIC_QPF_REMOTE_PRIVILEGED;
162*e8521822SAbhijit Gangurde 
163*e8521822SAbhijit Gangurde 	return flags;
164*e8521822SAbhijit Gangurde }
165*e8521822SAbhijit Gangurde 
166*e8521822SAbhijit Gangurde /* admin queue qp type */
167*e8521822SAbhijit Gangurde enum ionic_qp_type {
168*e8521822SAbhijit Gangurde 	IONIC_QPT_RC,
169*e8521822SAbhijit Gangurde 	IONIC_QPT_UC,
170*e8521822SAbhijit Gangurde 	IONIC_QPT_RD,
171*e8521822SAbhijit Gangurde 	IONIC_QPT_UD,
172*e8521822SAbhijit Gangurde 	IONIC_QPT_SRQ,
173*e8521822SAbhijit Gangurde 	IONIC_QPT_XRC_INI,
174*e8521822SAbhijit Gangurde 	IONIC_QPT_XRC_TGT,
175*e8521822SAbhijit Gangurde 	IONIC_QPT_XRC_SRQ,
176*e8521822SAbhijit Gangurde };
177*e8521822SAbhijit Gangurde 
178*e8521822SAbhijit Gangurde static inline int to_ionic_qp_type(enum ib_qp_type type)
179*e8521822SAbhijit Gangurde {
180*e8521822SAbhijit Gangurde 	switch (type) {
181*e8521822SAbhijit Gangurde 	case IB_QPT_GSI:
182*e8521822SAbhijit Gangurde 	case IB_QPT_UD:
183*e8521822SAbhijit Gangurde 		return IONIC_QPT_UD;
184*e8521822SAbhijit Gangurde 	case IB_QPT_RC:
185*e8521822SAbhijit Gangurde 		return IONIC_QPT_RC;
186*e8521822SAbhijit Gangurde 	case IB_QPT_UC:
187*e8521822SAbhijit Gangurde 		return IONIC_QPT_UC;
188*e8521822SAbhijit Gangurde 	case IB_QPT_XRC_INI:
189*e8521822SAbhijit Gangurde 		return IONIC_QPT_XRC_INI;
190*e8521822SAbhijit Gangurde 	case IB_QPT_XRC_TGT:
191*e8521822SAbhijit Gangurde 		return IONIC_QPT_XRC_TGT;
192*e8521822SAbhijit Gangurde 	default:
193*e8521822SAbhijit Gangurde 		return -EINVAL;
194*e8521822SAbhijit Gangurde 	}
195*e8521822SAbhijit Gangurde }
196*e8521822SAbhijit Gangurde 
197*e8521822SAbhijit Gangurde /* admin queue qp state */
198*e8521822SAbhijit Gangurde enum ionic_qp_state {
199*e8521822SAbhijit Gangurde 	IONIC_QPS_RESET,
200*e8521822SAbhijit Gangurde 	IONIC_QPS_INIT,
201*e8521822SAbhijit Gangurde 	IONIC_QPS_RTR,
202*e8521822SAbhijit Gangurde 	IONIC_QPS_RTS,
203*e8521822SAbhijit Gangurde 	IONIC_QPS_SQD,
204*e8521822SAbhijit Gangurde 	IONIC_QPS_SQE,
205*e8521822SAbhijit Gangurde 	IONIC_QPS_ERR,
206*e8521822SAbhijit Gangurde };
207*e8521822SAbhijit Gangurde 
208*e8521822SAbhijit Gangurde static inline int from_ionic_qp_state(enum ionic_qp_state state)
209*e8521822SAbhijit Gangurde {
210*e8521822SAbhijit Gangurde 	switch (state) {
211*e8521822SAbhijit Gangurde 	case IONIC_QPS_RESET:
212*e8521822SAbhijit Gangurde 		return IB_QPS_RESET;
213*e8521822SAbhijit Gangurde 	case IONIC_QPS_INIT:
214*e8521822SAbhijit Gangurde 		return IB_QPS_INIT;
215*e8521822SAbhijit Gangurde 	case IONIC_QPS_RTR:
216*e8521822SAbhijit Gangurde 		return IB_QPS_RTR;
217*e8521822SAbhijit Gangurde 	case IONIC_QPS_RTS:
218*e8521822SAbhijit Gangurde 		return IB_QPS_RTS;
219*e8521822SAbhijit Gangurde 	case IONIC_QPS_SQD:
220*e8521822SAbhijit Gangurde 		return IB_QPS_SQD;
221*e8521822SAbhijit Gangurde 	case IONIC_QPS_SQE:
222*e8521822SAbhijit Gangurde 		return IB_QPS_SQE;
223*e8521822SAbhijit Gangurde 	case IONIC_QPS_ERR:
224*e8521822SAbhijit Gangurde 		return IB_QPS_ERR;
225*e8521822SAbhijit Gangurde 	default:
226*e8521822SAbhijit Gangurde 		return -EINVAL;
227*e8521822SAbhijit Gangurde 	}
228*e8521822SAbhijit Gangurde }
229*e8521822SAbhijit Gangurde 
230*e8521822SAbhijit Gangurde static inline int to_ionic_qp_state(enum ib_qp_state state)
231*e8521822SAbhijit Gangurde {
232*e8521822SAbhijit Gangurde 	switch (state) {
233*e8521822SAbhijit Gangurde 	case IB_QPS_RESET:
234*e8521822SAbhijit Gangurde 		return IONIC_QPS_RESET;
235*e8521822SAbhijit Gangurde 	case IB_QPS_INIT:
236*e8521822SAbhijit Gangurde 		return IONIC_QPS_INIT;
237*e8521822SAbhijit Gangurde 	case IB_QPS_RTR:
238*e8521822SAbhijit Gangurde 		return IONIC_QPS_RTR;
239*e8521822SAbhijit Gangurde 	case IB_QPS_RTS:
240*e8521822SAbhijit Gangurde 		return IONIC_QPS_RTS;
241*e8521822SAbhijit Gangurde 	case IB_QPS_SQD:
242*e8521822SAbhijit Gangurde 		return IONIC_QPS_SQD;
243*e8521822SAbhijit Gangurde 	case IB_QPS_SQE:
244*e8521822SAbhijit Gangurde 		return IONIC_QPS_SQE;
245*e8521822SAbhijit Gangurde 	case IB_QPS_ERR:
246*e8521822SAbhijit Gangurde 		return IONIC_QPS_ERR;
247*e8521822SAbhijit Gangurde 	default:
248*e8521822SAbhijit Gangurde 		return 0;
249*e8521822SAbhijit Gangurde 	}
250*e8521822SAbhijit Gangurde }
251*e8521822SAbhijit Gangurde 
252*e8521822SAbhijit Gangurde static inline int to_ionic_qp_modify_state(enum ib_qp_state to_state,
253*e8521822SAbhijit Gangurde 					   enum ib_qp_state from_state)
254*e8521822SAbhijit Gangurde {
255*e8521822SAbhijit Gangurde 	return to_ionic_qp_state(to_state) |
256*e8521822SAbhijit Gangurde 		(to_ionic_qp_state(from_state) << 4);
257*e8521822SAbhijit Gangurde }
258*e8521822SAbhijit Gangurde 
259*e8521822SAbhijit Gangurde /* fw abi v1 */
260*e8521822SAbhijit Gangurde 
261*e8521822SAbhijit Gangurde /* data payload part of v1 wqe */
262*e8521822SAbhijit Gangurde union ionic_v1_pld {
263*e8521822SAbhijit Gangurde 	struct ionic_sge	sgl[2];
264*e8521822SAbhijit Gangurde 	__be32			spec32[8];
265*e8521822SAbhijit Gangurde 	__be16			spec16[16];
266*e8521822SAbhijit Gangurde 	__u8			data[32];
267*e8521822SAbhijit Gangurde };
268f3bdbd42SAbhijit Gangurde 
269f3bdbd42SAbhijit Gangurde /* completion queue v1 cqe */
270f3bdbd42SAbhijit Gangurde struct ionic_v1_cqe {
271f3bdbd42SAbhijit Gangurde 	union {
272f3bdbd42SAbhijit Gangurde 		struct {
273f3bdbd42SAbhijit Gangurde 			__be16		cmd_idx;
274f3bdbd42SAbhijit Gangurde 			__u8		cmd_op;
275f3bdbd42SAbhijit Gangurde 			__u8		rsvd[17];
276f3bdbd42SAbhijit Gangurde 			__le16		old_sq_cindex;
277f3bdbd42SAbhijit Gangurde 			__le16		old_rq_cq_cindex;
278f3bdbd42SAbhijit Gangurde 		} admin;
279f3bdbd42SAbhijit Gangurde 		struct {
280f3bdbd42SAbhijit Gangurde 			__u64		wqe_id;
281f3bdbd42SAbhijit Gangurde 			__be32		src_qpn_op;
282f3bdbd42SAbhijit Gangurde 			__u8		src_mac[6];
283f3bdbd42SAbhijit Gangurde 			__be16		vlan_tag;
284f3bdbd42SAbhijit Gangurde 			__be32		imm_data_rkey;
285f3bdbd42SAbhijit Gangurde 		} recv;
286f3bdbd42SAbhijit Gangurde 		struct {
287f3bdbd42SAbhijit Gangurde 			__u8		rsvd[4];
288f3bdbd42SAbhijit Gangurde 			__be32		msg_msn;
289f3bdbd42SAbhijit Gangurde 			__u8		rsvd2[8];
290f3bdbd42SAbhijit Gangurde 			__u64		npg_wqe_id;
291f3bdbd42SAbhijit Gangurde 		} send;
292f3bdbd42SAbhijit Gangurde 	};
293f3bdbd42SAbhijit Gangurde 	__be32				status_length;
294f3bdbd42SAbhijit Gangurde 	__be32				qid_type_flags;
295f3bdbd42SAbhijit Gangurde };
296f3bdbd42SAbhijit Gangurde 
297f3bdbd42SAbhijit Gangurde /* bits for cqe qid_type_flags */
298f3bdbd42SAbhijit Gangurde enum ionic_v1_cqe_qtf_bits {
299f3bdbd42SAbhijit Gangurde 	IONIC_V1_CQE_COLOR		= BIT(0),
300f3bdbd42SAbhijit Gangurde 	IONIC_V1_CQE_ERROR		= BIT(1),
301f3bdbd42SAbhijit Gangurde 	IONIC_V1_CQE_TYPE_SHIFT		= 5,
302f3bdbd42SAbhijit Gangurde 	IONIC_V1_CQE_TYPE_MASK		= 0x7,
303f3bdbd42SAbhijit Gangurde 	IONIC_V1_CQE_QID_SHIFT		= 8,
304f3bdbd42SAbhijit Gangurde 
305f3bdbd42SAbhijit Gangurde 	IONIC_V1_CQE_TYPE_ADMIN		= 0,
306f3bdbd42SAbhijit Gangurde 	IONIC_V1_CQE_TYPE_RECV		= 1,
307f3bdbd42SAbhijit Gangurde 	IONIC_V1_CQE_TYPE_SEND_MSN	= 2,
308f3bdbd42SAbhijit Gangurde 	IONIC_V1_CQE_TYPE_SEND_NPG	= 3,
309f3bdbd42SAbhijit Gangurde };
310f3bdbd42SAbhijit Gangurde 
311f3bdbd42SAbhijit Gangurde static inline bool ionic_v1_cqe_color(struct ionic_v1_cqe *cqe)
312f3bdbd42SAbhijit Gangurde {
313f3bdbd42SAbhijit Gangurde 	return cqe->qid_type_flags & cpu_to_be32(IONIC_V1_CQE_COLOR);
314f3bdbd42SAbhijit Gangurde }
315f3bdbd42SAbhijit Gangurde 
316f3bdbd42SAbhijit Gangurde static inline bool ionic_v1_cqe_error(struct ionic_v1_cqe *cqe)
317f3bdbd42SAbhijit Gangurde {
318f3bdbd42SAbhijit Gangurde 	return cqe->qid_type_flags & cpu_to_be32(IONIC_V1_CQE_ERROR);
319f3bdbd42SAbhijit Gangurde }
320f3bdbd42SAbhijit Gangurde 
321f3bdbd42SAbhijit Gangurde static inline void ionic_v1_cqe_clean(struct ionic_v1_cqe *cqe)
322f3bdbd42SAbhijit Gangurde {
323f3bdbd42SAbhijit Gangurde 	cqe->qid_type_flags |= cpu_to_be32(~0u << IONIC_V1_CQE_QID_SHIFT);
324f3bdbd42SAbhijit Gangurde }
325f3bdbd42SAbhijit Gangurde 
326f3bdbd42SAbhijit Gangurde static inline u32 ionic_v1_cqe_qtf(struct ionic_v1_cqe *cqe)
327f3bdbd42SAbhijit Gangurde {
328f3bdbd42SAbhijit Gangurde 	return be32_to_cpu(cqe->qid_type_flags);
329f3bdbd42SAbhijit Gangurde }
330f3bdbd42SAbhijit Gangurde 
331f3bdbd42SAbhijit Gangurde static inline u8 ionic_v1_cqe_qtf_type(u32 qtf)
332f3bdbd42SAbhijit Gangurde {
333f3bdbd42SAbhijit Gangurde 	return (qtf >> IONIC_V1_CQE_TYPE_SHIFT) & IONIC_V1_CQE_TYPE_MASK;
334f3bdbd42SAbhijit Gangurde }
335f3bdbd42SAbhijit Gangurde 
336f3bdbd42SAbhijit Gangurde static inline u32 ionic_v1_cqe_qtf_qid(u32 qtf)
337f3bdbd42SAbhijit Gangurde {
338f3bdbd42SAbhijit Gangurde 	return qtf >> IONIC_V1_CQE_QID_SHIFT;
339f3bdbd42SAbhijit Gangurde }
340f3bdbd42SAbhijit Gangurde 
341*e8521822SAbhijit Gangurde /* v1 base wqe header */
342*e8521822SAbhijit Gangurde struct ionic_v1_base_hdr {
343*e8521822SAbhijit Gangurde 	__u64				wqe_id;
344*e8521822SAbhijit Gangurde 	__u8				op;
345*e8521822SAbhijit Gangurde 	__u8				num_sge_key;
346*e8521822SAbhijit Gangurde 	__be16				flags;
347*e8521822SAbhijit Gangurde 	__be32				imm_data_key;
348*e8521822SAbhijit Gangurde };
349*e8521822SAbhijit Gangurde 
350*e8521822SAbhijit Gangurde /* v1 receive wqe body */
351*e8521822SAbhijit Gangurde struct ionic_v1_recv_bdy {
352*e8521822SAbhijit Gangurde 	__u8				rsvd[16];
353*e8521822SAbhijit Gangurde 	union ionic_v1_pld		pld;
354*e8521822SAbhijit Gangurde };
355*e8521822SAbhijit Gangurde 
356*e8521822SAbhijit Gangurde /* v1 send/rdma wqe body (common, has sgl) */
357*e8521822SAbhijit Gangurde struct ionic_v1_common_bdy {
358*e8521822SAbhijit Gangurde 	union {
359*e8521822SAbhijit Gangurde 		struct {
360*e8521822SAbhijit Gangurde 			__be32		ah_id;
361*e8521822SAbhijit Gangurde 			__be32		dest_qpn;
362*e8521822SAbhijit Gangurde 			__be32		dest_qkey;
363*e8521822SAbhijit Gangurde 		} send;
364*e8521822SAbhijit Gangurde 		struct {
365*e8521822SAbhijit Gangurde 			__be32		remote_va_high;
366*e8521822SAbhijit Gangurde 			__be32		remote_va_low;
367*e8521822SAbhijit Gangurde 			__be32		remote_rkey;
368*e8521822SAbhijit Gangurde 		} rdma;
369*e8521822SAbhijit Gangurde 	};
370*e8521822SAbhijit Gangurde 	__be32				length;
371*e8521822SAbhijit Gangurde 	union ionic_v1_pld		pld;
372*e8521822SAbhijit Gangurde };
373*e8521822SAbhijit Gangurde 
374*e8521822SAbhijit Gangurde /* v1 atomic wqe body */
375*e8521822SAbhijit Gangurde struct ionic_v1_atomic_bdy {
376*e8521822SAbhijit Gangurde 	__be32				remote_va_high;
377*e8521822SAbhijit Gangurde 	__be32				remote_va_low;
378*e8521822SAbhijit Gangurde 	__be32				remote_rkey;
379*e8521822SAbhijit Gangurde 	__be32				swap_add_high;
380*e8521822SAbhijit Gangurde 	__be32				swap_add_low;
381*e8521822SAbhijit Gangurde 	__be32				compare_high;
382*e8521822SAbhijit Gangurde 	__be32				compare_low;
383*e8521822SAbhijit Gangurde 	__u8				rsvd[4];
384*e8521822SAbhijit Gangurde 	struct ionic_sge		sge;
385*e8521822SAbhijit Gangurde };
386*e8521822SAbhijit Gangurde 
387*e8521822SAbhijit Gangurde /* v1 reg mr wqe body */
388*e8521822SAbhijit Gangurde struct ionic_v1_reg_mr_bdy {
389*e8521822SAbhijit Gangurde 	__be64				va;
390*e8521822SAbhijit Gangurde 	__be64				length;
391*e8521822SAbhijit Gangurde 	__be64				offset;
392*e8521822SAbhijit Gangurde 	__be64				dma_addr;
393*e8521822SAbhijit Gangurde 	__be32				map_count;
394*e8521822SAbhijit Gangurde 	__be16				flags;
395*e8521822SAbhijit Gangurde 	__u8				dir_size_log2;
396*e8521822SAbhijit Gangurde 	__u8				page_size_log2;
397*e8521822SAbhijit Gangurde 	__u8				rsvd[8];
398*e8521822SAbhijit Gangurde };
399*e8521822SAbhijit Gangurde 
400*e8521822SAbhijit Gangurde /* v1 bind mw wqe body */
401*e8521822SAbhijit Gangurde struct ionic_v1_bind_mw_bdy {
402*e8521822SAbhijit Gangurde 	__be64				va;
403*e8521822SAbhijit Gangurde 	__be64				length;
404*e8521822SAbhijit Gangurde 	__be32				lkey;
405*e8521822SAbhijit Gangurde 	__be16				flags;
406*e8521822SAbhijit Gangurde 	__u8				rsvd[26];
407*e8521822SAbhijit Gangurde };
408*e8521822SAbhijit Gangurde 
409*e8521822SAbhijit Gangurde /* v1 send/recv wqe */
410*e8521822SAbhijit Gangurde struct ionic_v1_wqe {
411*e8521822SAbhijit Gangurde 	struct ionic_v1_base_hdr	base;
412*e8521822SAbhijit Gangurde 	union {
413*e8521822SAbhijit Gangurde 		struct ionic_v1_recv_bdy	recv;
414*e8521822SAbhijit Gangurde 		struct ionic_v1_common_bdy	common;
415*e8521822SAbhijit Gangurde 		struct ionic_v1_atomic_bdy	atomic;
416*e8521822SAbhijit Gangurde 		struct ionic_v1_reg_mr_bdy	reg_mr;
417*e8521822SAbhijit Gangurde 		struct ionic_v1_bind_mw_bdy	bind_mw;
418*e8521822SAbhijit Gangurde 	};
419*e8521822SAbhijit Gangurde };
420*e8521822SAbhijit Gangurde 
421*e8521822SAbhijit Gangurde /* queue pair v1 send opcodes */
422*e8521822SAbhijit Gangurde enum ionic_v1_op {
423*e8521822SAbhijit Gangurde 	IONIC_V1_OP_SEND,
424*e8521822SAbhijit Gangurde 	IONIC_V1_OP_SEND_INV,
425*e8521822SAbhijit Gangurde 	IONIC_V1_OP_SEND_IMM,
426*e8521822SAbhijit Gangurde 	IONIC_V1_OP_RDMA_READ,
427*e8521822SAbhijit Gangurde 	IONIC_V1_OP_RDMA_WRITE,
428*e8521822SAbhijit Gangurde 	IONIC_V1_OP_RDMA_WRITE_IMM,
429*e8521822SAbhijit Gangurde 	IONIC_V1_OP_ATOMIC_CS,
430*e8521822SAbhijit Gangurde 	IONIC_V1_OP_ATOMIC_FA,
431*e8521822SAbhijit Gangurde 	IONIC_V1_OP_REG_MR,
432*e8521822SAbhijit Gangurde 	IONIC_V1_OP_LOCAL_INV,
433*e8521822SAbhijit Gangurde 	IONIC_V1_OP_BIND_MW,
434*e8521822SAbhijit Gangurde 
435*e8521822SAbhijit Gangurde 	/* flags */
436*e8521822SAbhijit Gangurde 	IONIC_V1_FLAG_FENCE		= BIT(0),
437*e8521822SAbhijit Gangurde 	IONIC_V1_FLAG_SOL		= BIT(1),
438*e8521822SAbhijit Gangurde 	IONIC_V1_FLAG_INL		= BIT(2),
439*e8521822SAbhijit Gangurde 	IONIC_V1_FLAG_SIG		= BIT(3),
440*e8521822SAbhijit Gangurde 
441*e8521822SAbhijit Gangurde 	/* flags last four bits for sgl spec format */
442*e8521822SAbhijit Gangurde 	IONIC_V1_FLAG_SPEC32		= (1u << 12),
443*e8521822SAbhijit Gangurde 	IONIC_V1_FLAG_SPEC16		= (2u << 12),
444*e8521822SAbhijit Gangurde 	IONIC_V1_SPEC_FIRST_SGE		= 2,
445*e8521822SAbhijit Gangurde };
446*e8521822SAbhijit Gangurde 
447*e8521822SAbhijit Gangurde static inline size_t ionic_v1_send_wqe_min_size(int min_sge, int min_data,
448*e8521822SAbhijit Gangurde 						int spec, bool expdb)
449*e8521822SAbhijit Gangurde {
450*e8521822SAbhijit Gangurde 	size_t sz_wqe, sz_sgl, sz_data;
451*e8521822SAbhijit Gangurde 
452*e8521822SAbhijit Gangurde 	if (spec > IONIC_V1_SPEC_FIRST_SGE)
453*e8521822SAbhijit Gangurde 		min_sge += IONIC_V1_SPEC_FIRST_SGE;
454*e8521822SAbhijit Gangurde 
455*e8521822SAbhijit Gangurde 	if (expdb) {
456*e8521822SAbhijit Gangurde 		min_sge += 1;
457*e8521822SAbhijit Gangurde 		min_data += IONIC_EXP_DBELL_SZ;
458*e8521822SAbhijit Gangurde 	}
459*e8521822SAbhijit Gangurde 
460*e8521822SAbhijit Gangurde 	sz_wqe = sizeof(struct ionic_v1_wqe);
461*e8521822SAbhijit Gangurde 	sz_sgl = offsetof(struct ionic_v1_wqe, common.pld.sgl[min_sge]);
462*e8521822SAbhijit Gangurde 	sz_data = offsetof(struct ionic_v1_wqe, common.pld.data[min_data]);
463*e8521822SAbhijit Gangurde 
464*e8521822SAbhijit Gangurde 	if (sz_sgl > sz_wqe)
465*e8521822SAbhijit Gangurde 		sz_wqe = sz_sgl;
466*e8521822SAbhijit Gangurde 
467*e8521822SAbhijit Gangurde 	if (sz_data > sz_wqe)
468*e8521822SAbhijit Gangurde 		sz_wqe = sz_data;
469*e8521822SAbhijit Gangurde 
470*e8521822SAbhijit Gangurde 	return sz_wqe;
471*e8521822SAbhijit Gangurde }
472*e8521822SAbhijit Gangurde 
473*e8521822SAbhijit Gangurde static inline int ionic_v1_send_wqe_max_sge(u8 stride_log2, int spec,
474*e8521822SAbhijit Gangurde 					    bool expdb)
475*e8521822SAbhijit Gangurde {
476*e8521822SAbhijit Gangurde 	struct ionic_sge *sge = (void *)(1ull << stride_log2);
477*e8521822SAbhijit Gangurde 	struct ionic_v1_wqe *wqe = (void *)0;
478*e8521822SAbhijit Gangurde 	int num_sge = 0;
479*e8521822SAbhijit Gangurde 
480*e8521822SAbhijit Gangurde 	if (expdb)
481*e8521822SAbhijit Gangurde 		sge -= 1;
482*e8521822SAbhijit Gangurde 
483*e8521822SAbhijit Gangurde 	if (spec > IONIC_V1_SPEC_FIRST_SGE)
484*e8521822SAbhijit Gangurde 		num_sge = IONIC_V1_SPEC_FIRST_SGE;
485*e8521822SAbhijit Gangurde 
486*e8521822SAbhijit Gangurde 	num_sge = sge - &wqe->common.pld.sgl[num_sge];
487*e8521822SAbhijit Gangurde 
488*e8521822SAbhijit Gangurde 	if (spec && num_sge > spec)
489*e8521822SAbhijit Gangurde 		num_sge = spec;
490*e8521822SAbhijit Gangurde 
491*e8521822SAbhijit Gangurde 	return num_sge;
492*e8521822SAbhijit Gangurde }
493*e8521822SAbhijit Gangurde 
494*e8521822SAbhijit Gangurde static inline int ionic_v1_send_wqe_max_data(u8 stride_log2, bool expdb)
495*e8521822SAbhijit Gangurde {
496*e8521822SAbhijit Gangurde 	struct ionic_v1_wqe *wqe = (void *)0;
497*e8521822SAbhijit Gangurde 	__u8 *data = (void *)(1ull << stride_log2);
498*e8521822SAbhijit Gangurde 
499*e8521822SAbhijit Gangurde 	if (expdb)
500*e8521822SAbhijit Gangurde 		data -= IONIC_EXP_DBELL_SZ;
501*e8521822SAbhijit Gangurde 
502*e8521822SAbhijit Gangurde 	return data - wqe->common.pld.data;
503*e8521822SAbhijit Gangurde }
504*e8521822SAbhijit Gangurde 
505*e8521822SAbhijit Gangurde static inline size_t ionic_v1_recv_wqe_min_size(int min_sge, int spec,
506*e8521822SAbhijit Gangurde 						bool expdb)
507*e8521822SAbhijit Gangurde {
508*e8521822SAbhijit Gangurde 	size_t sz_wqe, sz_sgl;
509*e8521822SAbhijit Gangurde 
510*e8521822SAbhijit Gangurde 	if (spec > IONIC_V1_SPEC_FIRST_SGE)
511*e8521822SAbhijit Gangurde 		min_sge += IONIC_V1_SPEC_FIRST_SGE;
512*e8521822SAbhijit Gangurde 
513*e8521822SAbhijit Gangurde 	if (expdb)
514*e8521822SAbhijit Gangurde 		min_sge += 1;
515*e8521822SAbhijit Gangurde 
516*e8521822SAbhijit Gangurde 	sz_wqe = sizeof(struct ionic_v1_wqe);
517*e8521822SAbhijit Gangurde 	sz_sgl = offsetof(struct ionic_v1_wqe, recv.pld.sgl[min_sge]);
518*e8521822SAbhijit Gangurde 
519*e8521822SAbhijit Gangurde 	if (sz_sgl > sz_wqe)
520*e8521822SAbhijit Gangurde 		sz_wqe = sz_sgl;
521*e8521822SAbhijit Gangurde 
522*e8521822SAbhijit Gangurde 	return sz_wqe;
523*e8521822SAbhijit Gangurde }
524*e8521822SAbhijit Gangurde 
525*e8521822SAbhijit Gangurde static inline int ionic_v1_recv_wqe_max_sge(u8 stride_log2, int spec,
526*e8521822SAbhijit Gangurde 					    bool expdb)
527*e8521822SAbhijit Gangurde {
528*e8521822SAbhijit Gangurde 	struct ionic_sge *sge = (void *)(1ull << stride_log2);
529*e8521822SAbhijit Gangurde 	struct ionic_v1_wqe *wqe = (void *)0;
530*e8521822SAbhijit Gangurde 	int num_sge = 0;
531*e8521822SAbhijit Gangurde 
532*e8521822SAbhijit Gangurde 	if (expdb)
533*e8521822SAbhijit Gangurde 		sge -= 1;
534*e8521822SAbhijit Gangurde 
535*e8521822SAbhijit Gangurde 	if (spec > IONIC_V1_SPEC_FIRST_SGE)
536*e8521822SAbhijit Gangurde 		num_sge = IONIC_V1_SPEC_FIRST_SGE;
537*e8521822SAbhijit Gangurde 
538*e8521822SAbhijit Gangurde 	num_sge = sge - &wqe->recv.pld.sgl[num_sge];
539*e8521822SAbhijit Gangurde 
540*e8521822SAbhijit Gangurde 	if (spec && num_sge > spec)
541*e8521822SAbhijit Gangurde 		num_sge = spec;
542*e8521822SAbhijit Gangurde 
543*e8521822SAbhijit Gangurde 	return num_sge;
544*e8521822SAbhijit Gangurde }
545*e8521822SAbhijit Gangurde 
546*e8521822SAbhijit Gangurde static inline int ionic_v1_use_spec_sge(int min_sge, int spec)
547*e8521822SAbhijit Gangurde {
548*e8521822SAbhijit Gangurde 	if (!spec || min_sge > spec)
549*e8521822SAbhijit Gangurde 		return 0;
550*e8521822SAbhijit Gangurde 
551*e8521822SAbhijit Gangurde 	if (min_sge <= IONIC_V1_SPEC_FIRST_SGE)
552*e8521822SAbhijit Gangurde 		return IONIC_V1_SPEC_FIRST_SGE;
553*e8521822SAbhijit Gangurde 
554*e8521822SAbhijit Gangurde 	return spec;
555*e8521822SAbhijit Gangurde }
556*e8521822SAbhijit Gangurde 
557*e8521822SAbhijit Gangurde struct ionic_admin_create_ah {
558*e8521822SAbhijit Gangurde 	__le64		dma_addr;
559*e8521822SAbhijit Gangurde 	__le32		length;
560*e8521822SAbhijit Gangurde 	__le32		pd_id;
561*e8521822SAbhijit Gangurde 	__le32		id_ver;
562*e8521822SAbhijit Gangurde 	__le16		dbid_flags;
563*e8521822SAbhijit Gangurde 	__u8		csum_profile;
564*e8521822SAbhijit Gangurde 	__u8		crypto;
565*e8521822SAbhijit Gangurde } __packed;
566*e8521822SAbhijit Gangurde 
567*e8521822SAbhijit Gangurde #define IONIC_ADMIN_CREATE_AH_IN_V1_LEN 24
568*e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_create_ah) ==
569*e8521822SAbhijit Gangurde 	       IONIC_ADMIN_CREATE_AH_IN_V1_LEN);
570*e8521822SAbhijit Gangurde 
571*e8521822SAbhijit Gangurde struct ionic_admin_destroy_ah {
572*e8521822SAbhijit Gangurde 	__le32		ah_id;
573*e8521822SAbhijit Gangurde } __packed;
574*e8521822SAbhijit Gangurde 
575*e8521822SAbhijit Gangurde #define IONIC_ADMIN_DESTROY_AH_IN_V1_LEN 4
576*e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_destroy_ah) ==
577*e8521822SAbhijit Gangurde 	       IONIC_ADMIN_DESTROY_AH_IN_V1_LEN);
578*e8521822SAbhijit Gangurde 
579*e8521822SAbhijit Gangurde struct ionic_admin_query_ah {
580*e8521822SAbhijit Gangurde 	__le64		dma_addr;
581*e8521822SAbhijit Gangurde } __packed;
582*e8521822SAbhijit Gangurde 
583*e8521822SAbhijit Gangurde #define IONIC_ADMIN_QUERY_AH_IN_V1_LEN 8
584*e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_query_ah) ==
585*e8521822SAbhijit Gangurde 	       IONIC_ADMIN_QUERY_AH_IN_V1_LEN);
586*e8521822SAbhijit Gangurde 
587*e8521822SAbhijit Gangurde struct ionic_admin_create_mr {
588*e8521822SAbhijit Gangurde 	__le64		va;
589*e8521822SAbhijit Gangurde 	__le64		length;
590*e8521822SAbhijit Gangurde 	__le32		pd_id;
591*e8521822SAbhijit Gangurde 	__le32		id_ver;
592*e8521822SAbhijit Gangurde 	__le32		tbl_index;
593*e8521822SAbhijit Gangurde 	__le32		map_count;
594*e8521822SAbhijit Gangurde 	__le64		dma_addr;
595*e8521822SAbhijit Gangurde 	__le16		dbid_flags;
596*e8521822SAbhijit Gangurde 	__u8		pt_type;
597*e8521822SAbhijit Gangurde 	__u8		dir_size_log2;
598*e8521822SAbhijit Gangurde 	__u8		page_size_log2;
599*e8521822SAbhijit Gangurde } __packed;
600*e8521822SAbhijit Gangurde 
601*e8521822SAbhijit Gangurde #define IONIC_ADMIN_CREATE_MR_IN_V1_LEN 45
602*e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_create_mr) ==
603*e8521822SAbhijit Gangurde 	       IONIC_ADMIN_CREATE_MR_IN_V1_LEN);
604*e8521822SAbhijit Gangurde 
605*e8521822SAbhijit Gangurde struct ionic_admin_destroy_mr {
606*e8521822SAbhijit Gangurde 	__le32		mr_id;
607*e8521822SAbhijit Gangurde } __packed;
608*e8521822SAbhijit Gangurde 
609*e8521822SAbhijit Gangurde #define IONIC_ADMIN_DESTROY_MR_IN_V1_LEN 4
610*e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_destroy_mr) ==
611*e8521822SAbhijit Gangurde 	       IONIC_ADMIN_DESTROY_MR_IN_V1_LEN);
612*e8521822SAbhijit Gangurde 
613*e8521822SAbhijit Gangurde struct ionic_admin_create_cq {
614*e8521822SAbhijit Gangurde 	__le32		eq_id;
615*e8521822SAbhijit Gangurde 	__u8		depth_log2;
616*e8521822SAbhijit Gangurde 	__u8		stride_log2;
617*e8521822SAbhijit Gangurde 	__u8		dir_size_log2_rsvd;
618*e8521822SAbhijit Gangurde 	__u8		page_size_log2;
619*e8521822SAbhijit Gangurde 	__le32		cq_flags;
620*e8521822SAbhijit Gangurde 	__le32		id_ver;
621*e8521822SAbhijit Gangurde 	__le32		tbl_index;
622*e8521822SAbhijit Gangurde 	__le32		map_count;
623*e8521822SAbhijit Gangurde 	__le64		dma_addr;
624*e8521822SAbhijit Gangurde 	__le16		dbid_flags;
625*e8521822SAbhijit Gangurde } __packed;
626*e8521822SAbhijit Gangurde 
627*e8521822SAbhijit Gangurde #define IONIC_ADMIN_CREATE_CQ_IN_V1_LEN 34
628*e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_create_cq) ==
629*e8521822SAbhijit Gangurde 	       IONIC_ADMIN_CREATE_CQ_IN_V1_LEN);
630*e8521822SAbhijit Gangurde 
631*e8521822SAbhijit Gangurde struct ionic_admin_destroy_cq {
632*e8521822SAbhijit Gangurde 	__le32		cq_id;
633*e8521822SAbhijit Gangurde } __packed;
634*e8521822SAbhijit Gangurde 
635*e8521822SAbhijit Gangurde #define IONIC_ADMIN_DESTROY_CQ_IN_V1_LEN 4
636*e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_destroy_cq) ==
637*e8521822SAbhijit Gangurde 	       IONIC_ADMIN_DESTROY_CQ_IN_V1_LEN);
638*e8521822SAbhijit Gangurde 
639*e8521822SAbhijit Gangurde struct ionic_admin_create_qp {
640*e8521822SAbhijit Gangurde 	__le32		pd_id;
641*e8521822SAbhijit Gangurde 	__be32		priv_flags;
642*e8521822SAbhijit Gangurde 	__le32		sq_cq_id;
643*e8521822SAbhijit Gangurde 	__u8		sq_depth_log2;
644*e8521822SAbhijit Gangurde 	__u8		sq_stride_log2;
645*e8521822SAbhijit Gangurde 	__u8		sq_dir_size_log2_rsvd;
646*e8521822SAbhijit Gangurde 	__u8		sq_page_size_log2;
647*e8521822SAbhijit Gangurde 	__le32		sq_tbl_index_xrcd_id;
648*e8521822SAbhijit Gangurde 	__le32		sq_map_count;
649*e8521822SAbhijit Gangurde 	__le64		sq_dma_addr;
650*e8521822SAbhijit Gangurde 	__le32		rq_cq_id;
651*e8521822SAbhijit Gangurde 	__u8		rq_depth_log2;
652*e8521822SAbhijit Gangurde 	__u8		rq_stride_log2;
653*e8521822SAbhijit Gangurde 	__u8		rq_dir_size_log2_rsvd;
654*e8521822SAbhijit Gangurde 	__u8		rq_page_size_log2;
655*e8521822SAbhijit Gangurde 	__le32		rq_tbl_index_srq_id;
656*e8521822SAbhijit Gangurde 	__le32		rq_map_count;
657*e8521822SAbhijit Gangurde 	__le64		rq_dma_addr;
658*e8521822SAbhijit Gangurde 	__le32		id_ver;
659*e8521822SAbhijit Gangurde 	__le16		dbid_flags;
660*e8521822SAbhijit Gangurde 	__u8		type_state;
661*e8521822SAbhijit Gangurde 	__u8		rsvd;
662*e8521822SAbhijit Gangurde } __packed;
663*e8521822SAbhijit Gangurde 
664*e8521822SAbhijit Gangurde #define IONIC_ADMIN_CREATE_QP_IN_V1_LEN 64
665*e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_create_qp) ==
666*e8521822SAbhijit Gangurde 	       IONIC_ADMIN_CREATE_QP_IN_V1_LEN);
667*e8521822SAbhijit Gangurde 
668*e8521822SAbhijit Gangurde struct ionic_admin_destroy_qp {
669*e8521822SAbhijit Gangurde 	__le32		qp_id;
670*e8521822SAbhijit Gangurde } __packed;
671*e8521822SAbhijit Gangurde 
672*e8521822SAbhijit Gangurde #define IONIC_ADMIN_DESTROY_QP_IN_V1_LEN 4
673*e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_destroy_qp) ==
674*e8521822SAbhijit Gangurde 	       IONIC_ADMIN_DESTROY_QP_IN_V1_LEN);
675*e8521822SAbhijit Gangurde 
676*e8521822SAbhijit Gangurde struct ionic_admin_mod_qp {
677*e8521822SAbhijit Gangurde 	__be32		attr_mask;
678*e8521822SAbhijit Gangurde 	__u8		dcqcn_profile;
679*e8521822SAbhijit Gangurde 	__u8		tfp_csum_profile;
680*e8521822SAbhijit Gangurde 	__be16		access_flags;
681*e8521822SAbhijit Gangurde 	__le32		rq_psn;
682*e8521822SAbhijit Gangurde 	__le32		sq_psn;
683*e8521822SAbhijit Gangurde 	__le32		qkey_dest_qpn;
684*e8521822SAbhijit Gangurde 	__le32		rate_limit_kbps;
685*e8521822SAbhijit Gangurde 	__u8		pmtu;
686*e8521822SAbhijit Gangurde 	__u8		retry;
687*e8521822SAbhijit Gangurde 	__u8		rnr_timer;
688*e8521822SAbhijit Gangurde 	__u8		retry_timeout;
689*e8521822SAbhijit Gangurde 	__u8		rsq_depth;
690*e8521822SAbhijit Gangurde 	__u8		rrq_depth;
691*e8521822SAbhijit Gangurde 	__le16		pkey_id;
692*e8521822SAbhijit Gangurde 	__le32		ah_id_len;
693*e8521822SAbhijit Gangurde 	__u8		en_pcp;
694*e8521822SAbhijit Gangurde 	__u8		ip_dscp;
695*e8521822SAbhijit Gangurde 	__u8		rsvd2;
696*e8521822SAbhijit Gangurde 	__u8		type_state;
697*e8521822SAbhijit Gangurde 	union {
698*e8521822SAbhijit Gangurde 		struct {
699*e8521822SAbhijit Gangurde 			__le16		rsvd1;
700*e8521822SAbhijit Gangurde 		};
701*e8521822SAbhijit Gangurde 		__le32		rrq_index;
702*e8521822SAbhijit Gangurde 	};
703*e8521822SAbhijit Gangurde 	__le32		rsq_index;
704*e8521822SAbhijit Gangurde 	__le64		dma_addr;
705*e8521822SAbhijit Gangurde 	__le32		id_ver;
706*e8521822SAbhijit Gangurde } __packed;
707*e8521822SAbhijit Gangurde 
708*e8521822SAbhijit Gangurde #define IONIC_ADMIN_MODIFY_QP_IN_V1_LEN 60
709*e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_mod_qp) ==
710*e8521822SAbhijit Gangurde 	       IONIC_ADMIN_MODIFY_QP_IN_V1_LEN);
711*e8521822SAbhijit Gangurde 
712*e8521822SAbhijit Gangurde struct ionic_admin_query_qp {
713*e8521822SAbhijit Gangurde 	__le64		hdr_dma_addr;
714*e8521822SAbhijit Gangurde 	__le64		sq_dma_addr;
715*e8521822SAbhijit Gangurde 	__le64		rq_dma_addr;
716*e8521822SAbhijit Gangurde 	__le32		ah_id;
717*e8521822SAbhijit Gangurde 	__le32		id_ver;
718*e8521822SAbhijit Gangurde 	__le16		dbid_flags;
719*e8521822SAbhijit Gangurde } __packed;
720*e8521822SAbhijit Gangurde 
721*e8521822SAbhijit Gangurde #define IONIC_ADMIN_QUERY_QP_IN_V1_LEN 34
722*e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_query_qp) ==
723*e8521822SAbhijit Gangurde 	       IONIC_ADMIN_QUERY_QP_IN_V1_LEN);
724*e8521822SAbhijit Gangurde 
725f3bdbd42SAbhijit Gangurde #define ADMIN_WQE_STRIDE	64
726f3bdbd42SAbhijit Gangurde #define ADMIN_WQE_HDR_LEN	4
727f3bdbd42SAbhijit Gangurde 
728f3bdbd42SAbhijit Gangurde /* admin queue v1 wqe */
729f3bdbd42SAbhijit Gangurde struct ionic_v1_admin_wqe {
730f3bdbd42SAbhijit Gangurde 	__u8				op;
731f3bdbd42SAbhijit Gangurde 	__u8				rsvd;
732f3bdbd42SAbhijit Gangurde 	__le16				len;
733f3bdbd42SAbhijit Gangurde 
734f3bdbd42SAbhijit Gangurde 	union {
735*e8521822SAbhijit Gangurde 		struct ionic_admin_create_ah create_ah;
736*e8521822SAbhijit Gangurde 		struct ionic_admin_destroy_ah destroy_ah;
737*e8521822SAbhijit Gangurde 		struct ionic_admin_query_ah query_ah;
738*e8521822SAbhijit Gangurde 		struct ionic_admin_create_mr create_mr;
739*e8521822SAbhijit Gangurde 		struct ionic_admin_destroy_mr destroy_mr;
740*e8521822SAbhijit Gangurde 		struct ionic_admin_create_cq create_cq;
741*e8521822SAbhijit Gangurde 		struct ionic_admin_destroy_cq destroy_cq;
742*e8521822SAbhijit Gangurde 		struct ionic_admin_create_qp create_qp;
743*e8521822SAbhijit Gangurde 		struct ionic_admin_destroy_qp destroy_qp;
744*e8521822SAbhijit Gangurde 		struct ionic_admin_mod_qp mod_qp;
745*e8521822SAbhijit Gangurde 		struct ionic_admin_query_qp query_qp;
746f3bdbd42SAbhijit Gangurde 	} cmd;
747f3bdbd42SAbhijit Gangurde };
748f3bdbd42SAbhijit Gangurde 
749*e8521822SAbhijit Gangurde /* side data for query qp */
750*e8521822SAbhijit Gangurde struct ionic_v1_admin_query_qp_sq {
751*e8521822SAbhijit Gangurde 	__u8				rnr_timer;
752*e8521822SAbhijit Gangurde 	__u8				retry_timeout;
753*e8521822SAbhijit Gangurde 	__be16				access_perms_flags;
754*e8521822SAbhijit Gangurde 	__be16				rsvd;
755*e8521822SAbhijit Gangurde 	__be16				pkey_id;
756*e8521822SAbhijit Gangurde 	__be32				qkey_dest_qpn;
757*e8521822SAbhijit Gangurde 	__be32				rate_limit_kbps;
758*e8521822SAbhijit Gangurde 	__be32				rq_psn;
759*e8521822SAbhijit Gangurde };
760*e8521822SAbhijit Gangurde 
761*e8521822SAbhijit Gangurde struct ionic_v1_admin_query_qp_rq {
762*e8521822SAbhijit Gangurde 	__u8				state_pmtu;
763*e8521822SAbhijit Gangurde 	__u8				retry_rnrtry;
764*e8521822SAbhijit Gangurde 	__u8				rrq_depth;
765*e8521822SAbhijit Gangurde 	__u8				rsq_depth;
766*e8521822SAbhijit Gangurde 	__be32				sq_psn;
767*e8521822SAbhijit Gangurde 	__be16				access_perms_flags;
768*e8521822SAbhijit Gangurde 	__be16				rsvd;
769*e8521822SAbhijit Gangurde };
770*e8521822SAbhijit Gangurde 
771*e8521822SAbhijit Gangurde /* admin queue v1 opcodes */
772*e8521822SAbhijit Gangurde enum ionic_v1_admin_op {
773*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_NOOP,
774*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_CREATE_CQ,
775*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_CREATE_QP,
776*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_CREATE_MR,
777*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_STATS_HDRS,
778*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_STATS_VALS,
779*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_DESTROY_MR,
780*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_RSVD_7,		/* RESIZE_CQ */
781*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_DESTROY_CQ,
782*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_MODIFY_QP,
783*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_QUERY_QP,
784*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_DESTROY_QP,
785*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_DEBUG,
786*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_CREATE_AH,
787*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_QUERY_AH,
788*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_MODIFY_DCQCN,
789*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_DESTROY_AH,
790*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_QP_STATS_HDRS,
791*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_QP_STATS_VALS,
792*e8521822SAbhijit Gangurde 	IONIC_V1_ADMIN_OPCODES_MAX,
793*e8521822SAbhijit Gangurde };
794*e8521822SAbhijit Gangurde 
795f3bdbd42SAbhijit Gangurde /* admin queue v1 cqe status */
796f3bdbd42SAbhijit Gangurde enum ionic_v1_admin_status {
797f3bdbd42SAbhijit Gangurde 	IONIC_V1_ASTS_OK,
798f3bdbd42SAbhijit Gangurde 	IONIC_V1_ASTS_BAD_CMD,
799f3bdbd42SAbhijit Gangurde 	IONIC_V1_ASTS_BAD_INDEX,
800f3bdbd42SAbhijit Gangurde 	IONIC_V1_ASTS_BAD_STATE,
801f3bdbd42SAbhijit Gangurde 	IONIC_V1_ASTS_BAD_TYPE,
802f3bdbd42SAbhijit Gangurde 	IONIC_V1_ASTS_BAD_ATTR,
803f3bdbd42SAbhijit Gangurde 	IONIC_V1_ASTS_MSG_TOO_BIG,
804f3bdbd42SAbhijit Gangurde };
805f3bdbd42SAbhijit Gangurde 
806f3bdbd42SAbhijit Gangurde /* event queue v1 eqe */
807f3bdbd42SAbhijit Gangurde struct ionic_v1_eqe {
808f3bdbd42SAbhijit Gangurde 	__be32				evt;
809f3bdbd42SAbhijit Gangurde };
810f3bdbd42SAbhijit Gangurde 
811f3bdbd42SAbhijit Gangurde /* bits for cqe queue_type_flags */
812f3bdbd42SAbhijit Gangurde enum ionic_v1_eqe_evt_bits {
813f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_COLOR		= BIT(0),
814f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_TYPE_SHIFT		= 1,
815f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_TYPE_MASK		= 0x7,
816f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_CODE_SHIFT		= 4,
817f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_CODE_MASK		= 0xf,
818f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_QID_SHIFT		= 8,
819f3bdbd42SAbhijit Gangurde 
820f3bdbd42SAbhijit Gangurde 	/* cq events */
821f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_TYPE_CQ		= 0,
822f3bdbd42SAbhijit Gangurde 	/* cq normal events */
823f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_CQ_NOTIFY		= 0,
824f3bdbd42SAbhijit Gangurde 	/* cq error events */
825f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_CQ_ERR		= 8,
826f3bdbd42SAbhijit Gangurde 
827f3bdbd42SAbhijit Gangurde 	/* qp and srq events */
828f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_TYPE_QP		= 1,
829f3bdbd42SAbhijit Gangurde 	/* qp normal events */
830f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_SRQ_LEVEL		= 0,
831f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_SQ_DRAIN		= 1,
832f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_QP_COMM_EST	= 2,
833f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_QP_LAST_WQE	= 3,
834f3bdbd42SAbhijit Gangurde 	/* qp error events */
835f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_QP_ERR		= 8,
836f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_QP_ERR_REQUEST	= 9,
837f3bdbd42SAbhijit Gangurde 	IONIC_V1_EQE_QP_ERR_ACCESS	= 10,
838f3bdbd42SAbhijit Gangurde };
839f3bdbd42SAbhijit Gangurde 
840*e8521822SAbhijit Gangurde enum ionic_tfp_csum_profiles {
841*e8521822SAbhijit Gangurde 	IONIC_TFP_CSUM_PROF_ETH_IPV4_UDP				= 0,
842*e8521822SAbhijit Gangurde 	IONIC_TFP_CSUM_PROF_ETH_QTAG_IPV4_UDP				= 1,
843*e8521822SAbhijit Gangurde 	IONIC_TFP_CSUM_PROF_ETH_IPV6_UDP				= 2,
844*e8521822SAbhijit Gangurde 	IONIC_TFP_CSUM_PROF_ETH_QTAG_IPV6_UDP				= 3,
845*e8521822SAbhijit Gangurde 	IONIC_TFP_CSUM_PROF_IPV4_UDP_VXLAN_ETH_QTAG_IPV4_UDP		= 4,
846*e8521822SAbhijit Gangurde 	IONIC_TFP_CSUM_PROF_IPV4_UDP_VXLAN_ETH_QTAG_IPV6_UDP		= 5,
847*e8521822SAbhijit Gangurde 	IONIC_TFP_CSUM_PROF_QTAG_IPV4_UDP_VXLAN_ETH_QTAG_IPV4_UDP	= 6,
848*e8521822SAbhijit Gangurde 	IONIC_TFP_CSUM_PROF_QTAG_IPV4_UDP_VXLAN_ETH_QTAG_IPV6_UDP	= 7,
849*e8521822SAbhijit Gangurde 	IONIC_TFP_CSUM_PROF_ETH_QTAG_IPV4_UDP_ESP_IPV4_UDP		= 8,
850*e8521822SAbhijit Gangurde 	IONIC_TFP_CSUM_PROF_ETH_QTAG_IPV4_ESP_UDP			= 9,
851*e8521822SAbhijit Gangurde 	IONIC_TFP_CSUM_PROF_ETH_QTAG_IPV4_UDP_ESP_UDP			= 10,
852*e8521822SAbhijit Gangurde 	IONIC_TFP_CSUM_PROF_ETH_QTAG_IPV6_ESP_UDP			= 11,
853*e8521822SAbhijit Gangurde 	IONIC_TFP_CSUM_PROF_ETH_QTAG_IPV4_UDP_CSUM			= 12,
854*e8521822SAbhijit Gangurde };
855*e8521822SAbhijit Gangurde 
856f3bdbd42SAbhijit Gangurde static inline bool ionic_v1_eqe_color(struct ionic_v1_eqe *eqe)
857f3bdbd42SAbhijit Gangurde {
858f3bdbd42SAbhijit Gangurde 	return eqe->evt & cpu_to_be32(IONIC_V1_EQE_COLOR);
859f3bdbd42SAbhijit Gangurde }
860f3bdbd42SAbhijit Gangurde 
861f3bdbd42SAbhijit Gangurde static inline u32 ionic_v1_eqe_evt(struct ionic_v1_eqe *eqe)
862f3bdbd42SAbhijit Gangurde {
863f3bdbd42SAbhijit Gangurde 	return be32_to_cpu(eqe->evt);
864f3bdbd42SAbhijit Gangurde }
865f3bdbd42SAbhijit Gangurde 
866f3bdbd42SAbhijit Gangurde static inline u8 ionic_v1_eqe_evt_type(u32 evt)
867f3bdbd42SAbhijit Gangurde {
868f3bdbd42SAbhijit Gangurde 	return (evt >> IONIC_V1_EQE_TYPE_SHIFT) & IONIC_V1_EQE_TYPE_MASK;
869f3bdbd42SAbhijit Gangurde }
870f3bdbd42SAbhijit Gangurde 
871f3bdbd42SAbhijit Gangurde static inline u8 ionic_v1_eqe_evt_code(u32 evt)
872f3bdbd42SAbhijit Gangurde {
873f3bdbd42SAbhijit Gangurde 	return (evt >> IONIC_V1_EQE_CODE_SHIFT) & IONIC_V1_EQE_CODE_MASK;
874f3bdbd42SAbhijit Gangurde }
875f3bdbd42SAbhijit Gangurde 
876f3bdbd42SAbhijit Gangurde static inline u32 ionic_v1_eqe_evt_qid(u32 evt)
877f3bdbd42SAbhijit Gangurde {
878f3bdbd42SAbhijit Gangurde 	return evt >> IONIC_V1_EQE_QID_SHIFT;
879f3bdbd42SAbhijit Gangurde }
880f3bdbd42SAbhijit Gangurde 
881f3bdbd42SAbhijit Gangurde #endif /* _IONIC_FW_H_ */
882