162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#ifndef __QPLIB_TLV_H__
462306a36Sopenharmony_ci#define __QPLIB_TLV_H__
562306a36Sopenharmony_ci
662306a36Sopenharmony_cistruct roce_tlv {
762306a36Sopenharmony_ci	struct tlv tlv;
862306a36Sopenharmony_ci	u8 total_size; // in units of 16 byte chunks
962306a36Sopenharmony_ci	u8 unused[7];  // for 16 byte alignment
1062306a36Sopenharmony_ci};
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define CHUNK_SIZE 16
1362306a36Sopenharmony_ci#define CHUNKS(x) (((x) + CHUNK_SIZE - 1) / CHUNK_SIZE)
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistatic inline  void __roce_1st_tlv_prep(struct roce_tlv *rtlv, u8 tot_chunks,
1662306a36Sopenharmony_ci					u16 content_bytes, u8 flags)
1762306a36Sopenharmony_ci{
1862306a36Sopenharmony_ci	rtlv->tlv.cmd_discr = cpu_to_le16(CMD_DISCR_TLV_ENCAP);
1962306a36Sopenharmony_ci	rtlv->tlv.tlv_type = cpu_to_le16(TLV_TYPE_ROCE_SP_COMMAND);
2062306a36Sopenharmony_ci	rtlv->tlv.length = cpu_to_le16(content_bytes);
2162306a36Sopenharmony_ci	rtlv->tlv.flags = TLV_FLAGS_REQUIRED;
2262306a36Sopenharmony_ci	rtlv->tlv.flags |= flags ? TLV_FLAGS_MORE : 0;
2362306a36Sopenharmony_ci	rtlv->total_size = (tot_chunks);
2462306a36Sopenharmony_ci}
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistatic inline void __roce_ext_tlv_prep(struct roce_tlv *rtlv, u16 tlv_type,
2762306a36Sopenharmony_ci				       u16 content_bytes, u8 more, u8 flags)
2862306a36Sopenharmony_ci{
2962306a36Sopenharmony_ci	rtlv->tlv.cmd_discr = cpu_to_le16(CMD_DISCR_TLV_ENCAP);
3062306a36Sopenharmony_ci	rtlv->tlv.tlv_type = cpu_to_le16(tlv_type);
3162306a36Sopenharmony_ci	rtlv->tlv.length = cpu_to_le16(content_bytes);
3262306a36Sopenharmony_ci	rtlv->tlv.flags |= more ? TLV_FLAGS_MORE : 0;
3362306a36Sopenharmony_ci	rtlv->tlv.flags |= flags ? TLV_FLAGS_REQUIRED : 0;
3462306a36Sopenharmony_ci}
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci/*
3762306a36Sopenharmony_ci * TLV size in units of 16 byte chunks
3862306a36Sopenharmony_ci */
3962306a36Sopenharmony_ci#define TLV_SIZE ((sizeof(struct roce_tlv) + 15) / 16)
4062306a36Sopenharmony_ci/*
4162306a36Sopenharmony_ci * TLV length in bytes
4262306a36Sopenharmony_ci */
4362306a36Sopenharmony_ci#define TLV_BYTES (TLV_SIZE * 16)
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci#define HAS_TLV_HEADER(msg) (le16_to_cpu(((struct tlv *)(msg))->cmd_discr) == CMD_DISCR_TLV_ENCAP)
4662306a36Sopenharmony_ci#define GET_TLV_DATA(tlv)   ((void *)&((uint8_t *)(tlv))[TLV_BYTES])
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistatic inline u8 __get_cmdq_base_opcode(struct cmdq_base *req, u32 size)
4962306a36Sopenharmony_ci{
5062306a36Sopenharmony_ci	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
5162306a36Sopenharmony_ci		return ((struct cmdq_base *)GET_TLV_DATA(req))->opcode;
5262306a36Sopenharmony_ci	else
5362306a36Sopenharmony_ci		return req->opcode;
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistatic inline void __set_cmdq_base_opcode(struct cmdq_base *req,
5762306a36Sopenharmony_ci					  u32 size, u8 val)
5862306a36Sopenharmony_ci{
5962306a36Sopenharmony_ci	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
6062306a36Sopenharmony_ci		((struct cmdq_base *)GET_TLV_DATA(req))->opcode = val;
6162306a36Sopenharmony_ci	else
6262306a36Sopenharmony_ci		req->opcode = val;
6362306a36Sopenharmony_ci}
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cistatic inline __le16 __get_cmdq_base_cookie(struct cmdq_base *req, u32 size)
6662306a36Sopenharmony_ci{
6762306a36Sopenharmony_ci	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
6862306a36Sopenharmony_ci		return ((struct cmdq_base *)GET_TLV_DATA(req))->cookie;
6962306a36Sopenharmony_ci	else
7062306a36Sopenharmony_ci		return req->cookie;
7162306a36Sopenharmony_ci}
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cistatic inline void __set_cmdq_base_cookie(struct cmdq_base *req,
7462306a36Sopenharmony_ci					  u32 size, __le16 val)
7562306a36Sopenharmony_ci{
7662306a36Sopenharmony_ci	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
7762306a36Sopenharmony_ci		((struct cmdq_base *)GET_TLV_DATA(req))->cookie = val;
7862306a36Sopenharmony_ci	else
7962306a36Sopenharmony_ci		req->cookie = val;
8062306a36Sopenharmony_ci}
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_cistatic inline __le64 __get_cmdq_base_resp_addr(struct cmdq_base *req, u32 size)
8362306a36Sopenharmony_ci{
8462306a36Sopenharmony_ci	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
8562306a36Sopenharmony_ci		return ((struct cmdq_base *)GET_TLV_DATA(req))->resp_addr;
8662306a36Sopenharmony_ci	else
8762306a36Sopenharmony_ci		return req->resp_addr;
8862306a36Sopenharmony_ci}
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cistatic inline void __set_cmdq_base_resp_addr(struct cmdq_base *req,
9162306a36Sopenharmony_ci					     u32 size, __le64 val)
9262306a36Sopenharmony_ci{
9362306a36Sopenharmony_ci	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
9462306a36Sopenharmony_ci		((struct cmdq_base *)GET_TLV_DATA(req))->resp_addr = val;
9562306a36Sopenharmony_ci	else
9662306a36Sopenharmony_ci		req->resp_addr = val;
9762306a36Sopenharmony_ci}
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cistatic inline u8 __get_cmdq_base_resp_size(struct cmdq_base *req, u32 size)
10062306a36Sopenharmony_ci{
10162306a36Sopenharmony_ci	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
10262306a36Sopenharmony_ci		return ((struct cmdq_base *)GET_TLV_DATA(req))->resp_size;
10362306a36Sopenharmony_ci	else
10462306a36Sopenharmony_ci		return req->resp_size;
10562306a36Sopenharmony_ci}
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_cistatic inline void __set_cmdq_base_resp_size(struct cmdq_base *req,
10862306a36Sopenharmony_ci					     u32 size, u8 val)
10962306a36Sopenharmony_ci{
11062306a36Sopenharmony_ci	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
11162306a36Sopenharmony_ci		((struct cmdq_base *)GET_TLV_DATA(req))->resp_size = val;
11262306a36Sopenharmony_ci	else
11362306a36Sopenharmony_ci		req->resp_size = val;
11462306a36Sopenharmony_ci}
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_cistatic inline u8 __get_cmdq_base_cmd_size(struct cmdq_base *req, u32 size)
11762306a36Sopenharmony_ci{
11862306a36Sopenharmony_ci	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
11962306a36Sopenharmony_ci		return ((struct roce_tlv *)(req))->total_size;
12062306a36Sopenharmony_ci	else
12162306a36Sopenharmony_ci		return req->cmd_size;
12262306a36Sopenharmony_ci}
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_cistatic inline void __set_cmdq_base_cmd_size(struct cmdq_base *req,
12562306a36Sopenharmony_ci					    u32 size, u8 val)
12662306a36Sopenharmony_ci{
12762306a36Sopenharmony_ci	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
12862306a36Sopenharmony_ci		((struct cmdq_base *)GET_TLV_DATA(req))->cmd_size = val;
12962306a36Sopenharmony_ci	else
13062306a36Sopenharmony_ci		req->cmd_size = val;
13162306a36Sopenharmony_ci}
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_cistatic inline __le16 __get_cmdq_base_flags(struct cmdq_base *req, u32 size)
13462306a36Sopenharmony_ci{
13562306a36Sopenharmony_ci	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
13662306a36Sopenharmony_ci		return ((struct cmdq_base *)GET_TLV_DATA(req))->flags;
13762306a36Sopenharmony_ci	else
13862306a36Sopenharmony_ci		return req->flags;
13962306a36Sopenharmony_ci}
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_cistatic inline void __set_cmdq_base_flags(struct cmdq_base *req,
14262306a36Sopenharmony_ci					 u32 size, __le16 val)
14362306a36Sopenharmony_ci{
14462306a36Sopenharmony_ci	if (HAS_TLV_HEADER(req) && size > TLV_BYTES)
14562306a36Sopenharmony_ci		((struct cmdq_base *)GET_TLV_DATA(req))->flags = val;
14662306a36Sopenharmony_ci	else
14762306a36Sopenharmony_ci		req->flags = val;
14862306a36Sopenharmony_ci}
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_cistruct bnxt_qplib_tlv_modify_cc_req {
15162306a36Sopenharmony_ci	struct roce_tlv				tlv_hdr;
15262306a36Sopenharmony_ci	struct cmdq_modify_roce_cc		base_req;
15362306a36Sopenharmony_ci	__le64					tlvpad;
15462306a36Sopenharmony_ci	struct cmdq_modify_roce_cc_gen1_tlv	ext_req;
15562306a36Sopenharmony_ci};
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_cistruct bnxt_qplib_tlv_query_rcc_sb {
15862306a36Sopenharmony_ci	struct roce_tlv					tlv_hdr;
15962306a36Sopenharmony_ci	struct creq_query_roce_cc_resp_sb		base_sb;
16062306a36Sopenharmony_ci	struct creq_query_roce_cc_gen1_resp_sb_tlv	gen1_sb;
16162306a36Sopenharmony_ci};
16262306a36Sopenharmony_ci#endif /* __QPLIB_TLV_H__ */
163