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 166*b83c6205SAbhijit Gangurde /* cqe non-admin status indicated in status_length field when err bit is set */ 167*b83c6205SAbhijit Gangurde enum ionic_status { 168*b83c6205SAbhijit Gangurde IONIC_STS_OK, 169*b83c6205SAbhijit Gangurde IONIC_STS_LOCAL_LEN_ERR, 170*b83c6205SAbhijit Gangurde IONIC_STS_LOCAL_QP_OPER_ERR, 171*b83c6205SAbhijit Gangurde IONIC_STS_LOCAL_PROT_ERR, 172*b83c6205SAbhijit Gangurde IONIC_STS_WQE_FLUSHED_ERR, 173*b83c6205SAbhijit Gangurde IONIC_STS_MEM_MGMT_OPER_ERR, 174*b83c6205SAbhijit Gangurde IONIC_STS_BAD_RESP_ERR, 175*b83c6205SAbhijit Gangurde IONIC_STS_LOCAL_ACC_ERR, 176*b83c6205SAbhijit Gangurde IONIC_STS_REMOTE_INV_REQ_ERR, 177*b83c6205SAbhijit Gangurde IONIC_STS_REMOTE_ACC_ERR, 178*b83c6205SAbhijit Gangurde IONIC_STS_REMOTE_OPER_ERR, 179*b83c6205SAbhijit Gangurde IONIC_STS_RETRY_EXCEEDED, 180*b83c6205SAbhijit Gangurde IONIC_STS_RNR_RETRY_EXCEEDED, 181*b83c6205SAbhijit Gangurde IONIC_STS_XRC_VIO_ERR, 182*b83c6205SAbhijit Gangurde IONIC_STS_LOCAL_SGL_INV_ERR, 183*b83c6205SAbhijit Gangurde }; 184*b83c6205SAbhijit Gangurde 185*b83c6205SAbhijit Gangurde static inline int ionic_to_ib_status(int sts) 186*b83c6205SAbhijit Gangurde { 187*b83c6205SAbhijit Gangurde switch (sts) { 188*b83c6205SAbhijit Gangurde case IONIC_STS_OK: 189*b83c6205SAbhijit Gangurde return IB_WC_SUCCESS; 190*b83c6205SAbhijit Gangurde case IONIC_STS_LOCAL_LEN_ERR: 191*b83c6205SAbhijit Gangurde return IB_WC_LOC_LEN_ERR; 192*b83c6205SAbhijit Gangurde case IONIC_STS_LOCAL_QP_OPER_ERR: 193*b83c6205SAbhijit Gangurde case IONIC_STS_LOCAL_SGL_INV_ERR: 194*b83c6205SAbhijit Gangurde return IB_WC_LOC_QP_OP_ERR; 195*b83c6205SAbhijit Gangurde case IONIC_STS_LOCAL_PROT_ERR: 196*b83c6205SAbhijit Gangurde return IB_WC_LOC_PROT_ERR; 197*b83c6205SAbhijit Gangurde case IONIC_STS_WQE_FLUSHED_ERR: 198*b83c6205SAbhijit Gangurde return IB_WC_WR_FLUSH_ERR; 199*b83c6205SAbhijit Gangurde case IONIC_STS_MEM_MGMT_OPER_ERR: 200*b83c6205SAbhijit Gangurde return IB_WC_MW_BIND_ERR; 201*b83c6205SAbhijit Gangurde case IONIC_STS_BAD_RESP_ERR: 202*b83c6205SAbhijit Gangurde return IB_WC_BAD_RESP_ERR; 203*b83c6205SAbhijit Gangurde case IONIC_STS_LOCAL_ACC_ERR: 204*b83c6205SAbhijit Gangurde return IB_WC_LOC_ACCESS_ERR; 205*b83c6205SAbhijit Gangurde case IONIC_STS_REMOTE_INV_REQ_ERR: 206*b83c6205SAbhijit Gangurde return IB_WC_REM_INV_REQ_ERR; 207*b83c6205SAbhijit Gangurde case IONIC_STS_REMOTE_ACC_ERR: 208*b83c6205SAbhijit Gangurde return IB_WC_REM_ACCESS_ERR; 209*b83c6205SAbhijit Gangurde case IONIC_STS_REMOTE_OPER_ERR: 210*b83c6205SAbhijit Gangurde return IB_WC_REM_OP_ERR; 211*b83c6205SAbhijit Gangurde case IONIC_STS_RETRY_EXCEEDED: 212*b83c6205SAbhijit Gangurde return IB_WC_RETRY_EXC_ERR; 213*b83c6205SAbhijit Gangurde case IONIC_STS_RNR_RETRY_EXCEEDED: 214*b83c6205SAbhijit Gangurde return IB_WC_RNR_RETRY_EXC_ERR; 215*b83c6205SAbhijit Gangurde case IONIC_STS_XRC_VIO_ERR: 216*b83c6205SAbhijit Gangurde default: 217*b83c6205SAbhijit Gangurde return IB_WC_GENERAL_ERR; 218*b83c6205SAbhijit Gangurde } 219*b83c6205SAbhijit Gangurde } 220*b83c6205SAbhijit 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 352*b83c6205SAbhijit Gangurde /* bits for cqe recv */ 353*b83c6205SAbhijit Gangurde enum ionic_v1_cqe_src_qpn_bits { 354*b83c6205SAbhijit Gangurde IONIC_V1_CQE_RECV_QPN_MASK = 0xffffff, 355*b83c6205SAbhijit Gangurde IONIC_V1_CQE_RECV_OP_SHIFT = 24, 356*b83c6205SAbhijit Gangurde 357*b83c6205SAbhijit Gangurde /* MASK could be 0x3, but need 0x1f for makeshift values: 358*b83c6205SAbhijit Gangurde * OP_TYPE_RDMA_OPER_WITH_IMM, OP_TYPE_SEND_RCVD 359*b83c6205SAbhijit Gangurde */ 360*b83c6205SAbhijit Gangurde IONIC_V1_CQE_RECV_OP_MASK = 0x1f, 361*b83c6205SAbhijit Gangurde IONIC_V1_CQE_RECV_OP_SEND = 0, 362*b83c6205SAbhijit Gangurde IONIC_V1_CQE_RECV_OP_SEND_INV = 1, 363*b83c6205SAbhijit Gangurde IONIC_V1_CQE_RECV_OP_SEND_IMM = 2, 364*b83c6205SAbhijit Gangurde IONIC_V1_CQE_RECV_OP_RDMA_IMM = 3, 365*b83c6205SAbhijit Gangurde 366*b83c6205SAbhijit Gangurde IONIC_V1_CQE_RECV_IS_IPV4 = BIT(7 + IONIC_V1_CQE_RECV_OP_SHIFT), 367*b83c6205SAbhijit Gangurde IONIC_V1_CQE_RECV_IS_VLAN = BIT(6 + IONIC_V1_CQE_RECV_OP_SHIFT), 368*b83c6205SAbhijit Gangurde }; 369*b83c6205SAbhijit 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 394*b83c6205SAbhijit Gangurde static inline bool ionic_v1_cqe_recv_is_ipv4(struct ionic_v1_cqe *cqe) 395*b83c6205SAbhijit Gangurde { 396*b83c6205SAbhijit Gangurde return cqe->recv.src_qpn_op & cpu_to_be32(IONIC_V1_CQE_RECV_IS_IPV4); 397*b83c6205SAbhijit Gangurde } 398*b83c6205SAbhijit Gangurde 399*b83c6205SAbhijit Gangurde static inline bool ionic_v1_cqe_recv_is_vlan(struct ionic_v1_cqe *cqe) 400*b83c6205SAbhijit Gangurde { 401*b83c6205SAbhijit Gangurde return cqe->recv.src_qpn_op & cpu_to_be32(IONIC_V1_CQE_RECV_IS_VLAN); 402*b83c6205SAbhijit Gangurde } 403*b83c6205SAbhijit 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 530*b83c6205SAbhijit Gangurde /* queue pair v2 send opcodes */ 531*b83c6205SAbhijit Gangurde enum ionic_v2_op { 532*b83c6205SAbhijit Gangurde IONIC_V2_OPSL_OUT = 0x20, 533*b83c6205SAbhijit Gangurde IONIC_V2_OPSL_IMM = 0x40, 534*b83c6205SAbhijit Gangurde IONIC_V2_OPSL_INV = 0x80, 535*b83c6205SAbhijit Gangurde 536*b83c6205SAbhijit Gangurde IONIC_V2_OP_SEND = 0x0 | IONIC_V2_OPSL_OUT, 537*b83c6205SAbhijit Gangurde IONIC_V2_OP_SEND_IMM = IONIC_V2_OP_SEND | IONIC_V2_OPSL_IMM, 538*b83c6205SAbhijit Gangurde IONIC_V2_OP_SEND_INV = IONIC_V2_OP_SEND | IONIC_V2_OPSL_INV, 539*b83c6205SAbhijit Gangurde 540*b83c6205SAbhijit Gangurde IONIC_V2_OP_RDMA_WRITE = 0x1 | IONIC_V2_OPSL_OUT, 541*b83c6205SAbhijit Gangurde IONIC_V2_OP_RDMA_WRITE_IMM = IONIC_V2_OP_RDMA_WRITE | IONIC_V2_OPSL_IMM, 542*b83c6205SAbhijit Gangurde 543*b83c6205SAbhijit Gangurde IONIC_V2_OP_RDMA_READ = 0x2, 544*b83c6205SAbhijit Gangurde 545*b83c6205SAbhijit Gangurde IONIC_V2_OP_ATOMIC_CS = 0x4, 546*b83c6205SAbhijit Gangurde IONIC_V2_OP_ATOMIC_FA = 0x5, 547*b83c6205SAbhijit Gangurde IONIC_V2_OP_REG_MR = 0x6, 548*b83c6205SAbhijit Gangurde IONIC_V2_OP_LOCAL_INV = 0x7, 549*b83c6205SAbhijit Gangurde IONIC_V2_OP_BIND_MW = 0x8, 550*b83c6205SAbhijit Gangurde }; 551*b83c6205SAbhijit 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 662e8521822SAbhijit Gangurde struct ionic_admin_create_ah { 663e8521822SAbhijit Gangurde __le64 dma_addr; 664e8521822SAbhijit Gangurde __le32 length; 665e8521822SAbhijit Gangurde __le32 pd_id; 666e8521822SAbhijit Gangurde __le32 id_ver; 667e8521822SAbhijit Gangurde __le16 dbid_flags; 668e8521822SAbhijit Gangurde __u8 csum_profile; 669e8521822SAbhijit Gangurde __u8 crypto; 670e8521822SAbhijit Gangurde } __packed; 671e8521822SAbhijit Gangurde 672e8521822SAbhijit Gangurde #define IONIC_ADMIN_CREATE_AH_IN_V1_LEN 24 673e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_create_ah) == 674e8521822SAbhijit Gangurde IONIC_ADMIN_CREATE_AH_IN_V1_LEN); 675e8521822SAbhijit Gangurde 676e8521822SAbhijit Gangurde struct ionic_admin_destroy_ah { 677e8521822SAbhijit Gangurde __le32 ah_id; 678e8521822SAbhijit Gangurde } __packed; 679e8521822SAbhijit Gangurde 680e8521822SAbhijit Gangurde #define IONIC_ADMIN_DESTROY_AH_IN_V1_LEN 4 681e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_destroy_ah) == 682e8521822SAbhijit Gangurde IONIC_ADMIN_DESTROY_AH_IN_V1_LEN); 683e8521822SAbhijit Gangurde 684e8521822SAbhijit Gangurde struct ionic_admin_query_ah { 685e8521822SAbhijit Gangurde __le64 dma_addr; 686e8521822SAbhijit Gangurde } __packed; 687e8521822SAbhijit Gangurde 688e8521822SAbhijit Gangurde #define IONIC_ADMIN_QUERY_AH_IN_V1_LEN 8 689e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_query_ah) == 690e8521822SAbhijit Gangurde IONIC_ADMIN_QUERY_AH_IN_V1_LEN); 691e8521822SAbhijit Gangurde 692e8521822SAbhijit Gangurde struct ionic_admin_create_mr { 693e8521822SAbhijit Gangurde __le64 va; 694e8521822SAbhijit Gangurde __le64 length; 695e8521822SAbhijit Gangurde __le32 pd_id; 696e8521822SAbhijit Gangurde __le32 id_ver; 697e8521822SAbhijit Gangurde __le32 tbl_index; 698e8521822SAbhijit Gangurde __le32 map_count; 699e8521822SAbhijit Gangurde __le64 dma_addr; 700e8521822SAbhijit Gangurde __le16 dbid_flags; 701e8521822SAbhijit Gangurde __u8 pt_type; 702e8521822SAbhijit Gangurde __u8 dir_size_log2; 703e8521822SAbhijit Gangurde __u8 page_size_log2; 704e8521822SAbhijit Gangurde } __packed; 705e8521822SAbhijit Gangurde 706e8521822SAbhijit Gangurde #define IONIC_ADMIN_CREATE_MR_IN_V1_LEN 45 707e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_create_mr) == 708e8521822SAbhijit Gangurde IONIC_ADMIN_CREATE_MR_IN_V1_LEN); 709e8521822SAbhijit Gangurde 710e8521822SAbhijit Gangurde struct ionic_admin_destroy_mr { 711e8521822SAbhijit Gangurde __le32 mr_id; 712e8521822SAbhijit Gangurde } __packed; 713e8521822SAbhijit Gangurde 714e8521822SAbhijit Gangurde #define IONIC_ADMIN_DESTROY_MR_IN_V1_LEN 4 715e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_destroy_mr) == 716e8521822SAbhijit Gangurde IONIC_ADMIN_DESTROY_MR_IN_V1_LEN); 717e8521822SAbhijit Gangurde 718e8521822SAbhijit Gangurde struct ionic_admin_create_cq { 719e8521822SAbhijit Gangurde __le32 eq_id; 720e8521822SAbhijit Gangurde __u8 depth_log2; 721e8521822SAbhijit Gangurde __u8 stride_log2; 722e8521822SAbhijit Gangurde __u8 dir_size_log2_rsvd; 723e8521822SAbhijit Gangurde __u8 page_size_log2; 724e8521822SAbhijit Gangurde __le32 cq_flags; 725e8521822SAbhijit Gangurde __le32 id_ver; 726e8521822SAbhijit Gangurde __le32 tbl_index; 727e8521822SAbhijit Gangurde __le32 map_count; 728e8521822SAbhijit Gangurde __le64 dma_addr; 729e8521822SAbhijit Gangurde __le16 dbid_flags; 730e8521822SAbhijit Gangurde } __packed; 731e8521822SAbhijit Gangurde 732e8521822SAbhijit Gangurde #define IONIC_ADMIN_CREATE_CQ_IN_V1_LEN 34 733e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_create_cq) == 734e8521822SAbhijit Gangurde IONIC_ADMIN_CREATE_CQ_IN_V1_LEN); 735e8521822SAbhijit Gangurde 736e8521822SAbhijit Gangurde struct ionic_admin_destroy_cq { 737e8521822SAbhijit Gangurde __le32 cq_id; 738e8521822SAbhijit Gangurde } __packed; 739e8521822SAbhijit Gangurde 740e8521822SAbhijit Gangurde #define IONIC_ADMIN_DESTROY_CQ_IN_V1_LEN 4 741e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_destroy_cq) == 742e8521822SAbhijit Gangurde IONIC_ADMIN_DESTROY_CQ_IN_V1_LEN); 743e8521822SAbhijit Gangurde 744e8521822SAbhijit Gangurde struct ionic_admin_create_qp { 745e8521822SAbhijit Gangurde __le32 pd_id; 746e8521822SAbhijit Gangurde __be32 priv_flags; 747e8521822SAbhijit Gangurde __le32 sq_cq_id; 748e8521822SAbhijit Gangurde __u8 sq_depth_log2; 749e8521822SAbhijit Gangurde __u8 sq_stride_log2; 750e8521822SAbhijit Gangurde __u8 sq_dir_size_log2_rsvd; 751e8521822SAbhijit Gangurde __u8 sq_page_size_log2; 752e8521822SAbhijit Gangurde __le32 sq_tbl_index_xrcd_id; 753e8521822SAbhijit Gangurde __le32 sq_map_count; 754e8521822SAbhijit Gangurde __le64 sq_dma_addr; 755e8521822SAbhijit Gangurde __le32 rq_cq_id; 756e8521822SAbhijit Gangurde __u8 rq_depth_log2; 757e8521822SAbhijit Gangurde __u8 rq_stride_log2; 758e8521822SAbhijit Gangurde __u8 rq_dir_size_log2_rsvd; 759e8521822SAbhijit Gangurde __u8 rq_page_size_log2; 760e8521822SAbhijit Gangurde __le32 rq_tbl_index_srq_id; 761e8521822SAbhijit Gangurde __le32 rq_map_count; 762e8521822SAbhijit Gangurde __le64 rq_dma_addr; 763e8521822SAbhijit Gangurde __le32 id_ver; 764e8521822SAbhijit Gangurde __le16 dbid_flags; 765e8521822SAbhijit Gangurde __u8 type_state; 766e8521822SAbhijit Gangurde __u8 rsvd; 767e8521822SAbhijit Gangurde } __packed; 768e8521822SAbhijit Gangurde 769e8521822SAbhijit Gangurde #define IONIC_ADMIN_CREATE_QP_IN_V1_LEN 64 770e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_create_qp) == 771e8521822SAbhijit Gangurde IONIC_ADMIN_CREATE_QP_IN_V1_LEN); 772e8521822SAbhijit Gangurde 773e8521822SAbhijit Gangurde struct ionic_admin_destroy_qp { 774e8521822SAbhijit Gangurde __le32 qp_id; 775e8521822SAbhijit Gangurde } __packed; 776e8521822SAbhijit Gangurde 777e8521822SAbhijit Gangurde #define IONIC_ADMIN_DESTROY_QP_IN_V1_LEN 4 778e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_destroy_qp) == 779e8521822SAbhijit Gangurde IONIC_ADMIN_DESTROY_QP_IN_V1_LEN); 780e8521822SAbhijit Gangurde 781e8521822SAbhijit Gangurde struct ionic_admin_mod_qp { 782e8521822SAbhijit Gangurde __be32 attr_mask; 783e8521822SAbhijit Gangurde __u8 dcqcn_profile; 784e8521822SAbhijit Gangurde __u8 tfp_csum_profile; 785e8521822SAbhijit Gangurde __be16 access_flags; 786e8521822SAbhijit Gangurde __le32 rq_psn; 787e8521822SAbhijit Gangurde __le32 sq_psn; 788e8521822SAbhijit Gangurde __le32 qkey_dest_qpn; 789e8521822SAbhijit Gangurde __le32 rate_limit_kbps; 790e8521822SAbhijit Gangurde __u8 pmtu; 791e8521822SAbhijit Gangurde __u8 retry; 792e8521822SAbhijit Gangurde __u8 rnr_timer; 793e8521822SAbhijit Gangurde __u8 retry_timeout; 794e8521822SAbhijit Gangurde __u8 rsq_depth; 795e8521822SAbhijit Gangurde __u8 rrq_depth; 796e8521822SAbhijit Gangurde __le16 pkey_id; 797e8521822SAbhijit Gangurde __le32 ah_id_len; 798e8521822SAbhijit Gangurde __u8 en_pcp; 799e8521822SAbhijit Gangurde __u8 ip_dscp; 800e8521822SAbhijit Gangurde __u8 rsvd2; 801e8521822SAbhijit Gangurde __u8 type_state; 802e8521822SAbhijit Gangurde union { 803e8521822SAbhijit Gangurde struct { 804e8521822SAbhijit Gangurde __le16 rsvd1; 805e8521822SAbhijit Gangurde }; 806e8521822SAbhijit Gangurde __le32 rrq_index; 807e8521822SAbhijit Gangurde }; 808e8521822SAbhijit Gangurde __le32 rsq_index; 809e8521822SAbhijit Gangurde __le64 dma_addr; 810e8521822SAbhijit Gangurde __le32 id_ver; 811e8521822SAbhijit Gangurde } __packed; 812e8521822SAbhijit Gangurde 813e8521822SAbhijit Gangurde #define IONIC_ADMIN_MODIFY_QP_IN_V1_LEN 60 814e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_mod_qp) == 815e8521822SAbhijit Gangurde IONIC_ADMIN_MODIFY_QP_IN_V1_LEN); 816e8521822SAbhijit Gangurde 817e8521822SAbhijit Gangurde struct ionic_admin_query_qp { 818e8521822SAbhijit Gangurde __le64 hdr_dma_addr; 819e8521822SAbhijit Gangurde __le64 sq_dma_addr; 820e8521822SAbhijit Gangurde __le64 rq_dma_addr; 821e8521822SAbhijit Gangurde __le32 ah_id; 822e8521822SAbhijit Gangurde __le32 id_ver; 823e8521822SAbhijit Gangurde __le16 dbid_flags; 824e8521822SAbhijit Gangurde } __packed; 825e8521822SAbhijit Gangurde 826e8521822SAbhijit Gangurde #define IONIC_ADMIN_QUERY_QP_IN_V1_LEN 34 827e8521822SAbhijit Gangurde static_assert(sizeof(struct ionic_admin_query_qp) == 828e8521822SAbhijit Gangurde IONIC_ADMIN_QUERY_QP_IN_V1_LEN); 829e8521822SAbhijit Gangurde 830f3bdbd42SAbhijit Gangurde #define ADMIN_WQE_STRIDE 64 831f3bdbd42SAbhijit Gangurde #define ADMIN_WQE_HDR_LEN 4 832f3bdbd42SAbhijit Gangurde 833f3bdbd42SAbhijit Gangurde /* admin queue v1 wqe */ 834f3bdbd42SAbhijit Gangurde struct ionic_v1_admin_wqe { 835f3bdbd42SAbhijit Gangurde __u8 op; 836f3bdbd42SAbhijit Gangurde __u8 rsvd; 837f3bdbd42SAbhijit Gangurde __le16 len; 838f3bdbd42SAbhijit Gangurde 839f3bdbd42SAbhijit Gangurde union { 840e8521822SAbhijit Gangurde struct ionic_admin_create_ah create_ah; 841e8521822SAbhijit Gangurde struct ionic_admin_destroy_ah destroy_ah; 842e8521822SAbhijit Gangurde struct ionic_admin_query_ah query_ah; 843e8521822SAbhijit Gangurde struct ionic_admin_create_mr create_mr; 844e8521822SAbhijit Gangurde struct ionic_admin_destroy_mr destroy_mr; 845e8521822SAbhijit Gangurde struct ionic_admin_create_cq create_cq; 846e8521822SAbhijit Gangurde struct ionic_admin_destroy_cq destroy_cq; 847e8521822SAbhijit Gangurde struct ionic_admin_create_qp create_qp; 848e8521822SAbhijit Gangurde struct ionic_admin_destroy_qp destroy_qp; 849e8521822SAbhijit Gangurde struct ionic_admin_mod_qp mod_qp; 850e8521822SAbhijit Gangurde struct ionic_admin_query_qp query_qp; 851f3bdbd42SAbhijit Gangurde } cmd; 852f3bdbd42SAbhijit Gangurde }; 853f3bdbd42SAbhijit Gangurde 854e8521822SAbhijit Gangurde /* side data for query qp */ 855e8521822SAbhijit Gangurde struct ionic_v1_admin_query_qp_sq { 856e8521822SAbhijit Gangurde __u8 rnr_timer; 857e8521822SAbhijit Gangurde __u8 retry_timeout; 858e8521822SAbhijit Gangurde __be16 access_perms_flags; 859e8521822SAbhijit Gangurde __be16 rsvd; 860e8521822SAbhijit Gangurde __be16 pkey_id; 861e8521822SAbhijit Gangurde __be32 qkey_dest_qpn; 862e8521822SAbhijit Gangurde __be32 rate_limit_kbps; 863e8521822SAbhijit Gangurde __be32 rq_psn; 864e8521822SAbhijit Gangurde }; 865e8521822SAbhijit Gangurde 866e8521822SAbhijit Gangurde struct ionic_v1_admin_query_qp_rq { 867e8521822SAbhijit Gangurde __u8 state_pmtu; 868e8521822SAbhijit Gangurde __u8 retry_rnrtry; 869e8521822SAbhijit Gangurde __u8 rrq_depth; 870e8521822SAbhijit Gangurde __u8 rsq_depth; 871e8521822SAbhijit Gangurde __be32 sq_psn; 872e8521822SAbhijit Gangurde __be16 access_perms_flags; 873e8521822SAbhijit Gangurde __be16 rsvd; 874e8521822SAbhijit Gangurde }; 875e8521822SAbhijit Gangurde 876e8521822SAbhijit Gangurde /* admin queue v1 opcodes */ 877e8521822SAbhijit Gangurde enum ionic_v1_admin_op { 878e8521822SAbhijit Gangurde IONIC_V1_ADMIN_NOOP, 879e8521822SAbhijit Gangurde IONIC_V1_ADMIN_CREATE_CQ, 880e8521822SAbhijit Gangurde IONIC_V1_ADMIN_CREATE_QP, 881e8521822SAbhijit Gangurde IONIC_V1_ADMIN_CREATE_MR, 882e8521822SAbhijit Gangurde IONIC_V1_ADMIN_STATS_HDRS, 883e8521822SAbhijit Gangurde IONIC_V1_ADMIN_STATS_VALS, 884e8521822SAbhijit Gangurde IONIC_V1_ADMIN_DESTROY_MR, 885e8521822SAbhijit Gangurde IONIC_V1_ADMIN_RSVD_7, /* RESIZE_CQ */ 886e8521822SAbhijit Gangurde IONIC_V1_ADMIN_DESTROY_CQ, 887e8521822SAbhijit Gangurde IONIC_V1_ADMIN_MODIFY_QP, 888e8521822SAbhijit Gangurde IONIC_V1_ADMIN_QUERY_QP, 889e8521822SAbhijit Gangurde IONIC_V1_ADMIN_DESTROY_QP, 890e8521822SAbhijit Gangurde IONIC_V1_ADMIN_DEBUG, 891e8521822SAbhijit Gangurde IONIC_V1_ADMIN_CREATE_AH, 892e8521822SAbhijit Gangurde IONIC_V1_ADMIN_QUERY_AH, 893e8521822SAbhijit Gangurde IONIC_V1_ADMIN_MODIFY_DCQCN, 894e8521822SAbhijit Gangurde IONIC_V1_ADMIN_DESTROY_AH, 895e8521822SAbhijit Gangurde IONIC_V1_ADMIN_QP_STATS_HDRS, 896e8521822SAbhijit Gangurde IONIC_V1_ADMIN_QP_STATS_VALS, 897e8521822SAbhijit Gangurde IONIC_V1_ADMIN_OPCODES_MAX, 898e8521822SAbhijit Gangurde }; 899e8521822SAbhijit Gangurde 900f3bdbd42SAbhijit Gangurde /* admin queue v1 cqe status */ 901f3bdbd42SAbhijit Gangurde enum ionic_v1_admin_status { 902f3bdbd42SAbhijit Gangurde IONIC_V1_ASTS_OK, 903f3bdbd42SAbhijit Gangurde IONIC_V1_ASTS_BAD_CMD, 904f3bdbd42SAbhijit Gangurde IONIC_V1_ASTS_BAD_INDEX, 905f3bdbd42SAbhijit Gangurde IONIC_V1_ASTS_BAD_STATE, 906f3bdbd42SAbhijit Gangurde IONIC_V1_ASTS_BAD_TYPE, 907f3bdbd42SAbhijit Gangurde IONIC_V1_ASTS_BAD_ATTR, 908f3bdbd42SAbhijit Gangurde IONIC_V1_ASTS_MSG_TOO_BIG, 909f3bdbd42SAbhijit Gangurde }; 910f3bdbd42SAbhijit Gangurde 911f3bdbd42SAbhijit Gangurde /* event queue v1 eqe */ 912f3bdbd42SAbhijit Gangurde struct ionic_v1_eqe { 913f3bdbd42SAbhijit Gangurde __be32 evt; 914f3bdbd42SAbhijit Gangurde }; 915f3bdbd42SAbhijit Gangurde 916f3bdbd42SAbhijit Gangurde /* bits for cqe queue_type_flags */ 917f3bdbd42SAbhijit Gangurde enum ionic_v1_eqe_evt_bits { 918f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_COLOR = BIT(0), 919f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_TYPE_SHIFT = 1, 920f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_TYPE_MASK = 0x7, 921f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_CODE_SHIFT = 4, 922f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_CODE_MASK = 0xf, 923f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_QID_SHIFT = 8, 924f3bdbd42SAbhijit Gangurde 925f3bdbd42SAbhijit Gangurde /* cq events */ 926f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_TYPE_CQ = 0, 927f3bdbd42SAbhijit Gangurde /* cq normal events */ 928f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_CQ_NOTIFY = 0, 929f3bdbd42SAbhijit Gangurde /* cq error events */ 930f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_CQ_ERR = 8, 931f3bdbd42SAbhijit Gangurde 932f3bdbd42SAbhijit Gangurde /* qp and srq events */ 933f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_TYPE_QP = 1, 934f3bdbd42SAbhijit Gangurde /* qp normal events */ 935f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_SRQ_LEVEL = 0, 936f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_SQ_DRAIN = 1, 937f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_QP_COMM_EST = 2, 938f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_QP_LAST_WQE = 3, 939f3bdbd42SAbhijit Gangurde /* qp error events */ 940f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_QP_ERR = 8, 941f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_QP_ERR_REQUEST = 9, 942f3bdbd42SAbhijit Gangurde IONIC_V1_EQE_QP_ERR_ACCESS = 10, 943f3bdbd42SAbhijit Gangurde }; 944f3bdbd42SAbhijit Gangurde 945e8521822SAbhijit Gangurde enum ionic_tfp_csum_profiles { 946e8521822SAbhijit Gangurde IONIC_TFP_CSUM_PROF_ETH_IPV4_UDP = 0, 947e8521822SAbhijit Gangurde IONIC_TFP_CSUM_PROF_ETH_QTAG_IPV4_UDP = 1, 948e8521822SAbhijit Gangurde IONIC_TFP_CSUM_PROF_ETH_IPV6_UDP = 2, 949e8521822SAbhijit Gangurde IONIC_TFP_CSUM_PROF_ETH_QTAG_IPV6_UDP = 3, 950e8521822SAbhijit Gangurde IONIC_TFP_CSUM_PROF_IPV4_UDP_VXLAN_ETH_QTAG_IPV4_UDP = 4, 951e8521822SAbhijit Gangurde IONIC_TFP_CSUM_PROF_IPV4_UDP_VXLAN_ETH_QTAG_IPV6_UDP = 5, 952e8521822SAbhijit Gangurde IONIC_TFP_CSUM_PROF_QTAG_IPV4_UDP_VXLAN_ETH_QTAG_IPV4_UDP = 6, 953e8521822SAbhijit Gangurde IONIC_TFP_CSUM_PROF_QTAG_IPV4_UDP_VXLAN_ETH_QTAG_IPV6_UDP = 7, 954e8521822SAbhijit Gangurde IONIC_TFP_CSUM_PROF_ETH_QTAG_IPV4_UDP_ESP_IPV4_UDP = 8, 955e8521822SAbhijit Gangurde IONIC_TFP_CSUM_PROF_ETH_QTAG_IPV4_ESP_UDP = 9, 956e8521822SAbhijit Gangurde IONIC_TFP_CSUM_PROF_ETH_QTAG_IPV4_UDP_ESP_UDP = 10, 957e8521822SAbhijit Gangurde IONIC_TFP_CSUM_PROF_ETH_QTAG_IPV6_ESP_UDP = 11, 958e8521822SAbhijit Gangurde IONIC_TFP_CSUM_PROF_ETH_QTAG_IPV4_UDP_CSUM = 12, 959e8521822SAbhijit Gangurde }; 960e8521822SAbhijit Gangurde 961f3bdbd42SAbhijit Gangurde static inline bool ionic_v1_eqe_color(struct ionic_v1_eqe *eqe) 962f3bdbd42SAbhijit Gangurde { 963f3bdbd42SAbhijit Gangurde return eqe->evt & cpu_to_be32(IONIC_V1_EQE_COLOR); 964f3bdbd42SAbhijit Gangurde } 965f3bdbd42SAbhijit Gangurde 966f3bdbd42SAbhijit Gangurde static inline u32 ionic_v1_eqe_evt(struct ionic_v1_eqe *eqe) 967f3bdbd42SAbhijit Gangurde { 968f3bdbd42SAbhijit Gangurde return be32_to_cpu(eqe->evt); 969f3bdbd42SAbhijit Gangurde } 970f3bdbd42SAbhijit Gangurde 971f3bdbd42SAbhijit Gangurde static inline u8 ionic_v1_eqe_evt_type(u32 evt) 972f3bdbd42SAbhijit Gangurde { 973f3bdbd42SAbhijit Gangurde return (evt >> IONIC_V1_EQE_TYPE_SHIFT) & IONIC_V1_EQE_TYPE_MASK; 974f3bdbd42SAbhijit Gangurde } 975f3bdbd42SAbhijit Gangurde 976f3bdbd42SAbhijit Gangurde static inline u8 ionic_v1_eqe_evt_code(u32 evt) 977f3bdbd42SAbhijit Gangurde { 978f3bdbd42SAbhijit Gangurde return (evt >> IONIC_V1_EQE_CODE_SHIFT) & IONIC_V1_EQE_CODE_MASK; 979f3bdbd42SAbhijit Gangurde } 980f3bdbd42SAbhijit Gangurde 981f3bdbd42SAbhijit Gangurde static inline u32 ionic_v1_eqe_evt_qid(u32 evt) 982f3bdbd42SAbhijit Gangurde { 983f3bdbd42SAbhijit Gangurde return evt >> IONIC_V1_EQE_QID_SHIFT; 984f3bdbd42SAbhijit Gangurde } 985f3bdbd42SAbhijit Gangurde 986f3bdbd42SAbhijit Gangurde #endif /* _IONIC_FW_H_ */ 987