From: Igor Mammedov <imammedo@redhat.com>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH v2 21/51] pc: acpi: factor out cpu hotplug code from build_ssdt() into separate function
Date: Mon, 28 Dec 2015 18:02:28 +0100 [thread overview]
Message-ID: <1451322178-261185-21-git-send-email-imammedo@redhat.com> (raw)
In-Reply-To: <1451321851-260744-1-git-send-email-imammedo@redhat.com>
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
hw/i386/acpi-build.c | 174 ++++++++++++++++++++++++++++-----------------------
1 file changed, 94 insertions(+), 80 deletions(-)
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 1cbc305..26655db 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -929,6 +929,98 @@ static Aml *build_crs(PCIHostState *host,
return crs;
}
+static void build_processor_devices(Aml *sb_scope, unsigned acpi_cpus,
+ AcpiCpuInfo *cpu, AcpiPmInfo *pm)
+{
+ int i;
+ Aml *dev;
+ Aml *crs;
+ Aml *pkg;
+ Aml *field;
+ Aml *ifctx;
+ Aml *method;
+
+ /* The current AML generator can cover the APIC ID range [0..255],
+ * inclusive, for VCPU hotplug. */
+ QEMU_BUILD_BUG_ON(ACPI_CPU_HOTPLUG_ID_LIMIT > 256);
+ g_assert(acpi_cpus <= ACPI_CPU_HOTPLUG_ID_LIMIT);
+
+ /* 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_NOLOCK, AML_PRESERVE);
+ 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);
+
+ method = aml_method("_MAT", 0, AML_NOTSERIALIZED);
+ aml_append(method,
+ aml_return(aml_call1(CPU_MAT_METHOD, aml_int(i))));
+ aml_append(dev, method);
+
+ method = aml_method("_STA", 0, AML_NOTSERIALIZED);
+ aml_append(method,
+ aml_return(aml_call1(CPU_STATUS_METHOD, aml_int(i))));
+ aml_append(dev, method);
+
+ method = aml_method("_EJ0", 1, AML_NOTSERIALIZED);
+ aml_append(method,
+ aml_return(aml_call2(CPU_EJECT_METHOD, aml_int(i), aml_arg(0)))
+ );
+ aml_append(dev, method);
+
+ aml_append(sb_scope, dev);
+ }
+
+ /* build this code:
+ * Method(NTFY, 2) {If (LEqual(Arg0, 0x00)) {Notify(CP00, Arg1)} ...}
+ */
+ /* Arg0 = Processor ID = APIC ID */
+ method = aml_method(AML_NOTIFY_METHOD, 2, AML_NOTSERIALIZED);
+ for (i = 0; i < acpi_cpus; i++) {
+ ifctx = aml_if(aml_equal(aml_arg(0), aml_int(i)));
+ aml_append(ifctx,
+ aml_notify(aml_name("CP%.02X", i), aml_arg(1))
+ );
+ aml_append(method, ifctx);
+ }
+ aml_append(sb_scope, method);
+
+ /* build "Name(CPON, Package() { One, One, ..., Zero, Zero, ... })"
+ *
+ * Note: The ability to create variable-sized packages was first
+ * introduced in ACPI 2.0. ACPI 1.0 only allowed fixed-size packages
+ * ith up to 255 elements. Windows guests up to win2k8 fail when
+ * VarPackageOp is used.
+ */
+ pkg = acpi_cpus <= 255 ? aml_package(acpi_cpus) :
+ aml_varpackage(acpi_cpus);
+
+ for (i = 0; i < acpi_cpus; i++) {
+ uint8_t b = test_bit(i, cpu->found_cpus) ? 0x01 : 0x00;
+ aml_append(pkg, aml_int(b));
+ }
+ aml_append(sb_scope, aml_name_decl(CPU_ON_BITMAP, pkg));
+}
+
static void build_memory_devices(Aml *sb_scope, int nr_mem,
uint16_t io_base, uint16_t io_len)
{
@@ -1060,8 +1152,7 @@ build_ssdt(GArray *table_data, GArray *linker,
{
MachineState *machine = MACHINE(qdev_get_machine());
uint32_t nr_mem = machine->ram_slots;
- unsigned acpi_cpus = guest_info->apic_id_limit;
- Aml *ssdt, *sb_scope, *scope, *pkg, *dev, *method, *crs, *field, *ifctx;
+ Aml *ssdt, *sb_scope, *scope, *pkg, *dev, *method, *crs, *field;
PCIBus *bus = NULL;
GPtrArray *io_ranges = g_ptr_array_new_with_free_func(crs_range_free);
GPtrArray *mem_ranges = g_ptr_array_new_with_free_func(crs_range_free);
@@ -1070,10 +1161,6 @@ build_ssdt(GArray *table_data, GArray *linker,
int i;
ssdt = init_aml_allocator();
- /* The current AML generator can cover the APIC ID range [0..255],
- * inclusive, for VCPU hotplug. */
- QEMU_BUILD_BUG_ON(ACPI_CPU_HOTPLUG_ID_LIMIT > 256);
- g_assert(acpi_cpus <= ACPI_CPU_HOTPLUG_ID_LIMIT);
/* Reserve space for header */
acpi_data_push(ssdt->buf, sizeof(AcpiTableHeader));
@@ -1295,80 +1382,7 @@ 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_NOLOCK, AML_PRESERVE);
- 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);
-
- method = aml_method("_MAT", 0, AML_NOTSERIALIZED);
- aml_append(method,
- aml_return(aml_call1(CPU_MAT_METHOD, aml_int(i))));
- aml_append(dev, method);
-
- method = aml_method("_STA", 0, AML_NOTSERIALIZED);
- aml_append(method,
- aml_return(aml_call1(CPU_STATUS_METHOD, aml_int(i))));
- aml_append(dev, method);
-
- method = aml_method("_EJ0", 1, AML_NOTSERIALIZED);
- aml_append(method,
- aml_return(aml_call2(CPU_EJECT_METHOD, aml_int(i), aml_arg(0)))
- );
- aml_append(dev, method);
-
- aml_append(sb_scope, dev);
- }
-
- /* build this code:
- * Method(NTFY, 2) {If (LEqual(Arg0, 0x00)) {Notify(CP00, Arg1)} ...}
- */
- /* Arg0 = Processor ID = APIC ID */
- method = aml_method(AML_NOTIFY_METHOD, 2, AML_NOTSERIALIZED);
- for (i = 0; i < acpi_cpus; i++) {
- ifctx = aml_if(aml_equal(aml_arg(0), aml_int(i)));
- aml_append(ifctx,
- aml_notify(aml_name("CP%.02X", i), aml_arg(1))
- );
- aml_append(method, ifctx);
- }
- aml_append(sb_scope, method);
-
- /* build "Name(CPON, Package() { One, One, ..., Zero, Zero, ... })"
- *
- * Note: The ability to create variable-sized packages was first
- * introduced in ACPI 2.0. ACPI 1.0 only allowed fixed-size packages
- * ith up to 255 elements. Windows guests up to win2k8 fail when
- * VarPackageOp is used.
- */
- pkg = acpi_cpus <= 255 ? aml_package(acpi_cpus) :
- aml_varpackage(acpi_cpus);
-
- for (i = 0; i < acpi_cpus; i++) {
- uint8_t b = test_bit(i, cpu->found_cpus) ? 0x01 : 0x00;
- aml_append(pkg, aml_int(b));
- }
- aml_append(sb_scope, aml_name_decl(CPU_ON_BITMAP, pkg));
+ build_processor_devices(sb_scope, guest_info->apic_id_limit, cpu, pm);
build_memory_devices(sb_scope, nr_mem, pm->mem_hp_io_base,
pm->mem_hp_io_len);
--
1.8.3.1
next prev parent reply other threads:[~2015-12-28 17:03 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-28 16:57 [Qemu-devel] [PATCH v2 00/51] pc: acpi: convert DSDT to AML API and drop ASL templates support Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 01/51] tests: acpi: print ASL diff in verbose mode Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 02/51] pc: acpi: memhp: prepare context in SSDT for moving memhp DSDT code Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 03/51] pc: acpi: memhp: move MHPD._STA method into SSDT Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 04/51] pc: acpi: memhp: move MHPD.MLCK mutex " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 05/51] pc: acpi: memhp: move MHPD.MSCN method " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 06/51] pc: acpi: memhp: move MHPD.MRST " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 07/51] pc: acpi: memhp: move MHPD.MPXM " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 08/51] pc: acpi: memhp: move MHPD.MOST " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 09/51] pc: acpi: memhp: move MHPD.MEJ0 " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 10/51] pc: acpi: memhp: move MHPD.MCRS " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 11/51] pc: acpi: memhp: move MHPD Device " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 12/51] pc: acpi: factor out memhp code from build_ssdt() into separate function Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 13/51] pc: acpi: memhp: move \_GPE._E03 into SSDT Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 14/51] pc: acpi: memhp: drop not needed stringify(MEMORY_foo) usage Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 15/51] pc: acpi: drop unused CPU_STATUS_LEN from DSDT Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 16/51] pc: acpi: cpuhp: move CPEJ() method to SSDT Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 17/51] pc: acpi: cpuhp: move CPMA() method into SSDT Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 18/51] pc: acpi: cpuhp: move CPST() " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 19/51] pc: acpi: cpuhp: move PRSC() " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 20/51] pc: acpi: cpuhp: move \_GPE._E02() " Igor Mammedov
2015-12-28 17:02 ` Igor Mammedov [this message]
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 22/51] pc: acpi: move HPET from DSDT to SSDT Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 23/51] pc: acpi: move DBUG() " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 24/51] pc: acpi: move RTC device " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 25/51] pc: acpi: move KBD " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 26/51] pc: acpi: move MOU " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 27/51] pc: acpi: move FDC0 " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 28/51] pc: acpi: move LPT " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 29/51] pc: acpi: move COM devices " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 30/51] pc: acpi: move PIIX4 isa-bridge and pm devices into SSDT Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 31/51] pc: acpi: move remaining GPE handlers " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 32/51] pc: acpi: pci: move link devices " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 33/51] pc: acpi: piix4: move IQCR() " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 34/51] pc: acpi: piix4: move IQST() " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 35/51] pc: acpi: piix4: move PCI0._PRT() " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 36/51] pc: acpi: piix4: move remaining PCI hotplug bits " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 37/51] pc: acpi: piix4: acpi move PCI0 device to SSDT Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 38/51] pc: acpi: q35: move GSI links " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 39/51] pc: acpi: q35: move link devices " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 40/51] pc: acpi: q35: move IQCR() into SSDT Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 41/51] pc: acpi: q35: move IQST() " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 42/51] pc: acpi: q35: move ISA bridge " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 43/51] pc: acpi: q35: move _PRT() " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 44/51] pc: acpi: q35: move PRTA routing table " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 45/51] pc: acpi: q35: move PRTP " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 46/51] pc: acpi: q35: move _PIC() method " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 47/51] pc: acpi: q35: move PCI0._OSC() " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 48/51] pc: acpi: q35: move PCI0 device definition " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 49/51] pc: acpi: q35: PCST, PCSB opregions and PCIB field " Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 50/51] pc: acpi: switch to AML API composed DSDT Igor Mammedov
2015-12-28 17:02 ` [Qemu-devel] [PATCH v2 51/51] pc: acpi: remove unused ASL templates and related blobs/utils 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=1451322178-261185-21-git-send-email-imammedo@redhat.com \
--to=imammedo@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 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).