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