484 lines
16 KiB
Diff
484 lines
16 KiB
Diff
From 3779944f2f2d81decc4c2cf2d126abdd7f8b4ec5 Mon Sep 17 00:00:00 2001
|
|
From: Yufeng Mo <moyufeng@huawei.com>
|
|
Date: Wed, 14 Jul 2021 20:55:30 +0800
|
|
Subject: [PATCH 153/283] net: hns3: add support for pf querying new interrupt
|
|
resources
|
|
|
|
mainline inclusion
|
|
from mainline-v5.11-rc1
|
|
commit 3a6863e4e8ee212c7f86594299d9ff0d6a15ecbc
|
|
category: feature
|
|
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMYT
|
|
CVE: NA
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3a6863e4e8ee212c7f86594299d9ff0d6a15ecbc
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
For HNAE3_DEVICE_VERSION_V3, a maximum of 1281 interrupt
|
|
resources are supported. To utilize these new resources,
|
|
extend the corresponding field or variable to 16bit type,
|
|
and remove the restriction of NIC client that only use a
|
|
maximum of 65 interrupt vectors. In addition, the I/O address
|
|
of the extended interrupt resources are different, so an extra
|
|
handler is needed.
|
|
|
|
Currently, the total number of interrupts is the sum of RoCE's
|
|
number and RoCE's offset (RoCE is in front of NIC), since
|
|
the number of both NIC and RoCE are same. For readability,
|
|
rewrite the corresponding field of the command, rename the
|
|
RoCE's offset field as the number of NIC interrupts, then
|
|
the total number of interrupts is sum of the number of RoCE
|
|
and NIC, and replace vport->back with hdev in
|
|
hclge_init_roce_base_info() for simplifying the code.
|
|
|
|
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
|
|
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
Reviewed-by: li yongxin <liyongxin1@huawei.com>
|
|
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
|
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
|
|
|
Conflicts:
|
|
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
---
|
|
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 1 +
|
|
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 3 -
|
|
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 16 +--
|
|
.../hisilicon/hns3/hns3pf/hclge_main.c | 131 ++++++++++++------
|
|
.../hisilicon/hns3/hns3pf/hclge_main.h | 4 +-
|
|
.../hisilicon/hns3/hns3pf/hclge_mbx.c | 2 +-
|
|
.../hisilicon/hns3/hns3vf/hclgevf_main.c | 33 +++++
|
|
.../hisilicon/hns3/hns3vf/hclgevf_main.h | 1 +
|
|
8 files changed, 138 insertions(+), 53 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
index 9eb545677c05..4f77d80b01f4 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
@@ -834,6 +834,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;
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
|
index 69170427c55d..9691d43a9b52 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
|
@@ -4253,8 +4253,6 @@ static void hns3_nic_init_coal_cfg(struct hns3_nic_priv *priv)
|
|
|
|
static int hns3_nic_alloc_vector_data(struct hns3_nic_priv *priv)
|
|
{
|
|
-#define HNS3_VECTOR_PF_MAX_NUM 64
|
|
-
|
|
struct hnae3_handle *h = priv->ae_handle;
|
|
struct hns3_enet_tqp_vector *tqp_vector;
|
|
struct hnae3_vector_info *vector;
|
|
@@ -4267,7 +4265,6 @@ static int hns3_nic_alloc_vector_data(struct hns3_nic_priv *priv)
|
|
/* RSS size, cpu online and vector_num should be the same */
|
|
/* Should consider 2p/4p later */
|
|
vector_num = min_t(u16, num_online_cpus(), tqp_num);
|
|
- vector_num = min_t(u16, vector_num, HNS3_VECTOR_PF_MAX_NUM);
|
|
|
|
vector = devm_kcalloc(&pdev->dev, vector_num, sizeof(*vector),
|
|
GFP_KERNEL);
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
index e96c58eeb9b4..16e41f546e21 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
@@ -359,7 +359,9 @@ enum hclge_int_type {
|
|
};
|
|
|
|
struct hclge_ctrl_vector_chain_cmd {
|
|
- u8 int_vector_id;
|
|
+#define HCLGE_VECTOR_ID_L_S 0
|
|
+#define HCLGE_VECTOR_ID_L_M GENMASK(7, 0)
|
|
+ u8 int_vector_id_l;
|
|
u8 int_cause_num;
|
|
#define HCLGE_INT_TYPE_S 0
|
|
#define HCLGE_INT_TYPE_M GENMASK(1, 0)
|
|
@@ -369,7 +371,9 @@ struct hclge_ctrl_vector_chain_cmd {
|
|
#define HCLGE_INT_GL_IDX_M GENMASK(14, 13)
|
|
__le16 tqp_type_and_id[HCLGE_VECTOR_ELEMENTS_PER_CMD];
|
|
u8 vfid;
|
|
- u8 rsv;
|
|
+#define HCLGE_VECTOR_ID_H_S 8
|
|
+#define HCLGE_VECTOR_ID_H_M GENMASK(15, 8)
|
|
+ u8 int_vector_id_h;
|
|
};
|
|
|
|
#define HCLGE_MAX_TC_NUM 8
|
|
@@ -499,12 +503,8 @@ struct hclge_pf_res_cmd {
|
|
__le16 tqp_num;
|
|
__le16 buf_size;
|
|
__le16 msixcap_localid_ba_nic;
|
|
- __le16 msixcap_localid_ba_rocee;
|
|
-#define HCLGE_MSIX_OFT_ROCEE_S 0
|
|
-#define HCLGE_MSIX_OFT_ROCEE_M GENMASK(15, 0)
|
|
-#define HCLGE_PF_VEC_NUM_S 0
|
|
-#define HCLGE_PF_VEC_NUM_M GENMASK(7, 0)
|
|
- __le16 pf_intr_vector_number;
|
|
+ __le16 msixcap_localid_number_nic;
|
|
+ __le16 pf_intr_vector_number_roce;
|
|
__le16 pf_own_fun_number;
|
|
__le16 tx_buf_size;
|
|
__le16 dv_buf_size;
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
index 2169c60aad03..6d41c3151916 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
@@ -958,35 +958,24 @@ static int hclge_query_pf_resource(struct hclge_dev *hdev)
|
|
|
|
hdev->dv_buf_size = roundup(hdev->dv_buf_size, HCLGE_BUF_SIZE_UNIT);
|
|
|
|
+ hdev->num_nic_msi = le16_to_cpu(req->msixcap_localid_number_nic);
|
|
+ if (hdev->num_nic_msi < HNAE3_MIN_VECTOR_NUM) {
|
|
+ dev_err(&hdev->pdev->dev,
|
|
+ "only %u msi resources available, not enough for pf(min:2).\n",
|
|
+ hdev->num_nic_msi);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
if (hnae3_dev_roce_supported(hdev)) {
|
|
- hdev->roce_base_msix_offset =
|
|
- hnae3_get_field(le16_to_cpu(req->msixcap_localid_ba_rocee),
|
|
- HCLGE_MSIX_OFT_ROCEE_M, HCLGE_MSIX_OFT_ROCEE_S);
|
|
hdev->num_roce_msi =
|
|
- hnae3_get_field(le16_to_cpu(req->pf_intr_vector_number),
|
|
- HCLGE_PF_VEC_NUM_M, HCLGE_PF_VEC_NUM_S);
|
|
-
|
|
- /* nic's msix numbers is always equals to the roce's. */
|
|
- hdev->num_nic_msi = hdev->num_roce_msi;
|
|
+ le16_to_cpu(req->pf_intr_vector_number_roce);
|
|
|
|
/* PF should have NIC vectors and Roce vectors,
|
|
* NIC vectors are queued before Roce vectors.
|
|
*/
|
|
- hdev->num_msi = hdev->num_roce_msi +
|
|
- hdev->roce_base_msix_offset;
|
|
+ hdev->num_msi = hdev->num_nic_msi + hdev->num_roce_msi;
|
|
} else {
|
|
- hdev->num_msi =
|
|
- hnae3_get_field(le16_to_cpu(req->pf_intr_vector_number),
|
|
- HCLGE_PF_VEC_NUM_M, HCLGE_PF_VEC_NUM_S);
|
|
-
|
|
- hdev->num_nic_msi = hdev->num_msi;
|
|
- }
|
|
-
|
|
- if (hdev->num_nic_msi < HNAE3_MIN_VECTOR_NUM) {
|
|
- dev_err(&hdev->pdev->dev,
|
|
- "Just %u msi resources, not enough for pf(min:2).\n",
|
|
- hdev->num_nic_msi);
|
|
- return -EINVAL;
|
|
+ hdev->num_msi = hdev->num_nic_msi;
|
|
}
|
|
|
|
return 0;
|
|
@@ -2517,17 +2506,18 @@ static int hclge_init_roce_base_info(struct hclge_vport *vport)
|
|
{
|
|
struct hnae3_handle *roce = &vport->roce;
|
|
struct hnae3_handle *nic = &vport->nic;
|
|
+ struct hclge_dev *hdev = vport->back;
|
|
|
|
roce->rinfo.num_vectors = vport->back->num_roce_msi;
|
|
|
|
- if (vport->back->num_msi_left < vport->roce.rinfo.num_vectors ||
|
|
- vport->back->num_msi_left == 0)
|
|
+ if (hdev->num_msi < hdev->num_nic_msi + hdev->num_roce_msi)
|
|
return -EINVAL;
|
|
|
|
- roce->rinfo.base_vector = vport->back->roce_base_vector;
|
|
+ roce->rinfo.base_vector = hdev->roce_base_vector;
|
|
|
|
roce->rinfo.netdev = nic->kinfo.netdev;
|
|
- roce->rinfo.roce_io_base = vport->back->hw.io_base;
|
|
+ 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;
|
|
@@ -2561,7 +2551,7 @@ static int hclge_init_msi(struct hclge_dev *hdev)
|
|
|
|
hdev->base_msi_vector = pdev->irq;
|
|
hdev->roce_base_vector = hdev->base_msi_vector +
|
|
- hdev->roce_base_msix_offset;
|
|
+ hdev->num_nic_msi;
|
|
|
|
hdev->vector_status = devm_kcalloc(&pdev->dev, hdev->num_msi,
|
|
sizeof(u16), GFP_KERNEL);
|
|
@@ -4591,6 +4581,30 @@ struct hclge_vport *hclge_get_vport(struct hnae3_handle *handle)
|
|
return container_of(handle, struct hclge_vport, nic);
|
|
}
|
|
|
|
+static void hclge_get_vector_info(struct hclge_dev *hdev, u16 idx,
|
|
+ struct hnae3_vector_info *vector_info)
|
|
+{
|
|
+#define HCLGE_PF_MAX_VECTOR_NUM_DEV_V2 64
|
|
+
|
|
+ vector_info->vector = pci_irq_vector(hdev->pdev, idx);
|
|
+
|
|
+ /* need an extend offset to config vector >= 64 */
|
|
+ if (idx - 1 < HCLGE_PF_MAX_VECTOR_NUM_DEV_V2)
|
|
+ vector_info->io_addr = hdev->hw.io_base +
|
|
+ HCLGE_VECTOR_REG_BASE +
|
|
+ (idx - 1) * HCLGE_VECTOR_REG_OFFSET;
|
|
+ else
|
|
+ vector_info->io_addr = hdev->hw.io_base +
|
|
+ HCLGE_VECTOR_EXT_REG_BASE +
|
|
+ (idx - 1) / HCLGE_PF_MAX_VECTOR_NUM_DEV_V2 *
|
|
+ HCLGE_VECTOR_REG_OFFSET_H +
|
|
+ (idx - 1) % HCLGE_PF_MAX_VECTOR_NUM_DEV_V2 *
|
|
+ HCLGE_VECTOR_REG_OFFSET;
|
|
+
|
|
+ hdev->vector_status[idx] = hdev->vport[0].vport_id;
|
|
+ hdev->vector_irq[idx] = vector_info->vector;
|
|
+}
|
|
+
|
|
static int hclge_get_vector(struct hnae3_handle *handle, u16 vector_num,
|
|
struct hnae3_vector_info *vector_info)
|
|
{
|
|
@@ -4598,23 +4612,16 @@ static int hclge_get_vector(struct hnae3_handle *handle, u16 vector_num,
|
|
struct hnae3_vector_info *vector = vector_info;
|
|
struct hclge_dev *hdev = vport->back;
|
|
int alloc = 0;
|
|
- int i, j;
|
|
+ u16 i = 0;
|
|
+ u16 j;
|
|
|
|
vector_num = min_t(u16, hdev->num_nic_msi - 1, vector_num);
|
|
vector_num = min(hdev->num_msi_left, vector_num);
|
|
|
|
for (j = 0; j < vector_num; j++) {
|
|
- for (i = 1; i < hdev->num_msi; i++) {
|
|
+ while (++i < hdev->num_nic_msi) {
|
|
if (hdev->vector_status[i] == HCLGE_INVALID_VPORT) {
|
|
- vector->vector = pci_irq_vector(hdev->pdev, i);
|
|
- vector->io_addr = hdev->hw.io_base +
|
|
- HCLGE_VECTOR_REG_BASE +
|
|
- (i - 1) * HCLGE_VECTOR_REG_OFFSET +
|
|
- vport->vport_id *
|
|
- HCLGE_VECTOR_VF_OFFSET;
|
|
- hdev->vector_status[i] = vport->vport_id;
|
|
- hdev->vector_irq[i] = vector->vector;
|
|
-
|
|
+ hclge_get_vector_info(hdev, i, vector);
|
|
vector++;
|
|
alloc++;
|
|
|
|
@@ -5205,7 +5212,12 @@ int hclge_bind_ring_with_vector(struct hclge_vport *vport,
|
|
|
|
op = en ? HCLGE_OPC_ADD_RING_TO_VECTOR : HCLGE_OPC_DEL_RING_TO_VECTOR;
|
|
hclge_cmd_setup_basic_desc(&desc, op, false);
|
|
- req->int_vector_id = vector_id;
|
|
+ req->int_vector_id_l = hnae3_get_field(vector_id,
|
|
+ HCLGE_VECTOR_ID_L_M,
|
|
+ HCLGE_VECTOR_ID_L_S);
|
|
+ req->int_vector_id_h = hnae3_get_field(vector_id,
|
|
+ HCLGE_VECTOR_ID_H_M,
|
|
+ HCLGE_VECTOR_ID_H_S);
|
|
|
|
i = 0;
|
|
for (node = ring_chain; node; node = node->next) {
|
|
@@ -5237,7 +5249,14 @@ int hclge_bind_ring_with_vector(struct hclge_vport *vport,
|
|
hclge_cmd_setup_basic_desc(&desc,
|
|
op,
|
|
false);
|
|
- req->int_vector_id = vector_id;
|
|
+ req->int_vector_id_l =
|
|
+ hnae3_get_field(vector_id,
|
|
+ HCLGE_VECTOR_ID_L_M,
|
|
+ HCLGE_VECTOR_ID_L_S);
|
|
+ req->int_vector_id_h =
|
|
+ hnae3_get_field(vector_id,
|
|
+ HCLGE_VECTOR_ID_H_M,
|
|
+ HCLGE_VECTOR_ID_H_S);
|
|
}
|
|
}
|
|
|
|
@@ -10670,6 +10689,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;
|
|
@@ -10708,9 +10749,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);
|
|
@@ -10724,6 +10772,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);
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
|
index 7acf0f091b40..5ff61230d79f 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
|
@@ -30,9 +30,11 @@
|
|
(HCLGE_PF_CFG_BLOCK_SIZE / HCLGE_CFG_RD_LEN_BYTES)
|
|
|
|
#define HCLGE_VECTOR_REG_BASE 0x20000
|
|
+#define HCLGE_VECTOR_EXT_REG_BASE 0x30000
|
|
#define HCLGE_MISC_VECTOR_REG_BASE 0x20400
|
|
|
|
#define HCLGE_VECTOR_REG_OFFSET 0x4
|
|
+#define HCLGE_VECTOR_REG_OFFSET_H 0x1000
|
|
#define HCLGE_VECTOR_VF_OFFSET 0x100000
|
|
|
|
#define HCLGE_NIC_CSQ_BASEADDR_L_REG 0x27000
|
|
@@ -295,6 +297,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;
|
|
@@ -850,7 +853,6 @@ struct hclge_dev {
|
|
u16 num_msi;
|
|
u16 num_msi_left;
|
|
u16 num_msi_used;
|
|
- u16 roce_base_msix_offset;
|
|
u32 base_msi_vector;
|
|
u16 *vector_status;
|
|
int *vector_irq;
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
|
|
index 07d0aaa0634e..7b27a012bbd1 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
|
|
@@ -311,7 +311,7 @@ static int hclge_get_vf_ring_vector_map(struct hclge_vport *vport,
|
|
resp->data[HCLGE_RING_TYPE_OFFSET] = req->msg.param[0].ring_type;
|
|
resp->data[HCLGE_TQP_INDEX_OFFSET] = req->msg.param[0].tqp_index;
|
|
resp->data[HCLGE_INT_GL_INDEX_OFFSET] = int_gl_index;
|
|
- resp->data[HCLGE_VECTOR_ID_OFFSET] = data->int_vector_id;
|
|
+ resp->data[HCLGE_VECTOR_ID_OFFSET] = data->int_vector_id_l;
|
|
resp->len = HCLGE_RING_VECTOR_MAP_INFO_LEN;
|
|
|
|
hclge_free_vector_ring_chain(&ring_chain);
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
|
index 8386baf0a6a6..082361e3713c 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
|
@@ -2486,6 +2486,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;
|
|
@@ -2946,6 +2947,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;
|
|
@@ -2980,8 +3004,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);
|
|
@@ -2995,6 +3025,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);
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
|
|
index 4498859e6ed4..45313a59a380 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
|
|
@@ -168,6 +168,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;
|
|
--
|
|
2.34.1
|
|
|