> > that OS cannot get control of SHPC hotplug and hotplug device to
> > the PCI bridge will fail when we use SHPC Native type:
> >
> >   [3.336059] shpchp 0000:00:03.0: Requesting control of SHPC hotplug via 
> >OSHP (\_SB_.PCI0.S28_)
> >   [3.337408] shpchp 0000:00:03.0: Requesting control of SHPC hotplug via 
> >OSHP (\_SB_.PCI0)
> >   [3.338710] shpchp 0000:00:03.0: Cannot get control of SHPC hotplug
> >
> > Add OSHP method support for transfer control to the operating system,
> > after this SHPC driver will be loaded success and the hotplug device to
> > the PCI bridge will success when we use SHPC Native type.
> >
> >   [1.703975] shpchp 0000:00:03.0: Requesting control of SHPC hotplug via 
> >OSHP (\_SB_.PCI0.S18_)
> >   [1.704934] shpchp 0000:00:03.0: Requesting control of SHPC hotplug via 
> >OSHP (\_SB_.PCI0)
> >   [1.705855] shpchp 0000:00:03.0: Gained control of SHPC hotplug 
> >(\_SB_.PCI0)
> >   [1.707054] shpchp 0000:00:03.0: HPC vendor_id 1b36 device_id 1 ss_vid 0 
> >ss_did 0
>
> please describe in commit message reproducer
> (aka QEMU CLI and guest OS and if necessary other details)

qemu-system-x86_64 -machine pc-q35-9.0
    ...
    -global PIIX4_PM.acpi-pci-hotplug-with-bridge-support=off

guest OS: centos7/ubuntu22.04

I will add it in the next version.

> > +/*
> > + * PCI Firmware Specification 3.0
> > + * 4.8. The OSHP Control Method
> > + */
> > +static Aml *build_oshp_method(void)
> > +{
> > +    Aml *method;
> > +
> > +    /*
> > +     * We don't use ACPI to control the SHPC, so just return
> > +     * success is enough.
> > +     */
> > +    method = aml_method("OSHP", 0, AML_NOTSERIALIZED);
> > +    aml_append(method, aml_return(aml_int(0x0)));
> > +    return method;
> > +}
> > +
> >  static void
> >  build_dsdt(GArray *table_data, BIOSLinker *linker,
> >             AcpiPmInfo *pm, AcpiMiscInfo *misc,
> > @@ -1452,6 +1469,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
> >          aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0A03")));
> >          aml_append(dev, aml_name_decl("_UID", 
> >aml_int(pcmc->pci_root_uid)));
> >          aml_append(dev, aml_pci_edsm());
> > +        aml_append(dev, build_oshp_method());
>
> it's global and what will happen if we have ACPI PCI hotplug enabled
> and guest calls this NOP method?

ths OS get the control of SHPC hotplug and SHPC driver load fail later.

[    6.170345] shpchp 0000:00:03.0: Requesting control of SHPC hotplug via OSHP 
(\_SB_.PCI0.S18_)
[    6.171962] shpchp 0000:00:03.0: Requesting control of SHPC hotplug via OSHP 
(\_SB_.PCI0)
[    6.173556] shpchp 0000:00:03.0: Gained control of SHPC hotplug (\_SB_.PCI0)
[    6.175144] shpchp 0000:00:03.0: HPC vendor_id 1b36 device_id 1 ss_vid 0 
ss_did 0
[    6.196153] shpchp 0000:00:03.0: irq 24 for MSI/MSI-X
[    6.197211] shpchp 0000:00:03.0: pci_hp_register failed with error -16
[    6.198272] shpchp 0000:00:03.0: Slot initialization failed

this looks more suitable.

+    if (!pm->pcihp_bridge_en) {
+        aml_append(dev, build_i440fx_oshp_method());
+    }

>
> >          aml_append(sb_scope, dev);
> >          aml_append(dsdt, sb_scope);
> >
> > @@ -1586,6 +1604,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
> >                  aml_append(dev, build_q35_osc_method(true));
> >              } else {
> >                  aml_append(dev, aml_name_decl("_HID", 
> >aml_eisaid("PNP0A03")));
> > +                aml_append(dev, build_oshp_method());
> >              }
> >
> >              if (numa_node != NUMA_NODE_UNASSIGNED) {

Hot plug/unplug a device using SHPC will take more time than ACPI PCI hotplug, 
because
after pressing the button, it can be cancelled within 5 seconds in SHPC driver.

If I want to use ACPI PCI hotplug in the pxb bridge, what else need to be done?

thanks.

Reply via email to