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