qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: qemu-devel@nongnu.org
Cc: drjones@redhat.com, mst@redhat.com, zhaoshenglong@huawei.com,
	marcel.a@redhat.com
Subject: [Qemu-devel] [PATCH v4 31/42] pc: acpi-build: create CPU hotplug IO region dynamically
Date: Wed, 18 Feb 2015 19:14:44 +0000	[thread overview]
Message-ID: <1424286895-21611-32-git-send-email-imammedo@redhat.com> (raw)
In-Reply-To: <1424286895-21611-1-git-send-email-imammedo@redhat.com>

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 <imammedo@redhat.com>
---
 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 c6910da..4f1c251 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -101,6 +101,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 {
@@ -176,12 +178,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) {
@@ -995,6 +1000,28 @@ build_ssdt(GArray *table_data, GArray *linker,
 
     sb_scope = aml_scope("_SB");
     {
+        /* create PCI0.PRES device and its _CRS to reserve CPU hotplug MMIO */
+        dev = aml_device("PCI0." stringify(CPU_HOTPLUG_RESOURCE_DEVICE));
+        aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0A06")));
+        aml_append(dev,
+            aml_name_decl("_UID", aml_string("CPU Hotplug resources"))
+        );
+        /* device present, functioning, decoding, not shown in UI */
+        aml_append(dev, aml_name_decl("_STA", aml_int(0xB)));
+        crs = aml_resource_template();
+        aml_append(crs,
+            aml_io(aml_decode16, pm->cpu_hp_io_base, pm->cpu_hp_io_base, 1,
+                   pm->cpu_hp_io_len)
+        );
+        aml_append(dev, aml_name_decl("_CRS", crs));
+        aml_append(sb_scope, dev);
+        /* declare CPU hotplug MMIO region and PRS field to access it */
+        aml_append(sb_scope, aml_operation_region(
+            "PRST", aml_system_io, pm->cpu_hp_io_base, pm->cpu_hp_io_len));
+        field = aml_field("PRST", aml_byte_acc);
+        aml_append(field, aml_named_field("PRS", 256));
+        aml_append(sb_scope, field);
+
         /* build Processor object for each processor */
         for (i = 0; i < acpi_cpus; i++) {
             dev = aml_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

  parent reply	other threads:[~2015-02-18 19:16 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-18 19:14 [Qemu-devel] [PATCH v4 00/42] ACPI refactoring: replace template patching with C AML API Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 01/42] acpi: introduce AML composer aml_append() Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 02/42] acpi: add aml_scope() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 03/42] pc: acpi-build: use aml_scope() for \_SB scope Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 04/42] acpi: add aml_device() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 05/42] acpi: add aml_method() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 06/42] acpi: add aml_if() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 07/42] acpi: add aml_name() & aml_name_decl() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 08/42] acpi: add aml_int() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 09/42] acpi: add aml_return() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 10/42] acpi: add aml_arg() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 11/42] acpi: add aml_store() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 12/42] acpi: add aml_and() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 13/42] acpi: add aml_notify() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 14/42] acpi: add aml_call1(), aml_call2(), aml_call3(), aml_call4() helpers Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 15/42] acpi: add aml_package() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 16/42] pc: acpi-build: generate _S[345] packages dynamically Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 17/42] acpi: add aml_buffer() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 18/42] acpi: add aml_resource_template() helper Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 19/42] acpi: add aml_io() helper Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 20/42] acpi: include PkgLength size only when requested Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 21/42] acpi: add aml_operation_region() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 22/42] acpi: add aml_field() & aml_named_field() terms Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 23/42] acpi: add aml_local() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 24/42] acpi: add aml_string() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 25/42] pc: acpi-build: generate pvpanic device description dynamically Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 26/42] acpi: add aml_varpackage() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 27/42] acpi: add aml_equal() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 28/42] acpi: add aml_processor() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 29/42] acpi: add aml_eisaid() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 30/42] pc: acpi-build: drop template patching and CPU hotplug objects dynamically Igor Mammedov
2015-02-18 19:14 ` Igor Mammedov [this message]
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 32/42] acpi: add aml_reserved_field() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 33/42] pc: acpi-build: drop template patching and memory hotplug objects dynamically Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 34/42] pc: acpi-build: create memory hotplug IO region dynamically Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 35/42] acpi: add aml_word_bus_number(), aml_word_io(), aml_dword_memory(), aml_qword_memory() terms Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 36/42] pc: pcihp: expose MMIO base and len as properties Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 37/42] pc: acpi-build: reserve PCIHP MMIO resources Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 38/42] pc: acpi-build: create PCI0._CRS dynamically Igor Mammedov
2015-02-18 20:25   ` Michael S. Tsirkin
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 39/42] pc: acpi-build: drop remaining ssdt_misc template Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 40/42] acpi: add acpi_irq_no_flags() term Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 41/42] pc: export applesmc IO port/len Igor Mammedov
2015-02-18 19:14 ` [Qemu-devel] [PATCH v4 42/42] pc: acpi-build: drop template patching and create Device(SMC) dynamically Igor Mammedov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1424286895-21611-32-git-send-email-imammedo@redhat.com \
    --to=imammedo@redhat.com \
    --cc=drjones@redhat.com \
    --cc=marcel.a@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=zhaoshenglong@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).