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