diff mbox

[v5,02/13] acpi/x86: Define ACPI IO registers for PVH guests

Message ID 1481930319-4796-3-git-send-email-boris.ostrovsky@oracle.com (mailing list archive)
State New, archived
Headers show

Commit Message

Boris Ostrovsky Dec. 16, 2016, 11:18 p.m. UTC
Define VCPU available map address (used by AML's PRSC method)
and GPE0 CPU hotplug event number. Use these definitions in mk_dsdt
instead hardcoded values.

These definitions will later be used by both the hypervisor and
the toolstack (initially for PVH guests only), thus they are
placed in public headers.

Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
---
Changes in v5:
* Renamed XEN_GPE0_CPUHP_BIT to XEN_ACPI_GPE0_CPUHP_BIT

 tools/libacpi/mk_dsdt.c           | 7 +++++--
 tools/libacpi/static_tables.c     | 4 ++++
 xen/include/public/arch-x86/xen.h | 7 +++++++
 3 files changed, 16 insertions(+), 2 deletions(-)

Comments

Julien Grall Dec. 20, 2016, 6:07 p.m. UTC | #1
Hello Boris,

This patch is breaking compilation of mk_dsdt on ARM64 (see below). 
Boris can you please send a patch to fix this?

In the future, please make sure that mk_dsdt at least build for all the 
targeted architectures.

mk_dsdt.c: In function 'main':
mk_dsdt.c:249:9: error: 'XEN_ACPI_CPU_MAP' undeclared (first use in this 
function)
          XEN_ACPI_CPU_MAP, XEN_ACPI_CPU_MAP_LEN);
          ^
mk_dsdt.c:63:25: note: in definition of macro 'stmt'
          _stmt(n, f , ## a );                    \
                          ^
mk_dsdt.c:249:9: note: each undeclared identifier is reported only once 
for each function it appears in
          XEN_ACPI_CPU_MAP, XEN_ACPI_CPU_MAP_LEN);
          ^
mk_dsdt.c:63:25: note: in definition of macro 'stmt'
          _stmt(n, f , ## a );                    \
                          ^
mk_dsdt.c:249:27: error: 'XEN_ACPI_CPU_MAP_LEN' undeclared (first use in 
this function)
          XEN_ACPI_CPU_MAP, XEN_ACPI_CPU_MAP_LEN);
                            ^
mk_dsdt.c:63:25: note: in definition of macro 'stmt'
          _stmt(n, f , ## a );                    \
                          ^
mk_dsdt.c:289:16: error: 'XEN_ACPI_GPE0_CPUHP_BIT' undeclared (first use 
in this function)
                 XEN_ACPI_GPE0_CPUHP_BIT);
                 ^
