blob: afb5daa3721d2162c3fe134c4716e551e0153ddd [file] [log] [blame]
huangdaode511e6bc2015-09-17 14:51:49 +08001/*
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
Kejian Yan8413b3b2016-06-03 10:55:18 +080010#include <linux/acpi.h>
Daode Huang2e2591b2016-04-23 17:05:10 +080011#include <linux/device.h>
huangdaode511e6bc2015-09-17 14:51:49 +080012#include <linux/init.h>
13#include <linux/interrupt.h>
Daode Huang2e2591b2016-04-23 17:05:10 +080014#include <linux/kernel.h>
15#include <linux/module.h>
huangdaode511e6bc2015-09-17 14:51:49 +080016#include <linux/netdevice.h>
Yisen.Zhuang\(Zhuangyuzeng\)831d8282016-04-23 17:05:11 +080017#include <linux/mfd/syscon.h>
huangdaode511e6bc2015-09-17 14:51:49 +080018#include <linux/of.h>
19#include <linux/of_address.h>
20#include <linux/of_irq.h>
Daode Huang2e2591b2016-04-23 17:05:10 +080021#include <linux/platform_device.h>
Arnd Bergmann119c7ad2015-10-16 11:30:56 +020022#include <linux/vmalloc.h>
23
huangdaode511e6bc2015-09-17 14:51:49 +080024#include "hns_dsaf_mac.h"
Daode Huang2e2591b2016-04-23 17:05:10 +080025#include "hns_dsaf_main.h"
26#include "hns_dsaf_ppe.h"
27#include "hns_dsaf_rcb.h"
Kejian Yana24274a2016-06-03 10:55:17 +080028#include "hns_dsaf_misc.h"
huangdaode511e6bc2015-09-17 14:51:49 +080029
30const 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",
Yisen.Zhuang\(Zhuangyuzeng\)89a44092016-04-23 17:05:05 +080034 [DSAF_MODE_DISABLE_SP] = "single-port",
huangdaode511e6bc2015-09-17 14:51:49 +080035};
36
Kejian Yan8413b3b2016-06-03 10:55:18 +080037static const struct acpi_device_id hns_dsaf_acpi_match[] = {
38 { "HISI00B1", 0 },
39 { "HISI00B2", 0 },
40 { },
41};
42MODULE_DEVICE_TABLE(acpi, hns_dsaf_acpi_match);
43
huangdaode511e6bc2015-09-17 14:51:49 +080044int hns_dsaf_get_cfg(struct dsaf_device *dsaf_dev)
45{
46 int ret, i;
47 u32 desc_num;
48 u32 buf_size;
Yisen.Zhuang\(Zhuangyuzeng\)422c3102016-04-23 17:05:08 +080049 u32 reset_offset = 0;
Yisen.Zhuang\(Zhuangyuzeng\)831d8282016-04-23 17:05:11 +080050 u32 res_idx = 0;
yankejian48189d62016-01-20 16:00:19 +080051 const char *mode_str;
Yisen.Zhuang\(Zhuangyuzeng\)831d8282016-04-23 17:05:11 +080052 struct regmap *syscon;
53 struct resource *res;
Peter Chen453cafb2016-08-01 15:02:35 +080054 struct device_node *np = dsaf_dev->dev->of_node, *np_temp;
Yisen.Zhuang\(Zhuangyuzeng\)831d8282016-04-23 17:05:11 +080055 struct platform_device *pdev = to_platform_device(dsaf_dev->dev);
huangdaode511e6bc2015-09-17 14:51:49 +080056
Kejian Yan8413b3b2016-06-03 10:55:18 +080057 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 }
huangdaode511e6bc2015-09-17 14:51:49 +080073
Kejian Yan61629282016-06-03 10:55:13 +080074 ret = device_property_read_string(dsaf_dev->dev, "mode", &mode_str);
huangdaode511e6bc2015-09-17 14:51:49 +080075 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
Kejian Yan8413b3b2016-06-03 10:55:18 +0800104 if (dev_of_node(dsaf_dev->dev)) {
Peter Chen453cafb2016-08-01 15:02:35 +0800105 np_temp = of_parse_phandle(np, "subctrl-syscon", 0);
106 syscon = syscon_node_to_regmap(np_temp);
107 of_node_put(np_temp);
Kejian Yan8413b3b2016-06-03 10:55:18 +0800108 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 }
Yisen.Zhuang\(Zhuangyuzeng\)831d8282016-04-23 17:05:11 +0800115
Kejian Yan8413b3b2016-06-03 10:55:18 +0800116 dsaf_dev->sc_base = devm_ioremap_resource(&pdev->dev,
117 res);
Wei Yongjun96329a12016-07-05 07:56:52 +0000118 if (IS_ERR(dsaf_dev->sc_base)) {
Kejian Yan8413b3b2016-06-03 10:55:18 +0800119 dev_err(dsaf_dev->dev, "subctrl can not map!\n");
Wei Yongjun96329a12016-07-05 07:56:52 +0000120 return PTR_ERR(dsaf_dev->sc_base);
Kejian Yan8413b3b2016-06-03 10:55:18 +0800121 }
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);
Wei Yongjun96329a12016-07-05 07:56:52 +0000132 if (IS_ERR(dsaf_dev->sds_base)) {
Kejian Yan8413b3b2016-06-03 10:55:18 +0800133 dev_err(dsaf_dev->dev, "serdes-ctrl can not map!\n");
Wei Yongjun96329a12016-07-05 07:56:52 +0000134 return PTR_ERR(dsaf_dev->sds_base);
Kejian Yan8413b3b2016-06-03 10:55:18 +0800135 }
136 } else {
137 dsaf_dev->sub_ctrl = syscon;
Yisen.Zhuang\(Zhuangyuzeng\)831d8282016-04-23 17:05:11 +0800138 }
huangdaode511e6bc2015-09-17 14:51:49 +0800139 }
140
Yisen.Zhuang\(Zhuangyuzeng\)831d8282016-04-23 17:05:11 +0800141 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 }
huangdaode511e6bc2015-09-17 14:51:49 +0800148 }
Yisen.Zhuang\(Zhuangyuzeng\)831d8282016-04-23 17:05:11 +0800149 dsaf_dev->ppe_base = devm_ioremap_resource(&pdev->dev, res);
Wei Yongjun96329a12016-07-05 07:56:52 +0000150 if (IS_ERR(dsaf_dev->ppe_base)) {
Yisen.Zhuang\(Zhuangyuzeng\)831d8282016-04-23 17:05:11 +0800151 dev_err(dsaf_dev->dev, "ppe-base resource can not map!\n");
Wei Yongjun96329a12016-07-05 07:56:52 +0000152 return PTR_ERR(dsaf_dev->ppe_base);
huangdaode511e6bc2015-09-17 14:51:49 +0800153 }
Yisen.Zhuang\(Zhuangyuzeng\)831d8282016-04-23 17:05:11 +0800154 dsaf_dev->ppe_paddr = res->start;
huangdaode511e6bc2015-09-17 14:51:49 +0800155
Yisen.Zhuang\(Zhuangyuzeng\)831d8282016-04-23 17:05:11 +0800156 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);
Wei Yongjun96329a12016-07-05 07:56:52 +0000169 if (IS_ERR(dsaf_dev->io_base)) {
Yisen.Zhuang\(Zhuangyuzeng\)831d8282016-04-23 17:05:11 +0800170 dev_err(dsaf_dev->dev, "dsaf-base resource can not map!\n");
Wei Yongjun96329a12016-07-05 07:56:52 +0000171 return PTR_ERR(dsaf_dev->io_base);
Yisen.Zhuang\(Zhuangyuzeng\)831d8282016-04-23 17:05:11 +0800172 }
huangdaode511e6bc2015-09-17 14:51:49 +0800173 }
174
Kejian Yan61629282016-06-03 10:55:13 +0800175 ret = device_property_read_u32(dsaf_dev->dev, "desc-num", &desc_num);
huangdaode511e6bc2015-09-17 14:51:49 +0800176 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);
Qianqian Xief6c2df12016-06-21 11:56:25 +0800180 return -EINVAL;
huangdaode511e6bc2015-09-17 14:51:49 +0800181 }
182 dsaf_dev->desc_num = desc_num;
183
Kejian Yan61629282016-06-03 10:55:13 +0800184 ret = device_property_read_u32(dsaf_dev->dev, "reset-field-offset",
185 &reset_offset);
Yisen.Zhuang\(Zhuangyuzeng\)422c3102016-04-23 17:05:08 +0800186 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
Kejian Yan61629282016-06-03 10:55:13 +0800192 ret = device_property_read_u32(dsaf_dev->dev, "buf-size", &buf_size);
huangdaode511e6bc2015-09-17 14:51:49 +0800193 if (ret < 0) {
194 dev_err(dsaf_dev->dev,
195 "get buf-size fail, ret=%d!\r\n", ret);
Qianqian Xief6c2df12016-06-21 11:56:25 +0800196 return ret;
huangdaode511e6bc2015-09-17 14:51:49 +0800197 }
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);
Qianqian Xief6c2df12016-06-21 11:56:25 +0800204 return -EINVAL;
huangdaode511e6bc2015-09-17 14:51:49 +0800205 }
206
Kejian Yana24274a2016-06-03 10:55:17 +0800207 dsaf_dev->misc_op = hns_misc_op_get(dsaf_dev);
208 if (!dsaf_dev->misc_op)
209 return -ENOMEM;
210
huangdaode511e6bc2015-09-17 14:51:49 +0800211 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;
huangdaode511e6bc2015-09-17 14:51:49 +0800217}
218
219/**
220 * hns_dsaf_sbm_link_sram_init_en - config dsaf_sbm_init_en
221 * @dsaf_id: dsa fabric id
222 */
223static 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 */
233static void
234hns_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 */
245static void
246hns_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
yankejian45686372015-10-13 09:53:45 +0800258static 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
Yisen.Zhuang\(Zhuangyuzeng\)89a44092016-04-23 17:05:05 +0800264 hns_rcb_get_queue_mode(dsaf_dev->dsaf_mode, &max_vfn, &max_q_per_vf);
yankejian45686372015-10-13 09:53:45 +0800265 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
yankejian68c222a2016-03-05 14:10:42 +0800275static 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
Yisen.Zhuang\(Zhuangyuzeng\)89a44092016-04-23 17:05:05 +0800284 hns_rcb_get_queue_mode(dsaf_dev->dsaf_mode, &max_vfn, &max_q_per_vf);
yankejian68c222a2016-03-05 14:10:42 +0800285 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
huangdaode511e6bc2015-09-17 14:51:49 +0800297/**
298 * hns_dsaf_sw_port_type_cfg - cfg sw type
299 * @dsaf_id: dsa fabric id
300 * @psw_port_type: array
301 */
302static 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 */
320static 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
Salil13ac6952015-12-03 12:17:53 +0000333#define HNS_DSAF_SBM_NUM(dev) \
334 (AE_IS_VER1((dev)->dsaf_ver) ? DSAF_SBM_NUM : DSAFV2_SBM_NUM)
huangdaode511e6bc2015-09-17 14:51:49 +0800335/**
336 * hns_dsaf_sbm_cfg - config sbm
337 * @dsaf_id: dsa fabric id
338 */
339static void hns_dsaf_sbm_cfg(struct dsaf_device *dsaf_dev)
340{
341 u32 o_sbm_cfg;
342 u32 i;
343
Salil13ac6952015-12-03 12:17:53 +0000344 for (i = 0; i < HNS_DSAF_SBM_NUM(dsaf_dev); i++) {
huangdaode511e6bc2015-09-17 14:51:49 +0800345 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 */
358static 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
Salil13ac6952015-12-03 12:17:53 +0000365 /* 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++) {
huangdaode511e6bc2015-09-17 14:51:49 +0800372 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 */
Salil13ac6952015-12-03 12:17:53 +0000377 for (i = 0; i < HNS_DSAF_SBM_NUM(dsaf_dev); i++) {
huangdaode511e6bc2015-09-17 14:51:49 +0800378 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 */
403static void hns_dsaf_sbm_bp_wl_cfg(struct dsaf_device *dsaf_dev)
404{
Salil13ac6952015-12-03 12:17:53 +0000405 u32 o_sbm_bp_cfg;
huangdaode511e6bc2015-09-17 14:51:49 +0800406 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;
Salil13ac6952015-12-03 12:17:53 +0000412 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,
huangdaode511e6bc2015-09-17 14:51:49 +0800414 DSAF_SBM_CFG0_COM_MAX_BUF_NUM_S, 512);
Salil13ac6952015-12-03 12:17:53 +0000415 dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG0_VC0_MAX_BUF_NUM_M,
huangdaode511e6bc2015-09-17 14:51:49 +0800416 DSAF_SBM_CFG0_VC0_MAX_BUF_NUM_S, 0);
Salil13ac6952015-12-03 12:17:53 +0000417 dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG0_VC1_MAX_BUF_NUM_M,
huangdaode511e6bc2015-09-17 14:51:49 +0800418 DSAF_SBM_CFG0_VC1_MAX_BUF_NUM_S, 0);
Salil13ac6952015-12-03 12:17:53 +0000419 dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
huangdaode511e6bc2015-09-17 14:51:49 +0800420
421 reg = DSAF_SBM_BP_CFG_1_REG_0_REG + 0x80 * i;
Salil13ac6952015-12-03 12:17:53 +0000422 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,
huangdaode511e6bc2015-09-17 14:51:49 +0800424 DSAF_SBM_CFG1_TC4_MAX_BUF_NUM_S, 0);
Salil13ac6952015-12-03 12:17:53 +0000425 dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG1_TC0_MAX_BUF_NUM_M,
huangdaode511e6bc2015-09-17 14:51:49 +0800426 DSAF_SBM_CFG1_TC0_MAX_BUF_NUM_S, 0);
Salil13ac6952015-12-03 12:17:53 +0000427 dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
huangdaode511e6bc2015-09-17 14:51:49 +0800428
429 reg = DSAF_SBM_BP_CFG_2_XGE_REG_0_REG + 0x80 * i;
Salil13ac6952015-12-03 12:17:53 +0000430 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,
huangdaode511e6bc2015-09-17 14:51:49 +0800432 DSAF_SBM_CFG2_SET_BUF_NUM_S, 104);
Salil13ac6952015-12-03 12:17:53 +0000433 dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG2_RESET_BUF_NUM_M,
huangdaode511e6bc2015-09-17 14:51:49 +0800434 DSAF_SBM_CFG2_RESET_BUF_NUM_S, 128);
Salil13ac6952015-12-03 12:17:53 +0000435 dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
huangdaode511e6bc2015-09-17 14:51:49 +0800436
437 reg = DSAF_SBM_BP_CFG_3_REG_0_REG + 0x80 * i;
Salil13ac6952015-12-03 12:17:53 +0000438 o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
439 dsaf_set_field(o_sbm_bp_cfg,
huangdaode511e6bc2015-09-17 14:51:49 +0800440 DSAF_SBM_CFG3_SET_BUF_NUM_NO_PFC_M,
441 DSAF_SBM_CFG3_SET_BUF_NUM_NO_PFC_S, 110);
Salil13ac6952015-12-03 12:17:53 +0000442 dsaf_set_field(o_sbm_bp_cfg,
huangdaode511e6bc2015-09-17 14:51:49 +0800443 DSAF_SBM_CFG3_RESET_BUF_NUM_NO_PFC_M,
444 DSAF_SBM_CFG3_RESET_BUF_NUM_NO_PFC_S, 160);
Salil13ac6952015-12-03 12:17:53 +0000445 dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
huangdaode511e6bc2015-09-17 14:51:49 +0800446
447 /* for no enable pfc mode */
448 reg = DSAF_SBM_BP_CFG_4_REG_0_REG + 0x80 * i;
Salil13ac6952015-12-03 12:17:53 +0000449 o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg);
450 dsaf_set_field(o_sbm_bp_cfg,
huangdaode511e6bc2015-09-17 14:51:49 +0800451 DSAF_SBM_CFG3_SET_BUF_NUM_NO_PFC_M,
452 DSAF_SBM_CFG3_SET_BUF_NUM_NO_PFC_S, 128);
Salil13ac6952015-12-03 12:17:53 +0000453 dsaf_set_field(o_sbm_bp_cfg,
huangdaode511e6bc2015-09-17 14:51:49 +0800454 DSAF_SBM_CFG3_RESET_BUF_NUM_NO_PFC_M,
455 DSAF_SBM_CFG3_RESET_BUF_NUM_NO_PFC_S, 192);
Salil13ac6952015-12-03 12:17:53 +0000456 dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
huangdaode511e6bc2015-09-17 14:51:49 +0800457 }
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;
Salil13ac6952015-12-03 12:17:53 +0000462 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,
huangdaode511e6bc2015-09-17 14:51:49 +0800464 DSAF_SBM_CFG2_SET_BUF_NUM_S, 10);
Salil13ac6952015-12-03 12:17:53 +0000465 dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG2_RESET_BUF_NUM_M,
huangdaode511e6bc2015-09-17 14:51:49 +0800466 DSAF_SBM_CFG2_RESET_BUF_NUM_S, 12);
Salil13ac6952015-12-03 12:17:53 +0000467 dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
huangdaode511e6bc2015-09-17 14:51:49 +0800468 }
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;
Salil13ac6952015-12-03 12:17:53 +0000473 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,
huangdaode511e6bc2015-09-17 14:51:49 +0800475 DSAF_SBM_CFG2_SET_BUF_NUM_S, 2);
Salil13ac6952015-12-03 12:17:53 +0000476 dsaf_set_field(o_sbm_bp_cfg, DSAF_SBM_CFG2_RESET_BUF_NUM_M,
huangdaode511e6bc2015-09-17 14:51:49 +0800477 DSAF_SBM_CFG2_RESET_BUF_NUM_S, 4);
Salil13ac6952015-12-03 12:17:53 +0000478 dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
479 }
480}
481
482static 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,
Daode Huang8ae7b8a2016-06-21 11:56:37 +0800520 DSAFV2_SBM_CFG3_SET_BUF_NUM_NO_PFC_S, 48);
Salil13ac6952015-12-03 12:17:53 +0000521 dsaf_set_field(o_sbm_bp_cfg,
522 DSAFV2_SBM_CFG3_RESET_BUF_NUM_NO_PFC_M,
Daode Huang8ae7b8a2016-06-21 11:56:37 +0800523 DSAFV2_SBM_CFG3_RESET_BUF_NUM_NO_PFC_S, 80);
Salil13ac6952015-12-03 12:17:53 +0000524 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,
Daode Huang8ae7b8a2016-06-21 11:56:37 +0800531 DSAFV2_SBM_CFG4_SET_BUF_NUM_NO_PFC_S, 192);
Salil13ac6952015-12-03 12:17:53 +0000532 dsaf_set_field(o_sbm_bp_cfg,
533 DSAFV2_SBM_CFG4_RESET_BUF_NUM_NO_PFC_M,
Daode Huang8ae7b8a2016-06-21 11:56:37 +0800534 DSAFV2_SBM_CFG4_RESET_BUF_NUM_NO_PFC_S, 240);
Salil13ac6952015-12-03 12:17:53 +0000535 dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
536 }
537
538 /* PPE */
Daode Huang8ae7b8a2016-06-21 11:56:37 +0800539 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
Salil13ac6952015-12-03 12:17:53 +0000554 /* 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);
Daode Huang8ae7b8a2016-06-21 11:56:37 +0800558 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);
Salil13ac6952015-12-03 12:17:53 +0000564 dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg);
huangdaode511e6bc2015-09-17 14:51:49 +0800565 }
566}
567
568/**
569 * hns_dsaf_voq_bp_all_thrd_cfg - voq
570 * @dsaf_id: dsa fabric id
571 */
572static 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 */
606static 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 */
621static 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 */
655static 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 */
681static 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 */
701static 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 */
716static 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 */
731static 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 */
749static 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
yankejian45686372015-10-13 09:53:45 +0800763void hns_dsaf_set_promisc_mode(struct dsaf_device *dsaf_dev, u32 en)
764{
Yisen.Zhuang\(Zhuangyuzeng\)89a44092016-04-23 17:05:05 +0800765 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);
yankejian45686372015-10-13 09:53:45 +0800768}
769
yankejian68c222a2016-03-05 14:10:42 +0800770void 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) ||
Yisen.Zhuang\(Zhuangyuzeng\)831d8282016-04-23 17:05:11 +0800773 dsaf_dev->mac_cb[mac_id]->mac_type == HNAE_PORT_DEBUG)
yankejian68c222a2016-03-05 14:10:42 +0800774 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
huangdaode511e6bc2015-09-17 14:51:49 +0800780/**
781 * hns_dsaf_tbl_stat_en - tbl
782 * @dsaf_id: dsa fabric id
783 * @ptbl_stat_en: addr
784 */
785static 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 */
801static void hns_dsaf_rocee_bp_en(struct dsaf_device *dsaf_dev)
802{
Qianqian Xie6f805632016-03-22 16:06:26 +0800803 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);
huangdaode511e6bc2015-09-17 14:51:49 +0800806}
807
808/* set msk for dsaf exception irq*/
809static 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
816static 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
823static 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
830static void
831hns_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*/
837static 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
844static 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
851static 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
858static 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 */
870static void hns_dsaf_single_line_tbl_cfg(
871 struct dsaf_device *dsaf_dev,
872 u32 address, struct dsaf_tbl_line_cfg *ptbl_line)
873{
Daode Huangb7623812016-06-21 11:56:31 +0800874 spin_lock_bh(&dsaf_dev->tcam_lock);
875
huangdaode511e6bc2015-09-17 14:51:49 +0800876 /*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);
Daode Huangb7623812016-06-21 11:56:31 +0800884
885 spin_unlock_bh(&dsaf_dev->tcam_lock);
huangdaode511e6bc2015-09-17 14:51:49 +0800886}
887
888/**
889 * hns_dsaf_tcam_uc_cfg - INT
890 * @dsaf_id: dsa fabric id
891 * @address,
892 * @ptbl_tcam_data,
893 */
894static 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{
Daode Huangb7623812016-06-21 11:56:31 +0800899 spin_lock_bh(&dsaf_dev->tcam_lock);
900
huangdaode511e6bc2015-09-17 14:51:49 +0800901 /*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);
Daode Huangb7623812016-06-21 11:56:31 +0800909
910 spin_unlock_bh(&dsaf_dev->tcam_lock);
huangdaode511e6bc2015-09-17 14:51:49 +0800911}
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 */
920static 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{
Daode Huangb7623812016-06-21 11:56:31 +0800925 spin_lock_bh(&dsaf_dev->tcam_lock);
926
huangdaode511e6bc2015-09-17 14:51:49 +0800927 /*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);
Daode Huangb7623812016-06-21 11:56:31 +0800935
936 spin_unlock_bh(&dsaf_dev->tcam_lock);
huangdaode511e6bc2015-09-17 14:51:49 +0800937}
938
939/**
940 * hns_dsaf_tcam_mc_invld - INT
941 * @dsaf_id: dsa fabric id
942 * @address
943 */
944static void hns_dsaf_tcam_mc_invld(struct dsaf_device *dsaf_dev, u32 address)
945{
Daode Huangb7623812016-06-21 11:56:31 +0800946 spin_lock_bh(&dsaf_dev->tcam_lock);
947
huangdaode511e6bc2015-09-17 14:51:49 +0800948 /*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);
Daode Huangb7623812016-06-21 11:56:31 +0800960
961 spin_unlock_bh(&dsaf_dev->tcam_lock);
huangdaode511e6bc2015-09-17 14:51:49 +0800962}
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 */
971static 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
Daode Huangb7623812016-06-21 11:56:31 +0800979 spin_lock_bh(&dsaf_dev->tcam_lock);
980
huangdaode511e6bc2015-09-17 14:51:49 +0800981 /*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
huangdaode511e6bc2015-09-17 14:51:49 +0800989 = dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RDATA_HIGH_0_REG);
Daode Huangf56c1b32016-06-21 11:56:32 +0800990 ptbl_tcam_data->tbl_tcam_data_low
991 = dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RDATA_LOW_0_REG);
huangdaode511e6bc2015-09-17 14:51:49 +0800992
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);
Daode Huangb7623812016-06-21 11:56:31 +08001013
1014 spin_unlock_bh(&dsaf_dev->tcam_lock);
huangdaode511e6bc2015-09-17 14:51:49 +08001015}
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 */
1024static 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
Daode Huangb7623812016-06-21 11:56:31 +08001031 spin_lock_bh(&dsaf_dev->tcam_lock);
1032
huangdaode511e6bc2015-09-17 14:51:49 +08001033 /*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 =
huangdaode511e6bc2015-09-17 14:51:49 +08001041 dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RDATA_HIGH_0_REG);
Daode Huangf56c1b32016-06-21 11:56:32 +08001042 ptbl_tcam_data->tbl_tcam_data_low =
1043 dsaf_read_dev(dsaf_dev, DSAF_TBL_TCAM_RDATA_LOW_0_REG);
huangdaode511e6bc2015-09-17 14:51:49 +08001044
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);
Daode Huangb7623812016-06-21 11:56:31 +08001063
1064 spin_unlock_bh(&dsaf_dev->tcam_lock);
huangdaode511e6bc2015-09-17 14:51:49 +08001065}
1066
1067/**
1068 * hns_dsaf_tbl_line_init - INT
1069 * @dsaf_id: dsa fabric id
1070 */
1071static 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 */
1085static 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 */
1100static void hns_dsaf_pfc_en_cfg(struct dsaf_device *dsaf_dev,
Lisheng5ada37b2016-03-31 21:00:09 +08001101 int mac_id, int tc_en)
huangdaode511e6bc2015-09-17 14:51:49 +08001102{
Lisheng5ada37b2016-03-31 21:00:09 +08001103 dsaf_write_dev(dsaf_dev, DSAF_PFC_EN_0_REG + mac_id * 4, tc_en);
1104}
1105
1106static 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
1122int 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)) {
Qianqian Xie14ae3352016-06-21 11:56:22 +08001126 if (!en) {
Lisheng5ada37b2016-03-31 21:00:09 +08001127 dev_err(dsaf_dev->dev, "dsafv1 can't close rx_pause!\n");
Qianqian Xie14ae3352016-06-21 11:56:22 +08001128 return -EINVAL;
1129 }
Lisheng5ada37b2016-03-31 21:00:09 +08001130 }
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
1138void 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;
huangdaode511e6bc2015-09-17 14:51:49 +08001143 else
Lisheng5ada37b2016-03-31 21:00:09 +08001144 *en = dsaf_get_dev_bit(dsaf_dev,
1145 DSAF_PAUSE_CFG_REG + mac_id * 4,
1146 DSAF_MAC_PAUSE_RX_EN_B);
huangdaode511e6bc2015-09-17 14:51:49 +08001147}
1148
1149/**
1150 * hns_dsaf_tbl_tcam_init - INT
1151 * @dsaf_id: dsa fabric id
1152 * @dsaf_mode
1153 */
1154static void hns_dsaf_comm_init(struct dsaf_device *dsaf_dev)
1155{
1156 u32 i;
1157 u32 o_dsaf_cfg;
Lisheng5ada37b2016-03-31 21:00:09 +08001158 bool is_ver1 = AE_IS_VER1(dsaf_dev->dsaf_ver);
huangdaode511e6bc2015-09-17 14:51:49 +08001159
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
yankejian45686372015-10-13 09:53:45 +08001174 /* set promisc def queue id */
1175 hns_dsaf_mix_def_qid_cfg(dsaf_dev);
1176
yankejian68c222a2016-03-05 14:10:42 +08001177 /* set inner loopback queue id */
1178 hns_dsaf_inner_qid_cfg(dsaf_dev);
1179
huangdaode511e6bc2015-09-17 14:51:49 +08001180 /* 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*/
Lisheng5ada37b2016-03-31 21:00:09 +08001184 for (i = 0; i < DSAF_COMM_CHN; i++) {
huangdaode511e6bc2015-09-17 14:51:49 +08001185 hns_dsaf_pfc_en_cfg(dsaf_dev, i, 0);
Lisheng5ada37b2016-03-31 21:00:09 +08001186 hns_dsaf_set_pfc_pause(dsaf_dev, i, is_ver1, is_ver1);
1187 }
huangdaode511e6bc2015-09-17 14:51:49 +08001188
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 */
1207static 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
Salil13ac6952015-12-03 12:17:53 +00001218 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 }
huangdaode511e6bc2015-09-17 14:51:49 +08001249 for (i = 0; i < DSAF_INODE_NUM; i++) {
huangdaode511e6bc2015-09-17 14:51:49 +08001250 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 */
1259static int hns_dsaf_sbm_init(struct dsaf_device *dsaf_dev)
1260{
1261 u32 flag;
Salil13ac6952015-12-03 12:17:53 +00001262 u32 finish_msk;
huangdaode511e6bc2015-09-17 14:51:49 +08001263 u32 cnt = 0;
1264 int ret;
1265
Salil13ac6952015-12-03 12:17:53 +00001266 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 }
huangdaode511e6bc2015-09-17 14:51:49 +08001273
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);*/
Salil13ac6952015-12-03 12:17:53 +00001291 flag = dsaf_get_dev_field(dsaf_dev, DSAF_SRAM_INIT_OVER_0_REG,
1292 finish_msk, DSAF_SRAM_INIT_OVER_S);
huangdaode511e6bc2015-09-17 14:51:49 +08001293 cnt++;
Salil13ac6952015-12-03 12:17:53 +00001294 } while (flag != (finish_msk >> DSAF_SRAM_INIT_OVER_S) &&
1295 cnt < DSAF_CFG_READ_CNT);
huangdaode511e6bc2015-09-17 14:51:49 +08001296
Salil13ac6952015-12-03 12:17:53 +00001297 if (flag != (finish_msk >> DSAF_SRAM_INIT_OVER_S)) {
huangdaode511e6bc2015-09-17 14:51:49 +08001298 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 */
1313static 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 */
1325static 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 */
1334static 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
Kejian Yana24274a2016-06-03 10:55:17 +08001341 dsaf_dev->misc_op->dsaf_reset(dsaf_dev, 0);
huangdaode511e6bc2015-09-17 14:51:49 +08001342 mdelay(10);
Kejian Yana24274a2016-06-03 10:55:17 +08001343 dsaf_dev->misc_op->dsaf_reset(dsaf_dev, 1);
huangdaode511e6bc2015-09-17 14:51:49 +08001344
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 */
1368static void hns_dsaf_remove_hw(struct dsaf_device *dsaf_dev)
1369{
1370 /*reset*/
Kejian Yana24274a2016-06-03 10:55:17 +08001371 dsaf_dev->misc_op->dsaf_reset(dsaf_dev, 0);
huangdaode511e6bc2015-09-17 14:51:49 +08001372}
1373
1374/**
1375 * hns_dsaf_init - init dsa fabric
1376 * @dsaf_dev: dsa fabric device struct pointer
1377 * retuen 0 - success , negative --fail
1378 */
1379static 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
Yisen.Zhuang\(Zhuangyuzeng\)89a44092016-04-23 17:05:05 +08001386 if (HNS_DSAF_IS_DEBUG(dsaf_dev))
1387 return 0;
1388
Daode Huangb7623812016-06-21 11:56:31 +08001389 spin_lock_init(&dsaf_dev->tcam_lock);
huangdaode511e6bc2015-09-17 14:51:49 +08001390 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
1408remove_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 */
1417static 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 */
1434static 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 */
1461static 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 */
1488static 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 */
1517int 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)) {
Andy Shevchenko98900a82015-12-10 17:23:10 +02001532 dev_err(dsaf_dev->dev, "set_uc %s Mac %pM err!\n",
1533 dsaf_dev->ae_dev.name, mac_entry->addr);
huangdaode511e6bc2015-09-17 14:51:49 +08001534 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 */
1586int 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)) {
Andy Shevchenko98900a82015-12-10 17:23:10 +02001600 dev_err(dsaf_dev->dev, "set uc %s Mac %pM err!\n",
1601 dsaf_dev->ae_dev.name, mac_entry->addr);
huangdaode511e6bc2015-09-17 14:51:49 +08001602 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 */
1661int 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)) {
Andy Shevchenko98900a82015-12-10 17:23:10 +02001675 dev_err(dsaf_dev->dev, "set_entry failed,addr %pM!\n",
1676 mac_entry->addr);
huangdaode511e6bc2015-09-17 14:51:49 +08001677 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 */
1748int 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)) {
Andy Shevchenko98900a82015-12-10 17:23:10 +02001759 dev_err(dsaf_dev->dev, "del_entry failed,addr %pM!\n",
1760 addr);
huangdaode511e6bc2015-09-17 14:51:49 +08001761 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 */
1797int 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)) {
Andy Shevchenko98900a82015-12-10 17:23:10 +02001824 dev_err(dsaf_dev->dev, "del_port failed, addr %pM!\n",
1825 mac_entry->addr);
huangdaode511e6bc2015-09-17 14:51:49 +08001826 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 */
1891int 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)) {
Andy Shevchenko98900a82015-12-10 17:23:10 +02001902 dev_err(dsaf_dev->dev, "get_entry failed,addr %pM\n",
1903 mac_entry->addr);
huangdaode511e6bc2015-09-17 14:51:49 +08001904 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 */
1939int 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)) {
Andy Shevchenko98900a82015-12-10 17:23:10 +02001950 dev_err(dsaf_dev->dev, "get_entry failed,addr %pM\n",
1951 mac_entry->addr);
huangdaode511e6bc2015-09-17 14:51:49 +08001952 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 */
1988int 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
2033static 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 */
2054static 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 */
2065static 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 */
2095void 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 */
2119void 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
Daode Huang379d3952016-06-21 11:56:30 +08002135static 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
huangdaode511e6bc2015-09-17 14:51:49 +08002147void 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];
Lisheng5ada37b2016-03-31 21:00:09 +08002151 bool is_ver1 = AE_IS_VER1(dsaf_dev->dsaf_ver);
Daode Huang379d3952016-06-21 11:56:30 +08002152 int i;
Lisheng5ada37b2016-03-31 21:00:09 +08002153 u32 reg_tmp;
huangdaode511e6bc2015-09-17 14:51:49 +08002154
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);
Lisheng5ada37b2016-03-31 21:00:09 +08002163
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
huangdaode511e6bc2015-09-17 14:51:49 +08002169 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
Daode Huang379d3952016-06-21 11:56:30 +08002187 /* 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 }
huangdaode511e6bc2015-09-17 14:51:49 +08002199 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 */
2208void hns_dsaf_get_regs(struct dsaf_device *ddev, u32 port, void *data)
2209{
2210 u32 i = 0;
2211 u32 j;
2212 u32 *p = data;
Lisheng5ada37b2016-03-31 21:00:09 +08002213 u32 reg_tmp;
2214 bool is_ver1 = AE_IS_VER1(ddev->dsaf_ver);
huangdaode511e6bc2015-09-17 14:51:49 +08002215
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);
Lisheng5ada37b2016-03-31 21:00:09 +08002279 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);
huangdaode511e6bc2015-09-17 14:51:49 +08002282 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 */
Salil13ac6952015-12-03 12:17:53 +00002318 for (i = 0; i < HNS_DSAF_SBM_NUM(ddev) / DSAF_COMM_CHN; i++) {
huangdaode511e6bc2015-09-17 14:51:49 +08002319 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,
Qianqian Xie52613122016-03-24 19:08:00 +08002379 DSAF_XOD_ETS_TSA_TC0_TC3_CFG_0_REG + i * 0x90);
huangdaode511e6bc2015-09-17 14:51:49 +08002380 p[319 + i] = dsaf_read_dev(ddev,
Qianqian Xie52613122016-03-24 19:08:00 +08002381 DSAF_XOD_ETS_TSA_TC4_TC7_CFG_0_REG + i * 0x90);
huangdaode511e6bc2015-09-17 14:51:49 +08002382 p[327 + i] = dsaf_read_dev(ddev,
Qianqian Xie52613122016-03-24 19:08:00 +08002383 DSAF_XOD_ETS_BW_TC0_TC3_CFG_0_REG + i * 0x90);
huangdaode511e6bc2015-09-17 14:51:49 +08002384 p[335 + i] = dsaf_read_dev(ddev,
Qianqian Xie52613122016-03-24 19:08:00 +08002385 DSAF_XOD_ETS_BW_TC4_TC7_CFG_0_REG + i * 0x90);
huangdaode511e6bc2015-09-17 14:51:49 +08002386 p[343 + i] = dsaf_read_dev(ddev,
Qianqian Xie52613122016-03-24 19:08:00 +08002387 DSAF_XOD_ETS_BW_OFFSET_CFG_0_REG + i * 0x90);
huangdaode511e6bc2015-09-17 14:51:49 +08002388 p[351 + i] = dsaf_read_dev(ddev,
Qianqian Xie52613122016-03-24 19:08:00 +08002389 DSAF_XOD_ETS_TOKEN_CFG_0_REG + i * 0x90);
huangdaode511e6bc2015-09-17 14:51:49 +08002390 }
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
Lisheng5ada37b2016-03-31 21:00:09 +08002528 if (!is_ver1)
2529 p[498] = dsaf_read_dev(ddev, DSAF_PAUSE_CFG_REG + port * 0x4);
2530
huangdaode511e6bc2015-09-17 14:51:49 +08002531 /* mark end of dsaf regs */
Lisheng5ada37b2016-03-31 21:00:09 +08002532 for (i = 499; i < 504; i++)
huangdaode511e6bc2015-09-17 14:51:49 +08002533 p[i] = 0xdddddddd;
2534}
2535
Daode Huang379d3952016-06-21 11:56:30 +08002536static char *hns_dsaf_get_node_stats_strings(char *data, int node,
2537 struct dsaf_device *dsaf_dev)
huangdaode511e6bc2015-09-17 14:51:49 +08002538{
2539 char *buff = data;
Daode Huang379d3952016-06-21 11:56:30 +08002540 int i;
2541 bool is_ver1 = AE_IS_VER1(dsaf_dev->dsaf_ver);
huangdaode511e6bc2015-09-17 14:51:49 +08002542
2543 snprintf(buff, ETH_GSTRING_LEN, "innod%d_pad_drop_pkts", node);
Daode Huang8ec98ba2016-07-01 17:34:07 +08002544 buff += ETH_GSTRING_LEN;
huangdaode511e6bc2015-09-17 14:51:49 +08002545 snprintf(buff, ETH_GSTRING_LEN, "innod%d_manage_pkts", node);
Daode Huang8ec98ba2016-07-01 17:34:07 +08002546 buff += ETH_GSTRING_LEN;
huangdaode511e6bc2015-09-17 14:51:49 +08002547 snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkts", node);
Daode Huang8ec98ba2016-07-01 17:34:07 +08002548 buff += ETH_GSTRING_LEN;
huangdaode511e6bc2015-09-17 14:51:49 +08002549 snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkt_id", node);
Daode Huang8ec98ba2016-07-01 17:34:07 +08002550 buff += ETH_GSTRING_LEN;
huangdaode511e6bc2015-09-17 14:51:49 +08002551 snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pause_frame", node);
Daode Huang8ec98ba2016-07-01 17:34:07 +08002552 buff += ETH_GSTRING_LEN;
huangdaode511e6bc2015-09-17 14:51:49 +08002553 snprintf(buff, ETH_GSTRING_LEN, "innod%d_release_buf_num", node);
Daode Huang8ec98ba2016-07-01 17:34:07 +08002554 buff += ETH_GSTRING_LEN;
huangdaode511e6bc2015-09-17 14:51:49 +08002555 snprintf(buff, ETH_GSTRING_LEN, "innod%d_sbm_drop_pkts", node);
Daode Huang8ec98ba2016-07-01 17:34:07 +08002556 buff += ETH_GSTRING_LEN;
huangdaode511e6bc2015-09-17 14:51:49 +08002557 snprintf(buff, ETH_GSTRING_LEN, "innod%d_crc_false_pkts", node);
Daode Huang8ec98ba2016-07-01 17:34:07 +08002558 buff += ETH_GSTRING_LEN;
huangdaode511e6bc2015-09-17 14:51:49 +08002559 snprintf(buff, ETH_GSTRING_LEN, "innod%d_bp_drop_pkts", node);
Daode Huang8ec98ba2016-07-01 17:34:07 +08002560 buff += ETH_GSTRING_LEN;
huangdaode511e6bc2015-09-17 14:51:49 +08002561 snprintf(buff, ETH_GSTRING_LEN, "innod%d_lookup_rslt_drop_pkts", node);
Daode Huang8ec98ba2016-07-01 17:34:07 +08002562 buff += ETH_GSTRING_LEN;
huangdaode511e6bc2015-09-17 14:51:49 +08002563 snprintf(buff, ETH_GSTRING_LEN, "innod%d_local_rslt_fail_pkts", node);
Daode Huang8ec98ba2016-07-01 17:34:07 +08002564 buff += ETH_GSTRING_LEN;
huangdaode511e6bc2015-09-17 14:51:49 +08002565 snprintf(buff, ETH_GSTRING_LEN, "innod%d_vlan_drop_pkts", node);
Daode Huang8ec98ba2016-07-01 17:34:07 +08002566 buff += ETH_GSTRING_LEN;
huangdaode511e6bc2015-09-17 14:51:49 +08002567 snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node);
Daode Huang8ec98ba2016-07-01 17:34:07 +08002568 buff += ETH_GSTRING_LEN;
Daode Huang68fa1632016-07-01 17:34:08 +08002569 if (node < DSAF_SERVICE_NW_NUM && !is_ver1) {
Daode Huang379d3952016-06-21 11:56:30 +08002570 for (i = 0; i < DSAF_PRIO_NR; i++) {
Daode Huang45fc7642016-07-01 17:34:10 +08002571 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);
Daode Huang8ec98ba2016-07-01 17:34:07 +08002577 buff += ETH_GSTRING_LEN;
Daode Huang379d3952016-06-21 11:56:30 +08002578 }
Daode Huang45fc7642016-07-01 17:34:10 +08002579 buff += 1 * DSAF_PRIO_NR * ETH_GSTRING_LEN;
Daode Huang379d3952016-06-21 11:56:30 +08002580 }
huangdaode511e6bc2015-09-17 14:51:49 +08002581 snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node);
Daode Huang8ec98ba2016-07-01 17:34:07 +08002582 buff += ETH_GSTRING_LEN;
huangdaode511e6bc2015-09-17 14:51:49 +08002583
2584 return buff;
2585}
2586
2587static u64 *hns_dsaf_get_node_stats(struct dsaf_device *ddev, u64 *data,
2588 int node_num)
2589{
2590 u64 *p = data;
Daode Huang379d3952016-06-21 11:56:30 +08002591 int i;
huangdaode511e6bc2015-09-17 14:51:49 +08002592 struct dsaf_hw_stats *hw_stats = &ddev->hw_stats[node_num];
Daode Huang379d3952016-06-21 11:56:30 +08002593 bool is_ver1 = AE_IS_VER1(ddev->dsaf_ver);
huangdaode511e6bc2015-09-17 14:51:49 +08002594
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;
Daode Huang68fa1632016-07-01 17:34:08 +08002608 if (node_num < DSAF_SERVICE_NW_NUM && !is_ver1) {
Daode Huang379d3952016-06-21 11:56:30 +08002609 for (i = 0; i < DSAF_PRIO_NR; i++) {
Daode Huang45fc7642016-07-01 17:34:10 +08002610 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];
Daode Huang379d3952016-06-21 11:56:30 +08002612 }
2613 p[29] = hw_stats->tx_pkts;
2614 return &p[30];
2615 }
huangdaode511e6bc2015-09-17 14:51:49 +08002616
Daode Huang379d3952016-06-21 11:56:30 +08002617 p[13] = hw_stats->tx_pkts;
huangdaode511e6bc2015-09-17 14:51:49 +08002618 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 */
2627void 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 */
Daode Huang379d3952016-06-21 11:56:30 +08002645int hns_dsaf_get_sset_count(struct dsaf_device *dsaf_dev, int stringset)
huangdaode511e6bc2015-09-17 14:51:49 +08002646{
Daode Huang379d3952016-06-21 11:56:30 +08002647 bool is_ver1 = AE_IS_VER1(dsaf_dev->dsaf_ver);
huangdaode511e6bc2015-09-17 14:51:49 +08002648
Daode Huang379d3952016-06-21 11:56:30 +08002649 if (stringset == ETH_SS_STATS) {
2650 if (is_ver1)
2651 return DSAF_STATIC_NUM;
2652 else
2653 return DSAF_V2_STATIC_NUM;
2654 }
huangdaode511e6bc2015-09-17 14:51:49 +08002655 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 */
Daode Huang379d3952016-06-21 11:56:30 +08002664void hns_dsaf_get_strings(int stringset, u8 *data, int port,
2665 struct dsaf_device *dsaf_dev)
huangdaode511e6bc2015-09-17 14:51:49 +08002666{
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 */
Daode Huang379d3952016-06-21 11:56:30 +08002674 buff = hns_dsaf_get_node_stats_strings(buff, node, dsaf_dev);
huangdaode511e6bc2015-09-17 14:51:49 +08002675
2676 /* for ppe node info */
2677 node = port + DSAF_PPE_INODE_BASE;
Daode Huang379d3952016-06-21 11:56:30 +08002678 (void)hns_dsaf_get_node_stats_strings(buff, node, dsaf_dev);
huangdaode511e6bc2015-09-17 14:51:49 +08002679}
2680
2681/**
2682 *hns_dsaf_get_sset_count - get dsaf regs count
2683 *return dsaf regs count
2684 */
2685int 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 */
2695static 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)
Qianqian Xief6c2df12016-06-21 11:56:25 +08002714 goto free_dev;
huangdaode511e6bc2015-09-17 14:51:49 +08002715
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
2730uninit_ppe:
2731 hns_ppe_uninit(dsaf_dev);
2732
2733uninit_mac:
2734 hns_mac_uninit(dsaf_dev);
2735
2736uninit_dsaf:
2737 hns_dsaf_free(dsaf_dev);
2738
huangdaode511e6bc2015-09-17 14:51:49 +08002739free_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 */
2749static 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
huangdaode511e6bc2015-09-17 14:51:49 +08002761 hns_dsaf_free_dev(dsaf_dev);
2762
2763 return 0;
2764}
2765
2766static const struct of_device_id g_dsaf_match[] = {
2767 {.compatible = "hisilicon,hns-dsaf-v1"},
2768 {.compatible = "hisilicon,hns-dsaf-v2"},
2769 {}
2770};
2771
2772static 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,
Kejian Yan8413b3b2016-06-03 10:55:18 +08002778 .acpi_match_table = hns_dsaf_acpi_match,
huangdaode511e6bc2015-09-17 14:51:49 +08002779 },
2780};
2781
2782module_platform_driver(g_dsaf_driver);
2783
2784MODULE_LICENSE("GPL");
2785MODULE_AUTHOR("Huawei Tech. Co., Ltd.");
2786MODULE_DESCRIPTION("HNS DSAF driver");
2787MODULE_VERSION(DSAF_MOD_VERSION);