}
}
+static void acpi_pcihp_disable_root_bus(void)
+{
+ static bool root_hp_disabled;
+ PCIBus *bus;
+
+ if (root_hp_disabled) {
+ return;
+ }
+
+ bus = find_i440fx();
+ if (bus) {
+ /* setting the hotplug handler to NULL makes the bus non-hotpluggable */
+ qbus_set_hotplug_handler(BUS(bus), NULL);
+ }
+ root_hp_disabled = true;
+ return;
+}
+
static void acpi_pcihp_test_hotplug_bus(PCIBus *bus, void *opaque)
{
AcpiPciHpFind *find = opaque;
}
}
-void acpi_pcihp_reset(AcpiPciHpState *s)
+void acpi_pcihp_reset(AcpiPciHpState *s, bool acpihp_root_off)
{
+ if (acpihp_root_off) {
+ acpi_pcihp_disable_root_bus();
+ }
acpi_set_pci_info();
acpi_pcihp_update(s);
}
AcpiPciHpState acpi_pci_hotplug;
bool use_acpi_hotplug_bridge;
+ bool use_acpi_root_pci_hotplug;
uint8_t disable_s3;
uint8_t disable_s4;
pci_conf[0x5B] = 0x02;
}
pm_io_space_update(s);
- acpi_pcihp_reset(&s->acpi_pci_hotplug);
+ acpi_pcihp_reset(&s->acpi_pci_hotplug, !s->use_acpi_root_pci_hotplug);
}
static void piix4_pm_powerdown_req(Notifier *n, void *opaque)
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),
DEFINE_PROP_BOOL("memory-hotplug-support", PIIX4PMState,
acpi_memory_hotplug.is_enabled, true),
DEFINE_PROP_END_OF_LIST(),
Error **errp);
/* Called on reset */
-void acpi_pcihp_reset(AcpiPciHpState *s);
+void acpi_pcihp_reset(AcpiPciHpState *s, bool acpihp_root_off);
extern const VMStateDescription vmstate_acpi_pcihp_pci_status;