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