[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 16/33] acpi: pci: add EDSM method to DSDT
From: |
Igor Mammedov |
Subject: |
[PATCH 16/33] acpi: pci: add EDSM method to DSDT |
Date: |
Fri, 24 Feb 2023 16:37:55 +0100 |
it's a helper method for acpi-index support on PCI buses
that do no support or have disabled ACPI PCI hotplug
or for non-hotpluggble endpoint devices.
(like non-hotpluggble NICs, integrated endpoints and
later for machines that do not support ACPI PCI hotplug)
no functional change, commit adds only EDSM method in DSDT
without any users. (the follow up patches will use it)
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
hw/i386/acpi-build.c | 54 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 54 insertions(+)
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index cb80b7a318..8db65663fc 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -398,6 +398,58 @@ static void build_append_pci_dsm_func0_common(Aml *ctx,
Aml *retvar)
aml_append(ctx, ifctx1);
}
+static Aml *aml_pci_edsm(void)
+{
+ Aml *method, *ifctx;
+ Aml *zero = aml_int(0);
+ Aml *func = aml_arg(2);
+ Aml *ret = aml_local(0);
+ Aml *aidx = aml_local(1);
+ Aml *params = aml_arg(4);
+
+ method = aml_method("EDSM", 5, AML_SERIALIZED);
+
+ /* get supported functions */
+ ifctx = aml_if(aml_equal(func, zero));
+ {
+ /* 1: have supported functions */
+ /* 7: support for function 7 */
+ const uint8_t caps = 1 | BIT(7);
+ build_append_pci_dsm_func0_common(ifctx, ret);
+ aml_append(ifctx, aml_store(aml_int(caps), aml_index(ret, zero)));
+ aml_append(ifctx, aml_return(ret));
+ }
+ aml_append(method, ifctx);
+
+ /* handle specific functions requests */
+ /*
+ * PCI Firmware Specification 3.1
+ * 4.6.7. _DSM for Naming a PCI or PCI Express Device Under
+ * Operating Systems
+ */
+ ifctx = aml_if(aml_equal(func, aml_int(7)));
+ {
+ Aml *pkg = aml_package(2);
+ aml_append(pkg, zero);
+ /* optional, if not impl. should return null string */
+ aml_append(pkg, aml_string("%s", ""));
+ aml_append(ifctx, aml_store(pkg, ret));
+
+ /*
+ * IASL is fine when initializing Package with computational data,
+ * however it makes guest unhappy /it fails to process such AML/.
+ * So use runtime assignment to set acpi-index after initializer
+ * to make OSPM happy.
+ */
+ aml_append(ifctx,
+ aml_store(aml_derefof(aml_index(params, aml_int(0))), aidx));
+ aml_append(ifctx, aml_store(aidx, aml_index(ret, zero)));
+ aml_append(ifctx, aml_return(ret));
+ }
+ aml_append(method, ifctx);
+
+ return method;
+}
static void build_append_pcihp_notify_entry(Aml *method, int slot)
{
@@ -1397,6 +1449,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0A03")));
aml_append(dev, aml_name_decl("_ADR", aml_int(0)));
aml_append(dev, aml_name_decl("_UID", aml_int(pcmc->pci_root_uid)));
+ aml_append(dev, aml_pci_edsm());
aml_append(sb_scope, dev);
aml_append(dsdt, sb_scope);
@@ -1412,6 +1465,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
aml_append(dev, aml_name_decl("_ADR", aml_int(0)));
aml_append(dev, aml_name_decl("_UID", aml_int(pcmc->pci_root_uid)));
aml_append(dev, build_q35_osc_method(!pm->pcihp_bridge_en));
+ aml_append(dev, aml_pci_edsm());
aml_append(sb_scope, dev);
if (mcfg_valid) {
aml_append(sb_scope, build_q35_dram_controller(&mcfg));
--
2.39.1
- [PATCH 00/33] pci(pc/q35): acpi-index support on non-hotpluggable slots, Igor Mammedov, 2023/02/24
- [PATCH 05/33] tests: acpi: extend multi-bridge case with case 'root-port, id=HOHP, hotplug=off root-port, bus=NOHP', Igor Mammedov, 2023/02/24
- [PATCH 02/33] tests: acpi: add test_acpi_q35_tcg_no_acpi_hotplug test and extend test_acpi_piix4_no_acpi_pci_hotplug, Igor Mammedov, 2023/02/24
- [PATCH 01/33] tests: acpi: whitelist new q35.noacpihp test and pc.hpbrroot, Igor Mammedov, 2023/02/24
- [PATCH 03/33] tests: acpi: update expected blobs, Igor Mammedov, 2023/02/24
- [PATCH 08/33] x86: pcihp: fix missing bridge AML when intermediate root-port has 'hotplug=off' set, Igor Mammedov, 2023/02/24
- [PATCH 12/33] tests: acpi: whitelist DSDT blobs before isolating PCI _DSM func 0 prolog, Igor Mammedov, 2023/02/24
- [PATCH 15/33] tests: acpi: whitelist DSDT before adding EDSM method, Igor Mammedov, 2023/02/24
- [PATCH 14/33] tests: acpi: update expected blobs, Igor Mammedov, 2023/02/24
- [PATCH 16/33] acpi: pci: add EDSM method to DSDT,
Igor Mammedov <=
- [PATCH 18/33] tests: acpi: whitelist DSDT before adding device with acpi-index to testcases, Igor Mammedov, 2023/02/24
- [PATCH 17/33] tests: acpi: update expected blobs, Igor Mammedov, 2023/02/24
- [PATCH 09/33] tests: acpi: update expected blobs, Igor Mammedov, 2023/02/24
- [PATCH 04/33] tests: acpi: whitelist q35/DSDT.multi-bridge before extending testcase, Igor Mammedov, 2023/02/24
- [PATCH 06/33] x86: pcihp: fix missing PCNT callchain when intermediate root-port has 'hotplug=off' set, Igor Mammedov, 2023/02/24
- [PATCH 07/33] tests: acpi: whitelist pc/DSDT.hpbrroot and pc/DSDT.hpbridge tests, Igor Mammedov, 2023/02/24
- [PATCH 10/33] pcihp: piix4: do not redirect hotplug controller to piix4 when ACPI hotplug is disabled, Igor Mammedov, 2023/02/24
- [PATCH 13/33] pcihp: move PCI _DSM function 0 prolog into separate function, Igor Mammedov, 2023/02/24
- [PATCH 11/33] pci: fix 'hotplugglable' property behavior, Igor Mammedov, 2023/02/24
- [PATCH 19/33] tests: acpi: add device with acpi-index on non-hotpluggble bus, Igor Mammedov, 2023/02/24