162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#ifndef __QPLIB_TLV_H__ 462306a36Sopenharmony_ci#define __QPLIB_TLV_H__ 562306a36Sopenharmony_ci 662306a36Sopenharmony_cistruct roce_tlv { 762306a36Sopenharmony_ci struct tlv tlv; 862306a36Sopenharmony_ci u8 total_size; // in units of 16 byte chunks 962306a36Sopenharmony_ci u8 unused[7]; // for 16 byte alignment 1062306a36Sopenharmony_ci}; 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define CHUNK_SIZE 16 1362306a36Sopenharmony_ci#define CHUNKS(x) (((x) + CHUNK_SIZE - 1) / CHUNK_SIZE) 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistatic inline void __roce_1st_tlv_prep(struct roce_tlv *rtlv, u8 tot_chunks, 1662306a36Sopenharmony_ci u16 content_bytes, u8 flags) 1762306a36Sopenharmony_ci{ 1862306a36Sopenharmony_ci rtlv->tlv.cmd_discr = cpu_to_le16(CMD_DISCR_TLV_ENCAP); 1962306a36Sopenharmony_ci rtlv->tlv.tlv_type = cpu_to_le16(TLV_TYPE_ROCE_SP_COMMAND); 2062306a36Sopenharmony_ci rtlv->tlv.length = cpu_to_le16(content_bytes); 2162306a36Sopenharmony_ci rtlv->tlv.flags = TLV_FLAGS_REQUIRED; 2262306a36Sopenharmony_ci rtlv->tlv.flags |= flags ? TLV_FLAGS_MORE : 0; 2362306a36Sopenharmony_ci rtlv->total_size = (tot_chunks); 2462306a36Sopenharmony_ci} 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistatic inline void __roce_ext_tlv_prep(struct roce_tlv *rtlv, u16 tlv_type, 2762306a36Sopenharmony_ci u16 content_bytes, u8 more, u8 flags) 2862306a36Sopenharmony_ci{ 2962306a36Sopenharmony_ci rtlv->tlv.cmd_discr = cpu_to_le16(CMD_DISCR_TLV_ENCAP); 3062306a36Sopenharmony_ci rtlv->tlv.tlv_type = cpu_to_le16(tlv_type); 3162306a36Sopenharmony_ci rtlv->tlv.length = cpu_to_le16(content_bytes); 3262306a36Sopenharmony_ci rtlv->tlv.flags |= more ? TLV_FLAGS_MORE : 0; 3362306a36Sopenharmony_ci rtlv->tlv.flags |= flags ? TLV_FLAGS_REQUIRED : 0; 3462306a36Sopenharmony_ci} 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci/* 3762306a36Sopenharmony_ci * TLV size in units of 16 byte chunks 3862306a36Sopenharmony_ci */ 3962306a36Sopenharmony_ci#define TLV_SIZE ((sizeof(struct roce_tlv) + 15) / 16) 4062306a36Sopenharmony_ci/* 4162306a36Sopenharmony_ci * TLV length in bytes 4262306a36Sopenharmony_ci */ 4362306a36Sopenharmony_ci#define TLV_BYTES (TLV_SIZE * 16) 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define HAS_TLV_HEADER(msg) (le16_to_cpu(((struct tlv *)(msg))->cmd_discr) == CMD_DISCR_TLV_ENCAP) 4662306a36Sopenharmony_ci#define GET_TLV_DATA(tlv) ((void *)&((uint8_t *)(tlv))[TLV_BYTES]) 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cistatic inline u8 __get_cmdq_base_opcode(struct cmdq_base *req, u32 size) 4962306a36Sopenharmony_ci{ 5062306a36Sopenharmony_ci if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 5162306a36Sopenharmony_ci return ((struct cmdq_base *)GET_TLV_DATA(req))->opcode; 5262306a36Sopenharmony_ci else 5362306a36Sopenharmony_ci return req->opcode; 5462306a36Sopenharmony_ci} 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistatic inline void __set_cmdq_base_opcode(struct cmdq_base *req, 5762306a36Sopenharmony_ci u32 size, u8 val) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 6062306a36Sopenharmony_ci ((struct cmdq_base *)GET_TLV_DATA(req))->opcode = val; 6162306a36Sopenharmony_ci else 6262306a36Sopenharmony_ci req->opcode = val; 6362306a36Sopenharmony_ci} 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistatic inline __le16 __get_cmdq_base_cookie(struct cmdq_base *req, u32 size) 6662306a36Sopenharmony_ci{ 6762306a36Sopenharmony_ci if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 6862306a36Sopenharmony_ci return ((struct cmdq_base *)GET_TLV_DATA(req))->cookie; 6962306a36Sopenharmony_ci else 7062306a36Sopenharmony_ci return req->cookie; 7162306a36Sopenharmony_ci} 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_cistatic inline void __set_cmdq_base_cookie(struct cmdq_base *req, 7462306a36Sopenharmony_ci u32 size, __le16 val) 7562306a36Sopenharmony_ci{ 7662306a36Sopenharmony_ci if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 7762306a36Sopenharmony_ci ((struct cmdq_base *)GET_TLV_DATA(req))->cookie = val; 7862306a36Sopenharmony_ci else 7962306a36Sopenharmony_ci req->cookie = val; 8062306a36Sopenharmony_ci} 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cistatic inline __le64 __get_cmdq_base_resp_addr(struct cmdq_base *req, u32 size) 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 8562306a36Sopenharmony_ci return ((struct cmdq_base *)GET_TLV_DATA(req))->resp_addr; 8662306a36Sopenharmony_ci else 8762306a36Sopenharmony_ci return req->resp_addr; 8862306a36Sopenharmony_ci} 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistatic inline void __set_cmdq_base_resp_addr(struct cmdq_base *req, 9162306a36Sopenharmony_ci u32 size, __le64 val) 9262306a36Sopenharmony_ci{ 9362306a36Sopenharmony_ci if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 9462306a36Sopenharmony_ci ((struct cmdq_base *)GET_TLV_DATA(req))->resp_addr = val; 9562306a36Sopenharmony_ci else 9662306a36Sopenharmony_ci req->resp_addr = val; 9762306a36Sopenharmony_ci} 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_cistatic inline u8 __get_cmdq_base_resp_size(struct cmdq_base *req, u32 size) 10062306a36Sopenharmony_ci{ 10162306a36Sopenharmony_ci if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 10262306a36Sopenharmony_ci return ((struct cmdq_base *)GET_TLV_DATA(req))->resp_size; 10362306a36Sopenharmony_ci else 10462306a36Sopenharmony_ci return req->resp_size; 10562306a36Sopenharmony_ci} 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistatic inline void __set_cmdq_base_resp_size(struct cmdq_base *req, 10862306a36Sopenharmony_ci u32 size, u8 val) 10962306a36Sopenharmony_ci{ 11062306a36Sopenharmony_ci if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 11162306a36Sopenharmony_ci ((struct cmdq_base *)GET_TLV_DATA(req))->resp_size = val; 11262306a36Sopenharmony_ci else 11362306a36Sopenharmony_ci req->resp_size = val; 11462306a36Sopenharmony_ci} 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_cistatic inline u8 __get_cmdq_base_cmd_size(struct cmdq_base *req, u32 size) 11762306a36Sopenharmony_ci{ 11862306a36Sopenharmony_ci if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 11962306a36Sopenharmony_ci return ((struct roce_tlv *)(req))->total_size; 12062306a36Sopenharmony_ci else 12162306a36Sopenharmony_ci return req->cmd_size; 12262306a36Sopenharmony_ci} 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cistatic inline void __set_cmdq_base_cmd_size(struct cmdq_base *req, 12562306a36Sopenharmony_ci u32 size, u8 val) 12662306a36Sopenharmony_ci{ 12762306a36Sopenharmony_ci if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 12862306a36Sopenharmony_ci ((struct cmdq_base *)GET_TLV_DATA(req))->cmd_size = val; 12962306a36Sopenharmony_ci else 13062306a36Sopenharmony_ci req->cmd_size = val; 13162306a36Sopenharmony_ci} 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cistatic inline __le16 __get_cmdq_base_flags(struct cmdq_base *req, u32 size) 13462306a36Sopenharmony_ci{ 13562306a36Sopenharmony_ci if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 13662306a36Sopenharmony_ci return ((struct cmdq_base *)GET_TLV_DATA(req))->flags; 13762306a36Sopenharmony_ci else 13862306a36Sopenharmony_ci return req->flags; 13962306a36Sopenharmony_ci} 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_cistatic inline void __set_cmdq_base_flags(struct cmdq_base *req, 14262306a36Sopenharmony_ci u32 size, __le16 val) 14362306a36Sopenharmony_ci{ 14462306a36Sopenharmony_ci if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 14562306a36Sopenharmony_ci ((struct cmdq_base *)GET_TLV_DATA(req))->flags = val; 14662306a36Sopenharmony_ci else 14762306a36Sopenharmony_ci req->flags = val; 14862306a36Sopenharmony_ci} 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_cistruct bnxt_qplib_tlv_modify_cc_req { 15162306a36Sopenharmony_ci struct roce_tlv tlv_hdr; 15262306a36Sopenharmony_ci struct cmdq_modify_roce_cc base_req; 15362306a36Sopenharmony_ci __le64 tlvpad; 15462306a36Sopenharmony_ci struct cmdq_modify_roce_cc_gen1_tlv ext_req; 15562306a36Sopenharmony_ci}; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cistruct bnxt_qplib_tlv_query_rcc_sb { 15862306a36Sopenharmony_ci struct roce_tlv tlv_hdr; 15962306a36Sopenharmony_ci struct creq_query_roce_cc_resp_sb base_sb; 16062306a36Sopenharmony_ci struct creq_query_roce_cc_gen1_resp_sb_tlv gen1_sb; 16162306a36Sopenharmony_ci}; 16262306a36Sopenharmony_ci#endif /* __QPLIB_TLV_H__ */ 163