[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC 34/47] pc: acpi-build: create CPU hotplug IO region dy
From: |
Igor Mammedov |
Subject: |
[Qemu-devel] [RFC 34/47] pc: acpi-build: create CPU hotplug IO region dynamically |
Date: |
Fri, 19 Dec 2014 02:02:29 +0000 |
it replaces a static complied in DSDT MMIO region
for CPU hotplug with one created at runtime
leaving only truly static CPU hotplug related ASL
bits in DSDT.
It also puts CPU_HOTPLUG_RESOURCE_DEVICE into
PCI0 scope and reserves resources from it,
preparing for dropping manual hole punching
in PCI0._CRS.
Later it also would make easier to reuse current
ACPI CPU hotplug on other targets.
Also later it would be possible to move remaining
CPU hotplug ASL methods into build_ssdt() and
add all CPU hotplug related AML into SSDT only
when CPU hotplug is enabled, further reducing
ACPI tables blob if CPU hotplug isn't used.
impl. detail:
Windows XP can't handle /BSODs/ OperationRegion
declaration in DSDT when variable from SSDT is used
for specifying its address/length and also when
Field declared in DSDT with OperationRegion from
SSDT if DSDT is being parsed before SSDT.
But it works just fine when referencing named
fields from another table. Hence OperationRegion
and Field declaration are moved to SSDT to make
XP based editions work.
PS:
Later Windows editions seem to be fine with above
conditions.
Signed-off-by: Igor Mammedov <address@hidden>
---
hw/i386/acpi-build.c | 27 +++++++++++++++++++++++++++
hw/i386/acpi-dsdt-cpu-hotplug.dsl | 17 +----------------
include/hw/acpi/pc-hotplug.h | 1 +
3 files changed, 29 insertions(+), 16 deletions(-)
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index cf6c166..7829ea5 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -98,6 +98,8 @@ typedef struct AcpiPmInfo {
uint32_t gpe0_blk;
uint32_t gpe0_blk_len;
uint32_t io_base;
+ uint16_t cpu_hp_io_base;
+ uint16_t cpu_hp_io_len;
} AcpiPmInfo;
typedef struct AcpiMiscInfo {
@@ -174,12 +176,15 @@ static void acpi_get_pm_info(AcpiPmInfo *pm)
if (piix) {
obj = piix;
+ pm->cpu_hp_io_base = PIIX4_CPU_HOTPLUG_IO_BASE;
}
if (lpc) {
obj = lpc;
+ pm->cpu_hp_io_base = ICH9_CPU_HOTPLUG_IO_BASE;
}
assert(obj);
+ pm->cpu_hp_io_len = ACPI_GPE_PROC_LEN;
/* Fill in optional s3/s4 related properties */
o = object_property_get_qobject(obj, ACPI_PM_PROP_S3_DISABLED, NULL);
if (o) {
@@ -817,6 +822,28 @@ build_ssdt(GArray *table_data, GArray *linker,
{
AcpiAml sb_scope = acpi_scope("_SB");
+ /* create PCI0.PRES device and its _CRS to reserve CPU hotplug MMIO */
+ dev = acpi_device("PCI0." stringify(CPU_HOTPLUG_RESOURCE_DEVICE));
+ aml_append(&dev, acpi_name_decl("_HID", acpi_eisaid("PNP0A06")));
+ aml_append(&dev,
+ acpi_name_decl("_UID", acpi_string("CPU Hotplug resources"))
+ );
+ /* device present, functioning, decoding, not shown in UI */
+ aml_append(&dev, acpi_name_decl("_STA", acpi_int(0xB)));
+ crs = acpi_resource_template();
+ aml_append(&crs,
+ acpi_io(acpi_decode16, pm->cpu_hp_io_base, pm->cpu_hp_io_base,
+ 1, pm->cpu_hp_io_len)
+ );
+ aml_append(&dev, acpi_name_decl("_CRS", crs));
+ aml_append(&sb_scope, dev);
+ /* declare CPU hotplug MMIO region and PRS field to access it */
+ aml_append(&sb_scope, acpi_operation_region(
+ "PRST", acpi_system_io, pm->cpu_hp_io_base, pm->cpu_hp_io_len));
+ field = acpi_field("PRST", acpi_byte_acc);
+ aml_append(&field, acpi_named_field("PRS", 256));
+ aml_append(&sb_scope, field);
+
/* build Processor object for each processor */
for (i = 0; i < acpi_cpus; i++) {
dev = acpi_processor(i, 0, 0, "CP%.02X", i);
diff --git a/hw/i386/acpi-dsdt-cpu-hotplug.dsl
b/hw/i386/acpi-dsdt-cpu-hotplug.dsl
index 268d870..1aff746 100644
--- a/hw/i386/acpi-dsdt-cpu-hotplug.dsl
+++ b/hw/i386/acpi-dsdt-cpu-hotplug.dsl
@@ -16,12 +16,12 @@
/****************************************************************
* CPU hotplug
****************************************************************/
-#define CPU_HOTPLUG_RESOURCE_DEVICE PRES
Scope(\_SB) {
/* Objects filled in by run-time generated SSDT */
External(NTFY, MethodObj)
External(CPON, PkgObj)
+ External(PRS, FieldUnitObj)
/* Methods called by run-time generated SSDT Processor objects */
Method(CPMA, 1, NotSerialized) {
@@ -54,10 +54,6 @@ Scope(\_SB) {
}
#define CPU_STATUS_LEN ACPI_GPE_PROC_LEN
- OperationRegion(PRST, SystemIO, CPU_STATUS_BASE, CPU_STATUS_LEN)
- Field(PRST, ByteAcc, NoLock, Preserve) {
- PRS, 256
- }
Method(PRSC, 0) {
// Local5 = active cpu bitmap
Store(PRS, Local5)
@@ -91,15 +87,4 @@ Scope(\_SB) {
Increment(Local0)
}
}
-
- Device(CPU_HOTPLUG_RESOURCE_DEVICE) {
- Name(_HID, EisaId("PNP0A06"))
- Name(_UID, "CPU hotplug resources")
-
- Name(_CRS, ResourceTemplate() {
- IO(Decode16, CPU_STATUS_BASE, CPU_STATUS_BASE, 0, CPU_STATUS_LEN)
- })
-
- Name(_STA, 0xB) /* present, functioning, decoding, not shown in UI */
- }
}
diff --git a/include/hw/acpi/pc-hotplug.h b/include/hw/acpi/pc-hotplug.h
index b9db295..efa6ed7 100644
--- a/include/hw/acpi/pc-hotplug.h
+++ b/include/hw/acpi/pc-hotplug.h
@@ -28,6 +28,7 @@
#define ICH9_CPU_HOTPLUG_IO_BASE 0x0CD8
#define PIIX4_CPU_HOTPLUG_IO_BASE 0xaf00
+#define CPU_HOTPLUG_RESOURCE_DEVICE PRES
#define ACPI_MEMORY_HOTPLUG_IO_LEN 24
#define ACPI_MEMORY_HOTPLUG_BASE 0x0a00
--
1.8.3.1
- [Qemu-devel] [RFC 28/47] pc: acpi-build: generate pvpanic device description dynamically, (continued)
- [Qemu-devel] [RFC 28/47] pc: acpi-build: generate pvpanic device description dynamically, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 23/47] acpi: include PkgLength size only when requested, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 30/47] acpi: add acpi_equal() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 29/47] acpi: add acpi_varpackage() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 33/47] pc: acpi-build: drop template patching and CPU hotplug objects dynamically, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 31/47] acpi: add acpi_processor() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 32/47] acpi: add acpi_eisaid() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 27/47] acpi: add acpi_string() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 36/47] pc: acpi-build: drop template patching and memory hotplug objects dynamically, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 35/47] acpi: add acpi_reserved_field() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 34/47] pc: acpi-build: create CPU hotplug IO region dynamically,
Igor Mammedov <=
- [Qemu-devel] [RFC 37/47] pc: acpi-build: create memory hotplug IO region dynamically, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 39/47] pc: pcihp: expose MMIO base and len as properties, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 41/47] pc: acpi-build: create PCI0._CRS dynamically, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 40/47] pc: acpi-build: reserve PCIHP MMIO resources, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 38/47] acpi: add acpi_word_bus_number(), acpi_word_io(), acpi_dword_memory(), acpi_qword_memory() terms, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 42/47] acpi: make tables linker-loader available to other targets, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 43/47] acpi: add acpi_def_block() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 45/47] pc: acpi-build: drop remaining ssdt_misc template and use acpi_def_block(), Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 44/47] pc: acpi-build: prepare to make ACPI tables blob opaque for table building functions, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 47/47] tests: acpi: update reference DSDT/SSDT tables, Igor Mammedov, 2014/12/18