Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: hns: separate debug dsaf device from service dsaf device

There are two kinds of dsaf device in hns, one is for service ports,
contains crossbar in it, can work under different mode. Another is for
debug port, only can work under "single-port" mode. The current code only
declared a dsaf device for both service ports and debug ports. This patch
separate it to three platform devices.

Here is the diagram of all port in one platform device(old):
CPU
|
| DSAF(one platform device)
-------------------------------------------------------------- /
| | | | | /
| PPE PPE PPE | /
| | | | | /
| | | | | /
| crossbar | | | /
| | | | |/
| ----------------------------------- | | |
| | | | | | | | | |
| | | | | | | | | |
| MAC MAC MAC MAC MAC MAC MAC MAC |
| | | | | | | | | |
--------------------------------------------------------------
| | | | | | | |
PHY PHY PHY PHY PHY PHY PHY PHY

Here is the diagram of separate all ports to three platform(new):
CPU
|
-----------------------------------
| | |
---------------------------------------------- --------- ---------
| | | | | | | |
| PPE | | PPE | | PPE |
| | | | | | | | |
| | | | | | | | |
| crossbar | | | | | | |
| | | | | | | | |
| ---------------------------------- | | | | | | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
| MAC MAC MAC MAC MAC MAC | | MAC | | MAC |
| | | | | | | | | | | | | |
---------------------------------------------- --------- ---------
| | | | | | \ / | / |
PHY PHY PHY PHY PHY PHY \ / PHY / PHY
\ / /
\ / /
DSAF(three platform device)

Signed-off-by: Daode Huang <huangdaode@hisilicon.com>
Signed-off-by: Yisen Zhuang <yisen.zhuang@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Yisen.Zhuang\(Zhuangyuzeng\) and committed by
David S. Miller
831d828b 2e2591b1

