Hi, On 8/18/20 11:54 AM, Ani Sinha wrote: > Igor etc, I just tested this patch using a Windows 2012 R2 image and > it seems to be working. Any feedbacks on this patch? > > On Tue, Aug 11, 2020 at 6:42 PM Ani Sinha <a...@anisinha.ca> wrote: >> >> We introduce a new global flag for PIIX with which we can turn on or off PCI >> device hotplug on the root bus. This flag can be used to prevent all PCI >> devices from getting hotplugged or unplugged from the root PCI bus. >> >> Signed-off-by: Ani Sinha <a...@anisinha.ca> >> --- >> hw/acpi/piix4.c | 3 +++ >> hw/i386/acpi-build.c | 20 ++++++++++++++++---- >> 2 files changed, 19 insertions(+), 4 deletions(-) >> >> diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c >> index 26bac4f..94ec35a 100644 >> --- a/hw/acpi/piix4.c >> +++ b/hw/acpi/piix4.c >> @@ -78,6 +78,7 @@ typedef struct PIIX4PMState { >> >> AcpiPciHpState acpi_pci_hotplug; >> bool use_acpi_hotplug_bridge; >> + bool use_acpi_root_pci_hotplug; >> >> uint8_t disable_s3; >> uint8_t disable_s4; >> @@ -635,6 +636,8 @@ static Property piix4_pm_properties[] = { >> DEFINE_PROP_UINT8(ACPI_PM_PROP_S4_VAL, PIIX4PMState, s4_val, 2), >> DEFINE_PROP_BOOL("acpi-pci-hotplug-with-bridge-support", PIIX4PMState, >> use_acpi_hotplug_bridge, true), >> + DEFINE_PROP_BOOL("acpi-root-pci-hotplug", PIIX4PMState, >> + use_acpi_root_pci_hotplug, true),
>From what I understood here, this file is already pretty twisted and Igor doesn't want more workarounds: https://www.mail-archive.com/qemu-devel@nongnu.org/msg690564.html ¯\_(ツ)_/¯ >> DEFINE_PROP_BOOL("memory-hotplug-support", PIIX4PMState, >> acpi_memory_hotplug.is_enabled, true), >> DEFINE_PROP_END_OF_LIST(), >> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c >> index b7bcbbb..a82e5c1 100644 >> --- a/hw/i386/acpi-build.c >> +++ b/hw/i386/acpi-build.c >> @@ -95,6 +95,7 @@ typedef struct AcpiPmInfo { >> bool s3_disabled; >> bool s4_disabled; >> bool pcihp_bridge_en; >> + bool pcihp_root_en; >> uint8_t s4_val; >> AcpiFadtData fadt; >> uint16_t cpu_hp_io_base; >> @@ -245,6 +246,9 @@ static void acpi_get_pm_info(MachineState *machine, >> AcpiPmInfo *pm) >> pm->pcihp_bridge_en = >> object_property_get_bool(obj, >> "acpi-pci-hotplug-with-bridge-support", >> NULL); >> + pm->pcihp_root_en = >> + object_property_get_bool(obj, "acpi-root-pci-hotplug", NULL); >> + >> } >> >> static void acpi_get_misc_info(AcpiMiscInfo *info) >> @@ -337,12 +341,15 @@ static void build_append_pcihp_notify_entry(Aml >> *method, int slot) >> } >> >> static void build_append_pci_bus_devices(Aml *parent_scope, PCIBus *bus, >> - bool pcihp_bridge_en) >> + bool pcihp_bridge_en, >> + bool pcihp_root_en) >> { >> Aml *dev, *notify_method = NULL, *method; >> QObject *bsel; >> PCIBus *sec; >> int i; >> + bool root_bus = pci_bus_is_root(bus); >> + bool root_pcihp_disabled = (root_bus && !pcihp_root_en); >> >> bsel = object_property_get_qobject(OBJECT(bus), ACPI_PCIHP_PROP_BSEL, >> NULL); >> if (bsel) { >> @@ -361,6 +368,9 @@ static void build_append_pci_bus_devices(Aml >> *parent_scope, PCIBus *bus, >> bool bridge_in_acpi; >> >> if (!pdev) { >> + /* skip if pci hotplug for the root bus is disabled */ >> + if (root_pcihp_disabled) >> + continue; >> if (bsel) { /* add hotplug slots for non present devices */ >> dev = aml_device("S%.02X", PCI_DEVFN(slot, 0)); >> aml_append(dev, aml_name_decl("_SUN", aml_int(slot))); >> @@ -419,7 +429,7 @@ static void build_append_pci_bus_devices(Aml >> *parent_scope, PCIBus *bus, >> method = aml_method("_S3D", 0, AML_NOTSERIALIZED); >> aml_append(method, aml_return(aml_int(s3d))); >> aml_append(dev, method); >> - } else if (hotplug_enabled_dev) { >> + } else if (hotplug_enabled_dev && !root_pcihp_disabled) { >> /* add _SUN/_EJ0 to make slot hotpluggable */ >> aml_append(dev, aml_name_decl("_SUN", aml_int(slot))); >> >> @@ -439,7 +449,8 @@ static void build_append_pci_bus_devices(Aml >> *parent_scope, PCIBus *bus, >> */ >> PCIBus *sec_bus = pci_bridge_get_sec_bus(PCI_BRIDGE(pdev)); >> >> - build_append_pci_bus_devices(dev, sec_bus, pcihp_bridge_en); >> + build_append_pci_bus_devices(dev, sec_bus, pcihp_bridge_en, >> + pcihp_root_en); >> } >> /* slot descriptor has been composed, add it into parent context */ >> aml_append(parent_scope, dev); >> @@ -1818,7 +1829,8 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, >> if (bus) { >> Aml *scope = aml_scope("PCI0"); >> /* Scan all PCI buses. Generate tables to support hotplug. */ >> - build_append_pci_bus_devices(scope, bus, pm->pcihp_bridge_en); >> + build_append_pci_bus_devices(scope, bus, pm->pcihp_bridge_en, >> + pm->pcihp_root_en); >> >> if (TPM_IS_TIS_ISA(tpm)) { >> if (misc->tpm_version == TPM_VERSION_2_0) { >> -- >> 2.7.4 >> >