Message ID | 20220110051851.84807-3-lingshan.zhu@intel.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Supoort shared irq for virtqueues | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Not a local patch |
On Mon, Jan 10, 2022 at 01:18:46PM +0800, Zhu Lingshan wrote: > This commit introduces new helpers to set config vector > and vq vectors in virtio common config space. > > Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com> > --- > drivers/vdpa/ifcvf/ifcvf_base.c | 30 ++++++++++++++++++++++++++++++ > drivers/vdpa/ifcvf/ifcvf_base.h | 2 ++ > 2 files changed, 32 insertions(+) > > diff --git a/drivers/vdpa/ifcvf/ifcvf_base.c b/drivers/vdpa/ifcvf/ifcvf_base.c > index 0b5df4cfaf06..696a41560eaa 100644 > --- a/drivers/vdpa/ifcvf/ifcvf_base.c > +++ b/drivers/vdpa/ifcvf/ifcvf_base.c > @@ -15,6 +15,36 @@ struct ifcvf_adapter *vf_to_adapter(struct ifcvf_hw *hw) > return container_of(hw, struct ifcvf_adapter, vf); > } > > +int ifcvf_set_vq_vector(struct ifcvf_hw *hw, u16 qid, int vector) > +{ > + struct virtio_pci_common_cfg __iomem *cfg = hw->common_cfg; > + struct ifcvf_adapter *ifcvf = vf_to_adapter(hw); > + > + ifc_iowrite16(qid, &cfg->queue_select); > + ifc_iowrite16(vector, &cfg->queue_msix_vector); > + if (ifc_ioread16(&cfg->queue_msix_vector) == VIRTIO_MSI_NO_VECTOR) { > + IFCVF_ERR(ifcvf->pdev, "No msix vector for queue %u\n", qid); > + return -EINVAL; > + } > + > + return 0; > +} > + > +int ifcvf_set_config_vector(struct ifcvf_hw *hw, int vector) > +{ > + struct virtio_pci_common_cfg __iomem *cfg = hw->common_cfg; > + struct ifcvf_adapter *ifcvf = vf_to_adapter(hw); > + > + cfg = hw->common_cfg; > + ifc_iowrite16(vector, &cfg->msix_config); > + if (ifc_ioread16(&cfg->msix_config) == VIRTIO_MSI_NO_VECTOR) { > + IFCVF_ERR(ifcvf->pdev, "No msix vector for device config\n"); > + return -EINVAL; > + } > + > + return 0; > +} > + The messages are confusing. Something like "unable to set" would be clearer. And maybe supply the info which vector and which vq to set? > static void __iomem *get_cap_addr(struct ifcvf_hw *hw, > struct virtio_pci_cap *cap) > { > diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h b/drivers/vdpa/ifcvf/ifcvf_base.h > index c924a7673afb..1d5431040d7d 100644 > --- a/drivers/vdpa/ifcvf/ifcvf_base.h > +++ b/drivers/vdpa/ifcvf/ifcvf_base.h > @@ -157,4 +157,6 @@ u16 ifcvf_get_vq_state(struct ifcvf_hw *hw, u16 qid); > int ifcvf_set_vq_state(struct ifcvf_hw *hw, u16 qid, u16 num); > struct ifcvf_adapter *vf_to_adapter(struct ifcvf_hw *hw); > int ifcvf_probed_virtio_net(struct ifcvf_hw *hw); > +int ifcvf_set_vq_vector(struct ifcvf_hw *hw, u16 qid, int vector); > +int ifcvf_set_config_vector(struct ifcvf_hw *hw, int vector); > #endif /* _IFCVF_H_ */ > -- > 2.27.0
diff --git a/drivers/vdpa/ifcvf/ifcvf_base.c b/drivers/vdpa/ifcvf/ifcvf_base.c index 0b5df4cfaf06..696a41560eaa 100644 --- a/drivers/vdpa/ifcvf/ifcvf_base.c +++ b/drivers/vdpa/ifcvf/ifcvf_base.c @@ -15,6 +15,36 @@ struct ifcvf_adapter *vf_to_adapter(struct ifcvf_hw *hw) return container_of(hw, struct ifcvf_adapter, vf); } +int ifcvf_set_vq_vector(struct ifcvf_hw *hw, u16 qid, int vector) +{ + struct virtio_pci_common_cfg __iomem *cfg = hw->common_cfg; + struct ifcvf_adapter *ifcvf = vf_to_adapter(hw); + + ifc_iowrite16(qid, &cfg->queue_select); + ifc_iowrite16(vector, &cfg->queue_msix_vector); + if (ifc_ioread16(&cfg->queue_msix_vector) == VIRTIO_MSI_NO_VECTOR) { + IFCVF_ERR(ifcvf->pdev, "No msix vector for queue %u\n", qid); + return -EINVAL; + } + + return 0; +} + +int ifcvf_set_config_vector(struct ifcvf_hw *hw, int vector) +{ + struct virtio_pci_common_cfg __iomem *cfg = hw->common_cfg; + struct ifcvf_adapter *ifcvf = vf_to_adapter(hw); + + cfg = hw->common_cfg; + ifc_iowrite16(vector, &cfg->msix_config); + if (ifc_ioread16(&cfg->msix_config) == VIRTIO_MSI_NO_VECTOR) { + IFCVF_ERR(ifcvf->pdev, "No msix vector for device config\n"); + return -EINVAL; + } + + return 0; +} + static void __iomem *get_cap_addr(struct ifcvf_hw *hw, struct virtio_pci_cap *cap) { diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h b/drivers/vdpa/ifcvf/ifcvf_base.h index c924a7673afb..1d5431040d7d 100644 --- a/drivers/vdpa/ifcvf/ifcvf_base.h +++ b/drivers/vdpa/ifcvf/ifcvf_base.h @@ -157,4 +157,6 @@ u16 ifcvf_get_vq_state(struct ifcvf_hw *hw, u16 qid); int ifcvf_set_vq_state(struct ifcvf_hw *hw, u16 qid, u16 num); struct ifcvf_adapter *vf_to_adapter(struct ifcvf_hw *hw); int ifcvf_probed_virtio_net(struct ifcvf_hw *hw); +int ifcvf_set_vq_vector(struct ifcvf_hw *hw, u16 qid, int vector); +int ifcvf_set_config_vector(struct ifcvf_hw *hw, int vector); #endif /* _IFCVF_H_ */
This commit introduces new helpers to set config vector and vq vectors in virtio common config space. Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com> --- drivers/vdpa/ifcvf/ifcvf_base.c | 30 ++++++++++++++++++++++++++++++ drivers/vdpa/ifcvf/ifcvf_base.h | 2 ++ 2 files changed, 32 insertions(+)