xref: /freebsd/sys/dev/bnxt/bnxt_re/qplib_tlv.h (revision acd884dec99adcf8c4cdd0aa8a50be79c216f8e8)
1 /*
2  * Copyright (c) 2017 - 2024, Broadcom. All rights reserved.  The term
3  * Broadcom refers to Broadcom Limited and/or its subsidiaries.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in
13  *    the documentation and/or other materials provided with the
14  *    distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  */
29 
30 #ifndef __QPLIB_TLV_H__
31 #define __QPLIB_TLV_H__
32 
33 struct roce_tlv {
34 	struct tlv tlv;
35 	u8 total_size;
36 	u8 unused[7];
37 };
38 
39 #define CHUNK_SIZE 16
40 #define CHUNKS(x) (((x) + CHUNK_SIZE - 1) / CHUNK_SIZE)
41 
42 #define ROCE_1ST_TLV_PREP(rtlv, tot_chunks, content_bytes, more)     \
43     do {                                                             \
44 	(rtlv)->tlv.cmd_discr = CMD_DISCR_TLV_ENCAP;                 \
45 	(rtlv)->tlv.tlv_type = TLV_TYPE_ROCE_SP_COMMAND;             \
46 	(rtlv)->tlv.length = (content_bytes);                        \
47 	(rtlv)->tlv.flags = TLV_FLAGS_REQUIRED;                      \
48 	(rtlv)->tlv.flags |= (more) ? TLV_FLAGS_MORE : 0;            \
49 	(rtlv)->total_size = (tot_chunks);                           \
50     } while (0)
51 
52 #define ROCE_EXT_TLV_PREP(rtlv, ext_type, content_bytes, more, reqd) \
53     do {                                                             \
54 	(rtlv)->tlv.cmd_discr = CMD_DISCR_TLV_ENCAP;                 \
55 	(rtlv)->tlv.tlv_type = (ext_type);                           \
56 	(rtlv)->tlv.length = (content_bytes);                        \
57 	(rtlv)->tlv.flags |= (more) ? TLV_FLAGS_MORE : 0;            \
58 	(rtlv)->tlv.flags |= (reqd) ? TLV_FLAGS_REQUIRED : 0;        \
59     } while (0)
60 
61 /*
62  * TLV size in units of 16 byte chunks
63  */
64 #define TLV_SIZE ((sizeof(struct roce_tlv) + 15) / 16)
65 /*
66  * TLV length in bytes
67  */
68 #define TLV_BYTES (TLV_SIZE * 16)
69 
70 #define HAS_TLV_HEADER(msg) (((struct tlv *)(msg))->cmd_discr == CMD_DISCR_TLV_ENCAP)
71 #define GET_TLV_DATA(tlv)   ((void *)&((uint8_t *)(tlv))[TLV_BYTES])
72 
__get_cmdq_base_opcode(struct cmdq_base * req,u32 size)73 static inline u8 __get_cmdq_base_opcode(struct cmdq_base *req, u32 size)
74 {
75 	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
76 		return ((struct cmdq_base *)GET_TLV_DATA(req))->opcode;
77 	else
78 		return req->opcode;
79 }
80 
__set_cmdq_base_opcode(struct cmdq_base * req,u32 size,u8 val)81 static inline void __set_cmdq_base_opcode(struct cmdq_base *req,
82 					  u32 size, u8 val)
83 {
84 	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
85 		((struct cmdq_base *)GET_TLV_DATA(req))->opcode = val;
86 	else
87 		req->opcode = val;
88 }
89 
__get_cmdq_base_cookie(struct cmdq_base * req,u32 size)90 static inline __le16 __get_cmdq_base_cookie(struct cmdq_base *req, u32 size)
91 {
92 	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
93 		return ((struct cmdq_base *)GET_TLV_DATA(req))->cookie;
94 	else
95 		return req->cookie;
96 }
97 
__set_cmdq_base_cookie(struct cmdq_base * req,u32 size,__le16 val)98 static inline void __set_cmdq_base_cookie(struct cmdq_base *req,
99 					  u32 size, __le16 val)
100 {
101 	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
102 		((struct cmdq_base *)GET_TLV_DATA(req))->cookie = val;
103 	else
104 		req->cookie = val;
105 }
106 
__get_cmdq_base_resp_addr(struct cmdq_base * req,u32 size)107 static inline __le64 __get_cmdq_base_resp_addr(struct cmdq_base *req, u32 size)
108 {
109 	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
110 		return ((struct cmdq_base *)GET_TLV_DATA(req))->resp_addr;
111 	else
112 		return req->resp_addr;
113 }
114 
__set_cmdq_base_resp_addr(struct cmdq_base * req,u32 size,__le64 val)115 static inline void __set_cmdq_base_resp_addr(struct cmdq_base *req,
116 					     u32 size, __le64 val)
117 {
118 	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
119 		((struct cmdq_base *)GET_TLV_DATA(req))->resp_addr = val;
120 	else
121 		req->resp_addr = val;
122 }
123 
__get_cmdq_base_resp_size(struct cmdq_base * req,u32 size)124 static inline u8 __get_cmdq_base_resp_size(struct cmdq_base *req, u32 size)
125 {
126 	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
127 		return ((struct cmdq_base *)GET_TLV_DATA(req))->resp_size;
128 	else
129 		return req->resp_size;
130 }
131 
__set_cmdq_base_resp_size(struct cmdq_base * req,u32 size,u8 val)132 static inline void __set_cmdq_base_resp_size(struct cmdq_base *req,
133 					     u32 size, u8 val)
134 {
135 	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
136 		((struct cmdq_base *)GET_TLV_DATA(req))->resp_size = val;
137 	else
138 		req->resp_size = val;
139 }
140 
__get_cmdq_base_cmd_size(struct cmdq_base * req,u32 size)141 static inline u8 __get_cmdq_base_cmd_size(struct cmdq_base *req, u32 size)
142 {
143 	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
144 		return ((struct roce_tlv *)(req))->total_size;
145 	else
146 		return req->cmd_size;
147 }
148 
__set_cmdq_base_cmd_size(struct cmdq_base * req,u32 size,u8 val)149 static inline void __set_cmdq_base_cmd_size(struct cmdq_base *req,
150 					    u32 size, u8 val)
151 {
152 	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
153 		((struct cmdq_base *)GET_TLV_DATA(req))->cmd_size = val;
154 	else
155 		req->cmd_size = val;
156 }
157 
__get_cmdq_base_flags(struct cmdq_base * req,u32 size)158 static inline __le16 __get_cmdq_base_flags(struct cmdq_base *req, u32 size)
159 {
160 	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
161 		return ((struct cmdq_base *)GET_TLV_DATA(req))->flags;
162 	else
163 		return req->flags;
164 }
165 
__set_cmdq_base_flags(struct cmdq_base * req,u32 size,__le16 val)166 static inline void __set_cmdq_base_flags(struct cmdq_base *req,
167 					 u32 size, __le16 val)
168 {
169 	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
170 		((struct cmdq_base *)GET_TLV_DATA(req))->flags = val;
171 	else
172 		req->flags = val;
173 }
174 
175 struct bnxt_qplib_tlv_modify_cc_req {
176 	struct roce_tlv				tlv_hdr;
177 	struct cmdq_modify_roce_cc		base_req;
178 	__le64					tlvpad;
179 	struct cmdq_modify_roce_cc_gen1_tlv	ext_req;
180 };
181 
182 struct bnxt_qplib_tlv_query_rcc_sb {
183 	struct roce_tlv					tlv_hdr;
184 	struct creq_query_roce_cc_resp_sb		base_sb;
185 	struct creq_query_roce_cc_gen1_resp_sb_tlv	gen1_sb;
186 };
187 #endif
188