brintos

brintos / linux-shallow public Read only

0
0
Text · 4.4 KiB · ae96a75 Raw
163 lines · c
1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */2 3#ifndef __QPLIB_TLV_H__4#define __QPLIB_TLV_H__5 6struct roce_tlv {7	struct tlv tlv;8	u8 total_size; // in units of 16 byte chunks9	u8 unused[7];  // for 16 byte alignment10};11 12#define CHUNK_SIZE 1613#define CHUNKS(x) (((x) + CHUNK_SIZE - 1) / CHUNK_SIZE)14 15static inline  void __roce_1st_tlv_prep(struct roce_tlv *rtlv, u8 tot_chunks,16					u16 content_bytes, u8 flags)17{18	rtlv->tlv.cmd_discr = cpu_to_le16(CMD_DISCR_TLV_ENCAP);19	rtlv->tlv.tlv_type = cpu_to_le16(TLV_TYPE_ROCE_SP_COMMAND);20	rtlv->tlv.length = cpu_to_le16(content_bytes);21	rtlv->tlv.flags = TLV_FLAGS_REQUIRED;22	rtlv->tlv.flags |= flags ? TLV_FLAGS_MORE : 0;23	rtlv->total_size = (tot_chunks);24}25 26static inline void __roce_ext_tlv_prep(struct roce_tlv *rtlv, u16 tlv_type,27				       u16 content_bytes, u8 more, u8 flags)28{29	rtlv->tlv.cmd_discr = cpu_to_le16(CMD_DISCR_TLV_ENCAP);30	rtlv->tlv.tlv_type = cpu_to_le16(tlv_type);31	rtlv->tlv.length = cpu_to_le16(content_bytes);32	rtlv->tlv.flags |= more ? TLV_FLAGS_MORE : 0;33	rtlv->tlv.flags |= flags ? TLV_FLAGS_REQUIRED : 0;34}35 36/*37 * TLV size in units of 16 byte chunks38 */39#define TLV_SIZE ((sizeof(struct roce_tlv) + 15) / 16)40/*41 * TLV length in bytes42 */43#define TLV_BYTES (TLV_SIZE * 16)44 45#define HAS_TLV_HEADER(msg) (le16_to_cpu(((struct tlv *)(msg))->cmd_discr) == CMD_DISCR_TLV_ENCAP)46#define GET_TLV_DATA(tlv)   ((void *)&((uint8_t *)(tlv))[TLV_BYTES])47 48static inline u8 __get_cmdq_base_opcode(struct cmdq_base *req, u32 size)49{50	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)51		return ((struct cmdq_base *)GET_TLV_DATA(req))->opcode;52	else53		return req->opcode;54}55 56static inline void __set_cmdq_base_opcode(struct cmdq_base *req,57					  u32 size, u8 val)58{59	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)60		((struct cmdq_base *)GET_TLV_DATA(req))->opcode = val;61	else62		req->opcode = val;63}64 65static inline __le16 __get_cmdq_base_cookie(struct cmdq_base *req, u32 size)66{67	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)68		return ((struct cmdq_base *)GET_TLV_DATA(req))->cookie;69	else70		return req->cookie;71}72 73static inline void __set_cmdq_base_cookie(struct cmdq_base *req,74					  u32 size, __le16 val)75{76	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)77		((struct cmdq_base *)GET_TLV_DATA(req))->cookie = val;78	else79		req->cookie = val;80}81 82static inline __le64 __get_cmdq_base_resp_addr(struct cmdq_base *req, u32 size)83{84	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)85		return ((struct cmdq_base *)GET_TLV_DATA(req))->resp_addr;86	else87		return req->resp_addr;88}89 90static inline void __set_cmdq_base_resp_addr(struct cmdq_base *req,91					     u32 size, __le64 val)92{93	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)94		((struct cmdq_base *)GET_TLV_DATA(req))->resp_addr = val;95	else96		req->resp_addr = val;97}98 99static inline u8 __get_cmdq_base_resp_size(struct cmdq_base *req, u32 size)100{101	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)102		return ((struct cmdq_base *)GET_TLV_DATA(req))->resp_size;103	else104		return req->resp_size;105}106 107static inline void __set_cmdq_base_resp_size(struct cmdq_base *req,108					     u32 size, u8 val)109{110	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)111		((struct cmdq_base *)GET_TLV_DATA(req))->resp_size = val;112	else113		req->resp_size = val;114}115 116static inline u8 __get_cmdq_base_cmd_size(struct cmdq_base *req, u32 size)117{118	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)119		return ((struct roce_tlv *)(req))->total_size;120	else121		return req->cmd_size;122}123 124static inline void __set_cmdq_base_cmd_size(struct cmdq_base *req,125					    u32 size, u8 val)126{127	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)128		((struct cmdq_base *)GET_TLV_DATA(req))->cmd_size = val;129	else130		req->cmd_size = val;131}132 133static inline __le16 __get_cmdq_base_flags(struct cmdq_base *req, u32 size)134{135	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)136		return ((struct cmdq_base *)GET_TLV_DATA(req))->flags;137	else138		return req->flags;139}140 141static inline void __set_cmdq_base_flags(struct cmdq_base *req,142					 u32 size, __le16 val)143{144	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)145		((struct cmdq_base *)GET_TLV_DATA(req))->flags = val;146	else147		req->flags = val;148}149 150struct bnxt_qplib_tlv_modify_cc_req {151	struct roce_tlv				tlv_hdr;152	struct cmdq_modify_roce_cc		base_req;153	__le64					tlvpad;154	struct cmdq_modify_roce_cc_gen1_tlv	ext_req;155};156 157struct bnxt_qplib_tlv_query_rcc_sb {158	struct roce_tlv					tlv_hdr;159	struct creq_query_roce_cc_resp_sb		base_sb;160	struct creq_query_roce_cc_gen1_resp_sb_tlv	gen1_sb;161};162#endif /* __QPLIB_TLV_H__ */163