net: hns3: add support for mapping device memory
authorHuazhong Tan <tanhuazhong@huawei.com>
Fri, 20 Nov 2020 09:16:20 +0000 (17:16 +0800)
committerJakub Kicinski <kuba@kernel.org>
Sat, 21 Nov 2020 22:33:46 +0000 (14:33 -0800)
For device who has device memory accessed through the PCI BAR4,
IO descriptor push of NIC and direct WQE(Work Queue Element) of
RoCE will use this device memory, so add support for mapping
this device memory, and add this info to the RoCE client whose
new feature needs.

Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/hisilicon/hns3/hnae3.h
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h

index f9d4d234a2afd65eea8512c0ad47fc7727d24299..5bae5e859c81ba7d0a0e12347fd96fbe6462a20b 100644 (file)
@@ -689,6 +689,7 @@ struct hnae3_knic_private_info {
 struct hnae3_roce_private_info {
        struct net_device *netdev;
        void __iomem *roce_io_base;
+       void __iomem *roce_mem_base;
        int base_vector;
        int num_vectors;
 
index 892e7f6f052dc5cc2914b0759a53c38e54d6da4b..998993024839b811f8e5a165a9714bb247629994 100644 (file)
@@ -2436,6 +2436,7 @@ static int hclge_init_roce_base_info(struct hclge_vport *vport)
 
        roce->rinfo.netdev = nic->kinfo.netdev;
        roce->rinfo.roce_io_base = vport->back->hw.io_base;
+       roce->rinfo.roce_mem_base = vport->back->hw.mem_base;
 
        roce->pdev = nic->pdev;
        roce->ae_algo = nic->ae_algo;
@@ -9890,6 +9891,28 @@ static void hclge_uninit_client_instance(struct hnae3_client *client,
        }
 }
 
+static int hclge_dev_mem_map(struct hclge_dev *hdev)
+{
+#define HCLGE_MEM_BAR          4
+
+       struct pci_dev *pdev = hdev->pdev;
+       struct hclge_hw *hw = &hdev->hw;
+
+       /* for device does not have device memory, return directly */
+       if (!(pci_select_bars(pdev, IORESOURCE_MEM) & BIT(HCLGE_MEM_BAR)))
+               return 0;
+
+       hw->mem_base = devm_ioremap_wc(&pdev->dev,
+                                      pci_resource_start(pdev, HCLGE_MEM_BAR),
+                                      pci_resource_len(pdev, HCLGE_MEM_BAR));
+       if (!hw->mem_base) {
+               dev_err(&pdev->dev, "failed to map device memroy\n");
+               return -EFAULT;
+       }
+
+       return 0;
+}
+
 static int hclge_pci_init(struct hclge_dev *hdev)
 {
        struct pci_dev *pdev = hdev->pdev;
@@ -9928,9 +9951,16 @@ static int hclge_pci_init(struct hclge_dev *hdev)
                goto err_clr_master;
        }
 
+       ret = hclge_dev_mem_map(hdev);
+       if (ret)
+               goto err_unmap_io_base;
+
        hdev->num_req_vfs = pci_sriov_get_totalvfs(pdev);
 
        return 0;
+
+err_unmap_io_base:
+       pcim_iounmap(pdev, hdev->hw.io_base);
 err_clr_master:
        pci_clear_master(pdev);
        pci_release_regions(pdev);
@@ -9944,6 +9974,9 @@ static void hclge_pci_uninit(struct hclge_dev *hdev)
 {
        struct pci_dev *pdev = hdev->pdev;
 
+       if (hdev->hw.mem_base)
+               devm_iounmap(&pdev->dev, hdev->hw.mem_base);
+
        pcim_iounmap(pdev, hdev->hw.io_base);
        pci_free_irq_vectors(pdev);
        pci_clear_master(pdev);
index 64e6afdb61b8de33942dd4aa3b5fe89cc7d7b901..3ed4e84f8b2e432b3ad01864f79741cd35948d41 100644 (file)
@@ -278,6 +278,7 @@ struct hclge_mac {
 
 struct hclge_hw {
        void __iomem *io_base;
+       void __iomem *mem_base;
        struct hclge_mac mac;
        int num_vec;
        struct hclge_cmq cmq;
index 5ac5c35febcb01e7476f9f8aeed02a35f3c32017..5d6b419b8a78bfb46cc4e2f3f928f387a246627b 100644 (file)
@@ -2442,6 +2442,7 @@ static int hclgevf_init_roce_base_info(struct hclgevf_dev *hdev)
 
        roce->rinfo.netdev = nic->kinfo.netdev;
        roce->rinfo.roce_io_base = hdev->hw.io_base;
+       roce->rinfo.roce_mem_base = hdev->hw.mem_base;
 
        roce->pdev = nic->pdev;
        roce->ae_algo = nic->ae_algo;
@@ -2887,6 +2888,29 @@ static void hclgevf_uninit_client_instance(struct hnae3_client *client,
        }
 }
 
+static int hclgevf_dev_mem_map(struct hclgevf_dev *hdev)
+{
+#define HCLGEVF_MEM_BAR                4
+
+       struct pci_dev *pdev = hdev->pdev;
+       struct hclgevf_hw *hw = &hdev->hw;
+
+       /* for device does not have device memory, return directly */
+       if (!(pci_select_bars(pdev, IORESOURCE_MEM) & BIT(HCLGEVF_MEM_BAR)))
+               return 0;
+
+       hw->mem_base = devm_ioremap_wc(&pdev->dev,
+                                      pci_resource_start(pdev,
+                                                         HCLGEVF_MEM_BAR),
+                                      pci_resource_len(pdev, HCLGEVF_MEM_BAR));
+       if (!hw->mem_base) {
+               dev_err(&pdev->dev, "failed to map device memroy\n");
+               return -EFAULT;
+       }
+
+       return 0;
+}
+
 static int hclgevf_pci_init(struct hclgevf_dev *hdev)
 {
        struct pci_dev *pdev = hdev->pdev;
@@ -2921,8 +2945,14 @@ static int hclgevf_pci_init(struct hclgevf_dev *hdev)
                goto err_clr_master;
        }
 
+       ret = hclgevf_dev_mem_map(hdev);
+       if (ret)
+               goto err_unmap_io_base;
+
        return 0;
 
+err_unmap_io_base:
+       pci_iounmap(pdev, hdev->hw.io_base);
 err_clr_master:
        pci_clear_master(pdev);
        pci_release_regions(pdev);
@@ -2936,6 +2966,9 @@ static void hclgevf_pci_uninit(struct hclgevf_dev *hdev)
 {
        struct pci_dev *pdev = hdev->pdev;
 
+       if (hdev->hw.mem_base)
+               devm_iounmap(&pdev->dev, hdev->hw.mem_base);
+
        pci_iounmap(pdev, hdev->hw.io_base);
        pci_clear_master(pdev);
        pci_release_regions(pdev);
index c5bcc3894fd54c860760f5195ee99b9556265313..1b183bc35604b4d780ef439e33ddee5c818e1f73 100644 (file)
@@ -164,6 +164,7 @@ struct hclgevf_mac {
 
 struct hclgevf_hw {
        void __iomem *io_base;
+       void __iomem *mem_base;
        int num_vec;
        struct hclgevf_cmq cmq;
        struct hclgevf_mac mac;