mirror of
https://github.com/qemu/qemu.git
synced 2024-11-26 04:13:39 +08:00
qdev:pci: refactor PCIDevice to use generic "hotpluggable" property
Get rid of PCIDevice specific PCIDeviceClass.no_hotplug and use generic DeviceClass.hotpluggable field instead. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
5fdae20cef
commit
2897ae0267
@ -105,12 +105,13 @@ static PCIBus *acpi_pcihp_find_hotplug_bus(AcpiPciHpState *s, int bsel)
|
||||
static bool acpi_pcihp_pc_no_hotplug(AcpiPciHpState *s, PCIDevice *dev)
|
||||
{
|
||||
PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
|
||||
DeviceClass *dc = DEVICE_GET_CLASS(dev);
|
||||
/*
|
||||
* ACPI doesn't allow hotplug of bridge devices. Don't allow
|
||||
* hot-unplug of bridge devices unless they were added by hotplug
|
||||
* (and so, not described by acpi).
|
||||
*/
|
||||
return (pc->is_bridge && !dev->qdev.hotplugged) || pc->no_hotplug;
|
||||
return (pc->is_bridge && !dev->qdev.hotplugged) || !dc->hotpluggable;
|
||||
}
|
||||
|
||||
static void acpi_pcihp_eject_slot(AcpiPciHpState *s, unsigned bsel, unsigned slots)
|
||||
|
@ -536,7 +536,6 @@ static void piix4_pm_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
|
||||
k->no_hotplug = 1;
|
||||
k->init = piix4_pm_initfn;
|
||||
k->config_write = pm_write_config;
|
||||
k->vendor_id = PCI_VENDOR_ID_INTEL;
|
||||
@ -551,6 +550,7 @@ static void piix4_pm_class_init(ObjectClass *klass, void *data)
|
||||
* e.g. by mips_malta_init()
|
||||
*/
|
||||
dc->cannot_instantiate_with_device_add_yet = true;
|
||||
dc->hotpluggable = false;
|
||||
}
|
||||
|
||||
static const TypeInfo piix4_pm_info = {
|
||||
|
@ -2996,7 +2996,6 @@ static void cirrus_vga_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
|
||||
k->no_hotplug = 1;
|
||||
k->init = pci_cirrus_vga_initfn;
|
||||
k->romfile = VGABIOS_CIRRUS_FILENAME;
|
||||
k->vendor_id = PCI_VENDOR_ID_CIRRUS;
|
||||
@ -3006,6 +3005,7 @@ static void cirrus_vga_class_init(ObjectClass *klass, void *data)
|
||||
dc->desc = "Cirrus CLGD 54xx VGA";
|
||||
dc->vmsd = &vmstate_pci_cirrus_vga;
|
||||
dc->props = pci_vga_cirrus_properties;
|
||||
dc->hotpluggable = false;
|
||||
}
|
||||
|
||||
static const TypeInfo cirrus_vga_info = {
|
||||
|
@ -2299,7 +2299,6 @@ static void qxl_primary_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
|
||||
k->no_hotplug = 1;
|
||||
k->init = qxl_init_primary;
|
||||
k->romfile = "vgabios-qxl.bin";
|
||||
k->vendor_id = REDHAT_PCI_VENDOR_ID;
|
||||
@ -2310,6 +2309,7 @@ static void qxl_primary_class_init(ObjectClass *klass, void *data)
|
||||
dc->reset = qxl_reset_handler;
|
||||
dc->vmsd = &qxl_vmstate;
|
||||
dc->props = qxl_properties;
|
||||
dc->hotpluggable = false;
|
||||
}
|
||||
|
||||
static const TypeInfo qxl_primary_info = {
|
||||
|
@ -190,7 +190,6 @@ static void vga_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
|
||||
k->no_hotplug = 1;
|
||||
k->init = pci_std_vga_initfn;
|
||||
k->romfile = "vgabios-stdvga.bin";
|
||||
k->vendor_id = PCI_VENDOR_ID_QEMU;
|
||||
@ -198,6 +197,7 @@ static void vga_class_init(ObjectClass *klass, void *data)
|
||||
k->class_id = PCI_CLASS_DISPLAY_VGA;
|
||||
dc->vmsd = &vmstate_vga_pci;
|
||||
dc->props = vga_pci_properties;
|
||||
dc->hotpluggable = false;
|
||||
set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
|
||||
}
|
||||
|
||||
|
@ -1296,7 +1296,6 @@ static void vmsvga_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
|
||||
k->no_hotplug = 1;
|
||||
k->init = pci_vmsvga_initfn;
|
||||
k->romfile = "vgabios-vmware.bin";
|
||||
k->vendor_id = PCI_VENDOR_ID_VMWARE;
|
||||
@ -1307,6 +1306,7 @@ static void vmsvga_class_init(ObjectClass *klass, void *data)
|
||||
dc->reset = vmsvga_reset;
|
||||
dc->vmsd = &vmstate_vmware_vga;
|
||||
dc->props = vga_vmware_properties;
|
||||
dc->hotpluggable = false;
|
||||
set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
|
||||
}
|
||||
|
||||
|
@ -768,6 +768,7 @@ static void build_pci_bus_end(PCIBus *bus, void *bus_state)
|
||||
memset(slot_hotplug_enable, 0xff, sizeof slot_hotplug_enable);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(bus->devices); ++i) {
|
||||
DeviceClass *dc;
|
||||
PCIDeviceClass *pc;
|
||||
PCIDevice *pdev = bus->devices[i];
|
||||
|
||||
@ -776,8 +777,9 @@ static void build_pci_bus_end(PCIBus *bus, void *bus_state)
|
||||
}
|
||||
|
||||
pc = PCI_DEVICE_GET_CLASS(pdev);
|
||||
dc = DEVICE_GET_CLASS(pdev);
|
||||
|
||||
if (pc->no_hotplug || pc->is_bridge) {
|
||||
if (!dc->hotpluggable || pc->is_bridge) {
|
||||
int slot = PCI_SLOT(i);
|
||||
|
||||
clear_bit(slot, slot_hotplug_enable);
|
||||
|
@ -241,13 +241,13 @@ static void piix3_ide_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
|
||||
k->no_hotplug = 1;
|
||||
k->init = pci_piix_ide_initfn;
|
||||
k->exit = pci_piix_ide_exitfn;
|
||||
k->vendor_id = PCI_VENDOR_ID_INTEL;
|
||||
k->device_id = PCI_DEVICE_ID_INTEL_82371SB_1;
|
||||
k->class_id = PCI_CLASS_STORAGE_IDE;
|
||||
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
|
||||
dc->hotpluggable = false;
|
||||
}
|
||||
|
||||
static const TypeInfo piix3_ide_info = {
|
||||
@ -280,13 +280,13 @@ static void piix4_ide_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
|
||||
k->no_hotplug = 1;
|
||||
k->init = pci_piix_ide_initfn;
|
||||
k->exit = pci_piix_ide_exitfn;
|
||||
k->vendor_id = PCI_VENDOR_ID_INTEL;
|
||||
k->device_id = PCI_DEVICE_ID_INTEL_82371AB;
|
||||
k->class_id = PCI_CLASS_STORAGE_IDE;
|
||||
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
|
||||
dc->hotpluggable = false;
|
||||
}
|
||||
|
||||
static const TypeInfo piix4_ide_info = {
|
||||
|
@ -107,7 +107,6 @@ static void piix4_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
|
||||
k->no_hotplug = 1;
|
||||
k->init = piix4_initfn;
|
||||
k->vendor_id = PCI_VENDOR_ID_INTEL;
|
||||
k->device_id = PCI_DEVICE_ID_INTEL_82371AB_0;
|
||||
@ -119,6 +118,7 @@ static void piix4_class_init(ObjectClass *klass, void *data)
|
||||
* e.g. by mips_malta_init()
|
||||
*/
|
||||
dc->cannot_instantiate_with_device_add_yet = true;
|
||||
dc->hotpluggable = false;
|
||||
}
|
||||
|
||||
static const TypeInfo piix4_info = {
|
||||
|
@ -628,7 +628,7 @@ static void piix3_class_init(ObjectClass *klass, void *data)
|
||||
|
||||
dc->desc = "ISA bridge";
|
||||
dc->vmsd = &vmstate_piix3;
|
||||
k->no_hotplug = 1;
|
||||
dc->hotpluggable = false;
|
||||
k->init = piix3_initfn;
|
||||
k->config_write = piix3_write_config;
|
||||
k->vendor_id = PCI_VENDOR_ID_INTEL;
|
||||
@ -656,7 +656,7 @@ static void piix3_xen_class_init(ObjectClass *klass, void *data)
|
||||
|
||||
dc->desc = "ISA bridge";
|
||||
dc->vmsd = &vmstate_piix3;
|
||||
k->no_hotplug = 1;
|
||||
dc->hotpluggable = false;
|
||||
k->init = piix3_initfn;
|
||||
k->config_write = piix3_write_config_xen;
|
||||
k->vendor_id = PCI_VENDOR_ID_INTEL;
|
||||
@ -682,7 +682,6 @@ static void i440fx_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
|
||||
k->no_hotplug = 1;
|
||||
k->init = i440fx_initfn;
|
||||
k->config_write = i440fx_write_config;
|
||||
k->vendor_id = PCI_VENDOR_ID_INTEL;
|
||||
@ -696,6 +695,7 @@ static void i440fx_class_init(ObjectClass *klass, void *data)
|
||||
* host-facing part, which can't be device_add'ed, yet.
|
||||
*/
|
||||
dc->cannot_instantiate_with_device_add_yet = true;
|
||||
dc->hotpluggable = false;
|
||||
}
|
||||
|
||||
static const TypeInfo i440fx_info = {
|
||||
|
11
hw/pci/pci.c
11
hw/pci/pci.c
@ -1761,11 +1761,7 @@ static int pci_qdev_init(DeviceState *qdev)
|
||||
pci_dev->devfn);
|
||||
if (pci_dev == NULL)
|
||||
return -1;
|
||||
if (qdev->hotplugged && pc->no_hotplug) {
|
||||
qerror_report(QERR_DEVICE_NO_HOTPLUG, object_get_typename(OBJECT(pci_dev)));
|
||||
do_pci_unregister_device(pci_dev);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (pc->init) {
|
||||
rc = pc->init(pci_dev);
|
||||
if (rc != 0) {
|
||||
@ -1800,12 +1796,7 @@ static int pci_qdev_init(DeviceState *qdev)
|
||||
static int pci_unplug_device(DeviceState *qdev)
|
||||
{
|
||||
PCIDevice *dev = PCI_DEVICE(qdev);
|
||||
PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
|
||||
|
||||
if (pc->no_hotplug) {
|
||||
qerror_report(QERR_DEVICE_NO_HOTPLUG, object_get_typename(OBJECT(dev)));
|
||||
return -1;
|
||||
}
|
||||
return dev->bus->hotplug(dev->bus->hotplug_qdev, dev,
|
||||
PCI_HOTPLUG_DISABLED);
|
||||
}
|
||||
|
@ -123,7 +123,7 @@ static void ehci_class_init(ObjectClass *klass, void *data)
|
||||
k->init = usb_ehci_pci_initfn;
|
||||
k->class_id = PCI_CLASS_SERIAL_USB;
|
||||
k->config_write = usb_ehci_pci_write_config;
|
||||
k->no_hotplug = 1;
|
||||
dc->hotpluggable = false;
|
||||
dc->vmsd = &vmstate_ehci_pci;
|
||||
dc->props = ehci_pci_properties;
|
||||
}
|
||||
|
@ -1993,10 +1993,10 @@ static void ohci_pci_class_init(ObjectClass *klass, void *data)
|
||||
k->vendor_id = PCI_VENDOR_ID_APPLE;
|
||||
k->device_id = PCI_DEVICE_ID_APPLE_IPID_USB;
|
||||
k->class_id = PCI_CLASS_SERIAL_USB;
|
||||
k->no_hotplug = 1;
|
||||
set_bit(DEVICE_CATEGORY_USB, dc->categories);
|
||||
dc->desc = "Apple USB Controller";
|
||||
dc->props = ohci_pci_properties;
|
||||
dc->hotpluggable = false;
|
||||
}
|
||||
|
||||
static const TypeInfo ohci_pci_info = {
|
||||
|
@ -1318,7 +1318,7 @@ static void uhci_class_init(ObjectClass *klass, void *data)
|
||||
k->device_id = info->device_id;
|
||||
k->revision = info->revision;
|
||||
k->class_id = PCI_CLASS_SERIAL_USB;
|
||||
k->no_hotplug = 1;
|
||||
dc->hotpluggable = false;
|
||||
dc->vmsd = &vmstate_uhci;
|
||||
dc->props = uhci_properties;
|
||||
set_bit(DEVICE_CATEGORY_USB, dc->categories);
|
||||
|
@ -3798,6 +3798,7 @@ static void xhci_class_init(ObjectClass *klass, void *data)
|
||||
dc->vmsd = &vmstate_xhci;
|
||||
dc->props = xhci_properties;
|
||||
dc->reset = xhci_reset;
|
||||
dc->hotpluggable = false;
|
||||
set_bit(DEVICE_CATEGORY_USB, dc->categories);
|
||||
k->init = usb_xhci_initfn;
|
||||
k->vendor_id = PCI_VENDOR_ID_NEC;
|
||||
@ -3805,7 +3806,6 @@ static void xhci_class_init(ObjectClass *klass, void *data)
|
||||
k->class_id = PCI_CLASS_SERIAL_USB;
|
||||
k->revision = 0x03;
|
||||
k->is_express = 1;
|
||||
k->no_hotplug = 1;
|
||||
}
|
||||
|
||||
static const TypeInfo xhci_info = {
|
||||
|
@ -201,9 +201,6 @@ typedef struct PCIDeviceClass {
|
||||
/* pcie stuff */
|
||||
int is_express; /* is this device pci express? */
|
||||
|
||||
/* device isn't hot-pluggable */
|
||||
int no_hotplug;
|
||||
|
||||
/* rom bar */
|
||||
const char *romfile;
|
||||
} PCIDeviceClass;
|
||||
|
Loading…
Reference in New Issue
Block a user