xref: /linux/drivers/net/ethernet/huawei/hinic3/hinic3_mgmt_interface.h (revision 37a93dd5c49b5fda807fd204edf2547c3493319c)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. */
3 
4 #ifndef _HINIC3_MGMT_INTERFACE_H_
5 #define _HINIC3_MGMT_INTERFACE_H_
6 
7 #include <linux/bitfield.h>
8 #include <linux/bits.h>
9 #include <linux/if_ether.h>
10 
11 #include "hinic3_hw_intf.h"
12 
13 struct l2nic_cmd_feature_nego {
14 	struct mgmt_msg_head msg_head;
15 	u16                  func_id;
16 	u8                   opcode;
17 	u8                   rsvd;
18 	u64                  s_feature[4];
19 };
20 
21 enum l2nic_func_tbl_cfg_bitmap {
22 	L2NIC_FUNC_TBL_CFG_INIT        = 0,
23 	L2NIC_FUNC_TBL_CFG_RX_BUF_SIZE = 1,
24 	L2NIC_FUNC_TBL_CFG_MTU         = 2,
25 };
26 
27 struct l2nic_func_tbl_cfg {
28 	u16 rx_wqe_buf_size;
29 	u16 mtu;
30 	u32 rsvd[9];
31 };
32 
33 struct l2nic_cmd_set_func_tbl {
34 	struct mgmt_msg_head      msg_head;
35 	u16                       func_id;
36 	u16                       rsvd;
37 	u32                       cfg_bitmap;
38 	struct l2nic_func_tbl_cfg tbl_cfg;
39 };
40 
41 struct l2nic_cmd_set_mac {
42 	struct mgmt_msg_head msg_head;
43 	u16                  func_id;
44 	u16                  vlan_id;
45 	u16                  rsvd1;
46 	u8                   mac[ETH_ALEN];
47 };
48 
49 struct l2nic_cmd_update_mac {
50 	struct mgmt_msg_head msg_head;
51 	u16                  func_id;
52 	u16                  vlan_id;
53 	u16                  rsvd1;
54 	u8                   old_mac[ETH_ALEN];
55 	u16                  rsvd2;
56 	u8                   new_mac[ETH_ALEN];
57 };
58 
59 struct l2nic_cmd_vlan_config {
60 	struct mgmt_msg_head msg_head;
61 	u16                  func_id;
62 	u8                   opcode;
63 	u8                   rsvd1;
64 	u16                  vlan_id;
65 	u16                  rsvd2;
66 };
67 
68 struct l2nic_cmd_vlan_offload {
69 	struct mgmt_msg_head msg_head;
70 	u16                  func_id;
71 	u8                   vlan_offload;
72 	u8                   rsvd1[5];
73 };
74 
75 /* set vlan filter */
76 struct l2nic_cmd_set_vlan_filter {
77 	struct mgmt_msg_head msg_head;
78 	u16                  func_id;
79 	u8                   rsvd[2];
80 	/* bit0:vlan filter en; bit1:broadcast_filter_en */
81 	u32                  vlan_filter_ctrl;
82 };
83 
84 struct l2nic_cmd_set_ci_attr {
85 	struct mgmt_msg_head msg_head;
86 	u16                  func_idx;
87 	u8                   dma_attr_off;
88 	u8                   pending_limit;
89 	u8                   coalescing_time;
90 	u8                   intr_en;
91 	u16                  intr_idx;
92 	u32                  l2nic_sqn;
93 	u32                  rsvd;
94 	u64                  ci_addr;
95 };
96 
97 struct l2nic_cmd_clear_qp_resource {
98 	struct mgmt_msg_head msg_head;
99 	u16                  func_id;
100 	u16                  rsvd1;
101 };
102 
103 struct l2nic_cmd_force_pkt_drop {
104 	struct mgmt_msg_head msg_head;
105 	u8                   port;
106 	u8                   rsvd1[3];
107 };
108 
109 struct l2nic_cmd_set_vport_state {
110 	struct mgmt_msg_head msg_head;
111 	u16                  func_id;
112 	u16                  rsvd1;
113 	/* 0--disable, 1--enable */
114 	u8                   state;
115 	u8                   rsvd2[3];
116 };
117 
118 /* *
119  * Definition of the NIC receiving mode
120  */
121 #define L2NIC_RX_MODE_UC       0x01
122 #define L2NIC_RX_MODE_MC       0x02
123 #define L2NIC_RX_MODE_BC       0x04
124 #define L2NIC_RX_MODE_MC_ALL   0x08
125 #define L2NIC_RX_MODE_PROMISC  0x10
126 
127 struct l2nic_rx_mode_config {
128 	struct mgmt_msg_head msg_head;
129 	u16                  func_id;
130 	u16                  rsvd1;
131 	u32                  rx_mode;
132 };
133 
134 struct l2nic_cmd_set_dcb_state {
135 	struct mgmt_msg_head head;
136 	u16                  func_id;
137 	/* 0 - get dcb state, 1 - set dcb state */
138 	u8                   op_code;
139 	/* 0 - disable, 1 - enable dcb */
140 	u8                   state;
141 	/* 0 - disable, 1 - enable dcb */
142 	u8                   port_state;
143 	u8                   rsvd[7];
144 };
145 
146 struct l2nic_cmd_lro_config {
147 	struct mgmt_msg_head msg_head;
148 	u16                  func_id;
149 	u8                   opcode;
150 	u8                   rsvd1;
151 	u8                   lro_ipv4_en;
152 	u8                   lro_ipv6_en;
153 	/* unit is 1K */
154 	u8                   lro_max_pkt_len;
155 	u8                   resv2[13];
156 };
157 
158 struct l2nic_cmd_lro_timer {
159 	struct mgmt_msg_head msg_head;
160 	/* 1: set timer value, 0: get timer value */
161 	u8                   opcode;
162 	u8                   rsvd[3];
163 	u32                  timer;
164 };
165 
166 #define L2NIC_RSS_TYPE_VALID_MASK         BIT(23)
167 #define L2NIC_RSS_TYPE_TCP_IPV6_EXT_MASK  BIT(24)
168 #define L2NIC_RSS_TYPE_IPV6_EXT_MASK      BIT(25)
169 #define L2NIC_RSS_TYPE_TCP_IPV6_MASK      BIT(26)
170 #define L2NIC_RSS_TYPE_IPV6_MASK          BIT(27)
171 #define L2NIC_RSS_TYPE_TCP_IPV4_MASK      BIT(28)
172 #define L2NIC_RSS_TYPE_IPV4_MASK          BIT(29)
173 #define L2NIC_RSS_TYPE_UDP_IPV6_MASK      BIT(30)
174 #define L2NIC_RSS_TYPE_UDP_IPV4_MASK      BIT(31)
175 #define L2NIC_RSS_TYPE_SET(val, member)  \
176 	FIELD_PREP(L2NIC_RSS_TYPE_##member##_MASK, val)
177 #define L2NIC_RSS_TYPE_GET(val, member)  \
178 	FIELD_GET(L2NIC_RSS_TYPE_##member##_MASK, val)
179 
180 #define L2NIC_RSS_INDIR_SIZE  256
181 #define L2NIC_RSS_KEY_SIZE    40
182 
183 /* IEEE 802.1Qaz std */
184 #define L2NIC_DCB_COS_MAX     0x8
185 
186 struct l2nic_cmd_set_rss_ctx_tbl {
187 	struct mgmt_msg_head msg_head;
188 	u16                  func_id;
189 	u16                  rsvd1;
190 	u32                  context;
191 };
192 
193 struct l2nic_cmd_cfg_rss_engine {
194 	struct mgmt_msg_head msg_head;
195 	u16                  func_id;
196 	u8                   opcode;
197 	u8                   hash_engine;
198 	u8                   rsvd1[4];
199 };
200 
201 struct l2nic_cmd_cfg_rss_hash_key {
202 	struct mgmt_msg_head msg_head;
203 	u16                  func_id;
204 	u8                   opcode;
205 	u8                   rsvd1;
206 	u8                   key[L2NIC_RSS_KEY_SIZE];
207 };
208 
209 struct l2nic_cmd_cfg_rss {
210 	struct mgmt_msg_head msg_head;
211 	u16                  func_id;
212 	u8                   rss_en;
213 	u8                   rq_priority_number;
214 	u8                   prio_tc[L2NIC_DCB_COS_MAX];
215 	u16                  num_qps;
216 	u16                  rsvd1;
217 };
218 
219 /* Commands between NIC to fw */
220 enum l2nic_cmd {
221 	/* FUNC CFG */
222 	L2NIC_CMD_SET_FUNC_TBL        = 5,
223 	L2NIC_CMD_SET_VPORT_ENABLE    = 6,
224 	L2NIC_CMD_SET_RX_MODE         = 7,
225 	L2NIC_CMD_SET_SQ_CI_ATTR      = 8,
226 	L2NIC_CMD_CLEAR_QP_RESOURCE   = 11,
227 	L2NIC_CMD_CFG_RX_LRO          = 13,
228 	L2NIC_CMD_CFG_LRO_TIMER       = 14,
229 	L2NIC_CMD_FEATURE_NEGO        = 15,
230 	L2NIC_CMD_GET_MAC             = 20,
231 	L2NIC_CMD_SET_MAC             = 21,
232 	L2NIC_CMD_DEL_MAC             = 22,
233 	L2NIC_CMD_UPDATE_MAC          = 23,
234 	L2NIC_CMD_CFG_FUNC_VLAN       = 25,
235 	L2NIC_CMD_SET_VLAN_FILTER_EN  = 26,
236 	L2NIC_CMD_SET_RX_VLAN_OFFLOAD = 27,
237 	L2NIC_CMD_CFG_RSS             = 60,
238 	L2NIC_CMD_CFG_RSS_HASH_KEY    = 63,
239 	L2NIC_CMD_CFG_RSS_HASH_ENGINE = 64,
240 	L2NIC_CMD_SET_RSS_CTX_TBL     = 65,
241 	L2NIC_CMD_QOS_DCB_STATE       = 110,
242 	L2NIC_CMD_FORCE_PKT_DROP      = 113,
243 	L2NIC_CMD_MAX                 = 256,
244 };
245 
246 struct l2nic_cmd_rss_set_indir_tbl {
247 	__le32 rsvd[4];
248 	__le16 entry[L2NIC_RSS_INDIR_SIZE];
249 };
250 
251 /* NIC CMDQ MODE */
252 enum l2nic_ucode_cmd {
253 	L2NIC_UCODE_CMD_MODIFY_QUEUE_CTX  = 0,
254 	L2NIC_UCODE_CMD_CLEAN_QUEUE_CTX   = 1,
255 	L2NIC_UCODE_CMD_SET_RSS_INDIR_TBL = 4,
256 };
257 
258 /* hilink mac group command */
259 enum mag_cmd {
260 	MAG_CMD_SET_PORT_ENABLE = 6,
261 	MAG_CMD_GET_LINK_STATUS = 7,
262 };
263 
264 /* firmware also use this cmd report link event to driver */
265 struct mag_cmd_get_link_status {
266 	struct mgmt_msg_head head;
267 	u8                   port_id;
268 	/* 0:link down  1:link up */
269 	u8                   status;
270 	u8                   rsvd0[2];
271 };
272 
273 enum hinic3_nic_feature_cap {
274 	HINIC3_NIC_F_CSUM           = BIT(0),
275 	HINIC3_NIC_F_SCTP_CRC       = BIT(1),
276 	HINIC3_NIC_F_TSO            = BIT(2),
277 	HINIC3_NIC_F_LRO            = BIT(3),
278 	HINIC3_NIC_F_UFO            = BIT(4),
279 	HINIC3_NIC_F_RSS            = BIT(5),
280 	HINIC3_NIC_F_RX_VLAN_FILTER = BIT(6),
281 	HINIC3_NIC_F_RX_VLAN_STRIP  = BIT(7),
282 	HINIC3_NIC_F_TX_VLAN_INSERT = BIT(8),
283 	HINIC3_NIC_F_VXLAN_OFFLOAD  = BIT(9),
284 	HINIC3_NIC_F_FDIR           = BIT(11),
285 	HINIC3_NIC_F_PROMISC        = BIT(12),
286 	HINIC3_NIC_F_ALLMULTI       = BIT(13),
287 	HINIC3_NIC_F_RATE_LIMIT     = BIT(16),
288 };
289 
290 #define HINIC3_NIC_F_ALL_MASK           0x33bff
291 #define HINIC3_NIC_DRV_DEFAULT_FEATURE  0x3f03f
292 
293 #endif
294