aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/hisilicon/hns
diff options
context:
space:
mode:
authoroulijun <oulijun@huawei.com>2016-08-18 08:32:52 -0400
committerDavid S. Miller <davem@davemloft.net>2016-08-19 19:58:33 -0400
commite018068812e54c407da599513bf8ad2d99fd0eaf (patch)
treebb018db88fca35dff805193c83dac495f3276fd8 /drivers/net/ethernet/hisilicon/hns
parenta68d53988bc7f54aa383ecb308e7684c787af67c (diff)
net: hns: Add reset function support for RoCE driver
It added reset function for RoCE driver. RoCE is a feature of hns. In hip06 SoC, in RoCE reset process, it's needed to configure dsaf channel reset, port and sl map info. Reset function of RoCE is located in dsaf module, we only call it in RoCE driver when needed. This patch is used to fix the conflict, please refer to this link: https://www.spinics.net/lists/linux-rdma/msg39114.html Signed-off-by: Wei Hu <xavier.huwei@huawei.com> Signed-off-by: Nenglong Zhao <zhaonenglong@hisilicon.com> Signed-off-by: Lijun Ou <oulijun@huawei.com> Signed-off-by: Sheng Li <lisheng011@huawei.com> Reviewed-by: Yisen Zhuang <yisen.zhuang@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/hisilicon/hns')
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c84
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h30
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c36
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h12
4 files changed, 162 insertions, 0 deletions
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index afb5daa3721d..05bd19f9ebc5 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -18,6 +18,7 @@
18#include <linux/of.h> 18#include <linux/of.h>
19#include <linux/of_address.h> 19#include <linux/of_address.h>
20#include <linux/of_irq.h> 20#include <linux/of_irq.h>
21#include <linux/of_platform.h>
21#include <linux/platform_device.h> 22#include <linux/platform_device.h>
22#include <linux/vmalloc.h> 23#include <linux/vmalloc.h>
23 24
@@ -2781,6 +2782,89 @@ static struct platform_driver g_dsaf_driver = {
2781 2782
2782module_platform_driver(g_dsaf_driver); 2783module_platform_driver(g_dsaf_driver);
2783 2784
2785/**
2786 * hns_dsaf_roce_reset - reset dsaf and roce
2787 * @dsaf_fwnode: Pointer to framework node for the dasf
2788 * @enable: false - request reset , true - drop reset
2789 * retuen 0 - success , negative -fail
2790 */
2791int hns_dsaf_roce_reset(struct fwnode_handle *dsaf_fwnode, bool enable)
2792{
2793 struct dsaf_device *dsaf_dev;
2794 struct platform_device *pdev;
2795 u32 mp;
2796 u32 sl;
2797 u32 credit;
2798 int i;
2799 const u32 port_map[DSAF_ROCE_CREDIT_CHN][DSAF_ROCE_CHAN_MODE_NUM] = {
2800 {DSAF_ROCE_PORT_0, DSAF_ROCE_PORT_0, DSAF_ROCE_PORT_0},
2801 {DSAF_ROCE_PORT_1, DSAF_ROCE_PORT_0, DSAF_ROCE_PORT_0},
2802 {DSAF_ROCE_PORT_2, DSAF_ROCE_PORT_1, DSAF_ROCE_PORT_0},
2803 {DSAF_ROCE_PORT_3, DSAF_ROCE_PORT_1, DSAF_ROCE_PORT_0},
2804 {DSAF_ROCE_PORT_4, DSAF_ROCE_PORT_2, DSAF_ROCE_PORT_1},
2805 {DSAF_ROCE_PORT_4, DSAF_ROCE_PORT_2, DSAF_ROCE_PORT_1},
2806 {DSAF_ROCE_PORT_5, DSAF_ROCE_PORT_3, DSAF_ROCE_PORT_1},
2807 {DSAF_ROCE_PORT_5, DSAF_ROCE_PORT_3, DSAF_ROCE_PORT_1},
2808 };
2809 const u32 sl_map[DSAF_ROCE_CREDIT_CHN][DSAF_ROCE_CHAN_MODE_NUM] = {
2810 {DSAF_ROCE_SL_0, DSAF_ROCE_SL_0, DSAF_ROCE_SL_0},
2811 {DSAF_ROCE_SL_0, DSAF_ROCE_SL_1, DSAF_ROCE_SL_1},
2812 {DSAF_ROCE_SL_0, DSAF_ROCE_SL_0, DSAF_ROCE_SL_2},
2813 {DSAF_ROCE_SL_0, DSAF_ROCE_SL_1, DSAF_ROCE_SL_3},
2814 {DSAF_ROCE_SL_0, DSAF_ROCE_SL_0, DSAF_ROCE_SL_0},
2815 {DSAF_ROCE_SL_1, DSAF_ROCE_SL_1, DSAF_ROCE_SL_1},
2816 {DSAF_ROCE_SL_0, DSAF_ROCE_SL_0, DSAF_ROCE_SL_2},
2817 {DSAF_ROCE_SL_1, DSAF_ROCE_SL_1, DSAF_ROCE_SL_3},
2818 };
2819
2820 if (!is_of_node(dsaf_fwnode)) {
2821 pr_err("hisi_dsaf: Only support DT node!\n");
2822 return -EINVAL;
2823 }
2824 pdev = of_find_device_by_node(to_of_node(dsaf_fwnode));
2825 dsaf_dev = dev_get_drvdata(&pdev->dev);
2826 if (AE_IS_VER1(dsaf_dev->dsaf_ver)) {
2827 dev_err(dsaf_dev->dev, "%s v1 chip doesn't support RoCE!\n",
2828 dsaf_dev->ae_dev.name);
2829 return -ENODEV;
2830 }
2831
2832 if (!enable) {
2833 /* Reset rocee-channels in dsaf and rocee */
2834 hns_dsaf_srst_chns(dsaf_dev, DSAF_CHNS_MASK, false);
2835 hns_dsaf_roce_srst(dsaf_dev, false);
2836 } else {
2837 /* Configure dsaf tx roce correspond to port map and sl map */
2838 mp = dsaf_read_dev(dsaf_dev, DSAF_ROCE_PORT_MAP_REG);
2839 for (i = 0; i < DSAF_ROCE_CREDIT_CHN; i++)
2840 dsaf_set_field(mp, 7 << i * 3, i * 3,
2841 port_map[i][DSAF_ROCE_6PORT_MODE]);
2842 dsaf_set_field(mp, 3 << i * 3, i * 3, 0);
2843 dsaf_write_dev(dsaf_dev, DSAF_ROCE_PORT_MAP_REG, mp);
2844
2845 sl = dsaf_read_dev(dsaf_dev, DSAF_ROCE_SL_MAP_REG);
2846 for (i = 0; i < DSAF_ROCE_CREDIT_CHN; i++)
2847 dsaf_set_field(sl, 3 << i * 2, i * 2,
2848 sl_map[i][DSAF_ROCE_6PORT_MODE]);
2849 dsaf_write_dev(dsaf_dev, DSAF_ROCE_SL_MAP_REG, sl);
2850
2851 /* De-reset rocee-channels in dsaf and rocee */
2852 hns_dsaf_srst_chns(dsaf_dev, DSAF_CHNS_MASK, true);
2853 msleep(SRST_TIME_INTERVAL);
2854 hns_dsaf_roce_srst(dsaf_dev, true);
2855
2856 /* Eanble dsaf channel rocee credit */
2857 credit = dsaf_read_dev(dsaf_dev, DSAF_SBM_ROCEE_CFG_REG_REG);
2858 dsaf_set_bit(credit, DSAF_SBM_ROCEE_CFG_CRD_EN_B, 0);
2859 dsaf_write_dev(dsaf_dev, DSAF_SBM_ROCEE_CFG_REG_REG, credit);
2860
2861 dsaf_set_bit(credit, DSAF_SBM_ROCEE_CFG_CRD_EN_B, 1);
2862 dsaf_write_dev(dsaf_dev, DSAF_SBM_ROCEE_CFG_REG_REG, credit);
2863 }
2864 return 0;
2865}
2866EXPORT_SYMBOL(hns_dsaf_roce_reset);
2867
2784MODULE_LICENSE("GPL"); 2868MODULE_LICENSE("GPL");
2785MODULE_AUTHOR("Huawei Tech. Co., Ltd."); 2869MODULE_AUTHOR("Huawei Tech. Co., Ltd.");
2786MODULE_DESCRIPTION("HNS DSAF driver"); 2870MODULE_DESCRIPTION("HNS DSAF driver");
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
index 1daf018d9071..f3681d566ae6 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
@@ -43,6 +43,32 @@ struct hns_mac_cb;
43#define DSAF_PRIO_NR 8 43#define DSAF_PRIO_NR 8
44#define DSAF_REG_PER_ZONE 3 44#define DSAF_REG_PER_ZONE 3
45 45
46#define DSAF_ROCE_CREDIT_CHN 8
47#define DSAF_ROCE_CHAN_MODE 3
48
49enum dsaf_roce_port_mode {
50 DSAF_ROCE_6PORT_MODE,
51 DSAF_ROCE_4PORT_MODE,
52 DSAF_ROCE_2PORT_MODE,
53 DSAF_ROCE_CHAN_MODE_NUM,
54};
55
56enum dsaf_roce_port_num {
57 DSAF_ROCE_PORT_0,
58 DSAF_ROCE_PORT_1,
59 DSAF_ROCE_PORT_2,
60 DSAF_ROCE_PORT_3,
61 DSAF_ROCE_PORT_4,
62 DSAF_ROCE_PORT_5,
63};
64
65enum dsaf_roce_qos_sl {
66 DSAF_ROCE_SL_0,
67 DSAF_ROCE_SL_1,
68 DSAF_ROCE_SL_2,
69 DSAF_ROCE_SL_3,
70};
71
46#define DSAF_STATS_READ(p, offset) (*((u64 *)((u8 *)(p) + (offset)))) 72#define DSAF_STATS_READ(p, offset) (*((u64 *)((u8 *)(p) + (offset))))
47#define HNS_DSAF_IS_DEBUG(dev) (dev->dsaf_mode == DSAF_MODE_DISABLE_SP) 73#define HNS_DSAF_IS_DEBUG(dev) (dev->dsaf_mode == DSAF_MODE_DISABLE_SP)
48 74
@@ -419,6 +445,10 @@ int hns_dsaf_get_mac_entry_by_index(
419 445
420void hns_dsaf_fix_mac_mode(struct hns_mac_cb *mac_cb); 446void hns_dsaf_fix_mac_mode(struct hns_mac_cb *mac_cb);
421 447
448void hns_dsaf_srst_chns(struct dsaf_device *dsaf_dev, u32 msk, bool enable);
449
450void hns_dsaf_roce_srst(struct dsaf_device *dsaf_dev, bool enable);
451
422int hns_dsaf_ae_init(struct dsaf_device *dsaf_dev); 452int hns_dsaf_ae_init(struct dsaf_device *dsaf_dev);
423void hns_dsaf_ae_uninit(struct dsaf_device *dsaf_dev); 453void hns_dsaf_ae_uninit(struct dsaf_device *dsaf_dev);
424 454
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
index 611b67b6f450..36b9f791cf2f 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
@@ -231,6 +231,42 @@ static void hns_dsaf_xge_core_srst_by_port(struct dsaf_device *dsaf_dev,
231 dsaf_write_sub(dsaf_dev, reg_addr, reg_val); 231 dsaf_write_sub(dsaf_dev, reg_addr, reg_val);
232} 232}
233 233
234/**
235 * hns_dsaf_srst_chns - reset dsaf channels
236 * @dsaf_dev: dsaf device struct pointer
237 * @msk: xbar channels mask value:
238 * bit0-5 for xge0-5
239 * bit6-11 for ppe0-5
240 * bit12-17 for roce0-5
241 * bit18-19 for com/dfx
242 * @enable: false - request reset , true - drop reset
243 */
244void hns_dsaf_srst_chns(struct dsaf_device *dsaf_dev, u32 msk, bool enable)
245{
246 u32 reg_addr;
247
248 if (!enable)
249 reg_addr = DSAF_SUB_SC_DSAF_RESET_REQ_REG;
250 else
251 reg_addr = DSAF_SUB_SC_DSAF_RESET_DREQ_REG;
252
253 dsaf_write_sub(dsaf_dev, reg_addr, msk);
254}
255
256void hns_dsaf_roce_srst(struct dsaf_device *dsaf_dev, bool enable)
257{
258 if (!enable) {
259 dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_ROCEE_RESET_REQ_REG, 1);
260 } else {
261 dsaf_write_sub(dsaf_dev,
262 DSAF_SUB_SC_ROCEE_CLK_DIS_REG, 1);
263 dsaf_write_sub(dsaf_dev,
264 DSAF_SUB_SC_ROCEE_RESET_DREQ_REG, 1);
265 msleep(20);
266 dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_ROCEE_CLK_EN_REG, 1);
267 }
268}
269
234static void 270static void
235hns_dsaf_xge_core_srst_by_port_acpi(struct dsaf_device *dsaf_dev, 271hns_dsaf_xge_core_srst_by_port_acpi(struct dsaf_device *dsaf_dev,
236 u32 port, bool dereset) 272 u32 port, bool dereset)
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
index 235f74444b1d..13c16ab7be48 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
@@ -77,6 +77,12 @@
77#define DSAF_SUB_SC_PPE_RESET_DREQ_REG 0xA4C 77#define DSAF_SUB_SC_PPE_RESET_DREQ_REG 0xA4C
78#define DSAF_SUB_SC_RCB_PPE_COM_RESET_REQ_REG 0xA88 78#define DSAF_SUB_SC_RCB_PPE_COM_RESET_REQ_REG 0xA88
79#define DSAF_SUB_SC_RCB_PPE_COM_RESET_DREQ_REG 0xA8C 79#define DSAF_SUB_SC_RCB_PPE_COM_RESET_DREQ_REG 0xA8C
80#define DSAF_SUB_SC_DSAF_RESET_REQ_REG 0xAA8
81#define DSAF_SUB_SC_ROCEE_RESET_REQ_REG 0xA50
82#define DSAF_SUB_SC_DSAF_RESET_DREQ_REG 0xAAC
83#define DSAF_SUB_SC_ROCEE_CLK_DIS_REG 0x32C
84#define DSAF_SUB_SC_ROCEE_RESET_DREQ_REG 0xA54
85#define DSAF_SUB_SC_ROCEE_CLK_EN_REG 0x328
80#define DSAF_SUB_SC_LIGHT_MODULE_DETECT_EN_REG 0x2060 86#define DSAF_SUB_SC_LIGHT_MODULE_DETECT_EN_REG 0x2060
81#define DSAF_SUB_SC_TCAM_MBIST_EN_REG 0x2300 87#define DSAF_SUB_SC_TCAM_MBIST_EN_REG 0x2300
82#define DSAF_SUB_SC_DSAF_CLK_ST_REG 0x5300 88#define DSAF_SUB_SC_DSAF_CLK_ST_REG 0x5300
@@ -133,6 +139,8 @@
133#define DSAF_ROCEE_INT_STS_0_REG 0x200 139#define DSAF_ROCEE_INT_STS_0_REG 0x200
134#define DSAFV2_SERDES_LBK_0_REG 0x220 140#define DSAFV2_SERDES_LBK_0_REG 0x220
135#define DSAF_PAUSE_CFG_REG 0x240 141#define DSAF_PAUSE_CFG_REG 0x240
142#define DSAF_ROCE_PORT_MAP_REG 0x2A0
143#define DSAF_ROCE_SL_MAP_REG 0x2A4
136#define DSAF_PPE_QID_CFG_0_REG 0x300 144#define DSAF_PPE_QID_CFG_0_REG 0x300
137#define DSAF_SW_PORT_TYPE_0_REG 0x320 145#define DSAF_SW_PORT_TYPE_0_REG 0x320
138#define DSAF_STP_PORT_TYPE_0_REG 0x340 146#define DSAF_STP_PORT_TYPE_0_REG 0x340
@@ -178,6 +186,7 @@
178#define DSAF_SBM_BP_CFG_2_XGE_REG_0_REG 0x200C 186#define DSAF_SBM_BP_CFG_2_XGE_REG_0_REG 0x200C
179#define DSAF_SBM_BP_CFG_2_PPE_REG_0_REG 0x230C 187#define DSAF_SBM_BP_CFG_2_PPE_REG_0_REG 0x230C
180#define DSAF_SBM_BP_CFG_2_ROCEE_REG_0_REG 0x260C 188#define DSAF_SBM_BP_CFG_2_ROCEE_REG_0_REG 0x260C
189#define DSAF_SBM_ROCEE_CFG_REG_REG 0x2380
181#define DSAFV2_SBM_BP_CFG_2_ROCEE_REG_0_REG 0x238C 190#define DSAFV2_SBM_BP_CFG_2_ROCEE_REG_0_REG 0x238C
182#define DSAF_SBM_FREE_CNT_0_0_REG 0x2010 191#define DSAF_SBM_FREE_CNT_0_0_REG 0x2010
183#define DSAF_SBM_FREE_CNT_1_0_REG 0x2014 192#define DSAF_SBM_FREE_CNT_1_0_REG 0x2014
@@ -796,6 +805,9 @@
796#define DSAFV2_SBM_CFG4_RESET_BUF_NUM_NO_PFC_S 9 805#define DSAFV2_SBM_CFG4_RESET_BUF_NUM_NO_PFC_S 9
797#define DSAFV2_SBM_CFG4_RESET_BUF_NUM_NO_PFC_M (((1ULL << 9) - 1) << 9) 806#define DSAFV2_SBM_CFG4_RESET_BUF_NUM_NO_PFC_M (((1ULL << 9) - 1) << 9)
798 807
808#define DSAF_CHNS_MASK 0x3f000
809#define DSAF_SBM_ROCEE_CFG_CRD_EN_B 2
810#define SRST_TIME_INTERVAL 20
799#define DSAFV2_SBM_CFG2_ROCEE_SET_BUF_NUM_S 0 811#define DSAFV2_SBM_CFG2_ROCEE_SET_BUF_NUM_S 0
800#define DSAFV2_SBM_CFG2_ROCEE_SET_BUF_NUM_M (((1ULL << 8) - 1) << 0) 812#define DSAFV2_SBM_CFG2_ROCEE_SET_BUF_NUM_M (((1ULL << 8) - 1) << 0)
801#define DSAFV2_SBM_CFG2_ROCEE_RESET_BUF_NUM_S 8 813#define DSAFV2_SBM_CFG2_ROCEE_RESET_BUF_NUM_S 8