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