1*4f830cd8SSiva Reddy Kallam /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2*4f830cd8SSiva Reddy Kallam 3*4f830cd8SSiva Reddy Kallam #ifndef __BNG_TLV_H__ 4*4f830cd8SSiva Reddy Kallam #define __BNG_TLV_H__ 5*4f830cd8SSiva Reddy Kallam 6*4f830cd8SSiva Reddy Kallam #include "roce_hsi.h" 7*4f830cd8SSiva Reddy Kallam 8*4f830cd8SSiva Reddy Kallam struct roce_tlv { 9*4f830cd8SSiva Reddy Kallam struct tlv tlv; 10*4f830cd8SSiva Reddy Kallam u8 total_size; // in units of 16 byte chunks 11*4f830cd8SSiva Reddy Kallam u8 unused[7]; // for 16 byte alignment 12*4f830cd8SSiva Reddy Kallam }; 13*4f830cd8SSiva Reddy Kallam 14*4f830cd8SSiva Reddy Kallam /* 15*4f830cd8SSiva Reddy Kallam * TLV size in units of 16 byte chunks 16*4f830cd8SSiva Reddy Kallam */ 17*4f830cd8SSiva Reddy Kallam #define TLV_SIZE ((sizeof(struct roce_tlv) + 15) / 16) 18*4f830cd8SSiva Reddy Kallam /* 19*4f830cd8SSiva Reddy Kallam * TLV length in bytes 20*4f830cd8SSiva Reddy Kallam */ 21*4f830cd8SSiva Reddy Kallam #define TLV_BYTES (TLV_SIZE * 16) 22*4f830cd8SSiva Reddy Kallam 23*4f830cd8SSiva Reddy Kallam #define HAS_TLV_HEADER(msg) (le16_to_cpu(((struct tlv *)(msg))->cmd_discr) == CMD_DISCR_TLV_ENCAP) 24*4f830cd8SSiva Reddy Kallam #define GET_TLV_DATA(tlv) ((void *)&((uint8_t *)(tlv))[TLV_BYTES]) 25*4f830cd8SSiva Reddy Kallam 26*4f830cd8SSiva Reddy Kallam static inline u8 __get_cmdq_base_opcode(struct cmdq_base *req, u32 size) 27*4f830cd8SSiva Reddy Kallam { 28*4f830cd8SSiva Reddy Kallam if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 29*4f830cd8SSiva Reddy Kallam return ((struct cmdq_base *)GET_TLV_DATA(req))->opcode; 30*4f830cd8SSiva Reddy Kallam else 31*4f830cd8SSiva Reddy Kallam return req->opcode; 32*4f830cd8SSiva Reddy Kallam } 33*4f830cd8SSiva Reddy Kallam 34*4f830cd8SSiva Reddy Kallam static inline void __set_cmdq_base_opcode(struct cmdq_base *req, 35*4f830cd8SSiva Reddy Kallam u32 size, u8 val) 36*4f830cd8SSiva Reddy Kallam { 37*4f830cd8SSiva Reddy Kallam if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 38*4f830cd8SSiva Reddy Kallam ((struct cmdq_base *)GET_TLV_DATA(req))->opcode = val; 39*4f830cd8SSiva Reddy Kallam else 40*4f830cd8SSiva Reddy Kallam req->opcode = val; 41*4f830cd8SSiva Reddy Kallam } 42*4f830cd8SSiva Reddy Kallam 43*4f830cd8SSiva Reddy Kallam static inline __le16 __get_cmdq_base_cookie(struct cmdq_base *req, u32 size) 44*4f830cd8SSiva Reddy Kallam { 45*4f830cd8SSiva Reddy Kallam if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 46*4f830cd8SSiva Reddy Kallam return ((struct cmdq_base *)GET_TLV_DATA(req))->cookie; 47*4f830cd8SSiva Reddy Kallam else 48*4f830cd8SSiva Reddy Kallam return req->cookie; 49*4f830cd8SSiva Reddy Kallam } 50*4f830cd8SSiva Reddy Kallam 51*4f830cd8SSiva Reddy Kallam static inline void __set_cmdq_base_cookie(struct cmdq_base *req, 52*4f830cd8SSiva Reddy Kallam u32 size, __le16 val) 53*4f830cd8SSiva Reddy Kallam { 54*4f830cd8SSiva Reddy Kallam if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 55*4f830cd8SSiva Reddy Kallam ((struct cmdq_base *)GET_TLV_DATA(req))->cookie = val; 56*4f830cd8SSiva Reddy Kallam else 57*4f830cd8SSiva Reddy Kallam req->cookie = val; 58*4f830cd8SSiva Reddy Kallam } 59*4f830cd8SSiva Reddy Kallam 60*4f830cd8SSiva Reddy Kallam static inline __le64 __get_cmdq_base_resp_addr(struct cmdq_base *req, u32 size) 61*4f830cd8SSiva Reddy Kallam { 62*4f830cd8SSiva Reddy Kallam if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 63*4f830cd8SSiva Reddy Kallam return ((struct cmdq_base *)GET_TLV_DATA(req))->resp_addr; 64*4f830cd8SSiva Reddy Kallam else 65*4f830cd8SSiva Reddy Kallam return req->resp_addr; 66*4f830cd8SSiva Reddy Kallam } 67*4f830cd8SSiva Reddy Kallam 68*4f830cd8SSiva Reddy Kallam static inline void __set_cmdq_base_resp_addr(struct cmdq_base *req, 69*4f830cd8SSiva Reddy Kallam u32 size, __le64 val) 70*4f830cd8SSiva Reddy Kallam { 71*4f830cd8SSiva Reddy Kallam if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 72*4f830cd8SSiva Reddy Kallam ((struct cmdq_base *)GET_TLV_DATA(req))->resp_addr = val; 73*4f830cd8SSiva Reddy Kallam else 74*4f830cd8SSiva Reddy Kallam req->resp_addr = val; 75*4f830cd8SSiva Reddy Kallam } 76*4f830cd8SSiva Reddy Kallam 77*4f830cd8SSiva Reddy Kallam static inline u8 __get_cmdq_base_resp_size(struct cmdq_base *req, u32 size) 78*4f830cd8SSiva Reddy Kallam { 79*4f830cd8SSiva Reddy Kallam if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 80*4f830cd8SSiva Reddy Kallam return ((struct cmdq_base *)GET_TLV_DATA(req))->resp_size; 81*4f830cd8SSiva Reddy Kallam else 82*4f830cd8SSiva Reddy Kallam return req->resp_size; 83*4f830cd8SSiva Reddy Kallam } 84*4f830cd8SSiva Reddy Kallam 85*4f830cd8SSiva Reddy Kallam static inline void __set_cmdq_base_resp_size(struct cmdq_base *req, 86*4f830cd8SSiva Reddy Kallam u32 size, u8 val) 87*4f830cd8SSiva Reddy Kallam { 88*4f830cd8SSiva Reddy Kallam if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 89*4f830cd8SSiva Reddy Kallam ((struct cmdq_base *)GET_TLV_DATA(req))->resp_size = val; 90*4f830cd8SSiva Reddy Kallam else 91*4f830cd8SSiva Reddy Kallam req->resp_size = val; 92*4f830cd8SSiva Reddy Kallam } 93*4f830cd8SSiva Reddy Kallam 94*4f830cd8SSiva Reddy Kallam static inline u8 __get_cmdq_base_cmd_size(struct cmdq_base *req, u32 size) 95*4f830cd8SSiva Reddy Kallam { 96*4f830cd8SSiva Reddy Kallam if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 97*4f830cd8SSiva Reddy Kallam return ((struct roce_tlv *)(req))->total_size; 98*4f830cd8SSiva Reddy Kallam else 99*4f830cd8SSiva Reddy Kallam return req->cmd_size; 100*4f830cd8SSiva Reddy Kallam } 101*4f830cd8SSiva Reddy Kallam 102*4f830cd8SSiva Reddy Kallam static inline void __set_cmdq_base_cmd_size(struct cmdq_base *req, 103*4f830cd8SSiva Reddy Kallam u32 size, u8 val) 104*4f830cd8SSiva Reddy Kallam { 105*4f830cd8SSiva Reddy Kallam if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 106*4f830cd8SSiva Reddy Kallam ((struct cmdq_base *)GET_TLV_DATA(req))->cmd_size = val; 107*4f830cd8SSiva Reddy Kallam else 108*4f830cd8SSiva Reddy Kallam req->cmd_size = val; 109*4f830cd8SSiva Reddy Kallam } 110*4f830cd8SSiva Reddy Kallam 111*4f830cd8SSiva Reddy Kallam static inline __le16 __get_cmdq_base_flags(struct cmdq_base *req, u32 size) 112*4f830cd8SSiva Reddy Kallam { 113*4f830cd8SSiva Reddy Kallam if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 114*4f830cd8SSiva Reddy Kallam return ((struct cmdq_base *)GET_TLV_DATA(req))->flags; 115*4f830cd8SSiva Reddy Kallam else 116*4f830cd8SSiva Reddy Kallam return req->flags; 117*4f830cd8SSiva Reddy Kallam } 118*4f830cd8SSiva Reddy Kallam 119*4f830cd8SSiva Reddy Kallam static inline void __set_cmdq_base_flags(struct cmdq_base *req, 120*4f830cd8SSiva Reddy Kallam u32 size, __le16 val) 121*4f830cd8SSiva Reddy Kallam { 122*4f830cd8SSiva Reddy Kallam if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 123*4f830cd8SSiva Reddy Kallam ((struct cmdq_base *)GET_TLV_DATA(req))->flags = val; 124*4f830cd8SSiva Reddy Kallam else 125*4f830cd8SSiva Reddy Kallam req->flags = val; 126*4f830cd8SSiva Reddy Kallam } 127*4f830cd8SSiva Reddy Kallam 128*4f830cd8SSiva Reddy Kallam #endif /* __BNG_TLV_H__ */ 129