On Thu, Sep 24, 2020 at 09:00:09AM +0200, Julia Suvorova wrote: > Instead of changing the hot-plug type in _OSC register, do not > initialize the slot capability or set the 'Slot Implemented' flag. > This way guest will choose ACPI hot-plug if it is preferred and leave > the option to use SHPC with pcie-pci-bridge. > > Signed-off-by: Julia Suvorova <jus...@redhat.com> > --- > hw/i386/acpi-build.h | 2 ++ > hw/i386/acpi-build.c | 2 +- > hw/pci/pcie.c | 16 ++++++++++++++++ > 3 files changed, 19 insertions(+), 1 deletion(-) > > diff --git a/hw/i386/acpi-build.h b/hw/i386/acpi-build.h > index 487ec7710f..4c5bfb3d0b 100644 > --- a/hw/i386/acpi-build.h > +++ b/hw/i386/acpi-build.h > @@ -11,4 +11,6 @@ extern const struct AcpiGenericAddress > x86_nvdimm_acpi_dsmio; > > void acpi_setup(void); > > +Object *object_resolve_type_unambiguous(const char *typename); > + > #endif > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c > index cf503b16af..b7811a8912 100644 > --- a/hw/i386/acpi-build.c > +++ b/hw/i386/acpi-build.c > @@ -174,7 +174,7 @@ static void init_common_fadt_data(MachineState *ms, > Object *o, > *data = fadt; > } > > -static Object *object_resolve_type_unambiguous(const char *typename) > +Object *object_resolve_type_unambiguous(const char *typename) > { > bool ambig; > Object *o = object_resolve_path_type("", typename, &ambig); > diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c > index 5b48bae0f6..c1a082e8b9 100644 > --- a/hw/pci/pcie.c > +++ b/hw/pci/pcie.c > @@ -27,6 +27,8 @@ > #include "hw/pci/pci_bus.h" > #include "hw/pci/pcie_regs.h" > #include "hw/pci/pcie_port.h" > +#include "hw/i386/ich9.h" > +#include "hw/i386/acpi-build.h" > #include "qemu/range.h" > > //#define DEBUG_PCIE
Not really happy with pcie.c getting an i386 dependency. > @@ -515,12 +517,26 @@ void pcie_cap_slot_unplug_request_cb(HotplugHandler > *hotplug_dev, > pcie_cap_slot_push_attention_button(hotplug_pdev); > } > > +static bool acpi_pcihp_enabled(void) > +{ > + Object *lpc = object_resolve_type_unambiguous(TYPE_ICH9_LPC_DEVICE); > + > + return lpc && > + object_property_get_bool(lpc, > "acpi-pci-hotplug-with-bridge-support", > + NULL); > + > +} > + Why not just check the property unconditionally? > /* pci express slot for pci express root/downstream port > PCI express capability slot registers */ > void pcie_cap_slot_init(PCIDevice *dev, PCIESlot *s) > { > uint32_t pos = dev->exp.exp_cap; > > + if (acpi_pcihp_enabled()) { > + return; > + } > + I think I would rather not teach pcie about acpi. How about we change the polarity, name the property "pci-native-hotplug" or whatever makes sense. > pci_word_test_and_set_mask(dev->config + pos + PCI_EXP_FLAGS, > PCI_EXP_FLAGS_SLOT); > > -- > 2.25.4