From patchwork Fri Oct 23 14:57:19 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Mammedov X-Patchwork-Id: 535034 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 5465B141312 for ; Sat, 24 Oct 2015 02:07:37 +1100 (AEDT) Received: from localhost ([::1]:39137 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZpdwN-0000gx-3b for incoming@patchwork.ozlabs.org; Fri, 23 Oct 2015 11:07:35 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43680) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Zpdmp-0000ON-P5 for qemu-devel@nongnu.org; Fri, 23 Oct 2015 10:57:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Zpdmo-0005Yf-4W for qemu-devel@nongnu.org; Fri, 23 Oct 2015 10:57:43 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33053) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Zpdmn-0005Ya-Qu for qemu-devel@nongnu.org; Fri, 23 Oct 2015 10:57:42 -0400 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 791888E697 for ; Fri, 23 Oct 2015 14:57:41 +0000 (UTC) Received: from dell-r430-03.lab.eng.brq.redhat.com (dell-r430-03.lab.eng.brq.redhat.com [10.34.112.60]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t9NEvNa0016682; Fri, 23 Oct 2015 10:57:40 -0400 From: Igor Mammedov To: qemu-devel@nongnu.org Date: Fri, 23 Oct 2015 16:57:19 +0200 Message-Id: <1445612242-79172-17-git-send-email-imammedo@redhat.com> In-Reply-To: <1445612242-79172-1-git-send-email-imammedo@redhat.com> References: <1445612242-79172-1-git-send-email-imammedo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: pbonzini@redhat.com, mst@redhat.com Subject: [Qemu-devel] [PATCH 16/19] pc: acpi: memhp: move MHPD.MCRS method into MHPT table X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Igor Mammedov --- hw/acpi/memory_hotplug_acpi_table.c | 60 +++++++++++++++++++++++++------ hw/i386/acpi-dsdt-mem-hotplug.dsl | 72 ------------------------------------- include/hw/acpi/pc-hotplug.h | 7 ---- 3 files changed, 49 insertions(+), 90 deletions(-) diff --git a/hw/acpi/memory_hotplug_acpi_table.c b/hw/acpi/memory_hotplug_acpi_table.c index c74da76..a410619 100644 --- a/hw/acpi/memory_hotplug_acpi_table.c +++ b/hw/acpi/memory_hotplug_acpi_table.c @@ -16,6 +16,11 @@ #define MEMORY_SLOT_OST_STATUS "MOSC" #define MEMORY_SLOT_EJECT_METHOD "MEJ0" #define MEMORY_SLOT_EJECT "MEJ" +#define MEMORY_SLOT_CRS_METHOD "MCRS" +#define MEMORY_SLOT_ADDR "MRB" +#define MEMORY_SLOT_SIZE "MRL" +#define MEMORY_SLOT_LOCK "MLCK" +#define MEMORY_SLOT_SLECTOR "MSEL" #define BASEPATH "\\_SB.PCI0." stringify(MEMORY_HOTPLUG_DEVICE) "." @@ -36,8 +41,8 @@ void build_mhpt(GArray *table_data, GArray *linker, uint32_t nr_mem, Aml *crs, *field; Aml *a_slot_arg = aml_arg(0); Aml *a_ret_val = aml_local(0); - Aml *a_ctrl_lock = aml_name(stringify(MEMORY_SLOT_LOCK)); - Aml *a_slot_selector = aml_name(stringify(MEMORY_SLOT_SLECTOR)); + Aml *a_ctrl_lock = aml_name(MEMORY_SLOT_LOCK); + Aml *a_slot_selector = aml_name(MEMORY_SLOT_SLECTOR); crs = aml_resource_template(); aml_append(crs, aml_io(AML_DECODE16, io_base, io_base, 0, io_len)); @@ -51,13 +56,9 @@ void build_mhpt(GArray *table_data, GArray *linker, uint32_t nr_mem, field = aml_field(stringify(MEMORY_HOTPLUG_IO_REGION), AML_DWORD_ACC, AML_PRESERVE); aml_append(field, /* read only */ - aml_named_field(stringify(MEMORY_SLOT_ADDR_LOW), 32)); + aml_named_field(MEMORY_SLOT_ADDR, 64)); aml_append(field, /* read only */ - aml_named_field(stringify(MEMORY_SLOT_ADDR_HIGH), 32)); - aml_append(field, /* read only */ - aml_named_field(stringify(MEMORY_SLOT_SIZE_LOW), 32)); - aml_append(field, /* read only */ - aml_named_field(stringify(MEMORY_SLOT_SIZE_HIGH), 32)); + aml_named_field(MEMORY_SLOT_SIZE, 64)); aml_append(field, /* read only */ aml_named_field(MEMORY_SLOT_PROXIMITY, 32)); aml_append(ctrl_dev, field); @@ -81,7 +82,7 @@ void build_mhpt(GArray *table_data, GArray *linker, uint32_t nr_mem, field = aml_field(stringify(MEMORY_HOTPLUG_IO_REGION), AML_DWORD_ACC, AML_PRESERVE); aml_append(field, /* DIMM selector, write only */ - aml_named_field(stringify(MEMORY_SLOT_SLECTOR), 32)); + aml_named_field(MEMORY_SLOT_SLECTOR, 32)); aml_append(field, /* _OST event code, write only */ aml_named_field(MEMORY_SLOT_OST_EVENT, 32)); aml_append(field, /* _OST status code, write only */ @@ -91,7 +92,7 @@ void build_mhpt(GArray *table_data, GArray *linker, uint32_t nr_mem, /* present, functioning, decoding, not shown in UI */ aml_append(ctrl_dev, aml_name_decl("_STA", aml_int(0xB))); - aml_append(ctrl_dev, aml_mutex(stringify(MEMORY_SLOT_LOCK), 0)); + aml_append(ctrl_dev, aml_mutex(MEMORY_SLOT_LOCK, 0)); method = aml_method(stringify(MEMORY_SLOT_SCAN_METHOD), 0); { @@ -179,6 +180,43 @@ void build_mhpt(GArray *table_data, GArray *linker, uint32_t nr_mem, aml_append(method, aml_release(a_ctrl_lock)); } aml_append(ctrl_dev, method); + + method = aml_method(MEMORY_SLOT_CRS_METHOD, 1); + { + Aml *a_mr64 = aml_name("MR64"); + Aml *a_crs_tmpl = aml_resource_template(); + Aml *a_min = aml_name("MIN"); + Aml *a_max = aml_name("MAX"); + Aml *a_len = aml_name("LEN"); + + aml_append(method, aml_acquire(a_ctrl_lock, 0xFFFF)); + aml_append(method, aml_store(a_slot_arg, a_slot_selector)); + + aml_append(a_crs_tmpl, + aml_qword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED, + AML_CACHEABLE, AML_READ_WRITE, + 0, 0x0, 0xFFFFFFFFFFFFFFFE, 0, + 0xFFFFFFFFFFFFFFFF)); + aml_append(method, aml_name_decl("MR64", a_crs_tmpl)); + aml_append(method, + aml_create_qword_field(a_mr64, aml_int(14), "MIN")); + aml_append(method, + aml_create_qword_field(a_mr64, aml_int(22), "MAX")); + aml_append(method, + aml_create_qword_field(a_mr64, aml_int(38), "LEN")); + + aml_append(method, aml_store(aml_name(MEMORY_SLOT_ADDR), a_min)); + aml_append(method, aml_store(aml_name(MEMORY_SLOT_SIZE), a_len)); + + aml_append(method, aml_store( + aml_add(a_min, aml_subtract(a_len, aml_int(1))), + a_max + )); + + aml_append(method, aml_release(a_ctrl_lock)); + aml_append(method, aml_return(a_mr64)); + } + aml_append(ctrl_dev, method); } aml_append(table, ctrl_dev); @@ -191,7 +229,7 @@ void build_mhpt(GArray *table_data, GArray *linker, uint32_t nr_mem, aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0C80"))); method = aml_method("_CRS", 0); - s = BASEPATH stringify(MEMORY_SLOT_CRS_METHOD); + s = BASEPATH MEMORY_SLOT_CRS_METHOD; aml_append(method, aml_return(aml_call1(s, aml_name("_UID")))); aml_append(dev, method); diff --git a/hw/i386/acpi-dsdt-mem-hotplug.dsl b/hw/i386/acpi-dsdt-mem-hotplug.dsl index 87d8d66..50b7541 100644 --- a/hw/i386/acpi-dsdt-mem-hotplug.dsl +++ b/hw/i386/acpi-dsdt-mem-hotplug.dsl @@ -19,77 +19,5 @@ Device(MEMORY_HOTPLUG_DEVICE) { Name(_HID, "PNP0A06") Name(_UID, "Memory hotplug resources") - - /* Memory hotplug IO registers */ - External(MEMORY_SLOT_ADDR_LOW, FieldUnitObj) // read only - External(MEMORY_SLOT_ADDR_HIGH, FieldUnitObj) // read only - External(MEMORY_SLOT_SIZE_LOW, FieldUnitObj) // read only - External(MEMORY_SLOT_SIZE_HIGH, FieldUnitObj) // read only - External(MEMORY_SLOT_SLECTOR, FieldUnitObj) // DIMM selector, write only - External(MEMORY_SLOT_LOCK, MutexObj) - - Method(MEMORY_SLOT_CRS_METHOD, 1, Serialized) { - Acquire(MEMORY_SLOT_LOCK, 0xFFFF) - Store(ToInteger(Arg0), MEMORY_SLOT_SLECTOR) // select DIMM - - Name(MR64, ResourceTemplate() { - QWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed, - Cacheable, ReadWrite, - 0x0000000000000000, // Address Space Granularity - 0x0000000000000000, // Address Range Minimum - 0xFFFFFFFFFFFFFFFE, // Address Range Maximum - 0x0000000000000000, // Address Translation Offset - 0xFFFFFFFFFFFFFFFF, // Address Length - ,, MW64, AddressRangeMemory, TypeStatic) - }) - - CreateDWordField(MR64, 14, MINL) - CreateDWordField(MR64, 18, MINH) - CreateDWordField(MR64, 38, LENL) - CreateDWordField(MR64, 42, LENH) - CreateDWordField(MR64, 22, MAXL) - CreateDWordField(MR64, 26, MAXH) - - Store(MEMORY_SLOT_ADDR_HIGH, MINH) - Store(MEMORY_SLOT_ADDR_LOW, MINL) - Store(MEMORY_SLOT_SIZE_HIGH, LENH) - Store(MEMORY_SLOT_SIZE_LOW, LENL) - - // 64-bit math: MAX = MIN + LEN - 1 - Add(MINL, LENL, MAXL) - Add(MINH, LENH, MAXH) - If (LLess(MAXL, MINL)) { - Add(MAXH, One, MAXH) - } - If (LLess(MAXL, One)) { - Subtract(MAXH, One, MAXH) - } - Subtract(MAXL, One, MAXL) - - If (LEqual(MAXH, Zero)){ - Name(MR32, ResourceTemplate() { - DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed, - Cacheable, ReadWrite, - 0x00000000, // Address Space Granularity - 0x00000000, // Address Range Minimum - 0xFFFFFFFE, // Address Range Maximum - 0x00000000, // Address Translation Offset - 0xFFFFFFFF, // Address Length - ,, MW32, AddressRangeMemory, TypeStatic) - }) - CreateDWordField(MR32, MW32._MIN, MIN) - CreateDWordField(MR32, MW32._MAX, MAX) - CreateDWordField(MR32, MW32._LEN, LEN) - Store(MINL, MIN) - Store(MAXL, MAX) - Store(LENL, LEN) - - Release(MEMORY_SLOT_LOCK) - Return(MR32) - } - - Release(MEMORY_SLOT_LOCK) - Return(MR64) - } } // Device() } // Scope() diff --git a/include/hw/acpi/pc-hotplug.h b/include/hw/acpi/pc-hotplug.h index 7198c90..29f0244 100644 --- a/include/hw/acpi/pc-hotplug.h +++ b/include/hw/acpi/pc-hotplug.h @@ -34,13 +34,6 @@ #define MEMORY_HOTPLUG_DEVICE MHPD #define MEMORY_HOTPLUG_IO_REGION HPMR -#define MEMORY_SLOT_ADDR_LOW MRBL -#define MEMORY_SLOT_ADDR_HIGH MRBH -#define MEMORY_SLOT_SIZE_LOW MRLL -#define MEMORY_SLOT_SIZE_HIGH MRLH -#define MEMORY_SLOT_SLECTOR MSEL -#define MEMORY_SLOT_LOCK MLCK -#define MEMORY_SLOT_CRS_METHOD MCRS #define MEMORY_SLOT_SCAN_METHOD MSCN #endif