+258 -238
+10 -30
drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
··· 37 37 static struct hns_ppe_cb *hns_get_ppe_cb(struct hnae_handle *handle) 38 38 { 39 39 int ppe_index; 40 - int ppe_common_index; 41 40 struct ppe_common_cb *ppe_comm; 42 41 struct hnae_vf_cb *vf_cb = hns_ae_get_vf_cb(handle); 43 42 44 - if (vf_cb->port_index < DSAF_SERVICE_PORT_NUM_PER_DSAF) { 45 - ppe_index = vf_cb->port_index; 46 - ppe_common_index = 0; 47 - } else { 48 - ppe_index = 0; 49 - ppe_common_index = 50 - vf_cb->port_index - DSAF_SERVICE_PORT_NUM_PER_DSAF + 1; 51 - } 52 - ppe_comm = vf_cb->dsaf_dev->ppe_common[ppe_common_index]; 43 + ppe_comm = vf_cb->dsaf_dev->ppe_common[0]; 44 + ppe_index = vf_cb->port_index; 45 + 53 46 return &ppe_comm->ppe_cb[ppe_index]; 54 47 } 55 48 56 49 static int hns_ae_get_q_num_per_vf( 57 50 struct dsaf_device *dsaf_dev, int port) 58 51 { 59 - int common_idx = hns_dsaf_get_comm_idx_by_port(port); 60 - 61 - return dsaf_dev->rcb_common[common_idx]->max_q_per_vf; 52 + return dsaf_dev->rcb_common[0]->max_q_per_vf; 62 53 } 63 54 64 55 static int hns_ae_get_vf_num_per_port( 65 56 struct dsaf_device *dsaf_dev, int port) 66 57 { 67 - int common_idx = hns_dsaf_get_comm_idx_by_port(port); 68 - 69 - return dsaf_dev->rcb_common[common_idx]->max_vfn; 58 + return dsaf_dev->rcb_common[0]->max_vfn; 70 59 } 71 60 72 61 static struct ring_pair_cb *hns_ae_get_base_ring_pair( 73 62 struct dsaf_device *dsaf_dev, int port) 74 63 { 75 - int common_idx = hns_dsaf_get_comm_idx_by_port(port); 76 - struct rcb_common_cb *rcb_comm = dsaf_dev->rcb_common[common_idx]; 64 + struct rcb_common_cb *rcb_comm = dsaf_dev->rcb_common[0]; 77 65 int q_num = rcb_comm->max_q_per_vf; 78 66 int vf_num = rcb_comm->max_vfn; 79 67 80 - if (!HNS_DSAF_IS_DEBUG(dsaf_dev)) 81 - return &rcb_comm->ring_pair_cb[port * q_num * vf_num]; 82 - else 83 - return &rcb_comm->ring_pair_cb[0]; 68 + return &rcb_comm->ring_pair_cb[port * q_num * vf_num]; 84 69 } 85 70 86 71 static struct ring_pair_cb *hns_ae_get_ring_pair(struct hnae_queue *q) ··· 128 143 129 144 vf_cb->dsaf_dev = dsaf_dev; 130 145 vf_cb->port_index = port_id; 131 - vf_cb->mac_cb = &dsaf_dev->mac_cb[port_id]; 146 + vf_cb->mac_cb = dsaf_dev->mac_cb[port_id]; 132 147 133 148 ae_handle->phy_if = vf_cb->mac_cb->phy_if; 134 149 ae_handle->phy_node = vf_cb->mac_cb->phy_node; ··· 284 299 struct hnae_vf_cb *vf_cb = hns_ae_get_vf_cb(handle); 285 300 286 301 if (vf_cb->mac_cb->mac_type == HNAE_PORT_DEBUG) { 287 - u8 ppe_common_index = 288 - vf_cb->port_index - DSAF_SERVICE_PORT_NUM_PER_DSAF + 1; 289 - 290 302 hns_mac_reset(vf_cb->mac_cb); 291 - hns_ppe_reset_common(vf_cb->dsaf_dev, ppe_common_index); 303 + hns_ppe_reset_common(vf_cb->dsaf_dev, 0); 292 304 } 293 305 } 294 306 ··· 684 702 void hns_ae_get_regs(struct hnae_handle *handle, void *data) 685 703 { 686 704 u32 *p = data; 687 - u32 rcb_com_idx; 688 705 int i; 689 706 struct hnae_vf_cb *vf_cb = hns_ae_get_vf_cb(handle); 690 707 struct hns_ppe_cb *ppe_cb = hns_get_ppe_cb(handle); ··· 691 710 hns_ppe_get_regs(ppe_cb, p); 692 711 p += hns_ppe_get_regs_count(); 693 712 694 - rcb_com_idx = hns_dsaf_get_comm_idx_by_port(vf_cb->port_index); 695 - hns_rcb_get_common_regs(vf_cb->dsaf_dev->rcb_common[rcb_com_idx], p); 713 + hns_rcb_get_common_regs(vf_cb->dsaf_dev->rcb_common[0], p); 696 714 p += hns_rcb_get_common_regs_count(); 697 715 698 716 for (i = 0; i < handle->q_num; i++) {
+108 -44
drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
··· 10 10 #include <linux/init.h> 11 11 #include <linux/interrupt.h> 12 12 #include <linux/kernel.h> 13 + #include <linux/mfd/syscon.h> 13 14 #include <linux/module.h> 14 15 #include <linux/netdevice.h> 15 16 #include <linux/of.h> ··· 169 168 u8 vmid, u8 *port_num) 170 169 { 171 170 u8 tmp_port; 172 - u32 comm_idx; 173 171 174 172 if (mac_cb->dsaf_dev->dsaf_mode <= DSAF_MODE_ENABLE) { 175 - if (mac_cb->mac_id != DSAF_MAX_PORT_NUM_PER_CHIP) { 173 + if (mac_cb->mac_id != DSAF_MAX_PORT_NUM) { 176 174 dev_err(mac_cb->dev, 177 175 "input invalid,%s mac%d vmid%d !\n", 178 176 mac_cb->dsaf_dev->ae_dev.name, ··· 179 179 return -EINVAL; 180 180 } 181 181 } else if (mac_cb->dsaf_dev->dsaf_mode < DSAF_MODE_MAX) { 182 - if (mac_cb->mac_id >= DSAF_MAX_PORT_NUM_PER_CHIP) { 182 + if (mac_cb->mac_id >= DSAF_MAX_PORT_NUM) { 183 183 dev_err(mac_cb->dev, 184 184 "input invalid,%s mac%d vmid%d!\n", 185 185 mac_cb->dsaf_dev->ae_dev.name, ··· 192 192 return -EINVAL; 193 193 } 194 194 195 - comm_idx = hns_dsaf_get_comm_idx_by_port(mac_cb->mac_id); 196 - 197 - if (vmid >= mac_cb->dsaf_dev->rcb_common[comm_idx]->max_vfn) { 195 + if (vmid >= mac_cb->dsaf_dev->rcb_common[0]->max_vfn) { 198 196 dev_err(mac_cb->dev, "input invalid,%s mac%d vmid%d !\n", 199 197 mac_cb->dsaf_dev->ae_dev.name, mac_cb->mac_id, vmid); 200 198 return -EINVAL; ··· 232 234 } 233 235 234 236 /** 235 - *hns_mac_get_inner_port_num - change vf mac address 237 + *hns_mac_change_vf_addr - change vf mac address 236 238 *@mac_cb: mac device 237 239 *@vmid: vmid 238 240 *@addr:mac address ··· 649 651 } 650 652 651 653 /** 652 - *mac_free_dev - get mac information from device node 654 + *hns_mac_get_info - get mac information from device node 653 655 *@mac_cb: mac device 654 656 *@np:device node 655 - *@mac_mode_idx:mac mode index 657 + * return: 0 --success, negative --fail 656 658 */ 657 - static void hns_mac_get_info(struct hns_mac_cb *mac_cb, 658 - struct device_node *np, u32 mac_mode_idx) 659 + static int hns_mac_get_info(struct hns_mac_cb *mac_cb) 659 660 { 661 + struct device_node *np = mac_cb->dev->of_node; 662 + struct regmap *syscon; 660 663 mac_cb->link = false; 661 664 mac_cb->half_duplex = false; 662 665 mac_cb->speed = mac_phy_to_speed[mac_cb->phy_if]; ··· 674 675 mac_cb->max_frm = MAC_DEFAULT_MTU; 675 676 mac_cb->tx_pause_frm_time = MAC_DEFAULT_PAUSE_TIME; 676 677 677 - /* Get the rest of the PHY information */ 678 - mac_cb->phy_node = of_parse_phandle(np, "phy-handle", mac_cb->mac_id); 678 + /* if the dsaf node doesn't contain a port subnode, get phy-handle 679 + * from dsaf node 680 + */ 681 + if (!mac_cb->fw_port) { 682 + mac_cb->phy_node = of_parse_phandle(np, "phy-handle", 683 + mac_cb->mac_id); 684 + if (mac_cb->phy_node) 685 + dev_dbg(mac_cb->dev, "mac%d phy_node: %s\n", 686 + mac_cb->mac_id, mac_cb->phy_node->name); 687 + return 0; 688 + } 689 + if (!is_of_node(mac_cb->fw_port)) 690 + return -EINVAL; 691 + /* parse property from port subnode in dsaf */ 692 + mac_cb->phy_node = of_parse_phandle(to_of_node(mac_cb->fw_port), 693 + "phy-handle", 0); 679 694 if (mac_cb->phy_node) 680 695 dev_dbg(mac_cb->dev, "mac%d phy_node: %s\n", 681 696 mac_cb->mac_id, mac_cb->phy_node->name); 697 + syscon = syscon_node_to_regmap( 698 + of_parse_phandle(to_of_node(mac_cb->fw_port), 699 + "serdes-syscon", 0)); 700 + if (IS_ERR_OR_NULL(syscon)) { 701 + dev_err(mac_cb->dev, "serdes-syscon is needed!\n"); 702 + return -EINVAL; 703 + } 704 + mac_cb->serdes_ctrl = syscon; 705 + return 0; 682 706 } 683 707 684 708 /** ··· 731 709 return base + 0x40000 + mac_id * 0x4000 - 732 710 mac_mode_idx * 0x20000; 733 711 else 734 - return mac_cb->serdes_vaddr + 0x1000 735 - + (mac_id - DSAF_SERVICE_PORT_NUM_PER_DSAF) * 0x100000; 712 + return dsaf_dev->ppe_base + 0x1000; 736 713 } 737 714 738 715 /** 739 716 * hns_mac_get_cfg - get mac cfg from dtb or acpi table 740 717 * @dsaf_dev: dsa fabric device struct pointer 741 - * @mac_idx: mac index 742 - * retuen 0 - success , negative --fail 718 + * @mac_cb: mac control block 719 + * return 0 - success , negative --fail 743 720 */ 744 - int hns_mac_get_cfg(struct dsaf_device *dsaf_dev, int mac_idx) 721 + int hns_mac_get_cfg(struct dsaf_device *dsaf_dev, struct hns_mac_cb *mac_cb) 745 722 { 746 723 int ret; 747 724 u32 mac_mode_idx; 748 - struct hns_mac_cb *mac_cb = &dsaf_dev->mac_cb[mac_idx]; 749 725 750 726 mac_cb->dsaf_dev = dsaf_dev; 751 727 mac_cb->dev = dsaf_dev->dev; 752 - mac_cb->mac_id = mac_idx; 753 728 754 729 mac_cb->sys_ctl_vaddr = dsaf_dev->sc_base; 755 730 mac_cb->serdes_vaddr = dsaf_dev->sds_base; 756 731 757 - if (dsaf_dev->cpld_base && 758 - mac_idx < DSAF_SERVICE_PORT_NUM_PER_DSAF) { 732 + if (dsaf_dev->cpld_base && !HNS_DSAF_IS_DEBUG(dsaf_dev)) { 759 733 mac_cb->cpld_vaddr = dsaf_dev->cpld_base + 760 734 mac_cb->mac_id * CPLD_ADDR_PORT_OFFSET; 761 735 cpld_led_reset(mac_cb); ··· 760 742 mac_cb->txpkt_for_led = 0; 761 743 mac_cb->rxpkt_for_led = 0; 762 744 763 - if (mac_idx < DSAF_SERVICE_PORT_NUM_PER_DSAF) 745 + if (!HNS_DSAF_IS_DEBUG(dsaf_dev)) 764 746 mac_cb->mac_type = HNAE_PORT_SERVICE; 765 747 else 766 748 mac_cb->mac_type = HNAE_PORT_DEBUG; ··· 776 758 } 777 759 mac_mode_idx = (u32)ret; 778 760 779 - hns_mac_get_info(mac_cb, mac_cb->dev->of_node, mac_mode_idx); 761 + ret = hns_mac_get_info(mac_cb); 762 + if (ret) 763 + return ret; 780 764 781 765 mac_cb->vaddr = hns_mac_get_vaddr(dsaf_dev, mac_cb, mac_mode_idx); 782 766 783 767 return 0; 784 768 } 785 769 770 + static int hns_mac_get_max_port_num(struct dsaf_device *dsaf_dev) 771 + { 772 + if (HNS_DSAF_IS_DEBUG(dsaf_dev)) 773 + return 1; 774 + else 775 + return DSAF_MAX_PORT_NUM; 776 + } 777 + 786 778 /** 787 779 * hns_mac_init - init mac 788 780 * @dsaf_dev: dsa fabric device struct pointer 789 - * retuen 0 - success , negative --fail 781 + * return 0 - success , negative --fail 790 782 */ 791 783 int hns_mac_init(struct dsaf_device *dsaf_dev) 792 784 { 793 - int i; 785 + bool found = false; 794 786 int ret; 795 - size_t size; 787 + u32 port_id; 788 + int max_port_num = hns_mac_get_max_port_num(dsaf_dev); 796 789 struct hns_mac_cb *mac_cb; 790 + struct fwnode_handle *child; 797 791 798 - size = sizeof(struct hns_mac_cb) * DSAF_MAX_PORT_NUM_PER_CHIP; 799 - dsaf_dev->mac_cb = devm_kzalloc(dsaf_dev->dev, size, GFP_KERNEL); 800 - if (!dsaf_dev->mac_cb) 801 - return -ENOMEM; 792 + device_for_each_child_node(dsaf_dev->dev, child) { 793 + ret = fwnode_property_read_u32(child, "port-id", &port_id); 794 + if (ret) { 795 + dev_err(dsaf_dev->dev, 796 + "get port-id fail, ret=%d!\n", ret); 797 + return ret; 798 + } 799 + if (port_id >= max_port_num) { 800 + dev_err(dsaf_dev->dev, 801 + "port-id(%u) out of range!\n", port_id); 802 + return -EINVAL; 803 + } 804 + mac_cb = devm_kzalloc(dsaf_dev->dev, sizeof(*mac_cb), 805 + GFP_KERNEL); 806 + if (!mac_cb) 807 + return -ENOMEM; 808 + mac_cb->fw_port = child; 809 + mac_cb->mac_id = (u8)port_id; 810 + dsaf_dev->mac_cb[port_id] = mac_cb; 811 + found = true; 812 + } 802 813 803 - for (i = 0; i < DSAF_MAX_PORT_NUM_PER_CHIP; i++) { 804 - ret = hns_mac_get_cfg(dsaf_dev, i); 814 + /* if don't get any port subnode from dsaf node 815 + * will init all port then, this is compatible with the old dts 816 + */ 817 + if (!found) { 818 + for (port_id = 0; port_id < max_port_num; port_id++) { 819 + mac_cb = devm_kzalloc(dsaf_dev->dev, sizeof(*mac_cb), 820 + GFP_KERNEL); 821 + if (!mac_cb) 822 + return -ENOMEM; 823 + 824 + mac_cb->mac_id = port_id; 825 + dsaf_dev->mac_cb[port_id] = mac_cb; 826 + } 827 + } 828 + /* init mac_cb for all port */ 829 + for (port_id = 0; port_id < max_port_num; port_id++) { 830 + mac_cb = dsaf_dev->mac_cb[port_id]; 831 + if (!mac_cb) 832 + continue; 833 + 834 + ret = hns_mac_get_cfg(dsaf_dev, mac_cb); 805 835 if (ret) 806 - goto free_mac_cb; 807 - 808 - mac_cb = &dsaf_dev->mac_cb[i]; 836 + return ret; 809 837 ret = hns_mac_init_ex(mac_cb); 810 838 if (ret) 811 - goto free_mac_cb; 839 + return ret; 812 840 } 813 841 814 842 return 0; 815 - 816 - free_mac_cb: 817 - dsaf_dev->mac_cb = NULL; 818 - 819 - return ret; 820 843 } 821 844 822 845 void hns_mac_uninit(struct dsaf_device *dsaf_dev) 823 846 { 824 - cpld_led_reset(dsaf_dev->mac_cb); 825 - dsaf_dev->mac_cb = NULL; 847 + int i; 848 + int max_port_num = hns_mac_get_max_port_num(dsaf_dev); 849 + 850 + for (i = 0; i < max_port_num; i++) { 851 + cpld_led_reset(dsaf_dev->mac_cb[i]); 852 + dsaf_dev->mac_cb[i] = NULL; 853 + } 826 854 } 827 855 828 856 int hns_mac_config_mac_loopback(struct hns_mac_cb *mac_cb,
+5 -2
drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
··· 10 10 #ifndef _HNS_DSAF_MAC_H 11 11 #define _HNS_DSAF_MAC_H 12 12 13 - #include <linux/phy.h> 14 - #include <linux/kernel.h> 15 13 #include <linux/if_vlan.h> 14 + #include <linux/kernel.h> 15 + #include <linux/phy.h> 16 + #include <linux/regmap.h> 16 17 #include "hns_dsaf_main.h" 17 18 18 19 struct dsaf_device; ··· 311 310 struct device *dev; 312 311 struct dsaf_device *dsaf_dev; 313 312 struct mac_priv priv; 313 + struct fwnode_handle *fw_port; 314 314 u8 __iomem *vaddr; 315 315 u8 __iomem *cpld_vaddr; 316 316 u8 __iomem *sys_ctl_vaddr; 317 317 u8 __iomem *serdes_vaddr; 318 + struct regmap *serdes_ctrl; 318 319 struct mac_entry_idx addr_entry_idx[DSAF_MAX_VM_NUM]; 319 320 u8 sfp_prsnt; 320 321 u8 cpld_led_value;
+60 -29
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
··· 13 13 #include <linux/kernel.h> 14 14 #include <linux/module.h> 15 15 #include <linux/netdevice.h> 16 + #include <linux/mfd/syscon.h> 16 17 #include <linux/of.h> 17 18 #include <linux/of_address.h> 18 19 #include <linux/of_irq.h> ··· 38 37 u32 desc_num; 39 38 u32 buf_size; 40 39 u32 reset_offset = 0; 40 + u32 res_idx = 0; 41 41 const char *mode_str; 42 + struct regmap *syscon; 43 + struct resource *res; 42 44 struct device_node *np = dsaf_dev->dev->of_node; 45 + struct platform_device *pdev = to_platform_device(dsaf_dev->dev); 43 46 44 47 if (of_device_is_compatible(np, "hisilicon,hns-dsaf-v1")) 45 48 dsaf_dev->dsaf_ver = AE_VERSION_1; ··· 80 75 else 81 76 dsaf_dev->dsaf_tc_mode = HRD_DSAF_4TC_MODE; 82 77 83 - dsaf_dev->sc_base = of_iomap(np, 0); 84 - if (!dsaf_dev->sc_base) { 85 - dev_err(dsaf_dev->dev, 86 - "%s of_iomap 0 fail!\n", dsaf_dev->ae_dev.name); 87 - ret = -ENOMEM; 88 - goto unmap_base_addr; 78 + syscon = syscon_node_to_regmap( 79 + of_parse_phandle(np, "subctrl-syscon", 0)); 80 + if (IS_ERR_OR_NULL(syscon)) { 81 + res = platform_get_resource(pdev, IORESOURCE_MEM, res_idx++); 82 + if (!res) { 83 + dev_err(dsaf_dev->dev, "subctrl info is needed!\n"); 84 + return -ENOMEM; 85 + } 86 + dsaf_dev->sc_base = devm_ioremap_resource(&pdev->dev, res); 87 + if (!dsaf_dev->sc_base) { 88 + dev_err(dsaf_dev->dev, "subctrl can not map!\n"); 89 + return -ENOMEM; 90 + } 91 + 92 + res = platform_get_resource(pdev, IORESOURCE_MEM, res_idx++); 93 + if (!res) { 94 + dev_err(dsaf_dev->dev, "serdes-ctrl info is needed!\n"); 95 + return -ENOMEM; 96 + } 97 + dsaf_dev->sds_base = devm_ioremap_resource(&pdev->dev, res); 98 + if (!dsaf_dev->sds_base) { 99 + dev_err(dsaf_dev->dev, "serdes-ctrl can not map!\n"); 100 + return -ENOMEM; 101 + } 102 + } else { 103 + dsaf_dev->sub_ctrl = syscon; 89 104 } 90 105 91 - dsaf_dev->sds_base = of_iomap(np, 1); 92 - if (!dsaf_dev->sds_base) { 93 - dev_err(dsaf_dev->dev, 94 - "%s of_iomap 1 fail!\n", dsaf_dev->ae_dev.name); 95 - ret = -ENOMEM; 96 - goto unmap_base_addr; 106 + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ppe-base"); 107 + if (!res) { 108 + res = platform_get_resource(pdev, IORESOURCE_MEM, res_idx++); 109 + if (!res) { 110 + dev_err(dsaf_dev->dev, "ppe-base info is needed!\n"); 111 + return -ENOMEM; 112 + } 97 113 } 98 - 99 - dsaf_dev->ppe_base = of_iomap(np, 2); 114 + dsaf_dev->ppe_base = devm_ioremap_resource(&pdev->dev, res); 100 115 if (!dsaf_dev->ppe_base) { 101 - dev_err(dsaf_dev->dev, 102 - "%s of_iomap 2 fail!\n", dsaf_dev->ae_dev.name); 103 - ret = -ENOMEM; 104 - goto unmap_base_addr; 116 + dev_err(dsaf_dev->dev, "ppe-base resource can not map!\n"); 117 + return -ENOMEM; 105 118 } 119 + dsaf_dev->ppe_paddr = res->start; 106 120 107 - dsaf_dev->io_base = of_iomap(np, 3); 108 - if (!dsaf_dev->io_base) { 109 - dev_err(dsaf_dev->dev, 110 - "%s of_iomap 3 fail!\n", dsaf_dev->ae_dev.name); 111 - ret = -ENOMEM; 112 - goto unmap_base_addr; 121 + if (!HNS_DSAF_IS_DEBUG(dsaf_dev)) { 122 + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, 123 + "dsaf-base"); 124 + if (!res) { 125 + res = platform_get_resource(pdev, IORESOURCE_MEM, 126 + res_idx); 127 + if (!res) { 128 + dev_err(dsaf_dev->dev, 129 + "dsaf-base info is needed!\n"); 130 + return -ENOMEM; 131 + } 132 + } 133 + dsaf_dev->io_base = devm_ioremap_resource(&pdev->dev, res); 134 + if (!dsaf_dev->io_base) { 135 + dev_err(dsaf_dev->dev, "dsaf-base resource can not map!\n"); 136 + return -ENOMEM; 137 + } 113 138 } 114 - 115 - dsaf_dev->cpld_base = of_iomap(np, 4); 116 - if (!dsaf_dev->cpld_base) 117 - dev_dbg(dsaf_dev->dev, "NO CPLD ADDR"); 118 139 119 140 ret = of_property_read_u32(np, "desc-num", &desc_num); 120 141 if (ret < 0 || desc_num < HNS_DSAF_MIN_DESC_CNT || ··· 756 725 void hns_dsaf_set_inner_lb(struct dsaf_device *dsaf_dev, u32 mac_id, u32 en) 757 726 { 758 727 if (AE_IS_VER1(dsaf_dev->dsaf_ver) || 759 - dsaf_dev->mac_cb[mac_id].mac_type == HNAE_PORT_DEBUG) 728 + dsaf_dev->mac_cb[mac_id]->mac_type == HNAE_PORT_DEBUG) 760 729 return; 761 730 762 731 dsaf_set_dev_bit(dsaf_dev, DSAFV2_SERDES_LBK_0_REG + 4 * mac_id,
+3 -9
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
··· 278 278 u8 __iomem *ppe_base; 279 279 u8 __iomem *io_base; 280 280 u8 __iomem *cpld_base; 281 + struct regmap *sub_ctrl; 282 + phys_addr_t ppe_paddr; 281 283 282 284 u32 desc_num; /* desc num per queue*/ 283 285 u32 buf_size; /* ring buffer size */ ··· 292 290 293 291 struct ppe_common_cb *ppe_common[DSAF_COMM_DEV_NUM]; 294 292 struct rcb_common_cb *rcb_common[DSAF_COMM_DEV_NUM]; 295 - struct hns_mac_cb *mac_cb; 293 + struct hns_mac_cb *mac_cb[DSAF_MAX_PORT_NUM]; 296 294 297 295 struct dsaf_hw_stats hw_stats[DSAF_NODE_NUM]; 298 296 struct dsaf_int_stat int_stat; ··· 362 360 dsaf_set_dev_field(dsaf_dev, DSAF_TBL_LINE_ADDR_0_REG, 363 361 DSAF_TBL_LINE_ADDR_M, DSAF_TBL_LINE_ADDR_S, 364 362 tab_line_addr); 365 - } 366 - 367 - static inline int hns_dsaf_get_comm_idx_by_port(int port) 368 - { 369 - if ((port < DSAF_COMM_CHN) || (port == DSAF_MAX_PORT_NUM_PER_CHIP)) 370 - return 0; 371 - else 372 - return (port - DSAF_COMM_CHN + 1); 373 363 } 374 364 375 365 static inline struct hnae_vf_cb *hns_ae_get_vf_cb(
+44 -28
drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
··· 12 12 #include "hns_dsaf_ppe.h" 13 13 #include "hns_dsaf_reg.h" 14 14 15 + static void dsaf_write_sub(struct dsaf_device *dsaf_dev, u32 reg, u32 val) 16 + { 17 + if (dsaf_dev->sub_ctrl) 18 + dsaf_write_syscon(dsaf_dev->sub_ctrl, reg, val); 19 + else 20 + dsaf_write_reg(dsaf_dev->sc_base, reg, val); 21 + } 22 + 23 + static u32 dsaf_read_sub(struct dsaf_device *dsaf_dev, u32 reg) 24 + { 25 + u32 ret; 26 + 27 + if (dsaf_dev->sub_ctrl) 28 + ret = dsaf_read_syscon(dsaf_dev->sub_ctrl, reg); 29 + else 30 + ret = dsaf_read_reg(dsaf_dev->sc_base, reg); 31 + 32 + return ret; 33 + } 34 + 15 35 void hns_cpld_set_led(struct hns_mac_cb *mac_cb, int link_status, 16 36 u16 speed, int data) 17 37 { ··· 115 95 nt_reg_addr = DSAF_SUB_SC_NT_RESET_DREQ_REG; 116 96 } 117 97 118 - dsaf_write_reg(dsaf_dev->sc_base, xbar_reg_addr, 119 - RESET_REQ_OR_DREQ); 120 - dsaf_write_reg(dsaf_dev->sc_base, nt_reg_addr, 121 - RESET_REQ_OR_DREQ); 98 + dsaf_write_sub(dsaf_dev, xbar_reg_addr, RESET_REQ_OR_DREQ); 99 + dsaf_write_sub(dsaf_dev, nt_reg_addr, RESET_REQ_OR_DREQ); 122 100 } 123 101 124 102 void hns_dsaf_xge_srst_by_port(struct dsaf_device *dsaf_dev, u32 port, u32 val) ··· 139 121 else 140 122 reg_addr = DSAF_SUB_SC_XGE_RESET_DREQ_REG; 141 123 142 - dsaf_write_reg(dsaf_dev->sc_base, reg_addr, reg_val); 124 + dsaf_write_sub(dsaf_dev, reg_addr, reg_val); 143 125 } 144 126 145 127 void hns_dsaf_xge_core_srst_by_port(struct dsaf_device *dsaf_dev, ··· 162 144 else 163 145 reg_addr = DSAF_SUB_SC_XGE_RESET_DREQ_REG; 164 146 165 - dsaf_write_reg(dsaf_dev->sc_base, reg_addr, reg_val); 147 + dsaf_write_sub(dsaf_dev, reg_addr, reg_val); 166 148 } 167 149 168 150 void hns_dsaf_ge_srst_by_port(struct dsaf_device *dsaf_dev, u32 port, u32 val) ··· 182 164 reg_val_2 = 0x2082082 << port; 183 165 184 166 if (val == 0) { 185 - dsaf_write_reg(dsaf_dev->sc_base, 186 - DSAF_SUB_SC_GE_RESET_REQ1_REG, 167 + dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_REQ1_REG, 187 168 reg_val_1); 188 169 189 - dsaf_write_reg(dsaf_dev->sc_base, 190 - DSAF_SUB_SC_GE_RESET_REQ0_REG, 170 + dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_REQ0_REG, 191 171 reg_val_2); 192 172 } else { 193 - dsaf_write_reg(dsaf_dev->sc_base, 194 - DSAF_SUB_SC_GE_RESET_DREQ0_REG, 173 + dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_DREQ0_REG, 195 174 reg_val_2); 196 175 197 - dsaf_write_reg(dsaf_dev->sc_base, 198 - DSAF_SUB_SC_GE_RESET_DREQ1_REG, 176 + dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_DREQ1_REG, 199 177 reg_val_1); 200 178 } 201 179 } else { ··· 199 185 reg_val_2 = 0x100 << dsaf_dev->reset_offset; 200 186 201 187 if (val == 0) { 202 - dsaf_write_reg(dsaf_dev->sc_base, 203 - DSAF_SUB_SC_GE_RESET_REQ1_REG, 188 + dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_REQ1_REG, 204 189 reg_val_1); 205 190 206 - dsaf_write_reg(dsaf_dev->sc_base, 207 - DSAF_SUB_SC_PPE_RESET_REQ_REG, 191 + dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_PPE_RESET_REQ_REG, 208 192 reg_val_2); 209 193 } else { 210 - dsaf_write_reg(dsaf_dev->sc_base, 211 - DSAF_SUB_SC_GE_RESET_DREQ1_REG, 194 + dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_DREQ1_REG, 212 195 reg_val_1); 213 196 214 - dsaf_write_reg(dsaf_dev->sc_base, 215 - DSAF_SUB_SC_PPE_RESET_DREQ_REG, 197 + dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_PPE_RESET_DREQ_REG, 216 198 reg_val_2); 217 199 } 218 200 } ··· 230 220 else 231 221 reg_addr = DSAF_SUB_SC_PPE_RESET_DREQ_REG; 232 222 233 - dsaf_write_reg(dsaf_dev->sc_base, reg_addr, reg_val); 223 + dsaf_write_sub(dsaf_dev, reg_addr, reg_val); 234 224 } 235 225 236 226 void hns_ppe_com_srst(struct ppe_common_cb *ppe_common, u32 val) ··· 255 245 reg_addr = DSAF_SUB_SC_PPE_RESET_DREQ_REG; 256 246 } 257 247 258 - dsaf_write_reg(dsaf_dev->sc_base, reg_addr, reg_val); 248 + dsaf_write_sub(dsaf_dev, reg_addr, reg_val); 259 249 } 260 250 261 251 /** ··· 270 260 u32 shift; 271 261 u32 phy_offset; 272 262 bool is_ver1 = AE_IS_VER1(mac_cb->dsaf_dev->dsaf_ver); 273 - void __iomem *sys_ctl_vaddr = mac_cb->sys_ctl_vaddr; 274 263 int mac_id = mac_cb->mac_id; 275 264 phy_interface_t phy_if = PHY_INTERFACE_MODE_NA; 276 265 ··· 278 269 } else if (mac_id >= 0 && mac_id <= 3 && 279 270 !HNS_DSAF_IS_DEBUG(mac_cb->dsaf_dev)) { 280 271 reg = is_ver1 ? HNS_MAC_HILINK4_REG : HNS_MAC_HILINK4V2_REG; 281 - mode = dsaf_read_reg(sys_ctl_vaddr, reg); 272 + mode = dsaf_read_sub(mac_cb->dsaf_dev, reg); 282 273 /* mac_id 0, 1, 2, 3 ---> hilink4 lane 0, 1, 2, 3 */ 283 274 shift = is_ver1 ? 0 : mac_id; 284 275 if (dsaf_get_bit(mode, shift)) ··· 287 278 phy_if = PHY_INTERFACE_MODE_SGMII; 288 279 } else { 289 280 reg = is_ver1 ? HNS_MAC_HILINK3_REG : HNS_MAC_HILINK3V2_REG; 290 - mode = dsaf_read_reg(sys_ctl_vaddr, reg); 281 + mode = dsaf_read_sub(mac_cb->dsaf_dev, reg); 291 282 /* mac_id 4, 5,---> hilink3 lane 2, 3 292 283 * debug port 0(6), 1(7) ---> hilink3 lane 0, 1 293 284 */ ··· 337 328 pr_info("no sfp in this eth\n"); 338 329 } 339 330 340 - dsaf_set_reg_field(base_addr, reg_offset, 1ull << 10, 10, !!en); 331 + if (mac_cb->serdes_ctrl) { 332 + u32 origin = dsaf_read_syscon(mac_cb->serdes_ctrl, reg_offset); 333 + 334 + dsaf_set_field(origin, 1ull << 10, 10, !!en); 335 + dsaf_write_syscon(mac_cb->serdes_ctrl, reg_offset, origin); 336 + } else { 337 + dsaf_set_reg_field(base_addr, reg_offset, 1ull << 10, 10, !!en); 338 + } 341 339 342 340 return 0; 343 341 }
+12 -45
drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.c
··· 61 61 } 62 62 } 63 63 64 - static void __iomem *hns_ppe_common_get_ioaddr( 65 - struct ppe_common_cb *ppe_common) 64 + static void __iomem * 65 + hns_ppe_common_get_ioaddr(struct ppe_common_cb *ppe_common) 66 66 { 67 - void __iomem *base_addr; 68 - 69 - int idx = ppe_common->comm_index; 70 - 71 - if (!HNS_DSAF_IS_DEBUG(ppe_common->dsaf_dev)) 72 - base_addr = ppe_common->dsaf_dev->ppe_base 73 - + PPE_COMMON_REG_OFFSET; 74 - else 75 - base_addr = ppe_common->dsaf_dev->sds_base 76 - + (idx - 1) * HNS_DSAF_DEBUG_NW_REG_OFFSET 77 - + PPE_COMMON_REG_OFFSET; 78 - 79 - return base_addr; 67 + return ppe_common->dsaf_dev->ppe_base + PPE_COMMON_REG_OFFSET; 80 68 } 81 69 82 70 /** ··· 112 124 static void __iomem *hns_ppe_get_iobase(struct ppe_common_cb *ppe_common, 113 125 int ppe_idx) 114 126 { 115 - void __iomem *base_addr; 116 - int common_idx = ppe_common->comm_index; 117 127 118 - if (ppe_common->ppe_mode == PPE_COMMON_MODE_SERVICE) { 119 - base_addr = ppe_common->dsaf_dev->ppe_base + 120 - ppe_idx * PPE_REG_OFFSET; 121 - 122 - } else { 123 - base_addr = ppe_common->dsaf_dev->sds_base + 124 - (common_idx - 1) * HNS_DSAF_DEBUG_NW_REG_OFFSET; 125 - } 126 - 127 - return base_addr; 128 - } 129 - 130 - static int hns_ppe_get_port(struct ppe_common_cb *ppe_common, int idx) 131 - { 132 - int port; 133 - 134 - if (ppe_common->ppe_mode == PPE_COMMON_MODE_SERVICE) 135 - port = idx; 136 - else 137 - port = HNS_PPE_SERVICE_NW_ENGINE_NUM 138 - + ppe_common->comm_index - 1; 139 - 140 - return port; 128 + return ppe_common->dsaf_dev->ppe_base + ppe_idx * PPE_REG_OFFSET; 141 129 } 142 130 143 131 static void hns_ppe_get_cfg(struct ppe_common_cb *ppe_common) ··· 128 164 ppe_cb->next = NULL; 129 165 ppe_cb->ppe_common_cb = ppe_common; 130 166 ppe_cb->index = i; 131 - ppe_cb->port = hns_ppe_get_port(ppe_common, i); 132 167 ppe_cb->io_base = hns_ppe_get_iobase(ppe_common, i); 133 168 ppe_cb->virq = 0; 134 169 } ··· 281 318 static void hns_ppe_init_hw(struct hns_ppe_cb *ppe_cb) 282 319 { 283 320 struct ppe_common_cb *ppe_common_cb = ppe_cb->ppe_common_cb; 284 - u32 port = ppe_cb->port; 321 + u32 port = ppe_cb->index; 285 322 struct dsaf_device *dsaf_dev = ppe_common_cb->dsaf_dev; 286 323 int i; 287 324 ··· 340 377 u32 i; 341 378 342 379 for (i = 0; i < ppe_common->ppe_num; i++) { 343 - hns_ppe_uninit_hw(&ppe_common->ppe_cb[i]); 380 + if (ppe_common->dsaf_dev->mac_cb[i]) 381 + hns_ppe_uninit_hw(&ppe_common->ppe_cb[i]); 344 382 memset(&ppe_common->ppe_cb[i], 0, sizeof(struct hns_ppe_cb)); 345 383 } 346 384 } ··· 374 410 if (ret) 375 411 return; 376 412 377 - for (i = 0; i < ppe_common->ppe_num; i++) 378 - hns_ppe_init_hw(&ppe_common->ppe_cb[i]); 413 + for (i = 0; i < ppe_common->ppe_num; i++) { 414 + /* We only need to initiate ppe when the port exists */ 415 + if (dsaf_dev->mac_cb[i]) 416 + hns_ppe_init_hw(&ppe_common->ppe_cb[i]); 417 + } 379 418 380 419 ret = hns_rcb_common_init_hw(dsaf_dev->rcb_common[ppe_common_index]); 381 420 if (ret)
-1
drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.h
··· 80 80 struct hns_ppe_hw_stats hw_stats; 81 81 82 82 u8 index; /* index in a ppe common device */ 83 - u8 port; /* port id in dsaf */ 84 83 void __iomem *io_base; 85 84 int virq; 86 85 u32 rss_indir_table[HNS_PPEV2_RSS_IND_TBL_SIZE]; /*shadow indir tab */
+9 -42
drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c
··· 430 430 static int hns_rcb_get_port_in_comm( 431 431 struct rcb_common_cb *rcb_common, int ring_idx) 432 432 { 433 - int port; 434 - int q_num; 435 433 436 - if (!HNS_DSAF_IS_DEBUG(rcb_common->dsaf_dev)) { 437 - q_num = (int)rcb_common->max_q_per_vf * rcb_common->max_vfn; 438 - port = ring_idx / q_num; 439 - } else { 440 - port = 0; /* config debug-ports port_id_in_comm to 0*/ 441 - } 442 - 443 - return port; 434 + return ring_idx / (rcb_common->max_q_per_vf * rcb_common->max_vfn); 444 435 } 445 436 446 437 #define SERVICE_RING_IRQ_IDX(v1) \ ··· 649 658 } 650 659 } 651 660 652 - void __iomem *hns_rcb_common_get_vaddr(struct dsaf_device *dsaf_dev, 653 - int comm_index) 661 + void __iomem *hns_rcb_common_get_vaddr(struct rcb_common_cb *rcb_common) 654 662 { 655 - void __iomem *base_addr; 663 + struct dsaf_device *dsaf_dev = rcb_common->dsaf_dev; 656 664 657 - if (!HNS_DSAF_IS_DEBUG(dsaf_dev)) 658 - base_addr = dsaf_dev->ppe_base + RCB_COMMON_REG_OFFSET; 659 - else 660 - base_addr = dsaf_dev->sds_base 661 - + (comm_index - 1) * HNS_DSAF_DEBUG_NW_REG_OFFSET 662 - + RCB_COMMON_REG_OFFSET; 663 - 664 - return base_addr; 665 + return dsaf_dev->ppe_base + RCB_COMMON_REG_OFFSET; 665 666 } 666 667 667 - static phys_addr_t hns_rcb_common_get_paddr(struct dsaf_device *dsaf_dev, 668 - int comm_index) 668 + static phys_addr_t hns_rcb_common_get_paddr(struct rcb_common_cb *rcb_common) 669 669 { 670 - struct device_node *np = dsaf_dev->dev->of_node; 671 - phys_addr_t phy_addr; 672 - const __be32 *tmp_addr; 673 - u64 addr_offset = 0; 674 - u64 size = 0; 675 - int index = 0; 670 + struct dsaf_device *dsaf_dev = rcb_common->dsaf_dev; 676 671 677 - if (!HNS_DSAF_IS_DEBUG(dsaf_dev)) { 678 - index = 2; 679 - addr_offset = RCB_COMMON_REG_OFFSET; 680 - } else { 681 - index = 1; 682 - addr_offset = (comm_index - 1) * HNS_DSAF_DEBUG_NW_REG_OFFSET + 683 - RCB_COMMON_REG_OFFSET; 684 - } 685 - tmp_addr = of_get_address(np, index, &size, NULL); 686 - phy_addr = of_translate_address(np, tmp_addr); 687 - return phy_addr + addr_offset; 672 + return dsaf_dev->ppe_paddr + RCB_COMMON_REG_OFFSET; 688 673 } 689 674 690 675 int hns_rcb_common_get_cfg(struct dsaf_device *dsaf_dev, ··· 689 722 rcb_common->max_vfn = max_vfn; 690 723 rcb_common->max_q_per_vf = max_q_per_vf; 691 724 692 - rcb_common->io_base = hns_rcb_common_get_vaddr(dsaf_dev, comm_index); 693 - rcb_common->phy_base = hns_rcb_common_get_paddr(dsaf_dev, comm_index); 725 + rcb_common->io_base = hns_rcb_common_get_vaddr(rcb_common); 726 + rcb_common->phy_base = hns_rcb_common_get_paddr(rcb_common); 694 727 695 728 dsaf_dev->rcb_common[comm_index] = rcb_common; 696 729 return 0;
+7 -8
drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
··· 11 11 #define _DSAF_REG_H_ 12 12 13 13 #include <linux/regmap.h> 14 - #define HNS_DEBUG_RING_IRQ_IDX 0 15 - #define HNS_SERVICE_RING_IRQ_IDX 59 16 - #define HNSV2_SERVICE_RING_IRQ_IDX 25 14 + #define HNS_DEBUG_RING_IRQ_IDX 0 15 + #define HNS_SERVICE_RING_IRQ_IDX 59 16 + #define HNSV2_SERVICE_RING_IRQ_IDX 25 17 17 18 - #define DSAF_MAX_PORT_NUM_PER_CHIP 8 19 - #define DSAF_SERVICE_PORT_NUM_PER_DSAF 6 20 - #define DSAF_MAX_VM_NUM 128 18 + #define DSAF_MAX_PORT_NUM 6 19 + #define DSAF_MAX_VM_NUM 128 21 20 22 - #define DSAF_COMM_DEV_NUM 3 23 - #define DSAF_PPE_INODE_BASE 6 21 + #define DSAF_COMM_DEV_NUM 1 22 + #define DSAF_PPE_INODE_BASE 6 24 23 #define DSAF_DEBUG_NW_NUM 2 25 24 #define DSAF_SERVICE_NW_NUM 6 26 25 #define DSAF_COMM_CHN DSAF_SERVICE_NW_NUM