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