Signed-off-by: Marcel Apfelbaum marcel@redhat.com --- hw/i386/acpi-build.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+)
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index fedcb2e..ee1a50a 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -643,6 +643,82 @@ static void build_append_pci_bus_devices(AcpiAml *parent_scope, PCIBus *bus, aml_append(parent_scope, method); }
+static AcpiAml build_prt(void) +{ + AcpiAml method, pkg, if_ctx, while_ctx; + + method = acpi_method("_PRT", 0); + + aml_append(&method, acpi_store(acpi_package(128), acpi_local0())); + aml_append(&method, acpi_store(acpi_int(0), acpi_local1())); + while_ctx = acpi_while(acpi_lless(acpi_local1(), acpi_int(128))); + { + aml_append(&while_ctx, + acpi_store(acpi_shiftright(acpi_local1(), 2), + acpi_local2())); + aml_append(&while_ctx, acpi_store( + acpi_and(acpi_add(acpi_local1(), acpi_local2()), acpi_int(3)), acpi_local3())); + + if_ctx = acpi_if(acpi_equal(acpi_local3(), acpi_int(0))); + { + pkg = acpi_package(4); + aml_append(&pkg, acpi_int(0)); + aml_append(&pkg, acpi_int(0)); + aml_append(&pkg, acpi_name("LNKD")); + aml_append(&pkg, acpi_int(0)); + aml_append(&if_ctx, acpi_store(pkg, acpi_local4())); + } + aml_append(&while_ctx, if_ctx); + + if_ctx = acpi_if(acpi_equal(acpi_local3(), acpi_int(1))); + { + pkg = acpi_package(4); + aml_append(&pkg, acpi_int(0)); + aml_append(&pkg, acpi_int(0)); + aml_append(&pkg, acpi_name("LNKA")); + aml_append(&pkg, acpi_int(0)); + aml_append(&if_ctx, acpi_store(pkg, acpi_local4())); + } + aml_append(&while_ctx, if_ctx); + + if_ctx = acpi_if(acpi_equal(acpi_local3(), acpi_int(2))); + { + pkg = acpi_package(4); + aml_append(&pkg, acpi_int(0)); + aml_append(&pkg, acpi_int(0)); + aml_append(&pkg, acpi_name("LNKB")); + aml_append(&pkg, acpi_int(0)); + aml_append(&if_ctx, acpi_store(pkg, acpi_local4())); + } + aml_append(&while_ctx, if_ctx); + + if_ctx = acpi_if(acpi_equal(acpi_local3(), acpi_int(3))); + { + pkg = acpi_package(4); + aml_append(&pkg, acpi_int(0)); + aml_append(&pkg, acpi_int(0)); + aml_append(&pkg, acpi_name("LNKC")); + aml_append(&pkg, acpi_int(0)); + aml_append(&if_ctx, acpi_store(pkg, acpi_local4())); + } + aml_append(&while_ctx, if_ctx); + + aml_append(&while_ctx, acpi_store( + acpi_or(acpi_shiftleft(acpi_local2(), 16), acpi_int(0xFFFF)), + acpi_index(acpi_local4(), acpi_int(0)))); + aml_append(&while_ctx, acpi_store( + acpi_and(acpi_local1(), acpi_int(3)), + acpi_index(acpi_local4(), acpi_int(1)))); + aml_append(&while_ctx, acpi_store( + acpi_local4(), acpi_index(acpi_local0(), acpi_local1()))); + aml_append(&while_ctx, acpi_increment(acpi_local1())); + } + aml_append(&method, while_ctx); + aml_append(&method, acpi_return(acpi_local0())); + + return method; + } + static void build_ssdt(AcpiAml *table_aml, GArray *linker, AcpiCpuInfo *cpu, AcpiPmInfo *pm, AcpiMiscInfo *misc, @@ -687,6 +763,7 @@ build_ssdt(AcpiAml *table_aml, GArray *linker, aml_append(&dev, acpi_name_decl("_HID", acpi_string("PNP0A03"))); aml_append(&dev, acpi_name_decl("_BBN", acpi_int((uint8_t)bus_info->bus))); + aml_append(&dev, build_prt()); aml_append(&scope, dev); aml_append(&ssdt, scope); }