pcihp: do not put empty PCNT in DSDT
count number of PCNT methods that actually call Notify and if there aren't any, drop PCNT altogether. It mostly affects 'Q35' tests where there is no root-ports /bridges attached and 'PC' machine when ACPI PCI hotplug is completely disabled. Expected ASL change: - Method (PCNT, 0, NotSerialized) - { - } ... Method (_E01, 0, NotSerialized) // _Exx: Edge-Triggered GPE { - Acquire (\_SB.PCI0.BLCK, 0xFFFF) - \_SB.PCI0.PCNT () - Release (\_SB.PCI0.BLCK) } Signed-off-by: Igor Mammedov <imammedo@redhat.com> Message-Id: <20230112140312.3096331-23-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
ddab4d3fae
commit
219e638f3b
@ -496,12 +496,13 @@ static void build_append_pci_bus_devices(Aml *parent_scope, PCIBus *bus,
|
||||
qobject_unref(bsel);
|
||||
}
|
||||
|
||||
static void build_append_notfication_callback(Aml *parent_scope,
|
||||
static bool build_append_notfication_callback(Aml *parent_scope,
|
||||
const PCIBus *bus)
|
||||
{
|
||||
Aml *method;
|
||||
PCIBus *sec;
|
||||
QObject *bsel;
|
||||
int nr_notifiers = 0;
|
||||
|
||||
QLIST_FOREACH(sec, &bus->child, sibling) {
|
||||
Aml *br_scope = aml_scope("S%.02X", sec->parent_dev->devfn);
|
||||
@ -509,7 +510,8 @@ static void build_append_notfication_callback(Aml *parent_scope,
|
||||
!object_property_find(OBJECT(sec), ACPI_PCIHP_PROP_BSEL)) {
|
||||
continue;
|
||||
}
|
||||
build_append_notfication_callback(br_scope, sec);
|
||||
nr_notifiers = nr_notifiers +
|
||||
build_append_notfication_callback(br_scope, sec);
|
||||
aml_append(parent_scope, br_scope);
|
||||
}
|
||||
|
||||
@ -530,6 +532,7 @@ static void build_append_notfication_callback(Aml *parent_scope,
|
||||
aml_int(1))); /* Device Check */
|
||||
aml_append(method, aml_call2("DVNT", aml_name("PCID"),
|
||||
aml_int(3))); /* Eject Request */
|
||||
nr_notifiers++;
|
||||
}
|
||||
|
||||
/* Notify about child bus events in any case */
|
||||
@ -544,6 +547,7 @@ static void build_append_notfication_callback(Aml *parent_scope,
|
||||
|
||||
aml_append(parent_scope, method);
|
||||
qobject_unref(bsel);
|
||||
return !!nr_notifiers;
|
||||
}
|
||||
|
||||
static Aml *aml_pci_pdsm(void)
|
||||
@ -1742,20 +1746,26 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
|
||||
aml_append(dsdt, sb_scope);
|
||||
|
||||
if (pm->pcihp_bridge_en || pm->pcihp_root_en) {
|
||||
bool has_pcnt;
|
||||
|
||||
Object *pci_host = acpi_get_i386_pci_host();
|
||||
PCIBus *bus = PCI_HOST_BRIDGE(pci_host)->bus;
|
||||
|
||||
scope = aml_scope("\\_SB.PCI0");
|
||||
build_append_notfication_callback(scope, bus);
|
||||
aml_append(dsdt, scope);
|
||||
has_pcnt = build_append_notfication_callback(scope, bus);
|
||||
if (has_pcnt) {
|
||||
aml_append(dsdt, scope);
|
||||
}
|
||||
|
||||
scope = aml_scope("_GPE");
|
||||
{
|
||||
method = aml_method("_E01", 0, AML_NOTSERIALIZED);
|
||||
aml_append(method,
|
||||
aml_acquire(aml_name("\\_SB.PCI0.BLCK"), 0xFFFF));
|
||||
aml_append(method, aml_call0("\\_SB.PCI0.PCNT"));
|
||||
aml_append(method, aml_release(aml_name("\\_SB.PCI0.BLCK")));
|
||||
if (has_pcnt) {
|
||||
aml_append(method,
|
||||
aml_acquire(aml_name("\\_SB.PCI0.BLCK"), 0xFFFF));
|
||||
aml_append(method, aml_call0("\\_SB.PCI0.PCNT"));
|
||||
aml_append(method, aml_release(aml_name("\\_SB.PCI0.BLCK")));
|
||||
}
|
||||
aml_append(scope, method);
|
||||
}
|
||||
aml_append(dsdt, scope);
|
||||
|
Loading…
Reference in New Issue
Block a user