Skip to content

Commit

Permalink
pc: acpi-build: generate pvpanic device description dynamically
Browse files Browse the repository at this point in the history
Drops AML template patching and allows to
save some space in SSDT if pvpanic device doesn't
exist by not including disabled device description
into SSDT. It also makes device description
smaller by replacing _STA method with named value
and dropping _INI method.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
  • Loading branch information
Igor Mammedov authored and mstsirkin committed Feb 26, 2015
1 parent d5e5830 commit cd61cb2
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 51 deletions.
36 changes: 32 additions & 4 deletions hw/i386/acpi-build.c
Expand Up @@ -924,7 +924,7 @@ build_ssdt(GArray *table_data, GArray *linker,
uint32_t nr_mem = machine->ram_slots;
unsigned acpi_cpus = guest_info->apic_id_limit;
uint8_t *ssdt_ptr;
Aml *ssdt, *sb_scope, *scope, *pkg;
Aml *ssdt, *sb_scope, *scope, *pkg, *dev, *method, *crs, *field;
int i;

ssdt = init_aml_allocator();
Expand All @@ -939,9 +939,6 @@ build_ssdt(GArray *table_data, GArray *linker,

patch_pci_windows(pci, ssdt_ptr, sizeof(ssdp_misc_aml));

ACPI_BUILD_SET_LE(ssdt_ptr, sizeof(ssdp_misc_aml),
ssdt_isa_pest[0], 16, misc->pvpanic_port);

ACPI_BUILD_SET_LE(ssdt_ptr, sizeof(ssdp_misc_aml),
ssdt_mctrl_nr_slots[0], 32, nr_mem);

Expand Down Expand Up @@ -974,6 +971,37 @@ build_ssdt(GArray *table_data, GArray *linker,
aml_append(scope, aml_name_decl("_S5", pkg));
aml_append(ssdt, scope);

if (misc->pvpanic_port) {
scope = aml_scope("\\_SB.PCI0.ISA");

dev = aml_device("PEVR");
aml_append(dev, aml_name_decl("_HID", aml_string("QEMU0002")));

crs = aml_resource_template();
aml_append(crs,
aml_io(aml_decode16, misc->pvpanic_port, misc->pvpanic_port, 1, 1)
);
aml_append(dev, aml_name_decl("_CRS", crs));

aml_append(dev, aml_operation_region("PEOR", aml_system_io,
misc->pvpanic_port, 1));
field = aml_field("PEOR", aml_byte_acc);
aml_append(field, aml_named_field("PEPT", 8));
aml_append(dev, field);

method = aml_method("RDPT", 0);
aml_append(method, aml_store(aml_name("PEPT"), aml_local(0)));
aml_append(method, aml_return(aml_local(0)));
aml_append(dev, method);

method = aml_method("WRPT", 1);
aml_append(method, aml_store(aml_arg(0), aml_name("PEPT")));
aml_append(dev, method);

aml_append(scope, dev);
aml_append(ssdt, scope);
}

sb_scope = aml_scope("_SB");
{
/* build Processor object for each processor */
Expand Down
47 changes: 0 additions & 47 deletions hw/i386/ssdt-misc.dsl
Expand Up @@ -39,51 +39,4 @@ DefinitionBlock ("ssdt-misc.aml", "SSDT", 0x01, "BXPC", "BXSSDTSUSP", 0x1)
ACPI_EXTRACT_NAME_DWORD_CONST ssdt_mctrl_nr_slots
Name(MEMORY_SLOTS_NUMBER, 0x12345678)
}


External(\_SB.PCI0, DeviceObj)
External(\_SB.PCI0.ISA, DeviceObj)

Scope(\_SB.PCI0.ISA) {
Device(PEVT) {
Name(_HID, "QEMU0001")
/* PEST will be patched to be Zero if no such device */
ACPI_EXTRACT_NAME_WORD_CONST ssdt_isa_pest
Name(PEST, 0xFFFF)
OperationRegion(PEOR, SystemIO, PEST, 0x01)
Field(PEOR, ByteAcc, NoLock, Preserve) {
PEPT, 8,
}

Method(_STA, 0, NotSerialized) {
Store(PEST, Local0)
If (LEqual(Local0, Zero)) {
Return (0x00)
} Else {
Return (0x0F)
}
}

Method(RDPT, 0, NotSerialized) {
Store(PEPT, Local0)
Return (Local0)
}

Method(WRPT, 1, NotSerialized) {
Store(Arg0, PEPT)
}

Name(_CRS, ResourceTemplate() {
IO(Decode16, 0x00, 0x00, 0x01, 0x01, IO)
})

CreateWordField(_CRS, IO._MIN, IOMN)
CreateWordField(_CRS, IO._MAX, IOMX)

Method(_INI, 0, NotSerialized) {
Store(PEST, IOMN)
Store(PEST, IOMX)
}
}
}
}

0 comments on commit cd61cb2

Please sign in to comment.