mirror of https://gitee.com/openkylin/qemu.git
vfio/pci: Add virtual capabilities quirk infrastructure
If the hypervisor needs to add purely virtual capabilties, give us a hook through quirks to do that. Note that we determine the maximum size for a capability based on the physical device, if we insert a virtual capability, that can change. Therefore if maximum size is smaller after added virt capabilities, use that. Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
parent
5b31c8229d
commit
e3f79f3bd4
|
@ -1850,3 +1850,7 @@ void vfio_setup_resetfn_quirk(VFIOPCIDevice *vdev)
|
|||
break;
|
||||
}
|
||||
}
|
||||
int vfio_add_virt_caps(VFIOPCIDevice *vdev, Error **errp)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1833,8 +1833,16 @@ static int vfio_add_std_cap(VFIOPCIDevice *vdev, uint8_t pos, Error **errp)
|
|||
pdev->config[PCI_CAPABILITY_LIST] = 0;
|
||||
vdev->emulated_config_bits[PCI_CAPABILITY_LIST] = 0xff;
|
||||
vdev->emulated_config_bits[PCI_STATUS] |= PCI_STATUS_CAP_LIST;
|
||||
|
||||
ret = vfio_add_virt_caps(vdev, errp);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
/* Scale down size, esp in case virt caps were added above */
|
||||
size = MIN(size, vfio_std_cap_max_size(pdev, pos));
|
||||
|
||||
/* Use emulated next pointer to allow dropping caps */
|
||||
pci_set_byte(vdev->emulated_config_bits + pos + PCI_CAP_LIST_NEXT, 0xff);
|
||||
|
||||
|
|
|
@ -160,6 +160,7 @@ void vfio_bar_quirk_setup(VFIOPCIDevice *vdev, int nr);
|
|||
void vfio_bar_quirk_exit(VFIOPCIDevice *vdev, int nr);
|
||||
void vfio_bar_quirk_finalize(VFIOPCIDevice *vdev, int nr);
|
||||
void vfio_setup_resetfn_quirk(VFIOPCIDevice *vdev);
|
||||
int vfio_add_virt_caps(VFIOPCIDevice *vdev, Error **errp);
|
||||
|
||||
int vfio_populate_vga(VFIOPCIDevice *vdev, Error **errp);
|
||||
|
||||
|
|
Loading…
Reference in New Issue