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