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