All of lore.kernel.org
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: qemu-devel@nongnu.org
Cc: pbonzini@redhat.com, drjones@redhat.com, marcel.a@redhat.com,
	claudio.fontana@huawei.com, mst@redhat.com
Subject: [Qemu-devel] [PATCH v2 34/47] pc: acpi-build: create CPU hotplug IO region dynamically
Date: Thu, 22 Jan 2015 14:50:18 +0000	[thread overview]
Message-ID: <1421938231-25698-35-git-send-email-imammedo@redhat.com> (raw)
In-Reply-To: <1421938231-25698-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 1245a38..09219e0 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 {
@@ -177,12 +179,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) {
@@ -823,6 +828,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

  parent reply	other threads:[~2015-01-22 14:51 UTC|newest]

Thread overview: 128+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-22 14:49 [Qemu-devel] [PATCH v2 00/47] ACPI refactoring: replace template patching with C ASL API Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 01/47] acpi: introduce AML composer aml_append() Igor Mammedov
2015-01-23  8:03   ` Michael S. Tsirkin
2015-01-23 10:03     ` Igor Mammedov
2015-01-23 13:26       ` Michael S. Tsirkin
2015-01-23  8:11   ` Michael S. Tsirkin
2015-01-23 10:35     ` Igor Mammedov
2015-01-23 13:24       ` Michael S. Tsirkin
2015-01-23 13:40         ` Igor Mammedov
2015-01-23 13:55           ` Michael S. Tsirkin
2015-01-23 17:56             ` Igor Mammedov
2015-01-24 16:33               ` Michael S. Tsirkin
2015-01-26  9:57                 ` Igor Mammedov
2015-01-26 10:37                   ` Michael S. Tsirkin
2015-01-26 15:09                   ` Igor Mammedov
2015-01-26 15:34                     ` Andrew Jones
2015-01-26 16:17                       ` Michael S. Tsirkin
2015-01-27 22:29                         ` Igor Mammedov
2015-01-28  7:27                           ` Michael S. Tsirkin
2015-01-28 10:03                             ` [Qemu-devel] [PATCH 00/13] convert AML API to QOM Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 01/13] convert to passing AcpiAml by pointers Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 02/13] make toplevel ACPI tables blob a pointer Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 03/13] qom: add support for weak referenced object: aka UnownedObject Igor Mammedov
2015-01-28 10:09                                 ` Paolo Bonzini
2015-01-28 12:55                                   ` Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 04/13] acpi: make AcpiAml an OQM object Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 05/13] acpi: use TYPE_AML_OBJECT inside of AML API Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 06/13] acpi: use TYPE_AML_OBJECT for toplevel ACPI tables blob Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 07/13] acpi: make toplevel ACPI tables blob a dedicated object Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 08/13] i386: acpi: hack not yet converted tables calls to deal with table_data being a pointer Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 09/13] acpi: add aml_blob() helper Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 10/13] i386: acpi: add DSDT table using AML API Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 11/13] acpi: acpi_add_table() to common cross target file Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 12/13] acpi: prepare for API internal collection of RSDT entries Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 13/13] i386: acpi: mark SSDT as RSDT entry so API would add entry to RSDT automatically Igor Mammedov
2015-01-28 12:44                               ` [Qemu-devel] [PATCH 00/13] convert AML API to QOM Andrew Jones
2015-02-05 14:28                                 ` Marcel Apfelbaum
2015-02-05 17:36                                   ` Igor Mammedov
2015-01-28  7:56                           ` [Qemu-devel] [PATCH v2 01/47] acpi: introduce AML composer aml_append() Michael S. Tsirkin
2015-01-28 10:00                             ` Igor Mammedov
2015-01-28 10:24                               ` Michael S. Tsirkin
2015-01-28 10:50                                 ` Igor Mammedov
2015-01-28 13:12                                   ` Michael S. Tsirkin
2015-01-28 10:32                               ` Claudio Fontana
2015-01-29  7:46                               ` Shannon Zhao
2015-01-29  8:42                                 ` Igor Mammedov
2015-02-05 14:35                               ` Marcel Apfelbaum
2015-01-28 10:45                             ` Andrew Jones
2015-02-05 14:30                             ` Marcel Apfelbaum
2015-02-05 14:09                           ` Marcel Apfelbaum
2015-01-23  9:14   ` Michael S. Tsirkin
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 02/47] acpi: add acpi_scope() term Igor Mammedov
2015-01-23  8:02   ` Michael S. Tsirkin
2015-01-23 10:36     ` Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 03/47] acpi: add acpi_device() term Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 04/47] acpi: add acpi_method() term Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 05/47] acpi: add acpi_if() term Igor Mammedov
2015-02-05 15:01   ` Marcel Apfelbaum
2015-02-05 17:54     ` Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 06/47] acpi: add acpi_name() & acpi_name_decl() term Igor Mammedov
2015-01-23  8:59   ` Michael S. Tsirkin
2015-01-23 13:32     ` Igor Mammedov
2015-01-23 13:42       ` Michael S. Tsirkin
2015-02-02 16:04         ` Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 07/47] acpi: factor out ACPI const int packing out build_append_value() Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 08/47] acpi: extend build_append_{value|int}() to support 64-bit values Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 09/47] acpi: add acpi_int() term Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 10/47] acpi: add acpi_return() term Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 11/47] acpi: add acpi_arg0(), acpi_arg1(), acpi_arg2(), acpi_arg3() terms Igor Mammedov
2015-01-23  8:32   ` Marcel Apfelbaum
2015-01-23  9:35     ` Michael S. Tsirkin
2015-01-23 13:34     ` Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 12/47] acpi: add acpi_store() term Igor Mammedov
2015-02-05 15:06   ` Marcel Apfelbaum
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 13/47] acpi: add acpi_and() term Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 14/47] acpi: add acpi_notify() term Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 15/47] acpi: add acpi_call1(), acpi_call2(), acpi_call3(), acpi_call4() helpers Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 16/47] pc: acpi-build: drop template patching and create PCI bus tree dynamically Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 17/47] acpi: add acpi_package() term Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 18/47] pc: acpi-build: drop unsupported PM1b_CNT.SLP_TYP Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 19/47] pc: acpi-build: generate _S[345] packages dynamically Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 20/47] acpi: add acpi_buffer() term Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 21/47] acpi: add acpi_resource_template() helper Igor Mammedov
2015-01-27 13:26   ` Claudio Fontana
2015-01-27 13:41     ` Michael S. Tsirkin
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 22/47] acpi: add acpi_io() helper Igor Mammedov
2015-02-05 15:19   ` Marcel Apfelbaum
2015-02-05 17:56     ` Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 23/47] acpi: include PkgLength size only when requested Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 24/47] acpi: add acpi_operation_region() term Igor Mammedov
2015-02-05 15:28   ` Marcel Apfelbaum
2015-02-05 17:57     ` Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 25/47] acpi: add acpi_field() & acpi_named_field() terms Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 26/47] acpi: add acpi_local0() term Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 27/47] acpi: add acpi_string() term Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 28/47] pc: acpi-build: generate pvpanic device description dynamically Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 29/47] acpi: add acpi_varpackage() term Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 30/47] acpi: add acpi_equal() term Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 31/47] acpi: add acpi_processor() term Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 32/47] acpi: add acpi_eisaid() term Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 33/47] pc: acpi-build: drop template patching and CPU hotplug objects dynamically Igor Mammedov
2015-01-22 14:50 ` Igor Mammedov [this message]
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 35/47] acpi: add acpi_reserved_field() term Igor Mammedov
2015-02-05 15:36   ` Marcel Apfelbaum
2015-02-05 17:57     ` Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 36/47] pc: acpi-build: drop template patching and memory hotplug objects dynamically Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 37/47] pc: acpi-build: create memory hotplug IO region dynamically Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 38/47] acpi: add acpi_word_bus_number(), acpi_word_io(), acpi_dword_memory(), acpi_qword_memory() terms Igor Mammedov
2015-02-05 15:38   ` Marcel Apfelbaum
2015-02-05 17:58     ` Igor Mammedov
2015-02-05 17:59     ` Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 39/47] pc: pcihp: expose MMIO base and len as properties Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 40/47] pc: acpi-build: reserve PCIHP MMIO resources Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 41/47] pc: acpi-build: create PCI0._CRS dynamically Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 42/47] acpi: add acpi_def_block() term Igor Mammedov
2015-01-29  8:02   ` Shannon Zhao
2015-01-29  8:45     ` Igor Mammedov
2015-01-29  9:01       ` Shannon Zhao
2015-01-29  9:21         ` Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 43/47] pc: acpi-build: prepare to make ACPI tables blob opaque for table building functions Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 44/47] pc: acpi-build: drop remaining ssdt_misc template and use acpi_def_block() Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 45/47] acpi: add acpi_iqr_no_flags() term Igor Mammedov
2015-01-27 15:37   ` Claudio Fontana
2015-01-28 12:15     ` Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 46/47] pc: export applesmc IO port/len Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 47/47] pc: acpi-build: drop template patching and create Device(SMC) dynamically Igor Mammedov
2015-01-28  7:38 ` [Qemu-devel] [PATCH v2 00/47] ACPI refactoring: replace template patching with C ASL API Michael S. Tsirkin
2015-01-28 10:07   ` 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=1421938231-25698-35-git-send-email-imammedo@redhat.com \
    --to=imammedo@redhat.com \
    --cc=claudio.fontana@huawei.com \
    --cc=drjones@redhat.com \
    --cc=marcel.a@redhat.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.