xref: /linux/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c (revision cc622420798c4bcf093785d872525087a7798db9)
1 /*
2  * Copyright (c) 2014-2015 Hisilicon Limited.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  */
9 
10 #include <linux/module.h>
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/interrupt.h>
14 #include <linux/netdevice.h>
15 #include <linux/platform_device.h>
16 #include <linux/of.h>
17 #include <linux/of_address.h>
18 #include <linux/of_irq.h>
19 #include <linux/device.h>
20 #include <linux/vmalloc.h>
21 
22 #include "hns_dsaf_main.h"
23 #include "hns_dsaf_rcb.h"
24 #include "hns_dsaf_ppe.h"
25 #include "hns_dsaf_mac.h"
26 
27 const char *g_dsaf_mode_match[DSAF_MODE_MAX] = {
28 	[DSAF_MODE_DISABLE_2PORT_64VM] = "2port-64vf",
29 	[DSAF_MODE_DISABLE_6PORT_0VM] = "6port-16rss",
30 	[DSAF_MODE_DISABLE_6PORT_16VM] = "6port-16vf",
31 };
32 
33 int hns_dsaf_get_cfg(struct dsaf_device *dsaf_dev)
34 {
35 	int ret, i;
36 	u32 desc_num;
37 	u32 buf_size;
38 	const char *mode_str;
39 	struct device_node *np = dsaf_dev->dev->of_node;
40 
41 	if (of_device_is_compatible(np, "hisilicon,hns-dsaf-v1"))
42 		dsaf_dev->dsaf_ver = AE_VERSION_1;
43 	else
44 		dsaf_dev->dsaf_ver = AE_VERSION_2;
45 
46 	ret = of_property_read_string(np, "mode", &mode_str);
47 	if (ret) {
48 		dev_err(dsaf_dev->dev, "get dsaf mode fail, ret=%d!\n", ret);
49 		return ret;
50 	}
51 	for (i = 0; i < DSAF_MODE_MAX; i++) {
52 		if (g_dsaf_mode_match[i] &&
53 		    !strcmp(mode_str, g_dsaf_mode_match[i]))
54 			break;
55 	}
56 	if (i >= DSAF_MODE_MAX ||
57 	    i == DSAF_MODE_INVALID || i == DSAF_MODE_ENABLE) {
58 		dev_err(dsaf_dev->dev,
59 			"%s prs mode str fail!\n", dsaf_dev->ae_dev.name);
60 		return -EINVAL;
61 	}
62 	dsaf_dev->dsaf_mode = (enum dsaf_mode)i;
63 
64 	if (dsaf_dev->dsaf_mode > DSAF_MODE_ENABLE)
65 		dsaf_dev->dsaf_en = HRD_DSAF_NO_DSAF_MODE;
66 	else
67 		dsaf_dev->dsaf_en = HRD_DSAF_MODE;
68 
69 	if ((i == DSAF_MODE_ENABLE_16VM) ||
70 	    (i == DSAF_MODE_DISABLE_2PORT_8VM) ||
71 	    (i == DSAF_MODE_DISABLE_6PORT_2VM))
72 		dsaf_dev->dsaf_tc_mode = HRD_DSAF_8TC_MODE;
73 	else
74 		dsaf_dev->dsaf_tc_mode = HRD_DSAF_4TC_MODE;
75 
76 	dsaf_dev->sc_base = of_iomap(np, 0);
77 	if (!dsaf_dev->sc_base) {
78 		dev_err(dsaf_dev->dev,
79 			"%s of_iomap 0 fail!\n", dsaf_dev->ae_dev.name);
80 		ret = -ENOMEM;
81 		goto unmap_base_addr;
82 	}
83 
84 	dsaf_dev->sds_base = of_iomap(np, 1);
85 	if (!dsaf_dev->sds_base) {
86 		dev_err(dsaf_dev->dev,
87 			"%s of_iomap 1 fail!\n", dsaf_dev->ae_dev.name);
88 		ret = -ENOMEM;
89 		goto unmap_base_addr;
90 	}
91 
92 	dsaf_dev->ppe_base = of_iomap(np, 2);
93 	if (!dsaf_dev->ppe_base) {
94 		dev_err(dsaf_dev->dev,
95 			"%s of_iomap 2 fail!\n", dsaf_dev->ae_dev.name);
96 		ret = -ENOMEM;
97 		goto unmap_base_addr;
98 	}
99 
100 	dsaf_dev->io_base = of_iomap(np, 3);
101 	if (!dsaf_dev->io_base) {
102 		dev_err(dsaf_dev->dev,
103 			"%s of_iomap 3 fail!\n", dsaf_dev->ae_dev.name);
104 		ret = -ENOMEM;
105 		goto unmap_base_addr;
106 	}
107 
108 	dsaf_dev->cpld_base = of_iomap(np, 4);
109 	if (!dsaf_dev->cpld_base)
110 		dev_dbg(dsaf_dev->dev, "NO CPLD ADDR");
111 
112 	ret = of_property_read_u32(np, "desc-num", &desc_num);
113 	if (ret < 0 || desc_num < HNS_DSAF_MIN_DESC_CNT ||
114 	    desc_num > HNS_DSAF_MAX_DESC_CNT) {
115 		dev_err(dsaf_dev->dev, "get desc-num(%d) fail, ret=%d!\n",
116 			desc_num, ret);
117 		goto unmap_base_addr;
118 	}
119 	dsaf_dev->desc_num = desc_num;
120 
121 	ret = of_property_read_u32(np, "buf-size", &buf_size);
122 	if (ret < 0) {
123 		dev_err(dsaf_dev->dev,
124 			"get buf-size fail, ret=%d!\r\n", ret);
125 		goto unmap_base_addr;
126 	}
127 	dsaf_dev->buf_size = buf_size;
128 
129 	dsaf_dev->buf_size_type = hns_rcb_buf_size2type(buf_size);
130 	if (dsaf_dev->buf_size_type < 0) {
131 		dev_err(dsaf_dev->dev,
132 			"buf_size(%d) is wrong!\n", buf_size);
133 		goto unmap_base_addr;
134 	}
135 
136 	if (!dma_set_mask_and_coherent(dsaf_dev->dev, DMA_BIT_MASK(64ULL)))
137 		dev_dbg(dsaf_dev->dev, "set mask to 64bit\n");
138 	else
139 		dev_err(dsaf_dev->dev, "set mask to 64bit fail!\n");
140 
141 	return 0;
142 
143 unmap_base_addr:
144 	if (dsaf_dev->io_base)
145 		iounmap(dsaf_dev->io_base);
146 	if (dsaf_dev->ppe_base)
147 		iounmap(dsaf_dev->ppe_base);
148 	if (dsaf_dev->sds_base)
149 		iounmap(dsaf_dev->sds_base);
150 	if (dsaf_dev->sc_base)
151 		iounmap(dsaf_dev->sc_base);
152 	if (dsaf_dev->cpld_base)
153 		iounmap(dsaf_dev->cpld_base);
154 	return ret;
155 }
156 
157 static void hns_dsaf_free_cfg(struct dsaf_device *dsaf_dev)
158 {
159 	if (dsaf_dev->io_base)
160 		iounmap(dsaf_dev->io_base);
161 
162 	if (dsaf_dev->ppe_base)
163 		iounmap(dsaf_dev->ppe_base);
164 
165 	if (dsaf_dev->sds_base)
166 		iounmap(dsaf_dev->sds_base);
167 
168 	if (dsaf_dev->sc_base)
169 		iounmap(dsaf_dev->sc_base);
170 
171 	if (dsaf_dev->cpld_base)
172 		iounmap(dsaf_dev->cpld_base);
173 }
174 
175 /**
176  * hns_dsaf_sbm_link_sram_init_en - config dsaf_sbm_init_en
177  * @dsaf_id: dsa fabric id
178  */
179 static void hns_dsaf_sbm_link_sram_init_en(struct dsaf_device *dsaf_dev)
180 {
181 	dsaf_set_dev_bit(dsaf_dev, DSAF_CFG_0_REG, DSAF_CFG_SBM_INIT_S, 1);
182 }
183 
184 /**
185  * hns_dsaf_reg_cnt_clr_ce - config hns_dsaf_reg_cnt_clr_ce
186  * @dsaf_id: dsa fabric id
187  * @hns_dsaf_reg_cnt_clr_ce: config value
188  */
189 static void
190 hns_dsaf_reg_cnt_clr_ce(struct dsaf_device *dsaf_dev, u32 reg_cnt_clr_ce)
191 {
192 	dsaf_set_dev_bit(dsaf_dev, DSAF_DSA_REG_CNT_CLR_CE_REG,
193 			 DSAF_CNT_CLR_CE_S, reg_cnt_clr_ce);
194 }
195 
196 /**
197  * hns_ppe_qid_cfg - config ppe qid
198  * @dsaf_id: dsa fabric id
199  * @pppe_qid_cfg: value array
200  */
201 static void
202 hns_dsaf_ppe_qid_cfg(struct dsaf_device *dsaf_dev, u32 qid_cfg)
203 {
204 	u32 i;
205 
206 	for (i = 0; i < DSAF_COMM_CHN; i++) {
207 		dsaf_set_dev_field(dsaf_dev,
208 				   DSAF_PPE_QID_CFG_0_REG + 0x0004 * i,
209 				   DSAF_PPE_QID_CFG_M, DSAF_PPE_QID_CFG_S,
210 				   qid_cfg);
211 	}
212 }
213 
214 static void hns_dsaf_mix_def_qid_cfg(struct dsaf_device *dsaf_dev)
215 {
216 	u16 max_q_per_vf, max_vfn;
217 	u32 q_id, q_num_per_port;
218 	u32 i;
219 
220 	hns_rcb_get_queue_mode(dsaf_dev->dsaf_mode,
221 			       HNS_DSAF_COMM_SERVICE_NW_IDX,
222 			       &max_vfn, &max_q_per_vf);
223 	q_num_per_port = max_vfn * max_q_per_vf;
224 
225 	for (i = 0, q_id = 0; i < DSAF_SERVICE_NW_NUM; i++) {
226 		dsaf_set_dev_field(dsaf_dev,
227 				   DSAF_MIX_DEF_QID_0_REG + 0x0004 * i,
228 				   0xff, 0, q_id);
229 		q_id += q_num_per_port;
230 	}
231 }
232 
233 static void hns_dsaf_inner_qid_cfg(struct dsaf_device *dsaf_dev)
234 {
235 	u16 max_q_per_vf, max_vfn;
236 	u32 q_id, q_num_per_port;
237 	u32 mac_id;
238 
239 	if (AE_IS_VER1(dsaf_dev->dsaf_ver))
240 		return;
241 
242 	hns_rcb_get_queue_mode(dsaf_dev->dsaf_mode,
243 			       HNS_DSAF_COMM_SERVICE_NW_IDX,
244 			       &max_vfn, &max_q_per_vf);
245 	q_num_per_port = max_vfn * max_q_per_vf;
246 
247 	for (mac_id = 0, q_id = 0; mac_id < DSAF_SERVICE_NW_NUM; mac_id++) {
248 		dsaf_set_dev_field(dsaf_dev,
249 				   DSAFV2_SERDES_LBK_0_REG + 4 * mac_id,
250 				   DSAFV2_SERDES_LBK_QID_M,
251 				   DSAFV2_SERDES_LBK_QID_S,
252 				   q_id);
253 		q_id += q_num_per_port;
254 	}
255 }
256 
257 /**
258  * hns_dsaf_sw_port_type_cfg - cfg sw type
259  * @dsaf_id: dsa fabric id
260  * @psw_port_type: array
261  */
262 static void hns_dsaf_sw_port_type_cfg(struct dsaf_device *dsaf_dev,
263 				      enum dsaf_sw_port_type port_type)
264 {
265 	u32 i;
266 
267 	for (i = 0; i < DSAF_SW_PORT_NUM; i++) {
268 		dsaf_set_dev_field(dsaf_dev,
269 				   DSAF_SW_PORT_TYPE_0_REG + 0x0004 * i,
270 				   DSAF_SW_PORT_TYPE_M, DSAF_SW_PORT_TYPE_S,
271 				   port_type);
272 	}
273 }
274 
275 /**
276  * hns_dsaf_stp_port_type_cfg - cfg stp type
277  * @dsaf_id: dsa fabric id
278  * @pstp_port_type: array
279  */
280 static void hns_dsaf_stp_port_type_cfg(struct dsaf_device *dsaf_dev,
281 				       enum dsaf_stp_port_type port_type)
282 {
283 	u32 i;
284 
285 	for (i = 0; i < DSAF_COMM_CHN; i++) {
286 		dsaf_set_dev_field(dsaf_dev,
287 				   DSAF_STP_PORT_TYPE_0_REG + 0x0004 * i,
288 				   DSAF_STP_PORT_TYPE_M, DSAF_STP_PORT_TYPE_S,
289 				   port_type);
290 	}
291 }
292 
293 #define HNS_DSAF_SBM_NUM(dev) \
294 	(AE_IS_VER1((dev)->dsaf_ver) ? DSAF_SBM_NUM : DSAFV2_SBM_NUM)
295 /**
296  * hns_dsaf_sbm_cfg - config sbm
297  * @dsaf_id: dsa fabric id
298  */
299 static void hns_dsaf_sbm_cfg(struct dsaf_device *dsaf_dev)
300 {
301 	u32 o_sbm_cfg;
302 	u32 i;
303 
304 	for (i = 0; i < HNS_DSAF_SBM_NUM(dsaf_dev); i++) {
305 		o_sbm_cfg = dsaf_read_dev(dsaf_dev,
306 					  DSAF_SBM_CFG_REG_0_REG + 0x80 * i);
307 		dsaf_set_bit(o_sbm_cfg, DSAF_SBM_CFG_EN_S, 1);
308 		dsaf_set_bit(o_sbm_cfg, DSAF_SBM_CFG_SHCUT_EN_S, 0);
309 		dsaf_write_dev(dsaf_dev,
310 			       DSAF_SBM_CFG_REG_0_REG + 0x80 * i, o_sbm_cfg);
311 	}
312 }
313 
314 /**
315  * hns_dsaf_sbm_cfg_mib_en - config sbm
316  * @dsaf_id: dsa fabric id
317  */
318 static int hns_dsaf_sbm_cfg_mib_en(struct dsaf_device *dsaf_dev)
319 {
320 	u32 sbm_cfg_mib_en;
321 	u32 i;
322 	u32 reg;
323 	u32 read_cnt;
324 
325 	/* validate configure by setting SBM_CFG_MIB_EN bit from 0 to 1. */
326 	for (i = 0; i < HNS_DSAF_SBM_NUM(dsaf_dev); i++) {
327 		reg = DSAF_SBM_CFG_REG_0_REG + 0x80 * i;
328 		dsaf_set_dev_bit(dsaf_dev, reg, DSAF_SBM_CFG_MIB_EN_S, 0);
329 	}
330 
331 	for (i = 0; i < HNS_DSAF_SBM_NUM(dsaf_dev); i++) {
332 		reg = DSAF_SBM_CFG_REG_0_REG + 0x80 * i;
333 		dsaf_set_dev_bit(dsaf_dev, reg, DSAF_SBM_CFG_MIB_EN_S, 1);
334 	}
335 
336 	/* waitint for all sbm enable finished */
337 	for (i = 0; i < HNS_DSAF_SBM_NUM(dsaf_dev); i++) {
338 		read_cnt = 0;
339 		reg = DSAF_SBM_CFG_REG_0_REG + 0x80 * i;
340 		do {
341 			udelay(1);
342 			sbm_cfg_mib_en = dsaf_get_dev_bit(
343 					dsaf_dev, reg, DSAF_SBM_CFG_MIB_EN_S);
344 			read_cnt++;
345 		} while (sbm_cfg_mib_en == 0 &&
346 			read_cnt < DSAF_CFG_READ_CNT);
347 
348 		if (sbm_cfg_mib_en == 0) {
349 			dev_err(dsaf_dev->dev,
350 				"sbm_cfg_mib_en fail,%s,sbm_num=%d\n",
351 				dsaf_dev->ae_dev.name, i);
352 			return -ENODEV;
353 		}
354 	}
355 
356 	return 0;
357 }
358 
359 /**
360  * hns_dsaf_sbm_bp_wl_cfg - config sbm
361  * @dsaf_id: dsa fabric id
362  */
363 static void hns_dsaf_sbm_bp_wl_cfg(struct dsaf_device *dsaf_dev)
364 {
365 	u32 o_sbm_bp_cfg;
366 	u32 reg;
367 	u32 i;
368 
369 	/* XGE */
370 	for (i = 0; i < DSAF_XGE_NUM; i++) {
371 		reg = DSAF_SBM_BP_CFG_0_XGE_REG_0_REG + 0x80 * i;
372 		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
373 		dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG0_COM_MAX_BUF_NUM_M,
374 			       DSAF_SBM_CFG0_COM_MAX_BUF_NUM_S, 512);
375 		dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG0_VC0_MAX_BUF_NUM_M,
376 			       DSAF_SBM_CFG0_VC0_MAX_BUF_NUM_S, 0);
377 		dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG0_VC1_MAX_BUF_NUM_M,
378 			       DSAF_SBM_CFG0_VC1_MAX_BUF_NUM_S, 0);
379 		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
380 
381 		reg = DSAF_SBM_BP_CFG_1_REG_0_REG + 0x80 * i;
382 		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
383 		dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG1_TC4_MAX_BUF_NUM_M,
384 			       DSAF_SBM_CFG1_TC4_MAX_BUF_NUM_S, 0);
385 		dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG1_TC0_MAX_BUF_NUM_M,
386 			       DSAF_SBM_CFG1_TC0_MAX_BUF_NUM_S, 0);
387 		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
388 
389 		reg = DSAF_SBM_BP_CFG_2_XGE_REG_0_REG + 0x80 * i;
390 		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
391 		dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG2_SET_BUF_NUM_M,
392 			       DSAF_SBM_CFG2_SET_BUF_NUM_S, 104);
393 		dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG2_RESET_BUF_NUM_M,
394 			       DSAF_SBM_CFG2_RESET_BUF_NUM_S, 128);
395 		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
396 
397 		reg = DSAF_SBM_BP_CFG_3_REG_0_REG + 0x80 * i;
398 		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
399 		dsaf_set_field(o_sbm_bp_cfg,
400 			       DSAF_SBM_CFG3_SET_BUF_NUM_NO_PFC_M,
401 			       DSAF_SBM_CFG3_SET_BUF_NUM_NO_PFC_S, 110);
402 		dsaf_set_field(o_sbm_bp_cfg,
403 			       DSAF_SBM_CFG3_RESET_BUF_NUM_NO_PFC_M,
404 			       DSAF_SBM_CFG3_RESET_BUF_NUM_NO_PFC_S, 160);
405 		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
406 
407 		/* for no enable pfc mode */
408 		reg = DSAF_SBM_BP_CFG_4_REG_0_REG + 0x80 * i;
409 		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
410 		dsaf_set_field(o_sbm_bp_cfg,
411 			       DSAF_SBM_CFG3_SET_BUF_NUM_NO_PFC_M,
412 			       DSAF_SBM_CFG3_SET_BUF_NUM_NO_PFC_S, 128);
413 		dsaf_set_field(o_sbm_bp_cfg,
414 			       DSAF_SBM_CFG3_RESET_BUF_NUM_NO_PFC_M,
415 			       DSAF_SBM_CFG3_RESET_BUF_NUM_NO_PFC_S, 192);
416 		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
417 	}
418 
419 	/* PPE */
420 	for (i = 0; i < DSAF_COMM_CHN; i++) {
421 		reg = DSAF_SBM_BP_CFG_2_PPE_REG_0_REG + 0x80 * i;
422 		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
423 		dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG2_SET_BUF_NUM_M,
424 			       DSAF_SBM_CFG2_SET_BUF_NUM_S, 10);
425 		dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG2_RESET_BUF_NUM_M,
426 			       DSAF_SBM_CFG2_RESET_BUF_NUM_S, 12);
427 		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
428 	}
429 
430 	/* RoCEE */
431 	for (i = 0; i < DSAF_COMM_CHN; i++) {
432 		reg = DSAF_SBM_BP_CFG_2_ROCEE_REG_0_REG + 0x80 * i;
433 		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
434 		dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG2_SET_BUF_NUM_M,
435 			       DSAF_SBM_CFG2_SET_BUF_NUM_S, 2);
436 		dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG2_RESET_BUF_NUM_M,
437 			       DSAF_SBM_CFG2_RESET_BUF_NUM_S, 4);
438 		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
439 	}
440 }
441 
442 static void hns_dsafv2_sbm_bp_wl_cfg(struct dsaf_device *dsaf_dev)
443 {
444 	u32 o_sbm_bp_cfg;
445 	u32 reg;
446 	u32 i;
447 
448 	/* XGE */
449 	for (i = 0; i < DSAFV2_SBM_XGE_CHN; i++) {
450 		reg = DSAF_SBM_BP_CFG_0_XGE_REG_0_REG + 0x80 * i;
451 		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
452 		dsaf_set_field(o_sbm_bp_cfg, DSAFV2_SBM_CFG0_COM_MAX_BUF_NUM_M,
453 			       DSAFV2_SBM_CFG0_COM_MAX_BUF_NUM_S, 256);
454 		dsaf_set_field(o_sbm_bp_cfg, DSAFV2_SBM_CFG0_VC0_MAX_BUF_NUM_M,
455 			       DSAFV2_SBM_CFG0_VC0_MAX_BUF_NUM_S, 0);
456 		dsaf_set_field(o_sbm_bp_cfg, DSAFV2_SBM_CFG0_VC1_MAX_BUF_NUM_M,
457 			       DSAFV2_SBM_CFG0_VC1_MAX_BUF_NUM_S, 0);
458 		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
459 
460 		reg = DSAF_SBM_BP_CFG_1_REG_0_REG + 0x80 * i;
461 		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
462 		dsaf_set_field(o_sbm_bp_cfg, DSAFV2_SBM_CFG1_TC4_MAX_BUF_NUM_M,
463 			       DSAFV2_SBM_CFG1_TC4_MAX_BUF_NUM_S, 0);
464 		dsaf_set_field(o_sbm_bp_cfg, DSAFV2_SBM_CFG1_TC0_MAX_BUF_NUM_M,
465 			       DSAFV2_SBM_CFG1_TC0_MAX_BUF_NUM_S, 0);
466 		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
467 
468 		reg = DSAF_SBM_BP_CFG_2_XGE_REG_0_REG + 0x80 * i;
469 		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
470 		dsaf_set_field(o_sbm_bp_cfg, DSAFV2_SBM_CFG2_SET_BUF_NUM_M,
471 			       DSAFV2_SBM_CFG2_SET_BUF_NUM_S, 104);
472 		dsaf_set_field(o_sbm_bp_cfg, DSAFV2_SBM_CFG2_RESET_BUF_NUM_M,
473 			       DSAFV2_SBM_CFG2_RESET_BUF_NUM_S, 128);
474 		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
475 
476 		reg = DSAF_SBM_BP_CFG_3_REG_0_REG + 0x80 * i;
477 		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
478 		dsaf_set_field(o_sbm_bp_cfg,
479 			       DSAFV2_SBM_CFG3_SET_BUF_NUM_NO_PFC_M,
480 			       DSAFV2_SBM_CFG3_SET_BUF_NUM_NO_PFC_S, 110);
481 		dsaf_set_field(o_sbm_bp_cfg,
482 			       DSAFV2_SBM_CFG3_RESET_BUF_NUM_NO_PFC_M,
483 			       DSAFV2_SBM_CFG3_RESET_BUF_NUM_NO_PFC_S, 160);
484 		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
485 
486 		/* for no enable pfc mode */
487 		reg = DSAF_SBM_BP_CFG_4_REG_0_REG + 0x80 * i;
488 		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
489 		dsaf_set_field(o_sbm_bp_cfg,
490 			       DSAFV2_SBM_CFG4_SET_BUF_NUM_NO_PFC_M,
491 			       DSAFV2_SBM_CFG4_SET_BUF_NUM_NO_PFC_S, 128);
492 		dsaf_set_field(o_sbm_bp_cfg,
493 			       DSAFV2_SBM_CFG4_RESET_BUF_NUM_NO_PFC_M,
494 			       DSAFV2_SBM_CFG4_RESET_BUF_NUM_NO_PFC_S, 192);
495 		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
496 	}
497 
498 	/* PPE */
499 	reg = DSAF_SBM_BP_CFG_2_PPE_REG_0_REG + 0x80 * i;
500 	o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
501 	dsaf_set_field(o_sbm_bp_cfg, DSAFV2_SBM_CFG2_SET_BUF_NUM_M,
502 		       DSAFV2_SBM_CFG2_SET_BUF_NUM_S, 10);
503 	dsaf_set_field(o_sbm_bp_cfg, DSAFV2_SBM_CFG2_RESET_BUF_NUM_M,
504 		       DSAFV2_SBM_CFG2_RESET_BUF_NUM_S, 12);
505 	dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
506 	/* RoCEE */
507 	for (i = 0; i < DASFV2_ROCEE_CRD_NUM; i++) {
508 		reg = DSAFV2_SBM_BP_CFG_2_ROCEE_REG_0_REG + 0x80 * i;
509 		o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
510 		dsaf_set_field(o_sbm_bp_cfg, DSAFV2_SBM_CFG2_SET_BUF_NUM_M,
511 			       DSAFV2_SBM_CFG2_SET_BUF_NUM_S, 2);
512 		dsaf_set_field(o_sbm_bp_cfg, DSAFV2_SBM_CFG2_RESET_BUF_NUM_M,
513 			       DSAFV2_SBM_CFG2_RESET_BUF_NUM_S, 4);
514 		dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
515 	}
516 }
517 
518 /**
519  * hns_dsaf_voq_bp_all_thrd_cfg -  voq
520  * @dsaf_id: dsa fabric id
521  */
522 static void hns_dsaf_voq_bp_all_thrd_cfg(struct dsaf_device *dsaf_dev)
523 {
524 	u32 voq_bp_all_thrd;
525 	u32 i;
526 
527 	for (i = 0; i < DSAF_VOQ_NUM; i++) {
528 		voq_bp_all_thrd = dsaf_read_dev(
529 			dsaf_dev, DSAF_VOQ_BP_ALL_THRD_0_REG + 0x40 * i);
530 		if (i < DSAF_XGE_NUM) {
531 			dsaf_set_field(voq_bp_all_thrd,
532 				       DSAF_VOQ_BP_ALL_DOWNTHRD_M,
533 				       DSAF_VOQ_BP_ALL_DOWNTHRD_S, 930);
534 			dsaf_set_field(voq_bp_all_thrd,
535 				       DSAF_VOQ_BP_ALL_UPTHRD_M,
536 				       DSAF_VOQ_BP_ALL_UPTHRD_S, 950);
537 		} else {
538 			dsaf_set_field(voq_bp_all_thrd,
539 				       DSAF_VOQ_BP_ALL_DOWNTHRD_M,
540 				       DSAF_VOQ_BP_ALL_DOWNTHRD_S, 220);
541 			dsaf_set_field(voq_bp_all_thrd,
542 				       DSAF_VOQ_BP_ALL_UPTHRD_M,
543 				       DSAF_VOQ_BP_ALL_UPTHRD_S, 230);
544 		}
545 		dsaf_write_dev(
546 			dsaf_dev, DSAF_VOQ_BP_ALL_THRD_0_REG + 0x40 * i,
547 			voq_bp_all_thrd);
548 	}
549 }
550 
551 /**
552  * hns_dsaf_tbl_tcam_data_cfg - tbl
553  * @dsaf_id: dsa fabric id
554  * @ptbl_tcam_data: addr
555  */
556 static void hns_dsaf_tbl_tcam_data_cfg(
557 	struct dsaf_device *dsaf_dev,
558 	struct dsaf_tbl_tcam_data *ptbl_tcam_data)
559 {
560 	dsaf_write_dev(dsaf_dev, DSAF_TBL_TCAM_LOW_0_REG,
561 		       ptbl_tcam_data->tbl_tcam_data_low);
562 	dsaf_write_dev(dsaf_dev, DSAF_TBL_TCAM_HIGH_0_REG,
563 		       ptbl_tcam_data->tbl_tcam_data_high);
564 }
565 
566 /**
567  * dsaf_tbl_tcam_mcast_cfg - tbl
568  * @dsaf_id: dsa fabric id
569  * @ptbl_tcam_mcast: addr
570  */
571 static void hns_dsaf_tbl_tcam_mcast_cfg(
572 	struct dsaf_device *dsaf_dev,
573 	struct dsaf_tbl_tcam_mcast_cfg *mcast)
574 {
575 	u32 mcast_cfg4;
576 
577 	mcast_cfg4 = dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_MCAST_CFG_4_0_REG);
578 	dsaf_set_bit(mcast_cfg4, DSAF_TBL_MCAST_CFG4_ITEM_VLD_S,
579 		     mcast->tbl_mcast_item_vld);
580 	dsaf_set_bit(mcast_cfg4, DSAF_TBL_MCAST_CFG4_OLD_EN_S,
581 		     mcast->tbl_mcast_old_en);
582 	dsaf_set_field(mcast_cfg4, DSAF_TBL_MCAST_CFG4_VM128_112_M,
583 		       DSAF_TBL_MCAST_CFG4_VM128_112_S,
584 		       mcast->tbl_mcast_port_msk[4]);
585 	dsaf_write_dev(dsaf_dev, DSAF_TBL_TCAM_MCAST_CFG_4_0_REG, mcast_cfg4);
586 
587 	dsaf_write_dev(dsaf_dev, DSAF_TBL_TCAM_MCAST_CFG_3_0_REG,
588 		       mcast->tbl_mcast_port_msk[3]);
589 
590 	dsaf_write_dev(dsaf_dev, DSAF_TBL_TCAM_MCAST_CFG_2_0_REG,
591 		       mcast->tbl_mcast_port_msk[2]);
592 
593 	dsaf_write_dev(dsaf_dev, DSAF_TBL_TCAM_MCAST_CFG_1_0_REG,
594 		       mcast->tbl_mcast_port_msk[1]);
595 
596 	dsaf_write_dev(dsaf_dev, DSAF_TBL_TCAM_MCAST_CFG_0_0_REG,
597 		       mcast->tbl_mcast_port_msk[0]);
598 }
599 
600 /**
601  * hns_dsaf_tbl_tcam_ucast_cfg - tbl
602  * @dsaf_id: dsa fabric id
603  * @ptbl_tcam_ucast: addr
604  */
605 static void hns_dsaf_tbl_tcam_ucast_cfg(
606 	struct dsaf_device *dsaf_dev,
607 	struct dsaf_tbl_tcam_ucast_cfg *tbl_tcam_ucast)
608 {
609 	u32 ucast_cfg1;
610 
611 	ucast_cfg1 = dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_UCAST_CFG_0_REG);
612 	dsaf_set_bit(ucast_cfg1, DSAF_TBL_UCAST_CFG1_MAC_DISCARD_S,
613 		     tbl_tcam_ucast->tbl_ucast_mac_discard);
614 	dsaf_set_bit(ucast_cfg1, DSAF_TBL_UCAST_CFG1_ITEM_VLD_S,
615 		     tbl_tcam_ucast->tbl_ucast_item_vld);
616 	dsaf_set_bit(ucast_cfg1, DSAF_TBL_UCAST_CFG1_OLD_EN_S,
617 		     tbl_tcam_ucast->tbl_ucast_old_en);
618 	dsaf_set_bit(ucast_cfg1, DSAF_TBL_UCAST_CFG1_DVC_S,
619 		     tbl_tcam_ucast->tbl_ucast_dvc);
620 	dsaf_set_field(ucast_cfg1, DSAF_TBL_UCAST_CFG1_OUT_PORT_M,
621 		       DSAF_TBL_UCAST_CFG1_OUT_PORT_S,
622 		       tbl_tcam_ucast->tbl_ucast_out_port);
623 	dsaf_write_dev(dsaf_dev, DSAF_TBL_TCAM_UCAST_CFG_0_REG, ucast_cfg1);
624 }
625 
626 /**
627  * hns_dsaf_tbl_line_cfg - tbl
628  * @dsaf_id: dsa fabric id
629  * @ptbl_lin: addr
630  */
631 static void hns_dsaf_tbl_line_cfg(struct dsaf_device *dsaf_dev,
632 				  struct dsaf_tbl_line_cfg *tbl_lin)
633 {
634 	u32 tbl_line;
635 
636 	tbl_line = dsaf_read_dev(dsaf_dev, DSAF_TBL_LIN_CFG_0_REG);
637 	dsaf_set_bit(tbl_line, DSAF_TBL_LINE_CFG_MAC_DISCARD_S,
638 		     tbl_lin->tbl_line_mac_discard);
639 	dsaf_set_bit(tbl_line, DSAF_TBL_LINE_CFG_DVC_S,
640 		     tbl_lin->tbl_line_dvc);
641 	dsaf_set_field(tbl_line, DSAF_TBL_LINE_CFG_OUT_PORT_M,
642 		       DSAF_TBL_LINE_CFG_OUT_PORT_S,
643 		       tbl_lin->tbl_line_out_port);
644 	dsaf_write_dev(dsaf_dev, DSAF_TBL_LIN_CFG_0_REG, tbl_line);
645 }
646 
647 /**
648  * hns_dsaf_tbl_tcam_mcast_pul - tbl
649  * @dsaf_id: dsa fabric id
650  */
651 static void hns_dsaf_tbl_tcam_mcast_pul(struct dsaf_device *dsaf_dev)
652 {
653 	u32 o_tbl_pul;
654 
655 	o_tbl_pul = dsaf_read_dev(dsaf_dev, DSAF_TBL_PUL_0_REG);
656 	dsaf_set_bit(o_tbl_pul, DSAF_TBL_PUL_MCAST_VLD_S, 1);
657 	dsaf_write_dev(dsaf_dev, DSAF_TBL_PUL_0_REG, o_tbl_pul);
658 	dsaf_set_bit(o_tbl_pul, DSAF_TBL_PUL_MCAST_VLD_S, 0);
659 	dsaf_write_dev(dsaf_dev, DSAF_TBL_PUL_0_REG, o_tbl_pul);
660 }
661 
662 /**
663  * hns_dsaf_tbl_line_pul - tbl
664  * @dsaf_id: dsa fabric id
665  */
666 static void hns_dsaf_tbl_line_pul(struct dsaf_device *dsaf_dev)
667 {
668 	u32 tbl_pul;
669 
670 	tbl_pul = dsaf_read_dev(dsaf_dev, DSAF_TBL_PUL_0_REG);
671 	dsaf_set_bit(tbl_pul, DSAF_TBL_PUL_LINE_VLD_S, 1);
672 	dsaf_write_dev(dsaf_dev, DSAF_TBL_PUL_0_REG, tbl_pul);
673 	dsaf_set_bit(tbl_pul, DSAF_TBL_PUL_LINE_VLD_S, 0);
674 	dsaf_write_dev(dsaf_dev, DSAF_TBL_PUL_0_REG, tbl_pul);
675 }
676 
677 /**
678  * hns_dsaf_tbl_tcam_data_mcast_pul - tbl
679  * @dsaf_id: dsa fabric id
680  */
681 static void hns_dsaf_tbl_tcam_data_mcast_pul(
682 	struct dsaf_device *dsaf_dev)
683 {
684 	u32 o_tbl_pul;
685 
686 	o_tbl_pul = dsaf_read_dev(dsaf_dev, DSAF_TBL_PUL_0_REG);
687 	dsaf_set_bit(o_tbl_pul, DSAF_TBL_PUL_TCAM_DATA_VLD_S, 1);
688 	dsaf_set_bit(o_tbl_pul, DSAF_TBL_PUL_MCAST_VLD_S, 1);
689 	dsaf_write_dev(dsaf_dev, DSAF_TBL_PUL_0_REG, o_tbl_pul);
690 	dsaf_set_bit(o_tbl_pul, DSAF_TBL_PUL_TCAM_DATA_VLD_S, 0);
691 	dsaf_set_bit(o_tbl_pul, DSAF_TBL_PUL_MCAST_VLD_S, 0);
692 	dsaf_write_dev(dsaf_dev, DSAF_TBL_PUL_0_REG, o_tbl_pul);
693 }
694 
695 /**
696  * hns_dsaf_tbl_tcam_data_ucast_pul - tbl
697  * @dsaf_id: dsa fabric id
698  */
699 static void hns_dsaf_tbl_tcam_data_ucast_pul(
700 	struct dsaf_device *dsaf_dev)
701 {
702 	u32 o_tbl_pul;
703 
704 	o_tbl_pul = dsaf_read_dev(dsaf_dev, DSAF_TBL_PUL_0_REG);
705 	dsaf_set_bit(o_tbl_pul, DSAF_TBL_PUL_TCAM_DATA_VLD_S, 1);
706 	dsaf_set_bit(o_tbl_pul, DSAF_TBL_PUL_UCAST_VLD_S, 1);
707 	dsaf_write_dev(dsaf_dev, DSAF_TBL_PUL_0_REG, o_tbl_pul);
708 	dsaf_set_bit(o_tbl_pul, DSAF_TBL_PUL_TCAM_DATA_VLD_S, 0);
709 	dsaf_set_bit(o_tbl_pul, DSAF_TBL_PUL_UCAST_VLD_S, 0);
710 	dsaf_write_dev(dsaf_dev, DSAF_TBL_PUL_0_REG, o_tbl_pul);
711 }
712 
713 void hns_dsaf_set_promisc_mode(struct dsaf_device *dsaf_dev, u32 en)
714 {
715 	dsaf_set_dev_bit(dsaf_dev, DSAF_CFG_0_REG, DSAF_CFG_MIX_MODE_S, !!en);
716 }
717 
718 void hns_dsaf_set_inner_lb(struct dsaf_device *dsaf_dev, u32 mac_id, u32 en)
719 {
720 	if (AE_IS_VER1(dsaf_dev->dsaf_ver) ||
721 	    dsaf_dev->mac_cb[mac_id].mac_type == HNAE_PORT_DEBUG)
722 		return;
723 
724 	dsaf_set_dev_bit(dsaf_dev, DSAFV2_SERDES_LBK_0_REG + 4 * mac_id,
725 			 DSAFV2_SERDES_LBK_EN_B, !!en);
726 }
727 
728 /**
729  * hns_dsaf_tbl_stat_en - tbl
730  * @dsaf_id: dsa fabric id
731  * @ptbl_stat_en: addr
732  */
733 static void hns_dsaf_tbl_stat_en(struct dsaf_device *dsaf_dev)
734 {
735 	u32 o_tbl_ctrl;
736 
737 	o_tbl_ctrl = dsaf_read_dev(dsaf_dev, DSAF_TBL_DFX_CTRL_0_REG);
738 	dsaf_set_bit(o_tbl_ctrl, DSAF_TBL_DFX_LINE_LKUP_NUM_EN_S, 1);
739 	dsaf_set_bit(o_tbl_ctrl, DSAF_TBL_DFX_UC_LKUP_NUM_EN_S, 1);
740 	dsaf_set_bit(o_tbl_ctrl, DSAF_TBL_DFX_MC_LKUP_NUM_EN_S, 1);
741 	dsaf_set_bit(o_tbl_ctrl, DSAF_TBL_DFX_BC_LKUP_NUM_EN_S, 1);
742 	dsaf_write_dev(dsaf_dev, DSAF_TBL_DFX_CTRL_0_REG, o_tbl_ctrl);
743 }
744 
745 /**
746  * hns_dsaf_rocee_bp_en - rocee back press enable
747  * @dsaf_id: dsa fabric id
748  */
749 static void hns_dsaf_rocee_bp_en(struct dsaf_device *dsaf_dev)
750 {
751 	if (AE_IS_VER1(dsaf_dev->dsaf_ver))
752 		dsaf_set_dev_bit(dsaf_dev, DSAF_XGE_CTRL_SIG_CFG_0_REG,
753 				 DSAF_FC_XGE_TX_PAUSE_S, 1);
754 }
755 
756 /* set msk for dsaf exception irq*/
757 static void hns_dsaf_int_xge_msk_set(struct dsaf_device *dsaf_dev,
758 				     u32 chnn_num, u32 mask_set)
759 {
760 	dsaf_write_dev(dsaf_dev,
761 		       DSAF_XGE_INT_MSK_0_REG + 0x4 * chnn_num, mask_set);
762 }
763 
764 static void hns_dsaf_int_ppe_msk_set(struct dsaf_device *dsaf_dev,
765 				     u32 chnn_num, u32 msk_set)
766 {
767 	dsaf_write_dev(dsaf_dev,
768 		       DSAF_PPE_INT_MSK_0_REG + 0x4 * chnn_num, msk_set);
769 }
770 
771 static void hns_dsaf_int_rocee_msk_set(struct dsaf_device *dsaf_dev,
772 				       u32 chnn, u32 msk_set)
773 {
774 	dsaf_write_dev(dsaf_dev,
775 		       DSAF_ROCEE_INT_MSK_0_REG + 0x4 * chnn, msk_set);
776 }
777 
778 static void
779 hns_dsaf_int_tbl_msk_set(struct dsaf_device *dsaf_dev, u32 msk_set)
780 {
781 	dsaf_write_dev(dsaf_dev, DSAF_TBL_INT_MSK_0_REG, msk_set);
782 }
783 
784 /* clr dsaf exception irq*/
785 static void hns_dsaf_int_xge_src_clr(struct dsaf_device *dsaf_dev,
786 				     u32 chnn_num, u32 int_src)
787 {
788 	dsaf_write_dev(dsaf_dev,
789 		       DSAF_XGE_INT_SRC_0_REG + 0x4 * chnn_num, int_src);
790 }
791 
792 static void hns_dsaf_int_ppe_src_clr(struct dsaf_device *dsaf_dev,
793 				     u32 chnn, u32 int_src)
794 {
795 	dsaf_write_dev(dsaf_dev,
796 		       DSAF_PPE_INT_SRC_0_REG + 0x4 * chnn, int_src);
797 }
798 
799 static void hns_dsaf_int_rocee_src_clr(struct dsaf_device *dsaf_dev,
800 				       u32 chnn, u32 int_src)
801 {
802 	dsaf_write_dev(dsaf_dev,
803 		       DSAF_ROCEE_INT_SRC_0_REG + 0x4 * chnn, int_src);
804 }
805 
806 static void hns_dsaf_int_tbl_src_clr(struct dsaf_device *dsaf_dev,
807 				     u32 int_src)
808 {
809 	dsaf_write_dev(dsaf_dev, DSAF_TBL_INT_SRC_0_REG, int_src);
810 }
811 
812 /**
813  * hns_dsaf_single_line_tbl_cfg - INT
814  * @dsaf_id: dsa fabric id
815  * @address:
816  * @ptbl_line:
817  */
818 static void hns_dsaf_single_line_tbl_cfg(
819 	struct dsaf_device *dsaf_dev,
820 	u32 address, struct dsaf_tbl_line_cfg *ptbl_line)
821 {
822 	/*Write Addr*/
823 	hns_dsaf_tbl_line_addr_cfg(dsaf_dev, address);
824 
825 	/*Write Line*/
826 	hns_dsaf_tbl_line_cfg(dsaf_dev, ptbl_line);
827 
828 	/*Write Plus*/
829 	hns_dsaf_tbl_line_pul(dsaf_dev);
830 }
831 
832 /**
833  * hns_dsaf_tcam_uc_cfg - INT
834  * @dsaf_id: dsa fabric id
835  * @address,
836  * @ptbl_tcam_data,
837  */
838 static void hns_dsaf_tcam_uc_cfg(
839 	struct dsaf_device *dsaf_dev, u32 address,
840 	struct dsaf_tbl_tcam_data *ptbl_tcam_data,
841 	struct dsaf_tbl_tcam_ucast_cfg *ptbl_tcam_ucast)
842 {
843 	/*Write Addr*/
844 	hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
845 	/*Write Tcam Data*/
846 	hns_dsaf_tbl_tcam_data_cfg(dsaf_dev, ptbl_tcam_data);
847 	/*Write Tcam Ucast*/
848 	hns_dsaf_tbl_tcam_ucast_cfg(dsaf_dev, ptbl_tcam_ucast);
849 	/*Write Plus*/
850 	hns_dsaf_tbl_tcam_data_ucast_pul(dsaf_dev);
851 }
852 
853 /**
854  * hns_dsaf_tcam_mc_cfg - INT
855  * @dsaf_id: dsa fabric id
856  * @address,
857  * @ptbl_tcam_data,
858  * @ptbl_tcam_mcast,
859  */
860 static void hns_dsaf_tcam_mc_cfg(
861 	struct dsaf_device *dsaf_dev, u32 address,
862 	struct dsaf_tbl_tcam_data *ptbl_tcam_data,
863 	struct dsaf_tbl_tcam_mcast_cfg *ptbl_tcam_mcast)
864 {
865 	/*Write Addr*/
866 	hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
867 	/*Write Tcam Data*/
868 	hns_dsaf_tbl_tcam_data_cfg(dsaf_dev, ptbl_tcam_data);
869 	/*Write Tcam Mcast*/
870 	hns_dsaf_tbl_tcam_mcast_cfg(dsaf_dev, ptbl_tcam_mcast);
871 	/*Write Plus*/
872 	hns_dsaf_tbl_tcam_data_mcast_pul(dsaf_dev);
873 }
874 
875 /**
876  * hns_dsaf_tcam_mc_invld - INT
877  * @dsaf_id: dsa fabric id
878  * @address
879  */
880 static void hns_dsaf_tcam_mc_invld(struct dsaf_device *dsaf_dev, u32 address)
881 {
882 	/*Write Addr*/
883 	hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
884 
885 	/*write tcam mcast*/
886 	dsaf_write_dev(dsaf_dev, DSAF_TBL_TCAM_MCAST_CFG_0_0_REG, 0);
887 	dsaf_write_dev(dsaf_dev, DSAF_TBL_TCAM_MCAST_CFG_1_0_REG, 0);
888 	dsaf_write_dev(dsaf_dev, DSAF_TBL_TCAM_MCAST_CFG_2_0_REG, 0);
889 	dsaf_write_dev(dsaf_dev, DSAF_TBL_TCAM_MCAST_CFG_3_0_REG, 0);
890 	dsaf_write_dev(dsaf_dev, DSAF_TBL_TCAM_MCAST_CFG_4_0_REG, 0);
891 
892 	/*Write Plus*/
893 	hns_dsaf_tbl_tcam_mcast_pul(dsaf_dev);
894 }
895 
896 /**
897  * hns_dsaf_tcam_uc_get - INT
898  * @dsaf_id: dsa fabric id
899  * @address
900  * @ptbl_tcam_data
901  * @ptbl_tcam_ucast
902  */
903 static void hns_dsaf_tcam_uc_get(
904 	struct dsaf_device *dsaf_dev, u32 address,
905 	struct dsaf_tbl_tcam_data *ptbl_tcam_data,
906 	struct dsaf_tbl_tcam_ucast_cfg *ptbl_tcam_ucast)
907 {
908 	u32 tcam_read_data0;
909 	u32 tcam_read_data4;
910 
911 	/*Write Addr*/
912 	hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
913 
914 	/*read tcam item puls*/
915 	hns_dsaf_tbl_tcam_load_pul(dsaf_dev);
916 
917 	/*read tcam data*/
918 	ptbl_tcam_data->tbl_tcam_data_high
919 		= dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RDATA_LOW_0_REG);
920 	ptbl_tcam_data->tbl_tcam_data_low
921 		= dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RDATA_HIGH_0_REG);
922 
923 	/*read tcam mcast*/
924 	tcam_read_data0 = dsaf_read_dev(dsaf_dev,
925 					DSAF_TBL_TCAM_RAM_RDATA0_0_REG);
926 	tcam_read_data4 = dsaf_read_dev(dsaf_dev,
927 					DSAF_TBL_TCAM_RAM_RDATA4_0_REG);
928 
929 	ptbl_tcam_ucast->tbl_ucast_item_vld
930 		= dsaf_get_bit(tcam_read_data4,
931 			       DSAF_TBL_MCAST_CFG4_ITEM_VLD_S);
932 	ptbl_tcam_ucast->tbl_ucast_old_en
933 		= dsaf_get_bit(tcam_read_data4, DSAF_TBL_MCAST_CFG4_OLD_EN_S);
934 	ptbl_tcam_ucast->tbl_ucast_mac_discard
935 		= dsaf_get_bit(tcam_read_data0,
936 			       DSAF_TBL_UCAST_CFG1_MAC_DISCARD_S);
937 	ptbl_tcam_ucast->tbl_ucast_out_port
938 		= dsaf_get_field(tcam_read_data0,
939 				 DSAF_TBL_UCAST_CFG1_OUT_PORT_M,
940 				 DSAF_TBL_UCAST_CFG1_OUT_PORT_S);
941 	ptbl_tcam_ucast->tbl_ucast_dvc
942 		= dsaf_get_bit(tcam_read_data0, DSAF_TBL_UCAST_CFG1_DVC_S);
943 }
944 
945 /**
946  * hns_dsaf_tcam_mc_get - INT
947  * @dsaf_id: dsa fabric id
948  * @address
949  * @ptbl_tcam_data
950  * @ptbl_tcam_ucast
951  */
952 static void hns_dsaf_tcam_mc_get(
953 	struct dsaf_device *dsaf_dev, u32 address,
954 	struct dsaf_tbl_tcam_data *ptbl_tcam_data,
955 	struct dsaf_tbl_tcam_mcast_cfg *ptbl_tcam_mcast)
956 {
957 	u32 data_tmp;
958 
959 	/*Write Addr*/
960 	hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
961 
962 	/*read tcam item puls*/
963 	hns_dsaf_tbl_tcam_load_pul(dsaf_dev);
964 
965 	/*read tcam data*/
966 	ptbl_tcam_data->tbl_tcam_data_high =
967 		dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RDATA_LOW_0_REG);
968 	ptbl_tcam_data->tbl_tcam_data_low =
969 		dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RDATA_HIGH_0_REG);
970 
971 	/*read tcam mcast*/
972 	ptbl_tcam_mcast->tbl_mcast_port_msk[0] =
973 		dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RAM_RDATA0_0_REG);
974 	ptbl_tcam_mcast->tbl_mcast_port_msk[1] =
975 		dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RAM_RDATA1_0_REG);
976 	ptbl_tcam_mcast->tbl_mcast_port_msk[2] =
977 		dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RAM_RDATA2_0_REG);
978 	ptbl_tcam_mcast->tbl_mcast_port_msk[3] =
979 		dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RAM_RDATA3_0_REG);
980 
981 	data_tmp = dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RAM_RDATA4_0_REG);
982 	ptbl_tcam_mcast->tbl_mcast_item_vld =
983 		dsaf_get_bit(data_tmp, DSAF_TBL_MCAST_CFG4_ITEM_VLD_S);
984 	ptbl_tcam_mcast->tbl_mcast_old_en =
985 		dsaf_get_bit(data_tmp, DSAF_TBL_MCAST_CFG4_OLD_EN_S);
986 	ptbl_tcam_mcast->tbl_mcast_port_msk[4] =
987 		dsaf_get_field(data_tmp, DSAF_TBL_MCAST_CFG4_VM128_112_M,
988 			       DSAF_TBL_MCAST_CFG4_VM128_112_S);
989 }
990 
991 /**
992  * hns_dsaf_tbl_line_init - INT
993  * @dsaf_id: dsa fabric id
994  */
995 static void hns_dsaf_tbl_line_init(struct dsaf_device *dsaf_dev)
996 {
997 	u32 i;
998 	/* defaultly set all lineal mac table entry resulting discard */
999 	struct dsaf_tbl_line_cfg tbl_line[] = {{1, 0, 0} };
1000 
1001 	for (i = 0; i < DSAF_LINE_SUM; i++)
1002 		hns_dsaf_single_line_tbl_cfg(dsaf_dev, i, tbl_line);
1003 }
1004 
1005 /**
1006  * hns_dsaf_tbl_tcam_init - INT
1007  * @dsaf_id: dsa fabric id
1008  */
1009 static void hns_dsaf_tbl_tcam_init(struct dsaf_device *dsaf_dev)
1010 {
1011 	u32 i;
1012 	struct dsaf_tbl_tcam_data tcam_data[] = {{0, 0} };
1013 	struct dsaf_tbl_tcam_ucast_cfg tcam_ucast[] = {{0, 0, 0, 0, 0} };
1014 
1015 	/*tcam tbl*/
1016 	for (i = 0; i < DSAF_TCAM_SUM; i++)
1017 		hns_dsaf_tcam_uc_cfg(dsaf_dev, i, tcam_data, tcam_ucast);
1018 }
1019 
1020 /**
1021  * hns_dsaf_pfc_en_cfg - dsaf pfc pause cfg
1022  * @mac_cb: mac contrl block
1023  */
1024 static void hns_dsaf_pfc_en_cfg(struct dsaf_device *dsaf_dev,
1025 				int mac_id, int en)
1026 {
1027 	if (!en)
1028 		dsaf_write_dev(dsaf_dev, DSAF_PFC_EN_0_REG + mac_id * 4, 0);
1029 	else
1030 		dsaf_write_dev(dsaf_dev, DSAF_PFC_EN_0_REG + mac_id * 4, 0xff);
1031 }
1032 
1033 /**
1034  * hns_dsaf_tbl_tcam_init - INT
1035  * @dsaf_id: dsa fabric id
1036  * @dsaf_mode
1037  */
1038 static void hns_dsaf_comm_init(struct dsaf_device *dsaf_dev)
1039 {
1040 	u32 i;
1041 	u32 o_dsaf_cfg;
1042 
1043 	o_dsaf_cfg = dsaf_read_dev(dsaf_dev, DSAF_CFG_0_REG);
1044 	dsaf_set_bit(o_dsaf_cfg, DSAF_CFG_EN_S, dsaf_dev->dsaf_en);
1045 	dsaf_set_bit(o_dsaf_cfg, DSAF_CFG_TC_MODE_S, dsaf_dev->dsaf_tc_mode);
1046 	dsaf_set_bit(o_dsaf_cfg, DSAF_CFG_CRC_EN_S, 0);
1047 	dsaf_set_bit(o_dsaf_cfg, DSAF_CFG_MIX_MODE_S, 0);
1048 	dsaf_set_bit(o_dsaf_cfg, DSAF_CFG_LOCA_ADDR_EN_S, 0);
1049 	dsaf_write_dev(dsaf_dev, DSAF_CFG_0_REG, o_dsaf_cfg);
1050 
1051 	hns_dsaf_reg_cnt_clr_ce(dsaf_dev, 1);
1052 	hns_dsaf_stp_port_type_cfg(dsaf_dev, DSAF_STP_PORT_TYPE_FORWARD);
1053 
1054 	/* set 22 queue per tx ppe engine, only used in switch mode */
1055 	hns_dsaf_ppe_qid_cfg(dsaf_dev, DSAF_DEFAUTL_QUEUE_NUM_PER_PPE);
1056 
1057 	/* set promisc def queue id */
1058 	hns_dsaf_mix_def_qid_cfg(dsaf_dev);
1059 
1060 	/* set inner loopback queue id */
1061 	hns_dsaf_inner_qid_cfg(dsaf_dev);
1062 
1063 	/* in non switch mode, set all port to access mode */
1064 	hns_dsaf_sw_port_type_cfg(dsaf_dev, DSAF_SW_PORT_TYPE_NON_VLAN);
1065 
1066 	/*set dsaf pfc  to 0 for parseing rx pause*/
1067 	for (i = 0; i < DSAF_COMM_CHN; i++)
1068 		hns_dsaf_pfc_en_cfg(dsaf_dev, i, 0);
1069 
1070 	/*msk and  clr exception irqs */
1071 	for (i = 0; i < DSAF_COMM_CHN; i++) {
1072 		hns_dsaf_int_xge_src_clr(dsaf_dev, i, 0xfffffffful);
1073 		hns_dsaf_int_ppe_src_clr(dsaf_dev, i, 0xfffffffful);
1074 		hns_dsaf_int_rocee_src_clr(dsaf_dev, i, 0xfffffffful);
1075 
1076 		hns_dsaf_int_xge_msk_set(dsaf_dev, i, 0xfffffffful);
1077 		hns_dsaf_int_ppe_msk_set(dsaf_dev, i, 0xfffffffful);
1078 		hns_dsaf_int_rocee_msk_set(dsaf_dev, i, 0xfffffffful);
1079 	}
1080 	hns_dsaf_int_tbl_src_clr(dsaf_dev, 0xfffffffful);
1081 	hns_dsaf_int_tbl_msk_set(dsaf_dev, 0xfffffffful);
1082 }
1083 
1084 /**
1085  * hns_dsaf_inode_init - INT
1086  * @dsaf_id: dsa fabric id
1087  */
1088 static void hns_dsaf_inode_init(struct dsaf_device *dsaf_dev)
1089 {
1090 	u32 reg;
1091 	u32 tc_cfg;
1092 	u32 i;
1093 
1094 	if (dsaf_dev->dsaf_tc_mode == HRD_DSAF_4TC_MODE)
1095 		tc_cfg = HNS_DSAF_I4TC_CFG;
1096 	else
1097 		tc_cfg = HNS_DSAF_I8TC_CFG;
1098 
1099 	if (AE_IS_VER1(dsaf_dev->dsaf_ver)) {
1100 		for (i = 0; i < DSAF_INODE_NUM; i++) {
1101 			reg = DSAF_INODE_IN_PORT_NUM_0_REG + 0x80 * i;
1102 			dsaf_set_dev_field(dsaf_dev, reg,
1103 					   DSAF_INODE_IN_PORT_NUM_M,
1104 					   DSAF_INODE_IN_PORT_NUM_S,
1105 					   i % DSAF_XGE_NUM);
1106 		}
1107 	} else {
1108 		for (i = 0; i < DSAF_PORT_TYPE_NUM; i++) {
1109 			reg = DSAF_INODE_IN_PORT_NUM_0_REG + 0x80 * i;
1110 			dsaf_set_dev_field(dsaf_dev, reg,
1111 					   DSAF_INODE_IN_PORT_NUM_M,
1112 					   DSAF_INODE_IN_PORT_NUM_S, 0);
1113 			dsaf_set_dev_field(dsaf_dev, reg,
1114 					   DSAFV2_INODE_IN_PORT1_NUM_M,
1115 					   DSAFV2_INODE_IN_PORT1_NUM_S, 1);
1116 			dsaf_set_dev_field(dsaf_dev, reg,
1117 					   DSAFV2_INODE_IN_PORT2_NUM_M,
1118 					   DSAFV2_INODE_IN_PORT2_NUM_S, 2);
1119 			dsaf_set_dev_field(dsaf_dev, reg,
1120 					   DSAFV2_INODE_IN_PORT3_NUM_M,
1121 					   DSAFV2_INODE_IN_PORT3_NUM_S, 3);
1122 			dsaf_set_dev_field(dsaf_dev, reg,
1123 					   DSAFV2_INODE_IN_PORT4_NUM_M,
1124 					   DSAFV2_INODE_IN_PORT4_NUM_S, 4);
1125 			dsaf_set_dev_field(dsaf_dev, reg,
1126 					   DSAFV2_INODE_IN_PORT5_NUM_M,
1127 					   DSAFV2_INODE_IN_PORT5_NUM_S, 5);
1128 		}
1129 	}
1130 	for (i = 0; i < DSAF_INODE_NUM; i++) {
1131 		reg = DSAF_INODE_PRI_TC_CFG_0_REG + 0x80 * i;
1132 		dsaf_write_dev(dsaf_dev, reg, tc_cfg);
1133 	}
1134 }
1135 
1136 /**
1137  * hns_dsaf_sbm_init - INT
1138  * @dsaf_id: dsa fabric id
1139  */
1140 static int hns_dsaf_sbm_init(struct dsaf_device *dsaf_dev)
1141 {
1142 	u32 flag;
1143 	u32 finish_msk;
1144 	u32 cnt = 0;
1145 	int ret;
1146 
1147 	if (AE_IS_VER1(dsaf_dev->dsaf_ver)) {
1148 		hns_dsaf_sbm_bp_wl_cfg(dsaf_dev);
1149 		finish_msk = DSAF_SRAM_INIT_OVER_M;
1150 	} else {
1151 		hns_dsafv2_sbm_bp_wl_cfg(dsaf_dev);
1152 		finish_msk = DSAFV2_SRAM_INIT_OVER_M;
1153 	}
1154 
1155 	/* enable sbm chanel, disable sbm chanel shcut function*/
1156 	hns_dsaf_sbm_cfg(dsaf_dev);
1157 
1158 	/* enable sbm mib */
1159 	ret = hns_dsaf_sbm_cfg_mib_en(dsaf_dev);
1160 	if (ret) {
1161 		dev_err(dsaf_dev->dev,
1162 			"hns_dsaf_sbm_cfg_mib_en fail,%s, ret=%d\n",
1163 			dsaf_dev->ae_dev.name, ret);
1164 		return ret;
1165 	}
1166 
1167 	/* enable sbm initial link sram */
1168 	hns_dsaf_sbm_link_sram_init_en(dsaf_dev);
1169 
1170 	do {
1171 		usleep_range(200, 210);/*udelay(200);*/
1172 		flag = dsaf_get_dev_field(dsaf_dev, DSAF_SRAM_INIT_OVER_0_REG,
1173 					  finish_msk, DSAF_SRAM_INIT_OVER_S);
1174 		cnt++;
1175 	} while (flag != (finish_msk >> DSAF_SRAM_INIT_OVER_S) &&
1176 		 cnt < DSAF_CFG_READ_CNT);
1177 
1178 	if (flag != (finish_msk >> DSAF_SRAM_INIT_OVER_S)) {
1179 		dev_err(dsaf_dev->dev,
1180 			"hns_dsaf_sbm_init fail %s, flag=%d, cnt=%d\n",
1181 			dsaf_dev->ae_dev.name, flag, cnt);
1182 		return -ENODEV;
1183 	}
1184 
1185 	hns_dsaf_rocee_bp_en(dsaf_dev);
1186 
1187 	return 0;
1188 }
1189 
1190 /**
1191  * hns_dsaf_tbl_init - INT
1192  * @dsaf_id: dsa fabric id
1193  */
1194 static void hns_dsaf_tbl_init(struct dsaf_device *dsaf_dev)
1195 {
1196 	hns_dsaf_tbl_stat_en(dsaf_dev);
1197 
1198 	hns_dsaf_tbl_tcam_init(dsaf_dev);
1199 	hns_dsaf_tbl_line_init(dsaf_dev);
1200 }
1201 
1202 /**
1203  * hns_dsaf_voq_init - INT
1204  * @dsaf_id: dsa fabric id
1205  */
1206 static void hns_dsaf_voq_init(struct dsaf_device *dsaf_dev)
1207 {
1208 	hns_dsaf_voq_bp_all_thrd_cfg(dsaf_dev);
1209 }
1210 
1211 /**
1212  * hns_dsaf_init_hw - init dsa fabric hardware
1213  * @dsaf_dev: dsa fabric device struct pointer
1214  */
1215 static int hns_dsaf_init_hw(struct dsaf_device *dsaf_dev)
1216 {
1217 	int ret;
1218 
1219 	dev_dbg(dsaf_dev->dev,
1220 		"hns_dsaf_init_hw begin %s !\n", dsaf_dev->ae_dev.name);
1221 
1222 	hns_dsaf_rst(dsaf_dev, 0);
1223 	mdelay(10);
1224 	hns_dsaf_rst(dsaf_dev, 1);
1225 
1226 	hns_dsaf_comm_init(dsaf_dev);
1227 
1228 	/*init XBAR_INODE*/
1229 	hns_dsaf_inode_init(dsaf_dev);
1230 
1231 	/*init SBM*/
1232 	ret = hns_dsaf_sbm_init(dsaf_dev);
1233 	if (ret)
1234 		return ret;
1235 
1236 	/*init TBL*/
1237 	hns_dsaf_tbl_init(dsaf_dev);
1238 
1239 	/*init VOQ*/
1240 	hns_dsaf_voq_init(dsaf_dev);
1241 
1242 	return 0;
1243 }
1244 
1245 /**
1246  * hns_dsaf_remove_hw - uninit dsa fabric hardware
1247  * @dsaf_dev: dsa fabric device struct pointer
1248  */
1249 static void hns_dsaf_remove_hw(struct dsaf_device *dsaf_dev)
1250 {
1251 	/*reset*/
1252 	hns_dsaf_rst(dsaf_dev, 0);
1253 }
1254 
1255 /**
1256  * hns_dsaf_init - init dsa fabric
1257  * @dsaf_dev: dsa fabric device struct pointer
1258  * retuen 0 - success , negative --fail
1259  */
1260 static int hns_dsaf_init(struct dsaf_device *dsaf_dev)
1261 {
1262 	struct dsaf_drv_priv *priv =
1263 	    (struct dsaf_drv_priv *)hns_dsaf_dev_priv(dsaf_dev);
1264 	u32 i;
1265 	int ret;
1266 
1267 	ret = hns_dsaf_init_hw(dsaf_dev);
1268 	if (ret)
1269 		return ret;
1270 
1271 	/* malloc mem for tcam mac key(vlan+mac) */
1272 	priv->soft_mac_tbl = vzalloc(sizeof(*priv->soft_mac_tbl)
1273 		  * DSAF_TCAM_SUM);
1274 	if (!priv->soft_mac_tbl) {
1275 		ret = -ENOMEM;
1276 		goto remove_hw;
1277 	}
1278 
1279 	/*all entry invall */
1280 	for (i = 0; i < DSAF_TCAM_SUM; i++)
1281 		(priv->soft_mac_tbl + i)->index = DSAF_INVALID_ENTRY_IDX;
1282 
1283 	return 0;
1284 
1285 remove_hw:
1286 	hns_dsaf_remove_hw(dsaf_dev);
1287 	return ret;
1288 }
1289 
1290 /**
1291  * hns_dsaf_free - free dsa fabric
1292  * @dsaf_dev: dsa fabric device struct pointer
1293  */
1294 static void hns_dsaf_free(struct dsaf_device *dsaf_dev)
1295 {
1296 	struct dsaf_drv_priv *priv =
1297 	    (struct dsaf_drv_priv *)hns_dsaf_dev_priv(dsaf_dev);
1298 
1299 	hns_dsaf_remove_hw(dsaf_dev);
1300 
1301 	/* free all mac mem */
1302 	vfree(priv->soft_mac_tbl);
1303 	priv->soft_mac_tbl = NULL;
1304 }
1305 
1306 /**
1307  * hns_dsaf_find_soft_mac_entry - find dsa fabric soft entry
1308  * @dsaf_dev: dsa fabric device struct pointer
1309  * @mac_key: mac entry struct pointer
1310  */
1311 static u16 hns_dsaf_find_soft_mac_entry(
1312 	struct dsaf_device *dsaf_dev,
1313 	struct dsaf_drv_tbl_tcam_key *mac_key)
1314 {
1315 	struct dsaf_drv_priv *priv =
1316 	    (struct dsaf_drv_priv *)hns_dsaf_dev_priv(dsaf_dev);
1317 	struct dsaf_drv_soft_mac_tbl *soft_mac_entry;
1318 	u32 i;
1319 
1320 	soft_mac_entry = priv->soft_mac_tbl;
1321 	for (i = 0; i < DSAF_TCAM_SUM; i++) {
1322 		/* invall tab entry */
1323 		if ((soft_mac_entry->index != DSAF_INVALID_ENTRY_IDX) &&
1324 		    (soft_mac_entry->tcam_key.high.val == mac_key->high.val) &&
1325 		    (soft_mac_entry->tcam_key.low.val == mac_key->low.val))
1326 			/* return find result --soft index */
1327 			return soft_mac_entry->index;
1328 
1329 		soft_mac_entry++;
1330 	}
1331 	return DSAF_INVALID_ENTRY_IDX;
1332 }
1333 
1334 /**
1335  * hns_dsaf_find_empty_mac_entry - search dsa fabric soft empty-entry
1336  * @dsaf_dev: dsa fabric device struct pointer
1337  */
1338 static u16 hns_dsaf_find_empty_mac_entry(struct dsaf_device *dsaf_dev)
1339 {
1340 	struct dsaf_drv_priv *priv =
1341 	    (struct dsaf_drv_priv *)hns_dsaf_dev_priv(dsaf_dev);
1342 	struct dsaf_drv_soft_mac_tbl *soft_mac_entry;
1343 	u32 i;
1344 
1345 	soft_mac_entry = priv->soft_mac_tbl;
1346 	for (i = 0; i < DSAF_TCAM_SUM; i++) {
1347 		/* inv all entry */
1348 		if (soft_mac_entry->index == DSAF_INVALID_ENTRY_IDX)
1349 			/* return find result --soft index */
1350 			return i;
1351 
1352 		soft_mac_entry++;
1353 	}
1354 	return DSAF_INVALID_ENTRY_IDX;
1355 }
1356 
1357 /**
1358  * hns_dsaf_set_mac_key - set mac key
1359  * @dsaf_dev: dsa fabric device struct pointer
1360  * @mac_key: tcam key pointer
1361  * @vlan_id: vlan id
1362  * @in_port_num: input port num
1363  * @addr: mac addr
1364  */
1365 static void hns_dsaf_set_mac_key(
1366 	struct dsaf_device *dsaf_dev,
1367 	struct dsaf_drv_tbl_tcam_key *mac_key, u16 vlan_id, u8 in_port_num,
1368 	u8 *addr)
1369 {
1370 	u8 port;
1371 
1372 	if (dsaf_dev->dsaf_mode <= DSAF_MODE_ENABLE)
1373 		/*DSAF mode : in port id fixed 0*/
1374 		port = 0;
1375 	else
1376 		/*non-dsaf mode*/
1377 		port = in_port_num;
1378 
1379 	mac_key->high.bits.mac_0 = addr[0];
1380 	mac_key->high.bits.mac_1 = addr[1];
1381 	mac_key->high.bits.mac_2 = addr[2];
1382 	mac_key->high.bits.mac_3 = addr[3];
1383 	mac_key->low.bits.mac_4 = addr[4];
1384 	mac_key->low.bits.mac_5 = addr[5];
1385 	mac_key->low.bits.vlan = vlan_id;
1386 	mac_key->low.bits.port = port;
1387 }
1388 
1389 /**
1390  * hns_dsaf_set_mac_uc_entry - set mac uc-entry
1391  * @dsaf_dev: dsa fabric device struct pointer
1392  * @mac_entry: uc-mac entry
1393  */
1394 int hns_dsaf_set_mac_uc_entry(
1395 	struct dsaf_device *dsaf_dev,
1396 	struct dsaf_drv_mac_single_dest_entry *mac_entry)
1397 {
1398 	u16 entry_index = DSAF_INVALID_ENTRY_IDX;
1399 	struct dsaf_drv_tbl_tcam_key mac_key;
1400 	struct dsaf_tbl_tcam_ucast_cfg mac_data;
1401 	struct dsaf_drv_priv *priv =
1402 	    (struct dsaf_drv_priv *)hns_dsaf_dev_priv(dsaf_dev);
1403 	struct dsaf_drv_soft_mac_tbl *soft_mac_entry = priv->soft_mac_tbl;
1404 
1405 	/* mac addr check */
1406 	if (MAC_IS_ALL_ZEROS(mac_entry->addr) ||
1407 	    MAC_IS_BROADCAST(mac_entry->addr) ||
1408 	    MAC_IS_MULTICAST(mac_entry->addr)) {
1409 		dev_err(dsaf_dev->dev, "set_uc %s Mac %pM err!\n",
1410 			dsaf_dev->ae_dev.name, mac_entry->addr);
1411 		return -EINVAL;
1412 	}
1413 
1414 	/* config key */
1415 	hns_dsaf_set_mac_key(dsaf_dev, &mac_key, mac_entry->in_vlan_id,
1416 			     mac_entry->in_port_num, mac_entry->addr);
1417 
1418 	/* entry ie exist? */
1419 	entry_index = hns_dsaf_find_soft_mac_entry(dsaf_dev, &mac_key);
1420 	if (entry_index == DSAF_INVALID_ENTRY_IDX) {
1421 		/*if has not inv entry,find a empty entry */
1422 		entry_index = hns_dsaf_find_empty_mac_entry(dsaf_dev);
1423 		if (entry_index == DSAF_INVALID_ENTRY_IDX) {
1424 			/* has not empty,return error */
1425 			dev_err(dsaf_dev->dev,
1426 				"set_uc_entry failed, %s Mac key(%#x:%#x)\n",
1427 				dsaf_dev->ae_dev.name,
1428 				mac_key.high.val, mac_key.low.val);
1429 			return -EINVAL;
1430 		}
1431 	}
1432 
1433 	dev_dbg(dsaf_dev->dev,
1434 		"set_uc_entry, %s Mac key(%#x:%#x) entry_index%d\n",
1435 		dsaf_dev->ae_dev.name, mac_key.high.val,
1436 		mac_key.low.val, entry_index);
1437 
1438 	/* config hardware entry */
1439 	mac_data.tbl_ucast_item_vld = 1;
1440 	mac_data.tbl_ucast_mac_discard = 0;
1441 	mac_data.tbl_ucast_old_en = 0;
1442 	/* default config dvc to 0 */
1443 	mac_data.tbl_ucast_dvc = 0;
1444 	mac_data.tbl_ucast_out_port = mac_entry->port_num;
1445 	hns_dsaf_tcam_uc_cfg(
1446 		dsaf_dev, entry_index,
1447 		(struct dsaf_tbl_tcam_data *)(&mac_key), &mac_data);
1448 
1449 	/* config software entry */
1450 	soft_mac_entry += entry_index;
1451 	soft_mac_entry->index = entry_index;
1452 	soft_mac_entry->tcam_key.high.val = mac_key.high.val;
1453 	soft_mac_entry->tcam_key.low.val = mac_key.low.val;
1454 
1455 	return 0;
1456 }
1457 
1458 /**
1459  * hns_dsaf_set_mac_mc_entry - set mac mc-entry
1460  * @dsaf_dev: dsa fabric device struct pointer
1461  * @mac_entry: mc-mac entry
1462  */
1463 int hns_dsaf_set_mac_mc_entry(
1464 	struct dsaf_device *dsaf_dev,
1465 	struct dsaf_drv_mac_multi_dest_entry *mac_entry)
1466 {
1467 	u16 entry_index = DSAF_INVALID_ENTRY_IDX;
1468 	struct dsaf_drv_tbl_tcam_key mac_key;
1469 	struct dsaf_tbl_tcam_mcast_cfg mac_data;
1470 	struct dsaf_drv_priv *priv =
1471 	    (struct dsaf_drv_priv *)hns_dsaf_dev_priv(dsaf_dev);
1472 	struct dsaf_drv_soft_mac_tbl *soft_mac_entry = priv->soft_mac_tbl;
1473 	struct dsaf_drv_tbl_tcam_key tmp_mac_key;
1474 
1475 	/* mac addr check */
1476 	if (MAC_IS_ALL_ZEROS(mac_entry->addr)) {
1477 		dev_err(dsaf_dev->dev, "set uc %s Mac %pM err!\n",
1478 			dsaf_dev->ae_dev.name, mac_entry->addr);
1479 		return -EINVAL;
1480 	}
1481 
1482 	/*config key */
1483 	hns_dsaf_set_mac_key(dsaf_dev, &mac_key,
1484 			     mac_entry->in_vlan_id,
1485 			     mac_entry->in_port_num, mac_entry->addr);
1486 
1487 	/* entry ie exist? */
1488 	entry_index = hns_dsaf_find_soft_mac_entry(dsaf_dev, &mac_key);
1489 	if (entry_index == DSAF_INVALID_ENTRY_IDX) {
1490 		/*if hasnot, find enpty entry*/
1491 		entry_index = hns_dsaf_find_empty_mac_entry(dsaf_dev);
1492 		if (entry_index == DSAF_INVALID_ENTRY_IDX) {
1493 			/*if hasnot empty, error*/
1494 			dev_err(dsaf_dev->dev,
1495 				"set_uc_entry failed, %s Mac key(%#x:%#x)\n",
1496 				dsaf_dev->ae_dev.name,
1497 				mac_key.high.val, mac_key.low.val);
1498 			return -EINVAL;
1499 		}
1500 
1501 		/* config hardware entry */
1502 		memset(mac_data.tbl_mcast_port_msk,
1503 		       0, sizeof(mac_data.tbl_mcast_port_msk));
1504 	} else {
1505 		/* config hardware entry */
1506 		hns_dsaf_tcam_mc_get(
1507 			dsaf_dev, entry_index,
1508 			(struct dsaf_tbl_tcam_data *)(&tmp_mac_key), &mac_data);
1509 	}
1510 	mac_data.tbl_mcast_old_en = 0;
1511 	mac_data.tbl_mcast_item_vld = 1;
1512 	dsaf_set_field(mac_data.tbl_mcast_port_msk[0],
1513 		       0x3F, 0, mac_entry->port_mask[0]);
1514 
1515 	dev_dbg(dsaf_dev->dev,
1516 		"set_uc_entry, %s key(%#x:%#x) entry_index%d\n",
1517 		dsaf_dev->ae_dev.name, mac_key.high.val,
1518 		mac_key.low.val, entry_index);
1519 
1520 	hns_dsaf_tcam_mc_cfg(
1521 		dsaf_dev, entry_index,
1522 		(struct dsaf_tbl_tcam_data *)(&mac_key), &mac_data);
1523 
1524 	/* config software entry */
1525 	soft_mac_entry += entry_index;
1526 	soft_mac_entry->index = entry_index;
1527 	soft_mac_entry->tcam_key.high.val = mac_key.high.val;
1528 	soft_mac_entry->tcam_key.low.val = mac_key.low.val;
1529 
1530 	return 0;
1531 }
1532 
1533 /**
1534  * hns_dsaf_add_mac_mc_port - add mac mc-port
1535  * @dsaf_dev: dsa fabric device struct pointer
1536  * @mac_entry: mc-mac entry
1537  */
1538 int hns_dsaf_add_mac_mc_port(struct dsaf_device *dsaf_dev,
1539 			     struct dsaf_drv_mac_single_dest_entry *mac_entry)
1540 {
1541 	u16 entry_index = DSAF_INVALID_ENTRY_IDX;
1542 	struct dsaf_drv_tbl_tcam_key mac_key;
1543 	struct dsaf_tbl_tcam_mcast_cfg mac_data;
1544 	struct dsaf_drv_priv *priv =
1545 	    (struct dsaf_drv_priv *)hns_dsaf_dev_priv(dsaf_dev);
1546 	struct dsaf_drv_soft_mac_tbl *soft_mac_entry = priv->soft_mac_tbl;
1547 	struct dsaf_drv_tbl_tcam_key tmp_mac_key;
1548 	int mskid;
1549 
1550 	/*chechk mac addr */
1551 	if (MAC_IS_ALL_ZEROS(mac_entry->addr)) {
1552 		dev_err(dsaf_dev->dev, "set_entry failed,addr %pM!\n",
1553 			mac_entry->addr);
1554 		return -EINVAL;
1555 	}
1556 
1557 	/*config key */
1558 	hns_dsaf_set_mac_key(
1559 		dsaf_dev, &mac_key, mac_entry->in_vlan_id,
1560 		mac_entry->in_port_num, mac_entry->addr);
1561 
1562 	memset(&mac_data, 0, sizeof(struct dsaf_tbl_tcam_mcast_cfg));
1563 
1564 	/*check exist? */
1565 	entry_index = hns_dsaf_find_soft_mac_entry(dsaf_dev, &mac_key);
1566 	if (entry_index == DSAF_INVALID_ENTRY_IDX) {
1567 		/*if hasnot , find a empty*/
1568 		entry_index = hns_dsaf_find_empty_mac_entry(dsaf_dev);
1569 		if (entry_index == DSAF_INVALID_ENTRY_IDX) {
1570 			/*if hasnot empty, error*/
1571 			dev_err(dsaf_dev->dev,
1572 				"set_uc_entry failed, %s Mac key(%#x:%#x)\n",
1573 				dsaf_dev->ae_dev.name, mac_key.high.val,
1574 				mac_key.low.val);
1575 			return -EINVAL;
1576 		}
1577 	} else {
1578 		/*if exist, add in */
1579 		hns_dsaf_tcam_mc_get(
1580 			dsaf_dev, entry_index,
1581 			(struct dsaf_tbl_tcam_data *)(&tmp_mac_key), &mac_data);
1582 	}
1583 	/* config hardware entry */
1584 	if (mac_entry->port_num < DSAF_SERVICE_NW_NUM) {
1585 		mskid = mac_entry->port_num;
1586 	} else if (mac_entry->port_num >= DSAF_BASE_INNER_PORT_NUM) {
1587 		mskid = mac_entry->port_num -
1588 			DSAF_BASE_INNER_PORT_NUM + DSAF_SERVICE_NW_NUM;
1589 	} else {
1590 		dev_err(dsaf_dev->dev,
1591 			"%s,pnum(%d)error,key(%#x:%#x)\n",
1592 			dsaf_dev->ae_dev.name, mac_entry->port_num,
1593 			mac_key.high.val, mac_key.low.val);
1594 		return -EINVAL;
1595 	}
1596 	dsaf_set_bit(mac_data.tbl_mcast_port_msk[mskid / 32], mskid % 32, 1);
1597 	mac_data.tbl_mcast_old_en = 0;
1598 	mac_data.tbl_mcast_item_vld = 1;
1599 
1600 	dev_dbg(dsaf_dev->dev,
1601 		"set_uc_entry, %s Mac key(%#x:%#x) entry_index%d\n",
1602 		dsaf_dev->ae_dev.name, mac_key.high.val,
1603 		mac_key.low.val, entry_index);
1604 
1605 	hns_dsaf_tcam_mc_cfg(
1606 		dsaf_dev, entry_index,
1607 		(struct dsaf_tbl_tcam_data *)(&mac_key), &mac_data);
1608 
1609 	/*config software entry */
1610 	soft_mac_entry += entry_index;
1611 	soft_mac_entry->index = entry_index;
1612 	soft_mac_entry->tcam_key.high.val = mac_key.high.val;
1613 	soft_mac_entry->tcam_key.low.val = mac_key.low.val;
1614 
1615 	return 0;
1616 }
1617 
1618 /**
1619  * hns_dsaf_del_mac_entry - del mac mc-port
1620  * @dsaf_dev: dsa fabric device struct pointer
1621  * @vlan_id: vlian id
1622  * @in_port_num: input port num
1623  * @addr : mac addr
1624  */
1625 int hns_dsaf_del_mac_entry(struct dsaf_device *dsaf_dev, u16 vlan_id,
1626 			   u8 in_port_num, u8 *addr)
1627 {
1628 	u16 entry_index = DSAF_INVALID_ENTRY_IDX;
1629 	struct dsaf_drv_tbl_tcam_key mac_key;
1630 	struct dsaf_drv_priv *priv =
1631 	    (struct dsaf_drv_priv *)hns_dsaf_dev_priv(dsaf_dev);
1632 	struct dsaf_drv_soft_mac_tbl *soft_mac_entry = priv->soft_mac_tbl;
1633 
1634 	/*check mac addr */
1635 	if (MAC_IS_ALL_ZEROS(addr) || MAC_IS_BROADCAST(addr)) {
1636 		dev_err(dsaf_dev->dev, "del_entry failed,addr %pM!\n",
1637 			addr);
1638 		return -EINVAL;
1639 	}
1640 
1641 	/*config key */
1642 	hns_dsaf_set_mac_key(dsaf_dev, &mac_key, vlan_id, in_port_num, addr);
1643 
1644 	/*exist ?*/
1645 	entry_index = hns_dsaf_find_soft_mac_entry(dsaf_dev, &mac_key);
1646 	if (entry_index == DSAF_INVALID_ENTRY_IDX) {
1647 		/*not exist, error */
1648 		dev_err(dsaf_dev->dev,
1649 			"del_mac_entry failed, %s Mac key(%#x:%#x)\n",
1650 			dsaf_dev->ae_dev.name,
1651 			mac_key.high.val, mac_key.low.val);
1652 		return -EINVAL;
1653 	}
1654 	dev_dbg(dsaf_dev->dev,
1655 		"del_mac_entry, %s Mac key(%#x:%#x) entry_index%d\n",
1656 		dsaf_dev->ae_dev.name, mac_key.high.val,
1657 		mac_key.low.val, entry_index);
1658 
1659 	/*do del opt*/
1660 	hns_dsaf_tcam_mc_invld(dsaf_dev, entry_index);
1661 
1662 	/*del soft emtry */
1663 	soft_mac_entry += entry_index;
1664 	soft_mac_entry->index = DSAF_INVALID_ENTRY_IDX;
1665 
1666 	return 0;
1667 }
1668 
1669 /**
1670  * hns_dsaf_del_mac_mc_port - del mac mc- port
1671  * @dsaf_dev: dsa fabric device struct pointer
1672  * @mac_entry: mac entry
1673  */
1674 int hns_dsaf_del_mac_mc_port(struct dsaf_device *dsaf_dev,
1675 			     struct dsaf_drv_mac_single_dest_entry *mac_entry)
1676 {
1677 	u16 entry_index = DSAF_INVALID_ENTRY_IDX;
1678 	struct dsaf_drv_tbl_tcam_key mac_key;
1679 	struct dsaf_drv_priv *priv =
1680 	    (struct dsaf_drv_priv *)hns_dsaf_dev_priv(dsaf_dev);
1681 	struct dsaf_drv_soft_mac_tbl *soft_mac_entry = priv->soft_mac_tbl;
1682 	u16 vlan_id;
1683 	u8 in_port_num;
1684 	struct dsaf_tbl_tcam_mcast_cfg mac_data;
1685 	struct dsaf_drv_tbl_tcam_key tmp_mac_key;
1686 	int mskid;
1687 	const u8 empty_msk[sizeof(mac_data.tbl_mcast_port_msk)] = {0};
1688 
1689 	if (!(void *)mac_entry) {
1690 		dev_err(dsaf_dev->dev,
1691 			"hns_dsaf_del_mac_mc_port mac_entry is NULL\n");
1692 		return -EINVAL;
1693 	}
1694 
1695 	/*get key info*/
1696 	vlan_id = mac_entry->in_vlan_id;
1697 	in_port_num = mac_entry->in_port_num;
1698 
1699 	/*check mac addr */
1700 	if (MAC_IS_ALL_ZEROS(mac_entry->addr)) {
1701 		dev_err(dsaf_dev->dev, "del_port failed, addr %pM!\n",
1702 			mac_entry->addr);
1703 		return -EINVAL;
1704 	}
1705 
1706 	/*config key */
1707 	hns_dsaf_set_mac_key(dsaf_dev, &mac_key, vlan_id, in_port_num,
1708 			     mac_entry->addr);
1709 
1710 	/*check is exist? */
1711 	entry_index = hns_dsaf_find_soft_mac_entry(dsaf_dev, &mac_key);
1712 	if (entry_index == DSAF_INVALID_ENTRY_IDX) {
1713 		/*find none */
1714 		dev_err(dsaf_dev->dev,
1715 			"find_soft_mac_entry failed, %s Mac key(%#x:%#x)\n",
1716 			dsaf_dev->ae_dev.name,
1717 			mac_key.high.val, mac_key.low.val);
1718 		return -EINVAL;
1719 	}
1720 
1721 	dev_dbg(dsaf_dev->dev,
1722 		"del_mac_mc_port, %s key(%#x:%#x) index%d\n",
1723 		dsaf_dev->ae_dev.name, mac_key.high.val,
1724 		mac_key.low.val, entry_index);
1725 
1726 	/*read entry*/
1727 	hns_dsaf_tcam_mc_get(
1728 		dsaf_dev, entry_index,
1729 		(struct dsaf_tbl_tcam_data *)(&tmp_mac_key), &mac_data);
1730 
1731 	/*del the port*/
1732 	if (mac_entry->port_num < DSAF_SERVICE_NW_NUM) {
1733 		mskid = mac_entry->port_num;
1734 	} else if (mac_entry->port_num >= DSAF_BASE_INNER_PORT_NUM) {
1735 		mskid = mac_entry->port_num -
1736 			DSAF_BASE_INNER_PORT_NUM + DSAF_SERVICE_NW_NUM;
1737 	} else {
1738 		dev_err(dsaf_dev->dev,
1739 			"%s,pnum(%d)error,key(%#x:%#x)\n",
1740 			dsaf_dev->ae_dev.name, mac_entry->port_num,
1741 			mac_key.high.val, mac_key.low.val);
1742 		return -EINVAL;
1743 	}
1744 	dsaf_set_bit(mac_data.tbl_mcast_port_msk[mskid / 32], mskid % 32, 0);
1745 
1746 	/*check non port, do del entry */
1747 	if (!memcmp(mac_data.tbl_mcast_port_msk, empty_msk,
1748 		    sizeof(mac_data.tbl_mcast_port_msk))) {
1749 		hns_dsaf_tcam_mc_invld(dsaf_dev, entry_index);
1750 
1751 		/* del soft entry */
1752 		soft_mac_entry += entry_index;
1753 		soft_mac_entry->index = DSAF_INVALID_ENTRY_IDX;
1754 	} else { /* not zer, just del port, updata*/
1755 		hns_dsaf_tcam_mc_cfg(
1756 			dsaf_dev, entry_index,
1757 			(struct dsaf_tbl_tcam_data *)(&mac_key), &mac_data);
1758 	}
1759 
1760 	return 0;
1761 }
1762 
1763 /**
1764  * hns_dsaf_get_mac_uc_entry - get mac uc entry
1765  * @dsaf_dev: dsa fabric device struct pointer
1766  * @mac_entry: mac entry
1767  */
1768 int hns_dsaf_get_mac_uc_entry(struct dsaf_device *dsaf_dev,
1769 			      struct dsaf_drv_mac_single_dest_entry *mac_entry)
1770 {
1771 	u16 entry_index = DSAF_INVALID_ENTRY_IDX;
1772 	struct dsaf_drv_tbl_tcam_key mac_key;
1773 
1774 	struct dsaf_tbl_tcam_ucast_cfg mac_data;
1775 
1776 	/* check macaddr */
1777 	if (MAC_IS_ALL_ZEROS(mac_entry->addr) ||
1778 	    MAC_IS_BROADCAST(mac_entry->addr)) {
1779 		dev_err(dsaf_dev->dev, "get_entry failed,addr %pM\n",
1780 			mac_entry->addr);
1781 		return -EINVAL;
1782 	}
1783 
1784 	/*config key */
1785 	hns_dsaf_set_mac_key(dsaf_dev, &mac_key, mac_entry->in_vlan_id,
1786 			     mac_entry->in_port_num, mac_entry->addr);
1787 
1788 	/*check exist? */
1789 	entry_index = hns_dsaf_find_soft_mac_entry(dsaf_dev, &mac_key);
1790 	if (entry_index == DSAF_INVALID_ENTRY_IDX) {
1791 		/*find none, error */
1792 		dev_err(dsaf_dev->dev,
1793 			"get_uc_entry failed, %s Mac key(%#x:%#x)\n",
1794 			dsaf_dev->ae_dev.name,
1795 			mac_key.high.val, mac_key.low.val);
1796 		return -EINVAL;
1797 	}
1798 	dev_dbg(dsaf_dev->dev,
1799 		"get_uc_entry, %s Mac key(%#x:%#x) entry_index%d\n",
1800 		dsaf_dev->ae_dev.name, mac_key.high.val,
1801 		mac_key.low.val, entry_index);
1802 
1803 	/*read entry*/
1804 	hns_dsaf_tcam_uc_get(dsaf_dev, entry_index,
1805 			     (struct dsaf_tbl_tcam_data *)&mac_key, &mac_data);
1806 	mac_entry->port_num = mac_data.tbl_ucast_out_port;
1807 
1808 	return 0;
1809 }
1810 
1811 /**
1812  * hns_dsaf_get_mac_mc_entry - get mac mc entry
1813  * @dsaf_dev: dsa fabric device struct pointer
1814  * @mac_entry: mac entry
1815  */
1816 int hns_dsaf_get_mac_mc_entry(struct dsaf_device *dsaf_dev,
1817 			      struct dsaf_drv_mac_multi_dest_entry *mac_entry)
1818 {
1819 	u16 entry_index = DSAF_INVALID_ENTRY_IDX;
1820 	struct dsaf_drv_tbl_tcam_key mac_key;
1821 
1822 	struct dsaf_tbl_tcam_mcast_cfg mac_data;
1823 
1824 	/*check mac addr */
1825 	if (MAC_IS_ALL_ZEROS(mac_entry->addr) ||
1826 	    MAC_IS_BROADCAST(mac_entry->addr)) {
1827 		dev_err(dsaf_dev->dev, "get_entry failed,addr %pM\n",
1828 			mac_entry->addr);
1829 		return -EINVAL;
1830 	}
1831 
1832 	/*config key */
1833 	hns_dsaf_set_mac_key(dsaf_dev, &mac_key, mac_entry->in_vlan_id,
1834 			     mac_entry->in_port_num, mac_entry->addr);
1835 
1836 	/*check exist? */
1837 	entry_index = hns_dsaf_find_soft_mac_entry(dsaf_dev, &mac_key);
1838 	if (entry_index == DSAF_INVALID_ENTRY_IDX) {
1839 		/* find none, error */
1840 		dev_err(dsaf_dev->dev,
1841 			"get_mac_uc_entry failed, %s Mac key(%#x:%#x)\n",
1842 			dsaf_dev->ae_dev.name, mac_key.high.val,
1843 			mac_key.low.val);
1844 		return -EINVAL;
1845 	}
1846 	dev_dbg(dsaf_dev->dev,
1847 		"get_mac_uc_entry, %s Mac key(%#x:%#x) entry_index%d\n",
1848 		dsaf_dev->ae_dev.name, mac_key.high.val,
1849 		mac_key.low.val, entry_index);
1850 
1851 	/*read entry */
1852 	hns_dsaf_tcam_mc_get(dsaf_dev, entry_index,
1853 			     (struct dsaf_tbl_tcam_data *)&mac_key, &mac_data);
1854 
1855 	mac_entry->port_mask[0] = mac_data.tbl_mcast_port_msk[0] & 0x3F;
1856 	return 0;
1857 }
1858 
1859 /**
1860  * hns_dsaf_get_mac_entry_by_index - get mac entry by tab index
1861  * @dsaf_dev: dsa fabric device struct pointer
1862  * @entry_index: tab entry index
1863  * @mac_entry: mac entry
1864  */
1865 int hns_dsaf_get_mac_entry_by_index(
1866 	struct dsaf_device *dsaf_dev,
1867 	u16 entry_index, struct dsaf_drv_mac_multi_dest_entry *mac_entry)
1868 {
1869 	struct dsaf_drv_tbl_tcam_key mac_key;
1870 
1871 	struct dsaf_tbl_tcam_mcast_cfg mac_data;
1872 	struct dsaf_tbl_tcam_ucast_cfg mac_uc_data;
1873 	char mac_addr[MAC_NUM_OCTETS_PER_ADDR] = {0};
1874 
1875 	if (entry_index >= DSAF_TCAM_SUM) {
1876 		/* find none, del error */
1877 		dev_err(dsaf_dev->dev, "get_uc_entry failed, %s\n",
1878 			dsaf_dev->ae_dev.name);
1879 		return -EINVAL;
1880 	}
1881 
1882 	/* mc entry, do read opt */
1883 	hns_dsaf_tcam_mc_get(dsaf_dev, entry_index,
1884 			     (struct dsaf_tbl_tcam_data *)&mac_key, &mac_data);
1885 
1886 	mac_entry->port_mask[0] = mac_data.tbl_mcast_port_msk[0] & 0x3F;
1887 
1888 	/***get mac addr*/
1889 	mac_addr[0] = mac_key.high.bits.mac_0;
1890 	mac_addr[1] = mac_key.high.bits.mac_1;
1891 	mac_addr[2] = mac_key.high.bits.mac_2;
1892 	mac_addr[3] = mac_key.high.bits.mac_3;
1893 	mac_addr[4] = mac_key.low.bits.mac_4;
1894 	mac_addr[5] = mac_key.low.bits.mac_5;
1895 	/**is mc or uc*/
1896 	if (MAC_IS_MULTICAST((u8 *)mac_addr) ||
1897 	    MAC_IS_L3_MULTICAST((u8 *)mac_addr)) {
1898 		/**mc donot do*/
1899 	} else {
1900 		/*is not mc, just uc... */
1901 		hns_dsaf_tcam_uc_get(dsaf_dev, entry_index,
1902 				     (struct dsaf_tbl_tcam_data *)&mac_key,
1903 				     &mac_uc_data);
1904 		mac_entry->port_mask[0] = (1 << mac_uc_data.tbl_ucast_out_port);
1905 	}
1906 
1907 	return 0;
1908 }
1909 
1910 static struct dsaf_device *hns_dsaf_alloc_dev(struct device *dev,
1911 					      size_t sizeof_priv)
1912 {
1913 	struct dsaf_device *dsaf_dev;
1914 
1915 	dsaf_dev = devm_kzalloc(dev,
1916 				sizeof(*dsaf_dev) + sizeof_priv, GFP_KERNEL);
1917 	if (unlikely(!dsaf_dev)) {
1918 		dsaf_dev = ERR_PTR(-ENOMEM);
1919 	} else {
1920 		dsaf_dev->dev = dev;
1921 		dev_set_drvdata(dev, dsaf_dev);
1922 	}
1923 
1924 	return dsaf_dev;
1925 }
1926 
1927 /**
1928  * hns_dsaf_free_dev - free dev mem
1929  * @dev: struct device pointer
1930  */
1931 static void hns_dsaf_free_dev(struct dsaf_device *dsaf_dev)
1932 {
1933 	(void)dev_set_drvdata(dsaf_dev->dev, NULL);
1934 }
1935 
1936 /**
1937  * dsaf_pfc_unit_cnt - set pfc unit count
1938  * @dsaf_id: dsa fabric id
1939  * @pport_rate:  value array
1940  * @pdsaf_pfc_unit_cnt:  value array
1941  */
1942 static void hns_dsaf_pfc_unit_cnt(struct dsaf_device *dsaf_dev, int  mac_id,
1943 				  enum dsaf_port_rate_mode rate)
1944 {
1945 	u32 unit_cnt;
1946 
1947 	switch (rate) {
1948 	case DSAF_PORT_RATE_10000:
1949 		unit_cnt = HNS_DSAF_PFC_UNIT_CNT_FOR_XGE;
1950 		break;
1951 	case DSAF_PORT_RATE_1000:
1952 		unit_cnt = HNS_DSAF_PFC_UNIT_CNT_FOR_GE_1000;
1953 		break;
1954 	case DSAF_PORT_RATE_2500:
1955 		unit_cnt = HNS_DSAF_PFC_UNIT_CNT_FOR_GE_1000;
1956 		break;
1957 	default:
1958 		unit_cnt = HNS_DSAF_PFC_UNIT_CNT_FOR_XGE;
1959 	}
1960 
1961 	dsaf_set_dev_field(dsaf_dev,
1962 			   (DSAF_PFC_UNIT_CNT_0_REG + 0x4 * (u64)mac_id),
1963 			   DSAF_PFC_UNINT_CNT_M, DSAF_PFC_UNINT_CNT_S,
1964 			   unit_cnt);
1965 }
1966 
1967 /**
1968  * dsaf_port_work_rate_cfg - fifo
1969  * @dsaf_id: dsa fabric id
1970  * @xge_ge_work_mode
1971  */
1972 void hns_dsaf_port_work_rate_cfg(struct dsaf_device *dsaf_dev, int mac_id,
1973 				 enum dsaf_port_rate_mode rate_mode)
1974 {
1975 	u32 port_work_mode;
1976 
1977 	port_work_mode = dsaf_read_dev(
1978 		dsaf_dev, DSAF_XGE_GE_WORK_MODE_0_REG + 0x4 * (u64)mac_id);
1979 
1980 	if (rate_mode == DSAF_PORT_RATE_10000)
1981 		dsaf_set_bit(port_work_mode, DSAF_XGE_GE_WORK_MODE_S, 1);
1982 	else
1983 		dsaf_set_bit(port_work_mode, DSAF_XGE_GE_WORK_MODE_S, 0);
1984 
1985 	dsaf_write_dev(dsaf_dev,
1986 		       DSAF_XGE_GE_WORK_MODE_0_REG + 0x4 * (u64)mac_id,
1987 		       port_work_mode);
1988 
1989 	hns_dsaf_pfc_unit_cnt(dsaf_dev, mac_id, rate_mode);
1990 }
1991 
1992 /**
1993  * hns_dsaf_fix_mac_mode - dsaf modify mac mode
1994  * @mac_cb: mac contrl block
1995  */
1996 void hns_dsaf_fix_mac_mode(struct hns_mac_cb *mac_cb)
1997 {
1998 	enum dsaf_port_rate_mode mode;
1999 	struct dsaf_device *dsaf_dev = mac_cb->dsaf_dev;
2000 	int mac_id = mac_cb->mac_id;
2001 
2002 	if (mac_cb->mac_type != HNAE_PORT_SERVICE)
2003 		return;
2004 	if (mac_cb->phy_if == PHY_INTERFACE_MODE_XGMII)
2005 		mode = DSAF_PORT_RATE_10000;
2006 	else
2007 		mode = DSAF_PORT_RATE_1000;
2008 
2009 	hns_dsaf_port_work_rate_cfg(dsaf_dev, mac_id, mode);
2010 }
2011 
2012 void hns_dsaf_update_stats(struct dsaf_device *dsaf_dev, u32 node_num)
2013 {
2014 	struct dsaf_hw_stats *hw_stats
2015 		= &dsaf_dev->hw_stats[node_num];
2016 
2017 	hw_stats->pad_drop += dsaf_read_dev(dsaf_dev,
2018 		DSAF_INODE_PAD_DISCARD_NUM_0_REG + 0x80 * (u64)node_num);
2019 	hw_stats->man_pkts += dsaf_read_dev(dsaf_dev,
2020 		DSAF_INODE_FINAL_IN_MAN_NUM_0_REG + 0x80 * (u64)node_num);
2021 	hw_stats->rx_pkts += dsaf_read_dev(dsaf_dev,
2022 		DSAF_INODE_FINAL_IN_PKT_NUM_0_REG + 0x80 * (u64)node_num);
2023 	hw_stats->rx_pkt_id += dsaf_read_dev(dsaf_dev,
2024 		DSAF_INODE_SBM_PID_NUM_0_REG + 0x80 * (u64)node_num);
2025 	hw_stats->rx_pause_frame += dsaf_read_dev(dsaf_dev,
2026 		DSAF_INODE_FINAL_IN_PAUSE_NUM_0_REG + 0x80 * (u64)node_num);
2027 	hw_stats->release_buf_num += dsaf_read_dev(dsaf_dev,
2028 		DSAF_INODE_SBM_RELS_NUM_0_REG + 0x80 * (u64)node_num);
2029 	hw_stats->sbm_drop += dsaf_read_dev(dsaf_dev,
2030 		DSAF_INODE_SBM_DROP_NUM_0_REG + 0x80 * (u64)node_num);
2031 	hw_stats->crc_false += dsaf_read_dev(dsaf_dev,
2032 		DSAF_INODE_CRC_FALSE_NUM_0_REG + 0x80 * (u64)node_num);
2033 	hw_stats->bp_drop += dsaf_read_dev(dsaf_dev,
2034 		DSAF_INODE_BP_DISCARD_NUM_0_REG + 0x80 * (u64)node_num);
2035 	hw_stats->rslt_drop += dsaf_read_dev(dsaf_dev,
2036 		DSAF_INODE_RSLT_DISCARD_NUM_0_REG + 0x80 * (u64)node_num);
2037 	hw_stats->local_addr_false += dsaf_read_dev(dsaf_dev,
2038 		DSAF_INODE_LOCAL_ADDR_FALSE_NUM_0_REG + 0x80 * (u64)node_num);
2039 
2040 	hw_stats->vlan_drop += dsaf_read_dev(dsaf_dev,
2041 		DSAF_INODE_SW_VLAN_TAG_DISC_0_REG + 0x80 * (u64)node_num);
2042 	hw_stats->stp_drop += dsaf_read_dev(dsaf_dev,
2043 		DSAF_INODE_IN_DATA_STP_DISC_0_REG + 0x80 * (u64)node_num);
2044 
2045 	hw_stats->tx_pkts += dsaf_read_dev(dsaf_dev,
2046 		DSAF_XOD_RCVPKT_CNT_0_REG + 0x90 * (u64)node_num);
2047 }
2048 
2049 /**
2050  *hns_dsaf_get_regs - dump dsaf regs
2051  *@dsaf_dev: dsaf device
2052  *@data:data for value of regs
2053  */
2054 void hns_dsaf_get_regs(struct dsaf_device *ddev, u32 port, void *data)
2055 {
2056 	u32 i = 0;
2057 	u32 j;
2058 	u32 *p = data;
2059 
2060 	/* dsaf common registers */
2061 	p[0] = dsaf_read_dev(ddev, DSAF_SRAM_INIT_OVER_0_REG);
2062 	p[1] = dsaf_read_dev(ddev, DSAF_CFG_0_REG);
2063 	p[2] = dsaf_read_dev(ddev, DSAF_ECC_ERR_INVERT_0_REG);
2064 	p[3] = dsaf_read_dev(ddev, DSAF_ABNORMAL_TIMEOUT_0_REG);
2065 	p[4] = dsaf_read_dev(ddev, DSAF_FSM_TIMEOUT_0_REG);
2066 	p[5] = dsaf_read_dev(ddev, DSAF_DSA_REG_CNT_CLR_CE_REG);
2067 	p[6] = dsaf_read_dev(ddev, DSAF_DSA_SBM_INF_FIFO_THRD_REG);
2068 	p[7] = dsaf_read_dev(ddev, DSAF_DSA_SRAM_1BIT_ECC_SEL_REG);
2069 	p[8] = dsaf_read_dev(ddev, DSAF_DSA_SRAM_1BIT_ECC_CNT_REG);
2070 
2071 	p[9] = dsaf_read_dev(ddev, DSAF_PFC_EN_0_REG + port * 4);
2072 	p[10] = dsaf_read_dev(ddev, DSAF_PFC_UNIT_CNT_0_REG + port * 4);
2073 	p[11] = dsaf_read_dev(ddev, DSAF_XGE_INT_MSK_0_REG + port * 4);
2074 	p[12] = dsaf_read_dev(ddev, DSAF_XGE_INT_SRC_0_REG + port * 4);
2075 	p[13] = dsaf_read_dev(ddev, DSAF_XGE_INT_STS_0_REG + port * 4);
2076 	p[14] = dsaf_read_dev(ddev, DSAF_XGE_INT_MSK_0_REG + port * 4);
2077 	p[15] = dsaf_read_dev(ddev, DSAF_PPE_INT_MSK_0_REG + port * 4);
2078 	p[16] = dsaf_read_dev(ddev, DSAF_ROCEE_INT_MSK_0_REG + port * 4);
2079 	p[17] = dsaf_read_dev(ddev, DSAF_XGE_INT_SRC_0_REG + port * 4);
2080 	p[18] = dsaf_read_dev(ddev, DSAF_PPE_INT_SRC_0_REG + port * 4);
2081 	p[19] =  dsaf_read_dev(ddev, DSAF_ROCEE_INT_SRC_0_REG + port * 4);
2082 	p[20] = dsaf_read_dev(ddev, DSAF_XGE_INT_STS_0_REG + port * 4);
2083 	p[21] = dsaf_read_dev(ddev, DSAF_PPE_INT_STS_0_REG + port * 4);
2084 	p[22] = dsaf_read_dev(ddev, DSAF_ROCEE_INT_STS_0_REG + port * 4);
2085 	p[23] = dsaf_read_dev(ddev, DSAF_PPE_QID_CFG_0_REG + port * 4);
2086 
2087 	for (i = 0; i < DSAF_SW_PORT_NUM; i++)
2088 		p[24 + i] = dsaf_read_dev(ddev,
2089 				DSAF_SW_PORT_TYPE_0_REG + i * 4);
2090 
2091 	p[32] = dsaf_read_dev(ddev, DSAF_MIX_DEF_QID_0_REG + port * 4);
2092 
2093 	for (i = 0; i < DSAF_SW_PORT_NUM; i++)
2094 		p[33 + i] = dsaf_read_dev(ddev,
2095 				DSAF_PORT_DEF_VLAN_0_REG + i * 4);
2096 
2097 	for (i = 0; i < DSAF_TOTAL_QUEUE_NUM; i++)
2098 		p[41 + i] = dsaf_read_dev(ddev,
2099 				DSAF_VM_DEF_VLAN_0_REG + i * 4);
2100 
2101 	/* dsaf inode registers */
2102 	p[170] = dsaf_read_dev(ddev, DSAF_INODE_CUT_THROUGH_CFG_0_REG);
2103 
2104 	p[171] = dsaf_read_dev(ddev,
2105 			DSAF_INODE_ECC_ERR_ADDR_0_REG + port * 0x80);
2106 
2107 	for (i = 0; i < DSAF_INODE_NUM / DSAF_COMM_CHN; i++) {
2108 		j = i * DSAF_COMM_CHN + port;
2109 		p[172 + i] = dsaf_read_dev(ddev,
2110 				DSAF_INODE_IN_PORT_NUM_0_REG + j * 0x80);
2111 		p[175 + i] = dsaf_read_dev(ddev,
2112 				DSAF_INODE_PRI_TC_CFG_0_REG + j * 0x80);
2113 		p[178 + i] = dsaf_read_dev(ddev,
2114 				DSAF_INODE_BP_STATUS_0_REG + j * 0x80);
2115 		p[181 + i] = dsaf_read_dev(ddev,
2116 				DSAF_INODE_PAD_DISCARD_NUM_0_REG + j * 0x80);
2117 		p[184 + i] = dsaf_read_dev(ddev,
2118 				DSAF_INODE_FINAL_IN_MAN_NUM_0_REG + j * 0x80);
2119 		p[187 + i] = dsaf_read_dev(ddev,
2120 				DSAF_INODE_FINAL_IN_PKT_NUM_0_REG + j * 0x80);
2121 		p[190 + i] = dsaf_read_dev(ddev,
2122 				DSAF_INODE_SBM_PID_NUM_0_REG + j * 0x80);
2123 		p[193 + i] = dsaf_read_dev(ddev,
2124 				DSAF_INODE_FINAL_IN_PAUSE_NUM_0_REG + j * 0x80);
2125 		p[196 + i] = dsaf_read_dev(ddev,
2126 				DSAF_INODE_SBM_RELS_NUM_0_REG + j * 0x80);
2127 		p[199 + i] = dsaf_read_dev(ddev,
2128 				DSAF_INODE_SBM_DROP_NUM_0_REG + j * 0x80);
2129 		p[202 + i] = dsaf_read_dev(ddev,
2130 				DSAF_INODE_CRC_FALSE_NUM_0_REG + j * 0x80);
2131 		p[205 + i] = dsaf_read_dev(ddev,
2132 				DSAF_INODE_BP_DISCARD_NUM_0_REG + j * 0x80);
2133 		p[208 + i] = dsaf_read_dev(ddev,
2134 				DSAF_INODE_RSLT_DISCARD_NUM_0_REG + j * 0x80);
2135 		p[211 + i] = dsaf_read_dev(ddev,
2136 			DSAF_INODE_LOCAL_ADDR_FALSE_NUM_0_REG + j * 0x80);
2137 		p[214 + i] = dsaf_read_dev(ddev,
2138 				DSAF_INODE_VOQ_OVER_NUM_0_REG + j * 0x80);
2139 		p[217 + i] = dsaf_read_dev(ddev,
2140 				DSAF_INODE_BD_SAVE_STATUS_0_REG + j * 4);
2141 		p[220 + i] = dsaf_read_dev(ddev,
2142 				DSAF_INODE_BD_ORDER_STATUS_0_REG + j * 4);
2143 		p[223 + i] = dsaf_read_dev(ddev,
2144 				DSAF_INODE_SW_VLAN_TAG_DISC_0_REG + j * 4);
2145 		p[224 + i] = dsaf_read_dev(ddev,
2146 				DSAF_INODE_IN_DATA_STP_DISC_0_REG + j * 4);
2147 	}
2148 
2149 	p[227] = dsaf_read_dev(ddev, DSAF_INODE_GE_FC_EN_0_REG + port * 4);
2150 
2151 	for (i = 0; i < DSAF_INODE_NUM / DSAF_COMM_CHN; i++) {
2152 		j = i * DSAF_COMM_CHN + port;
2153 		p[228 + i] = dsaf_read_dev(ddev,
2154 				DSAF_INODE_VC0_IN_PKT_NUM_0_REG + j * 4);
2155 	}
2156 
2157 	p[231] = dsaf_read_dev(ddev,
2158 		DSAF_INODE_VC1_IN_PKT_NUM_0_REG + port * 4);
2159 
2160 	/* dsaf inode registers */
2161 	for (i = 0; i < HNS_DSAF_SBM_NUM(ddev) / DSAF_COMM_CHN; i++) {
2162 		j = i * DSAF_COMM_CHN + port;
2163 		p[232 + i] = dsaf_read_dev(ddev,
2164 				DSAF_SBM_CFG_REG_0_REG + j * 0x80);
2165 		p[235 + i] = dsaf_read_dev(ddev,
2166 				DSAF_SBM_BP_CFG_0_XGE_REG_0_REG + j * 0x80);
2167 		p[238 + i] = dsaf_read_dev(ddev,
2168 				DSAF_SBM_BP_CFG_1_REG_0_REG + j * 0x80);
2169 		p[241 + i] = dsaf_read_dev(ddev,
2170 				DSAF_SBM_BP_CFG_2_XGE_REG_0_REG + j * 0x80);
2171 		p[244 + i] = dsaf_read_dev(ddev,
2172 				DSAF_SBM_FREE_CNT_0_0_REG + j * 0x80);
2173 		p[245 + i] = dsaf_read_dev(ddev,
2174 				DSAF_SBM_FREE_CNT_1_0_REG + j * 0x80);
2175 		p[248 + i] = dsaf_read_dev(ddev,
2176 				DSAF_SBM_BP_CNT_0_0_REG + j * 0x80);
2177 		p[251 + i] = dsaf_read_dev(ddev,
2178 				DSAF_SBM_BP_CNT_1_0_REG + j * 0x80);
2179 		p[254 + i] = dsaf_read_dev(ddev,
2180 				DSAF_SBM_BP_CNT_2_0_REG + j * 0x80);
2181 		p[257 + i] = dsaf_read_dev(ddev,
2182 				DSAF_SBM_BP_CNT_3_0_REG + j * 0x80);
2183 		p[260 + i] = dsaf_read_dev(ddev,
2184 				DSAF_SBM_INER_ST_0_REG + j * 0x80);
2185 		p[263 + i] = dsaf_read_dev(ddev,
2186 				DSAF_SBM_MIB_REQ_FAILED_TC_0_REG + j * 0x80);
2187 		p[266 + i] = dsaf_read_dev(ddev,
2188 				DSAF_SBM_LNK_INPORT_CNT_0_REG + j * 0x80);
2189 		p[269 + i] = dsaf_read_dev(ddev,
2190 				DSAF_SBM_LNK_DROP_CNT_0_REG + j * 0x80);
2191 		p[272 + i] = dsaf_read_dev(ddev,
2192 				DSAF_SBM_INF_OUTPORT_CNT_0_REG + j * 0x80);
2193 		p[275 + i] = dsaf_read_dev(ddev,
2194 				DSAF_SBM_LNK_INPORT_TC0_CNT_0_REG + j * 0x80);
2195 		p[278 + i] = dsaf_read_dev(ddev,
2196 				DSAF_SBM_LNK_INPORT_TC1_CNT_0_REG + j * 0x80);
2197 		p[281 + i] = dsaf_read_dev(ddev,
2198 				DSAF_SBM_LNK_INPORT_TC2_CNT_0_REG + j * 0x80);
2199 		p[284 + i] = dsaf_read_dev(ddev,
2200 				DSAF_SBM_LNK_INPORT_TC3_CNT_0_REG + j * 0x80);
2201 		p[287 + i] = dsaf_read_dev(ddev,
2202 				DSAF_SBM_LNK_INPORT_TC4_CNT_0_REG + j * 0x80);
2203 		p[290 + i] = dsaf_read_dev(ddev,
2204 				DSAF_SBM_LNK_INPORT_TC5_CNT_0_REG + j * 0x80);
2205 		p[293 + i] = dsaf_read_dev(ddev,
2206 				DSAF_SBM_LNK_INPORT_TC6_CNT_0_REG + j * 0x80);
2207 		p[296 + i] = dsaf_read_dev(ddev,
2208 				DSAF_SBM_LNK_INPORT_TC7_CNT_0_REG + j * 0x80);
2209 		p[299 + i] = dsaf_read_dev(ddev,
2210 				DSAF_SBM_LNK_REQ_CNT_0_REG + j * 0x80);
2211 		p[302 + i] = dsaf_read_dev(ddev,
2212 				DSAF_SBM_LNK_RELS_CNT_0_REG + j * 0x80);
2213 		p[305 + i] = dsaf_read_dev(ddev,
2214 				DSAF_SBM_BP_CFG_3_REG_0_REG + j * 0x80);
2215 		p[308 + i] = dsaf_read_dev(ddev,
2216 				DSAF_SBM_BP_CFG_4_REG_0_REG + j * 0x80);
2217 	}
2218 
2219 	/* dsaf onode registers */
2220 	for (i = 0; i < DSAF_XOD_NUM; i++) {
2221 		p[311 + i] = dsaf_read_dev(ddev,
2222 				DSAF_XOD_ETS_TSA_TC0_TC3_CFG_0_REG + j * 0x90);
2223 		p[319 + i] = dsaf_read_dev(ddev,
2224 				DSAF_XOD_ETS_TSA_TC4_TC7_CFG_0_REG + j * 0x90);
2225 		p[327 + i] = dsaf_read_dev(ddev,
2226 				DSAF_XOD_ETS_BW_TC0_TC3_CFG_0_REG + j * 0x90);
2227 		p[335 + i] = dsaf_read_dev(ddev,
2228 				DSAF_XOD_ETS_BW_TC4_TC7_CFG_0_REG + j * 0x90);
2229 		p[343 + i] = dsaf_read_dev(ddev,
2230 				DSAF_XOD_ETS_BW_OFFSET_CFG_0_REG + j * 0x90);
2231 		p[351 + i] = dsaf_read_dev(ddev,
2232 				DSAF_XOD_ETS_TOKEN_CFG_0_REG + j * 0x90);
2233 	}
2234 
2235 	p[359] = dsaf_read_dev(ddev, DSAF_XOD_PFS_CFG_0_0_REG + port * 0x90);
2236 	p[360] = dsaf_read_dev(ddev, DSAF_XOD_PFS_CFG_1_0_REG + port * 0x90);
2237 	p[361] = dsaf_read_dev(ddev, DSAF_XOD_PFS_CFG_2_0_REG + port * 0x90);
2238 
2239 	for (i = 0; i < DSAF_XOD_BIG_NUM / DSAF_COMM_CHN; i++) {
2240 		j = i * DSAF_COMM_CHN + port;
2241 		p[362 + i] = dsaf_read_dev(ddev,
2242 				DSAF_XOD_GNT_L_0_REG + j * 0x90);
2243 		p[365 + i] = dsaf_read_dev(ddev,
2244 				DSAF_XOD_GNT_H_0_REG + j * 0x90);
2245 		p[368 + i] = dsaf_read_dev(ddev,
2246 				DSAF_XOD_CONNECT_STATE_0_REG + j * 0x90);
2247 		p[371 + i] = dsaf_read_dev(ddev,
2248 				DSAF_XOD_RCVPKT_CNT_0_REG + j * 0x90);
2249 		p[374 + i] = dsaf_read_dev(ddev,
2250 				DSAF_XOD_RCVTC0_CNT_0_REG + j * 0x90);
2251 		p[377 + i] = dsaf_read_dev(ddev,
2252 				DSAF_XOD_RCVTC1_CNT_0_REG + j * 0x90);
2253 		p[380 + i] = dsaf_read_dev(ddev,
2254 				DSAF_XOD_RCVTC2_CNT_0_REG + j * 0x90);
2255 		p[383 + i] = dsaf_read_dev(ddev,
2256 				DSAF_XOD_RCVTC3_CNT_0_REG + j * 0x90);
2257 		p[386 + i] = dsaf_read_dev(ddev,
2258 				DSAF_XOD_RCVVC0_CNT_0_REG + j * 0x90);
2259 		p[389 + i] = dsaf_read_dev(ddev,
2260 				DSAF_XOD_RCVVC1_CNT_0_REG + j * 0x90);
2261 	}
2262 
2263 	p[392] = dsaf_read_dev(ddev,
2264 		DSAF_XOD_XGE_RCVIN0_CNT_0_REG + port * 0x90);
2265 	p[393] = dsaf_read_dev(ddev,
2266 		DSAF_XOD_XGE_RCVIN1_CNT_0_REG + port * 0x90);
2267 	p[394] = dsaf_read_dev(ddev,
2268 		DSAF_XOD_XGE_RCVIN2_CNT_0_REG + port * 0x90);
2269 	p[395] = dsaf_read_dev(ddev,
2270 		DSAF_XOD_XGE_RCVIN3_CNT_0_REG + port * 0x90);
2271 	p[396] = dsaf_read_dev(ddev,
2272 		DSAF_XOD_XGE_RCVIN4_CNT_0_REG + port * 0x90);
2273 	p[397] = dsaf_read_dev(ddev,
2274 		DSAF_XOD_XGE_RCVIN5_CNT_0_REG + port * 0x90);
2275 	p[398] = dsaf_read_dev(ddev,
2276 		DSAF_XOD_XGE_RCVIN6_CNT_0_REG + port * 0x90);
2277 	p[399] = dsaf_read_dev(ddev,
2278 		DSAF_XOD_XGE_RCVIN7_CNT_0_REG + port * 0x90);
2279 	p[400] = dsaf_read_dev(ddev,
2280 		DSAF_XOD_PPE_RCVIN0_CNT_0_REG + port * 0x90);
2281 	p[401] = dsaf_read_dev(ddev,
2282 		DSAF_XOD_PPE_RCVIN1_CNT_0_REG + port * 0x90);
2283 	p[402] = dsaf_read_dev(ddev,
2284 		DSAF_XOD_ROCEE_RCVIN0_CNT_0_REG + port * 0x90);
2285 	p[403] = dsaf_read_dev(ddev,
2286 		DSAF_XOD_ROCEE_RCVIN1_CNT_0_REG + port * 0x90);
2287 	p[404] = dsaf_read_dev(ddev,
2288 		DSAF_XOD_FIFO_STATUS_0_REG + port * 0x90);
2289 
2290 	/* dsaf voq registers */
2291 	for (i = 0; i < DSAF_VOQ_NUM / DSAF_COMM_CHN; i++) {
2292 		j = (i * DSAF_COMM_CHN + port) * 0x90;
2293 		p[405 + i] = dsaf_read_dev(ddev,
2294 			DSAF_VOQ_ECC_INVERT_EN_0_REG + j);
2295 		p[408 + i] = dsaf_read_dev(ddev,
2296 			DSAF_VOQ_SRAM_PKT_NUM_0_REG + j);
2297 		p[411 + i] = dsaf_read_dev(ddev, DSAF_VOQ_IN_PKT_NUM_0_REG + j);
2298 		p[414 + i] = dsaf_read_dev(ddev,
2299 			DSAF_VOQ_OUT_PKT_NUM_0_REG + j);
2300 		p[417 + i] = dsaf_read_dev(ddev,
2301 			DSAF_VOQ_ECC_ERR_ADDR_0_REG + j);
2302 		p[420 + i] = dsaf_read_dev(ddev, DSAF_VOQ_BP_STATUS_0_REG + j);
2303 		p[423 + i] = dsaf_read_dev(ddev, DSAF_VOQ_SPUP_IDLE_0_REG + j);
2304 		p[426 + i] = dsaf_read_dev(ddev,
2305 			DSAF_VOQ_XGE_XOD_REQ_0_0_REG + j);
2306 		p[429 + i] = dsaf_read_dev(ddev,
2307 			DSAF_VOQ_XGE_XOD_REQ_1_0_REG + j);
2308 		p[432 + i] = dsaf_read_dev(ddev,
2309 			DSAF_VOQ_PPE_XOD_REQ_0_REG + j);
2310 		p[435 + i] = dsaf_read_dev(ddev,
2311 			DSAF_VOQ_ROCEE_XOD_REQ_0_REG + j);
2312 		p[438 + i] = dsaf_read_dev(ddev,
2313 			DSAF_VOQ_BP_ALL_THRD_0_REG + j);
2314 	}
2315 
2316 	/* dsaf tbl registers */
2317 	p[441] = dsaf_read_dev(ddev, DSAF_TBL_CTRL_0_REG);
2318 	p[442] = dsaf_read_dev(ddev, DSAF_TBL_INT_MSK_0_REG);
2319 	p[443] = dsaf_read_dev(ddev, DSAF_TBL_INT_SRC_0_REG);
2320 	p[444] = dsaf_read_dev(ddev, DSAF_TBL_INT_STS_0_REG);
2321 	p[445] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_ADDR_0_REG);
2322 	p[446] = dsaf_read_dev(ddev, DSAF_TBL_LINE_ADDR_0_REG);
2323 	p[447] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_HIGH_0_REG);
2324 	p[448] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_LOW_0_REG);
2325 	p[449] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_4_0_REG);
2326 	p[450] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_3_0_REG);
2327 	p[451] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_2_0_REG);
2328 	p[452] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_1_0_REG);
2329 	p[453] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_0_0_REG);
2330 	p[454] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_UCAST_CFG_0_REG);
2331 	p[455] = dsaf_read_dev(ddev, DSAF_TBL_LIN_CFG_0_REG);
2332 	p[456] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RDATA_HIGH_0_REG);
2333 	p[457] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RDATA_LOW_0_REG);
2334 	p[458] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA4_0_REG);
2335 	p[459] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA3_0_REG);
2336 	p[460] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA2_0_REG);
2337 	p[461] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA1_0_REG);
2338 	p[462] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA0_0_REG);
2339 	p[463] = dsaf_read_dev(ddev, DSAF_TBL_LIN_RDATA_0_REG);
2340 
2341 	for (i = 0; i < DSAF_SW_PORT_NUM; i++) {
2342 		j = i * 0x8;
2343 		p[464 + 2 * i] = dsaf_read_dev(ddev,
2344 			DSAF_TBL_DA0_MIS_INFO1_0_REG + j);
2345 		p[465 + 2 * i] = dsaf_read_dev(ddev,
2346 			DSAF_TBL_DA0_MIS_INFO0_0_REG + j);
2347 	}
2348 
2349 	p[480] = dsaf_read_dev(ddev, DSAF_TBL_SA_MIS_INFO2_0_REG);
2350 	p[481] = dsaf_read_dev(ddev, DSAF_TBL_SA_MIS_INFO1_0_REG);
2351 	p[482] = dsaf_read_dev(ddev, DSAF_TBL_SA_MIS_INFO0_0_REG);
2352 	p[483] = dsaf_read_dev(ddev, DSAF_TBL_PUL_0_REG);
2353 	p[484] = dsaf_read_dev(ddev, DSAF_TBL_OLD_RSLT_0_REG);
2354 	p[485] = dsaf_read_dev(ddev, DSAF_TBL_OLD_SCAN_VAL_0_REG);
2355 	p[486] = dsaf_read_dev(ddev, DSAF_TBL_DFX_CTRL_0_REG);
2356 	p[487] = dsaf_read_dev(ddev, DSAF_TBL_DFX_STAT_0_REG);
2357 	p[488] = dsaf_read_dev(ddev, DSAF_TBL_DFX_STAT_2_0_REG);
2358 	p[489] = dsaf_read_dev(ddev, DSAF_TBL_LKUP_NUM_I_0_REG);
2359 	p[490] = dsaf_read_dev(ddev, DSAF_TBL_LKUP_NUM_O_0_REG);
2360 	p[491] = dsaf_read_dev(ddev, DSAF_TBL_UCAST_BCAST_MIS_INFO_0_0_REG);
2361 
2362 	/* dsaf other registers */
2363 	p[492] = dsaf_read_dev(ddev, DSAF_INODE_FIFO_WL_0_REG + port * 0x4);
2364 	p[493] = dsaf_read_dev(ddev, DSAF_ONODE_FIFO_WL_0_REG + port * 0x4);
2365 	p[494] = dsaf_read_dev(ddev, DSAF_XGE_GE_WORK_MODE_0_REG + port * 0x4);
2366 	p[495] = dsaf_read_dev(ddev,
2367 		DSAF_XGE_APP_RX_LINK_UP_0_REG + port * 0x4);
2368 	p[496] = dsaf_read_dev(ddev, DSAF_NETPORT_CTRL_SIG_0_REG + port * 0x4);
2369 	p[497] = dsaf_read_dev(ddev, DSAF_XGE_CTRL_SIG_CFG_0_REG + port * 0x4);
2370 
2371 	/* mark end of dsaf regs */
2372 	for (i = 498; i < 504; i++)
2373 		p[i] = 0xdddddddd;
2374 }
2375 
2376 static char *hns_dsaf_get_node_stats_strings(char *data, int node)
2377 {
2378 	char *buff = data;
2379 
2380 	snprintf(buff, ETH_GSTRING_LEN, "innod%d_pad_drop_pkts", node);
2381 	buff = buff + ETH_GSTRING_LEN;
2382 	snprintf(buff, ETH_GSTRING_LEN, "innod%d_manage_pkts", node);
2383 	buff = buff + ETH_GSTRING_LEN;
2384 	snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkts", node);
2385 	buff = buff + ETH_GSTRING_LEN;
2386 	snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkt_id", node);
2387 	buff = buff + ETH_GSTRING_LEN;
2388 	snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pause_frame", node);
2389 	buff = buff + ETH_GSTRING_LEN;
2390 	snprintf(buff, ETH_GSTRING_LEN, "innod%d_release_buf_num", node);
2391 	buff = buff + ETH_GSTRING_LEN;
2392 	snprintf(buff, ETH_GSTRING_LEN, "innod%d_sbm_drop_pkts", node);
2393 	buff = buff + ETH_GSTRING_LEN;
2394 	snprintf(buff, ETH_GSTRING_LEN, "innod%d_crc_false_pkts", node);
2395 	buff = buff + ETH_GSTRING_LEN;
2396 	snprintf(buff, ETH_GSTRING_LEN, "innod%d_bp_drop_pkts", node);
2397 	buff = buff + ETH_GSTRING_LEN;
2398 	snprintf(buff, ETH_GSTRING_LEN, "innod%d_lookup_rslt_drop_pkts", node);
2399 	buff = buff + ETH_GSTRING_LEN;
2400 	snprintf(buff, ETH_GSTRING_LEN, "innod%d_local_rslt_fail_pkts", node);
2401 	buff = buff + ETH_GSTRING_LEN;
2402 	snprintf(buff, ETH_GSTRING_LEN, "innod%d_vlan_drop_pkts", node);
2403 	buff = buff + ETH_GSTRING_LEN;
2404 	snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node);
2405 	buff = buff + ETH_GSTRING_LEN;
2406 	snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node);
2407 	buff = buff + ETH_GSTRING_LEN;
2408 
2409 	return buff;
2410 }
2411 
2412 static u64 *hns_dsaf_get_node_stats(struct dsaf_device *ddev, u64 *data,
2413 				    int node_num)
2414 {
2415 	u64 *p = data;
2416 	struct dsaf_hw_stats *hw_stats = &ddev->hw_stats[node_num];
2417 
2418 	p[0] = hw_stats->pad_drop;
2419 	p[1] = hw_stats->man_pkts;
2420 	p[2] = hw_stats->rx_pkts;
2421 	p[3] = hw_stats->rx_pkt_id;
2422 	p[4] = hw_stats->rx_pause_frame;
2423 	p[5] = hw_stats->release_buf_num;
2424 	p[6] = hw_stats->sbm_drop;
2425 	p[7] = hw_stats->crc_false;
2426 	p[8] = hw_stats->bp_drop;
2427 	p[9] = hw_stats->rslt_drop;
2428 	p[10] = hw_stats->local_addr_false;
2429 	p[11] = hw_stats->vlan_drop;
2430 	p[12] = hw_stats->stp_drop;
2431 	p[13] = hw_stats->tx_pkts;
2432 
2433 	return &p[14];
2434 }
2435 
2436 /**
2437  *hns_dsaf_get_stats - get dsaf statistic
2438  *@ddev: dsaf device
2439  *@data:statistic value
2440  *@port: port num
2441  */
2442 void hns_dsaf_get_stats(struct dsaf_device *ddev, u64 *data, int port)
2443 {
2444 	u64 *p = data;
2445 	int node_num = port;
2446 
2447 	/* for ge/xge node info */
2448 	p = hns_dsaf_get_node_stats(ddev, p, node_num);
2449 
2450 	/* for ppe node info */
2451 	node_num = port + DSAF_PPE_INODE_BASE;
2452 	(void)hns_dsaf_get_node_stats(ddev, p, node_num);
2453 }
2454 
2455 /**
2456  *hns_dsaf_get_sset_count - get dsaf string set count
2457  *@stringset: type of values in data
2458  *return dsaf string name count
2459  */
2460 int hns_dsaf_get_sset_count(int stringset)
2461 {
2462 	if (stringset == ETH_SS_STATS)
2463 		return DSAF_STATIC_NUM;
2464 
2465 	return 0;
2466 }
2467 
2468 /**
2469  *hns_dsaf_get_strings - get dsaf string set
2470  *@stringset:srting set index
2471  *@data:strings name value
2472  *@port:port index
2473  */
2474 void hns_dsaf_get_strings(int stringset, u8 *data, int port)
2475 {
2476 	char *buff = (char *)data;
2477 	int node = port;
2478 
2479 	if (stringset != ETH_SS_STATS)
2480 		return;
2481 
2482 	/* for ge/xge node info */
2483 	buff = hns_dsaf_get_node_stats_strings(buff, node);
2484 
2485 	/* for ppe node info */
2486 	node = port + DSAF_PPE_INODE_BASE;
2487 	(void)hns_dsaf_get_node_stats_strings(buff, node);
2488 }
2489 
2490 /**
2491  *hns_dsaf_get_sset_count - get dsaf regs count
2492  *return dsaf regs count
2493  */
2494 int hns_dsaf_get_regs_count(void)
2495 {
2496 	return DSAF_DUMP_REGS_NUM;
2497 }
2498 
2499 /**
2500  * dsaf_probe - probo dsaf dev
2501  * @pdev: dasf platform device
2502  * retuen 0 - success , negative --fail
2503  */
2504 static int hns_dsaf_probe(struct platform_device *pdev)
2505 {
2506 	struct dsaf_device *dsaf_dev;
2507 	int ret;
2508 
2509 	dsaf_dev = hns_dsaf_alloc_dev(&pdev->dev, sizeof(struct dsaf_drv_priv));
2510 	if (IS_ERR(dsaf_dev)) {
2511 		ret = PTR_ERR(dsaf_dev);
2512 		dev_err(&pdev->dev,
2513 			"dsaf_probe dsaf_alloc_dev failed, ret = %#x!\n", ret);
2514 		return ret;
2515 	}
2516 
2517 	ret = hns_dsaf_get_cfg(dsaf_dev);
2518 	if (ret)
2519 		goto free_dev;
2520 
2521 	ret = hns_dsaf_init(dsaf_dev);
2522 	if (ret)
2523 		goto free_cfg;
2524 
2525 	ret = hns_mac_init(dsaf_dev);
2526 	if (ret)
2527 		goto uninit_dsaf;
2528 
2529 	ret = hns_ppe_init(dsaf_dev);
2530 	if (ret)
2531 		goto uninit_mac;
2532 
2533 	ret = hns_dsaf_ae_init(dsaf_dev);
2534 	if (ret)
2535 		goto uninit_ppe;
2536 
2537 	return 0;
2538 
2539 uninit_ppe:
2540 	hns_ppe_uninit(dsaf_dev);
2541 
2542 uninit_mac:
2543 	hns_mac_uninit(dsaf_dev);
2544 
2545 uninit_dsaf:
2546 	hns_dsaf_free(dsaf_dev);
2547 
2548 free_cfg:
2549 	hns_dsaf_free_cfg(dsaf_dev);
2550 
2551 free_dev:
2552 	hns_dsaf_free_dev(dsaf_dev);
2553 
2554 	return ret;
2555 }
2556 
2557 /**
2558  * dsaf_remove - remove dsaf dev
2559  * @pdev: dasf platform device
2560  */
2561 static int hns_dsaf_remove(struct platform_device *pdev)
2562 {
2563 	struct dsaf_device *dsaf_dev = dev_get_drvdata(&pdev->dev);
2564 
2565 	hns_dsaf_ae_uninit(dsaf_dev);
2566 
2567 	hns_ppe_uninit(dsaf_dev);
2568 
2569 	hns_mac_uninit(dsaf_dev);
2570 
2571 	hns_dsaf_free(dsaf_dev);
2572 
2573 	hns_dsaf_free_cfg(dsaf_dev);
2574 
2575 	hns_dsaf_free_dev(dsaf_dev);
2576 
2577 	return 0;
2578 }
2579 
2580 static const struct of_device_id g_dsaf_match[] = {
2581 	{.compatible = "hisilicon,hns-dsaf-v1"},
2582 	{.compatible = "hisilicon,hns-dsaf-v2"},
2583 	{}
2584 };
2585 
2586 static struct platform_driver g_dsaf_driver = {
2587 	.probe = hns_dsaf_probe,
2588 	.remove = hns_dsaf_remove,
2589 	.driver = {
2590 		.name = DSAF_DRV_NAME,
2591 		.of_match_table = g_dsaf_match,
2592 	},
2593 };
2594 
2595 module_platform_driver(g_dsaf_driver);
2596 
2597 MODULE_LICENSE("GPL");
2598 MODULE_AUTHOR("Huawei Tech. Co., Ltd.");
2599 MODULE_DESCRIPTION("HNS DSAF driver");
2600 MODULE_VERSION(DSAF_MOD_VERSION);
2601