xref: /linux/drivers/infiniband/hw/bng_re/bng_tlv.h (revision 55aa394a5ed871208eac11c5f4677cafd258c4dd)
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 
__get_cmdq_base_opcode(struct cmdq_base * req,u32 size)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 
__set_cmdq_base_opcode(struct cmdq_base * req,u32 size,u8 val)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 
__get_cmdq_base_cookie(struct cmdq_base * req,u32 size)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 
__set_cmdq_base_cookie(struct cmdq_base * req,u32 size,__le16 val)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 
__get_cmdq_base_resp_addr(struct cmdq_base * req,u32 size)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 
__set_cmdq_base_resp_addr(struct cmdq_base * req,u32 size,__le64 val)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 
__get_cmdq_base_resp_size(struct cmdq_base * req,u32 size)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 
__set_cmdq_base_resp_size(struct cmdq_base * req,u32 size,u8 val)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 
__get_cmdq_base_cmd_size(struct cmdq_base * req,u32 size)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 
__set_cmdq_base_cmd_size(struct cmdq_base * req,u32 size,u8 val)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 
__get_cmdq_base_flags(struct cmdq_base * req,u32 size)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 
__set_cmdq_base_flags(struct cmdq_base * req,u32 size,__le16 val)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