vDPA/ifcvf: deduce VIRTIO device ID when probe

This commit deduces VIRTIO device ID as device type when probe,
then ifcvf_vdpa_get_device_id() can simply return the ID.
ifcvf_vdpa_get_features() and ifcvf_vdpa_get_config_size()
can work properly based on the device ID.

Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com>
Link: https://lore.kernel.org/r/20210419063326.3748-2-lingshan.zhu@intel.com
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Acked-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
Zhu Lingshan 2021-04-19 14:33:24 +08:00 коммит произвёл Michael S. Tsirkin
Родитель 899c4d187f
Коммит 26bfea1309
2 изменённых файлов: 16 добавлений и 12 удалений

Просмотреть файл

@ -84,6 +84,7 @@ struct ifcvf_hw {
u32 notify_off_multiplier; u32 notify_off_multiplier;
u64 req_features; u64 req_features;
u64 hw_features; u64 hw_features;
u32 dev_type;
struct virtio_pci_common_cfg __iomem *common_cfg; struct virtio_pci_common_cfg __iomem *common_cfg;
void __iomem *net_cfg; void __iomem *net_cfg;
struct vring_info vring[IFCVF_MAX_QUEUE_PAIRS * 2]; struct vring_info vring[IFCVF_MAX_QUEUE_PAIRS * 2];

Просмотреть файл

@ -323,19 +323,9 @@ static u32 ifcvf_vdpa_get_generation(struct vdpa_device *vdpa_dev)
static u32 ifcvf_vdpa_get_device_id(struct vdpa_device *vdpa_dev) static u32 ifcvf_vdpa_get_device_id(struct vdpa_device *vdpa_dev)
{ {
struct ifcvf_adapter *adapter = vdpa_to_adapter(vdpa_dev); struct ifcvf_hw *vf = vdpa_to_vf(vdpa_dev);
struct pci_dev *pdev = adapter->pdev;
u32 ret = -ENODEV;
if (pdev->device < 0x1000 || pdev->device > 0x107f) return vf->dev_type;
return ret;
if (pdev->device < 0x1040)
ret = pdev->subsystem_device;
else
ret = pdev->device - 0x1040;
return ret;
} }
static u32 ifcvf_vdpa_get_vendor_id(struct vdpa_device *vdpa_dev) static u32 ifcvf_vdpa_get_vendor_id(struct vdpa_device *vdpa_dev)
@ -466,6 +456,19 @@ static int ifcvf_probe(struct pci_dev *pdev, const struct pci_device_id *id)
pci_set_drvdata(pdev, adapter); pci_set_drvdata(pdev, adapter);
vf = &adapter->vf; vf = &adapter->vf;
/* This drirver drives both modern virtio devices and transitional
* devices in modern mode.
* vDPA requires feature bit VIRTIO_F_ACCESS_PLATFORM,
* so legacy devices and transitional devices in legacy
* mode will not work for vDPA, this driver will not
* drive devices with legacy interface.
*/
if (pdev->device < 0x1040)
vf->dev_type = pdev->subsystem_device;
else
vf->dev_type = pdev->device - 0x1040;
vf->base = pcim_iomap_table(pdev); vf->base = pcim_iomap_table(pdev);
adapter->pdev = pdev; adapter->pdev = pdev;