mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 06:43:53 -06:00
vfio: add vfio-pci-base class
Split out parts of TYPE_VFIO_PCI into a base TYPE_VFIO_PCI_BASE, although we have not yet introduced another subclass, so all the properties have remained in TYPE_VFIO_PCI. Note that currently there is no need for additional data for TYPE_VFIO_PCI, so it shares the same C struct type as TYPE_VFIO_PCI_BASE, VFIOPCIDevice. Originally-by: John Johnson <john.g.johnson@oracle.com> Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com> Signed-off-by: Jagannathan Raman <jag.raman@oracle.com> Signed-off-by: John Levon <john.levon@nutanix.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Link: https://lore.kernel.org/qemu-devel/20250507152020.1254632-14-john.levon@nutanix.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
This commit is contained in:
parent
776066ac90
commit
d4e392d0a9
3 changed files with 50 additions and 24 deletions
|
@ -392,7 +392,7 @@ bool vfio_device_hiod_create_and_realize(VFIODevice *vbasedev,
|
|||
VFIODevice *vfio_get_vfio_device(Object *obj)
|
||||
{
|
||||
if (object_dynamic_cast(obj, TYPE_VFIO_PCI)) {
|
||||
return &VFIO_PCI(obj)->vbasedev;
|
||||
return &VFIO_PCI_BASE(obj)->vbasedev;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -241,7 +241,7 @@ static void vfio_intx_update(VFIOPCIDevice *vdev, PCIINTxRoute *route)
|
|||
|
||||
static void vfio_intx_routing_notifier(PCIDevice *pdev)
|
||||
{
|
||||
VFIOPCIDevice *vdev = VFIO_PCI(pdev);
|
||||
VFIOPCIDevice *vdev = VFIO_PCI_BASE(pdev);
|
||||
PCIINTxRoute route;
|
||||
|
||||
if (vdev->interrupt != VFIO_INT_INTx) {
|
||||
|
@ -514,7 +514,7 @@ static void vfio_update_kvm_msi_virq(VFIOMSIVector *vector, MSIMessage msg,
|
|||
static int vfio_msix_vector_do_use(PCIDevice *pdev, unsigned int nr,
|
||||
MSIMessage *msg, IOHandler *handler)
|
||||
{
|
||||
VFIOPCIDevice *vdev = VFIO_PCI(pdev);
|
||||
VFIOPCIDevice *vdev = VFIO_PCI_BASE(pdev);
|
||||
VFIOMSIVector *vector;
|
||||
int ret;
|
||||
bool resizing = !!(vdev->nr_vectors < nr + 1);
|
||||
|
@ -620,7 +620,7 @@ static int vfio_msix_vector_use(PCIDevice *pdev,
|
|||
|
||||
static void vfio_msix_vector_release(PCIDevice *pdev, unsigned int nr)
|
||||
{
|
||||
VFIOPCIDevice *vdev = VFIO_PCI(pdev);
|
||||
VFIOPCIDevice *vdev = VFIO_PCI_BASE(pdev);
|
||||
VFIOMSIVector *vector = &vdev->msi_vectors[nr];
|
||||
|
||||
trace_vfio_msix_vector_release(vdev->vbasedev.name, nr);
|
||||
|
@ -1196,7 +1196,7 @@ static const MemoryRegionOps vfio_vga_ops = {
|
|||
*/
|
||||
static void vfio_sub_page_bar_update_mapping(PCIDevice *pdev, int bar)
|
||||
{
|
||||
VFIOPCIDevice *vdev = VFIO_PCI(pdev);
|
||||
VFIOPCIDevice *vdev = VFIO_PCI_BASE(pdev);
|
||||
VFIORegion *region = &vdev->bars[bar].region;
|
||||
MemoryRegion *mmap_mr, *region_mr, *base_mr;
|
||||
PCIIORegion *r;
|
||||
|
@ -1242,7 +1242,7 @@ static void vfio_sub_page_bar_update_mapping(PCIDevice *pdev, int bar)
|
|||
*/
|
||||
uint32_t vfio_pci_read_config(PCIDevice *pdev, uint32_t addr, int len)
|
||||
{
|
||||
VFIOPCIDevice *vdev = VFIO_PCI(pdev);
|
||||
VFIOPCIDevice *vdev = VFIO_PCI_BASE(pdev);
|
||||
VFIODevice *vbasedev = &vdev->vbasedev;
|
||||
uint32_t emu_bits = 0, emu_val = 0, phys_val = 0, val;
|
||||
|
||||
|
@ -1276,7 +1276,7 @@ uint32_t vfio_pci_read_config(PCIDevice *pdev, uint32_t addr, int len)
|
|||
void vfio_pci_write_config(PCIDevice *pdev,
|
||||
uint32_t addr, uint32_t val, int len)
|
||||
{
|
||||
VFIOPCIDevice *vdev = VFIO_PCI(pdev);
|
||||
VFIOPCIDevice *vdev = VFIO_PCI_BASE(pdev);
|
||||
VFIODevice *vbasedev = &vdev->vbasedev;
|
||||
uint32_t val_le = cpu_to_le32(val);
|
||||
int ret;
|
||||
|
@ -3129,7 +3129,7 @@ static bool vfio_interrupt_setup(VFIOPCIDevice *vdev, Error **errp)
|
|||
static void vfio_realize(PCIDevice *pdev, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
VFIOPCIDevice *vdev = VFIO_PCI(pdev);
|
||||
VFIOPCIDevice *vdev = VFIO_PCI_BASE(pdev);
|
||||
VFIODevice *vbasedev = &vdev->vbasedev;
|
||||
int i, ret;
|
||||
char uuid[UUID_STR_LEN];
|
||||
|
@ -3300,7 +3300,7 @@ error:
|
|||
|
||||
static void vfio_instance_finalize(Object *obj)
|
||||
{
|
||||
VFIOPCIDevice *vdev = VFIO_PCI(obj);
|
||||
VFIOPCIDevice *vdev = VFIO_PCI_BASE(obj);
|
||||
|
||||
vfio_display_finalize(vdev);
|
||||
vfio_bars_finalize(vdev);
|
||||
|
@ -3318,7 +3318,7 @@ static void vfio_instance_finalize(Object *obj)
|
|||
|
||||
static void vfio_exitfn(PCIDevice *pdev)
|
||||
{
|
||||
VFIOPCIDevice *vdev = VFIO_PCI(pdev);
|
||||
VFIOPCIDevice *vdev = VFIO_PCI_BASE(pdev);
|
||||
VFIODevice *vbasedev = &vdev->vbasedev;
|
||||
|
||||
vfio_unregister_req_notifier(vdev);
|
||||
|
@ -3342,7 +3342,7 @@ static void vfio_exitfn(PCIDevice *pdev)
|
|||
|
||||
static void vfio_pci_reset(DeviceState *dev)
|
||||
{
|
||||
VFIOPCIDevice *vdev = VFIO_PCI(dev);
|
||||
VFIOPCIDevice *vdev = VFIO_PCI_BASE(dev);
|
||||
|
||||
trace_vfio_pci_reset(vdev->vbasedev.name);
|
||||
|
||||
|
@ -3382,7 +3382,7 @@ post_reset:
|
|||
static void vfio_instance_init(Object *obj)
|
||||
{
|
||||
PCIDevice *pci_dev = PCI_DEVICE(obj);
|
||||
VFIOPCIDevice *vdev = VFIO_PCI(obj);
|
||||
VFIOPCIDevice *vdev = VFIO_PCI_BASE(obj);
|
||||
VFIODevice *vbasedev = &vdev->vbasedev;
|
||||
|
||||
device_add_bootindex_property(obj, &vdev->bootindex,
|
||||
|
@ -3403,6 +3403,31 @@ static void vfio_instance_init(Object *obj)
|
|||
pci_dev->cap_present |= QEMU_PCI_CAP_EXPRESS;
|
||||
}
|
||||
|
||||
static void vfio_pci_base_dev_class_init(ObjectClass *klass, const void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *pdc = PCI_DEVICE_CLASS(klass);
|
||||
|
||||
dc->desc = "VFIO PCI base device";
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
pdc->exit = vfio_exitfn;
|
||||
pdc->config_read = vfio_pci_read_config;
|
||||
pdc->config_write = vfio_pci_write_config;
|
||||
}
|
||||
|
||||
static const TypeInfo vfio_pci_base_dev_info = {
|
||||
.name = TYPE_VFIO_PCI_BASE,
|
||||
.parent = TYPE_PCI_DEVICE,
|
||||
.instance_size = 0,
|
||||
.abstract = true,
|
||||
.class_init = vfio_pci_base_dev_class_init,
|
||||
.interfaces = (const InterfaceInfo[]) {
|
||||
{ INTERFACE_PCIE_DEVICE },
|
||||
{ INTERFACE_CONVENTIONAL_PCI_DEVICE },
|
||||
{ }
|
||||
},
|
||||
};
|
||||
|
||||
static PropertyInfo vfio_pci_migration_multifd_transfer_prop;
|
||||
|
||||
static const Property vfio_pci_dev_properties[] = {
|
||||
|
@ -3473,7 +3498,8 @@ static const Property vfio_pci_dev_properties[] = {
|
|||
#ifdef CONFIG_IOMMUFD
|
||||
static void vfio_pci_set_fd(Object *obj, const char *str, Error **errp)
|
||||
{
|
||||
vfio_device_set_fd(&VFIO_PCI(obj)->vbasedev, str, errp);
|
||||
VFIOPCIDevice *vdev = VFIO_PCI_BASE(obj);
|
||||
vfio_device_set_fd(&vdev->vbasedev, str, errp);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -3488,11 +3514,7 @@ static void vfio_pci_dev_class_init(ObjectClass *klass, const void *data)
|
|||
object_class_property_add_str(klass, "fd", NULL, vfio_pci_set_fd);
|
||||
#endif
|
||||
dc->desc = "VFIO-based PCI device assignment";
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
pdc->realize = vfio_realize;
|
||||
pdc->exit = vfio_exitfn;
|
||||
pdc->config_read = vfio_pci_read_config;
|
||||
pdc->config_write = vfio_pci_write_config;
|
||||
|
||||
object_class_property_set_description(klass, /* 1.3 */
|
||||
"host",
|
||||
|
@ -3617,16 +3639,11 @@ static void vfio_pci_dev_class_init(ObjectClass *klass, const void *data)
|
|||
|
||||
static const TypeInfo vfio_pci_dev_info = {
|
||||
.name = TYPE_VFIO_PCI,
|
||||
.parent = TYPE_PCI_DEVICE,
|
||||
.parent = TYPE_VFIO_PCI_BASE,
|
||||
.instance_size = sizeof(VFIOPCIDevice),
|
||||
.class_init = vfio_pci_dev_class_init,
|
||||
.instance_init = vfio_instance_init,
|
||||
.instance_finalize = vfio_instance_finalize,
|
||||
.interfaces = (const InterfaceInfo[]) {
|
||||
{ INTERFACE_PCIE_DEVICE },
|
||||
{ INTERFACE_CONVENTIONAL_PCI_DEVICE },
|
||||
{ }
|
||||
},
|
||||
};
|
||||
|
||||
static const Property vfio_pci_dev_nohotplug_properties[] = {
|
||||
|
@ -3673,6 +3690,7 @@ static void register_vfio_pci_dev_type(void)
|
|||
vfio_pci_migration_multifd_transfer_prop = qdev_prop_on_off_auto;
|
||||
vfio_pci_migration_multifd_transfer_prop.realized_set_allowed = true;
|
||||
|
||||
type_register_static(&vfio_pci_base_dev_info);
|
||||
type_register_static(&vfio_pci_dev_info);
|
||||
type_register_static(&vfio_pci_nohotplug_dev_info);
|
||||
}
|
||||
|
|
|
@ -118,8 +118,16 @@ typedef struct VFIOMSIXInfo {
|
|||
bool noresize;
|
||||
} VFIOMSIXInfo;
|
||||
|
||||
/*
|
||||
* TYPE_VFIO_PCI_BASE is an abstract type used to share code
|
||||
* between VFIO implementations that use a kernel driver
|
||||
* with those that use user sockets.
|
||||
*/
|
||||
#define TYPE_VFIO_PCI_BASE "vfio-pci-base"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(VFIOPCIDevice, VFIO_PCI_BASE)
|
||||
|
||||
#define TYPE_VFIO_PCI "vfio-pci"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(VFIOPCIDevice, VFIO_PCI)
|
||||
/* TYPE_VFIO_PCI shares struct VFIOPCIDevice. */
|
||||
|
||||
struct VFIOPCIDevice {
|
||||
PCIDevice pdev;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue