On Tue, May 14, 2024 at 05:27:07AM +0800, Zhu Lingshan wrote: > Most of ifcvf code work for standard virtio pci, > except for bar4. This commit makes bar4 only effective > for Intel products, thereby turning ifcvf into > a standard virtio pci driver. > > Signed-off-by: Zhu Lingshan <lingshan.zhu@xxxxxxxxx> > --- > drivers/vdpa/Kconfig | 2 +- > drivers/vdpa/ifcvf/ifcvf_base.c | 17 ++++++++++++----- > drivers/vdpa/ifcvf/ifcvf_main.c | 5 ++++- > 3 files changed, 17 insertions(+), 7 deletions(-) > > diff --git a/drivers/vdpa/Kconfig b/drivers/vdpa/Kconfig > index 656c1cb541de..dbf09f35bcef 100644 > --- a/drivers/vdpa/Kconfig > +++ b/drivers/vdpa/Kconfig > @@ -44,7 +44,7 @@ config VDPA_USER > in a userspace program. > > config IFCVF > - tristate "Intel IFC VF vDPA driver" > + tristate "Intel IFC VF and standard virtio-pci vDPA driver" > depends on PCI_MSI > help > This kernel module can drive Intel IFC VF NIC to offload > diff --git a/drivers/vdpa/ifcvf/ifcvf_base.c b/drivers/vdpa/ifcvf/ifcvf_base.c > index 472daa588a9d..47bc9b11c678 100644 > --- a/drivers/vdpa/ifcvf/ifcvf_base.c > +++ b/drivers/vdpa/ifcvf/ifcvf_base.c > @@ -178,7 +178,8 @@ int ifcvf_init_hw(struct ifcvf_hw *hw, struct pci_dev *pdev) > hw->vring[i].irq = -EINVAL; > } > > - hw->lm_cfg = hw->base[IFCVF_LM_BAR]; > + if (hw->pdev->subsystem_vendor == PCI_VENDOR_ID_INTEL) > + hw->lm_cfg = hw->base[IFCVF_LM_BAR]; > > IFCVF_DBG(pdev, > "PCI capability mapping: common cfg: %p, notify base: %p\n, isr cfg: %p, device cfg: %p, multiplier: %u\n", > @@ -330,18 +331,24 @@ u16 ifcvf_get_vq_state(struct ifcvf_hw *hw, u16 qid) > struct ifcvf_lm_cfg __iomem *lm_cfg = hw->lm_cfg; > u16 last_avail_idx; > > - last_avail_idx = vp_ioread16(&lm_cfg->vq_state_region + qid * 2); > + if (lm_cfg) { > + last_avail_idx = vp_ioread16(&lm_cfg->vq_state_region + qid * 2); > + return last_avail_idx; > + } > > - return last_avail_idx; > + return -EOPNOTSUPP; > } > > int ifcvf_set_vq_state(struct ifcvf_hw *hw, u16 qid, u16 num) > { > struct ifcvf_lm_cfg __iomem *lm_cfg = hw->lm_cfg; > > - vp_iowrite16(num, &lm_cfg->vq_state_region + qid * 2); > + if (lm_cfg) { > + vp_iowrite16(num, &lm_cfg->vq_state_region + qid * 2); > + return 0; > + } > > - return 0; > + return -EOPNOTSUPP; > } > > void ifcvf_set_vq_num(struct ifcvf_hw *hw, u16 qid, u32 num) > diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c > index 80d0a0460885..e89fd4d96ff1 100644 > --- a/drivers/vdpa/ifcvf/ifcvf_main.c > +++ b/drivers/vdpa/ifcvf/ifcvf_main.c > @@ -1,6 +1,7 @@ > // SPDX-License-Identifier: GPL-2.0-only > /* > * Intel IFC VF NIC driver for virtio dataplane offloading > + * This driver also drives standard virtio-pci hardwares > * > * Copyright (C) 2020 Intel Corporation. > * > @@ -880,7 +881,9 @@ static struct pci_device_id ifcvf_pci_ids[] = { > VIRTIO_TRANS_ID_BLOCK, > PCI_VENDOR_ID_INTEL, > VIRTIO_ID_BLOCK) }, > - > + /* standard virtio pci devices */ > + { PCI_DEVICE(PCI_VENDOR_ID_REDHAT_QUMRANET, > + PCI_ANY_ID) }, > { 0 }, > }; > MODULE_DEVICE_TABLE(pci, ifcvf_pci_ids); Will make it conflict with the normal virtio driver, won't it? What are you trying to achieve here? > -- > 2.43.0