mk_dsdt.c:69:25: note: in definition of macro 'push_block'
          _stmt(n, f , ## a );                    \
                          ^

Cheers,

On 17/12/2016 00:18, Boris Ostrovsky wrote:
> Define VCPU available map address (used by AML's PRSC method)
> and GPE0 CPU hotplug event number. Use these definitions in mk_dsdt
> instead hardcoded values.
>
> These definitions will later be used by both the hypervisor and
> the toolstack (initially for PVH guests only), thus they are
> placed in public headers.
>
> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> Reviewed-by: Jan Beulich <jbeulich@suse.com>
> ---
> Changes in v5:
> * Renamed XEN_GPE0_CPUHP_BIT to XEN_ACPI_GPE0_CPUHP_BIT
>
>  tools/libacpi/mk_dsdt.c           | 7 +++++--
>  tools/libacpi/static_tables.c     | 4 ++++
>  xen/include/public/arch-x86/xen.h | 7 +++++++
>  3 files changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/tools/libacpi/mk_dsdt.c b/tools/libacpi/mk_dsdt.c
> index 639d21e..9421f3f 100644
> --- a/tools/libacpi/mk_dsdt.c
> +++ b/tools/libacpi/mk_dsdt.c
> @@ -18,6 +18,7 @@
>  #include <stdlib.h>
>  #include <stdbool.h>
>  #if defined(CONFIG_X86)
> +#include <xen/arch-x86/xen.h>
>  #include <xen/hvm/hvm_info_table.h>
>  #elif defined(CONFIG_ARM_64)
>  #include <xen/arch-arm.h>
> @@ -244,7 +245,8 @@ int main(int argc, char **argv)
>  #endif
>
>      /* Operation Region 'PRST': bitmask of online CPUs. */
> -    stmt("OperationRegion", "PRST, SystemIO, 0xaf00, 32");
> +    stmt("OperationRegion", "PRST, SystemIO, %#x, %d",
> +        XEN_ACPI_CPU_MAP, XEN_ACPI_CPU_MAP_LEN);
>      push_block("Field", "PRST, ByteAcc, NoLock, Preserve");
>      indent(); printf("PRS, %u\n", max_cpus);
>      pop_block();
> @@ -283,7 +285,8 @@ int main(int argc, char **argv)
>      /* Define GPE control method. */
>      push_block("Scope", "\\_GPE");
>      push_block("Method",
> -               dm_version == QEMU_XEN_TRADITIONAL ? "_L02" : "_E02");
> +               dm_version == QEMU_XEN_TRADITIONAL ? "_L%02d" : "_E%02d",
> +               XEN_ACPI_GPE0_CPUHP_BIT);
>      stmt("\\_SB.PRSC ()", NULL);
>      pop_block();
>      pop_block();
> diff --git a/tools/libacpi/static_tables.c b/tools/libacpi/static_tables.c
> index 1f6247d..608c936 100644
> --- a/tools/libacpi/static_tables.c
> +++ b/tools/libacpi/static_tables.c
> @@ -31,6 +31,10 @@ struct acpi_20_facs Facs = {
>   * Fixed ACPI Description Table (FADT).
>   */
>
> +/*
> + * These values must match register definitions in struct hvm_hw_acpi
> + * (in xen/include/public/arch-x86/hvm/save.h).
> + */
>  #define ACPI_PM1A_EVT_BLK_BIT_WIDTH         0x20
>  #define ACPI_PM1A_EVT_BLK_BIT_OFFSET        0x00
>  #define ACPI_PM1A_CNT_BLK_BIT_WIDTH         0x10
> diff --git a/xen/include/public/arch-x86/xen.h b/xen/include/public/arch-x86/xen.h
> index cdd93c1..12f719d 100644
> --- a/xen/include/public/arch-x86/xen.h
> +++ b/xen/include/public/arch-x86/xen.h
> @@ -291,6 +291,13 @@ struct xen_arch_domainconfig {
>                                       XEN_X86_EMU_PIT)
>      uint32_t emulation_flags;
>  };
> +
> +/* Location of online VCPU bitmap. */
> +#define XEN_ACPI_CPU_MAP             0xaf00
> +#define XEN_ACPI_CPU_MAP_LEN         ((HVM_MAX_VCPUS + 7) / 8)
> +
> +/* GPE0 bit set during CPU hotplug */
> +#define XEN_ACPI_GPE0_CPUHP_BIT      2
>  #endif
>
>  #endif /* !__ASSEMBLY__ */
>
diff mbox

Patch

diff --git a/tools/libacpi/mk_dsdt.c b/tools/libacpi/mk_dsdt.c
index 639d21e..9421f3f 100644
--- a/tools/libacpi/mk_dsdt.c
+++ b/tools/libacpi/mk_dsdt.c
@@ -18,6 +18,7 @@ 
 #include <stdlib.h>
 #include <stdbool.h>
 #if defined(CONFIG_X86)
+#include <xen/arch-x86/xen.h>
 #include <xen/hvm/hvm_info_table.h>
 #elif defined(CONFIG_ARM_64)
 #include <xen/arch-arm.h>
@@ -244,7 +245,8 @@  int main(int argc, char **argv)
 #endif
 
     /* Operation Region 'PRST': bitmask of online CPUs. */
-    stmt("OperationRegion", "PRST, SystemIO, 0xaf00, 32");
+    stmt("OperationRegion", "PRST, SystemIO, %#x, %d",
+        XEN_ACPI_CPU_MAP, XEN_ACPI_CPU_MAP_LEN);
     push_block("Field", "PRST, ByteAcc, NoLock, Preserve");
     indent(); printf("PRS, %u\n", max_cpus);
     pop_block();
@@ -283,7 +285,8 @@  int main(int argc, char **argv)
     /* Define GPE control method. */
     push_block("Scope", "\\_GPE");
     push_block("Method",
-               dm_version == QEMU_XEN_TRADITIONAL ? "_L02" : "_E02");
+               dm_version == QEMU_XEN_TRADITIONAL ? "_L%02d" : "_E%02d",
+               XEN_ACPI_GPE0_CPUHP_BIT);
     stmt("\\_SB.PRSC ()", NULL);
     pop_block();
     pop_block();
diff --git a/tools/libacpi/static_tables.c b/tools/libacpi/static_tables.c
index 1f6247d..608c936 100644
--- a/tools/libacpi/static_tables.c
+++ b/tools/libacpi/static_tables.c
@@ -31,6 +31,10 @@  struct acpi_20_facs Facs = {
  * Fixed ACPI Description Table (FADT).
  */
 
+/*
+ * These values must match register definitions in struct hvm_hw_acpi
+ * (in xen/include/public/arch-x86/hvm/save.h).
+ */
 #define ACPI_PM1A_EVT_BLK_BIT_WIDTH         0x20
 #define ACPI_PM1A_EVT_BLK_BIT_OFFSET        0x00
 #define ACPI_PM1A_CNT_BLK_BIT_WIDTH         0x10
diff --git a/xen/include/public/arch-x86/xen.h b/xen/include/public/arch-x86/xen.h
index cdd93c1..12f719d 100644
--- a/xen/include/public/arch-x86/xen.h
+++ b/xen/include/public/arch-x86/xen.h
@@ -291,6 +291,13 @@  struct xen_arch_domainconfig {
                                      XEN_X86_EMU_PIT)
     uint32_t emulation_flags;
 };
+
+/* Location of online VCPU bitmap. */
+#define XEN_ACPI_CPU_MAP             0xaf00
+#define XEN_ACPI_CPU_MAP_LEN         ((HVM_MAX_VCPUS + 7) / 8)
+
+/* GPE0 bit set during CPU hotplug */
+#define XEN_ACPI_GPE0_CPUHP_BIT      2
 #endif
 
 #endif /* !__ASSEMBLY__ */