hvmloader: Add the WAET since Microsoft are demanding it for Windows 8
authorAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 14 Oct 2011 17:11:25 +0000 (18:11 +0100)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 14 Oct 2011 17:11:25 +0000 (18:11 +0100)
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Committed-by: Keir Fraser <keir@xen.org>
tools/firmware/hvmloader/acpi/acpi2_0.h
tools/firmware/hvmloader/acpi/build.c
tools/firmware/hvmloader/acpi/static_tables.c

index dcc362ad5dc7f5b2d0314def24f487c4bf86d8b5..7fa8f5bab8d34d8601dfb0bfa032ce52068a9d05 100644 (file)
@@ -296,6 +296,14 @@ struct acpi_20_hpet {
 };
 #define ACPI_HPET_ADDRESS 0xFED00000UL
 
+/*
+ * WAET Description Table
+ */
+struct acpi_20_waet {
+    struct acpi_header header;
+    uint32_t           flags;
+};
+
 /*
  * Multiple APIC Flags.
  */
@@ -366,6 +374,7 @@ struct acpi_20_madt_intsrcovr {
 #define ACPI_2_0_XSDT_SIGNATURE ASCII32('X','S','D','T')
 #define ACPI_2_0_TCPA_SIGNATURE ASCII32('T','C','P','A')
 #define ACPI_2_0_HPET_SIGNATURE ASCII32('H','P','E','T')
+#define ACPI_2_0_WAET_SIGNATURE ASCII32('W','A','E','T')
 
 /*
  * Table revision numbers.
@@ -377,6 +386,7 @@ struct acpi_20_madt_intsrcovr {
 #define ACPI_2_0_XSDT_REVISION 0x01
 #define ACPI_2_0_TCPA_REVISION 0x02
 #define ACPI_2_0_HPET_REVISION 0x01
+#define ACPI_2_0_WAET_REVISION 0x01
 #define ACPI_1_0_FADT_REVISION 0x01
 
 #pragma pack ()
index 61ed7ff3c061dbb3d05b8d7b2b837d897b1d2396..d8222b1955c490f76468683fe8a14cad045e9067 100644 (file)
@@ -30,6 +30,7 @@ extern struct acpi_20_rsdt Rsdt;
 extern struct acpi_20_xsdt Xsdt;
 extern struct acpi_20_fadt Fadt;
 extern struct acpi_20_facs Facs;
+extern struct acpi_20_waet Waet;
 
 /*
  * Located at ACPI_INFO_PHYSICAL_ADDRESS.
@@ -190,12 +191,28 @@ static struct acpi_20_hpet *construct_hpet(void)
     return hpet;
 }
 
+static struct acpi_20_waet *construct_waet(void)
+{
+    struct acpi_20_waet *waet;
+
+    waet = mem_alloc(sizeof(*waet), 16);
+    if (!waet) return NULL;
+
+    memcpy(waet, &Waet, sizeof(*waet));
+
+    waet->header.length = sizeof(*waet);
+    set_checksum(waet, offsetof(struct acpi_header, checksum), sizeof(*waet));
+
+    return waet;
+}
+
 static int construct_secondary_tables(unsigned long *table_ptrs,
                                       struct acpi_info *info)
 {
     int nr_tables = 0;
     struct acpi_20_madt *madt;
     struct acpi_20_hpet *hpet;
+    struct acpi_20_waet *waet;
     struct acpi_20_tcpa *tcpa;
     unsigned char *ssdt;
     static const uint16_t tis_signature[] = {0x0001, 0x0001, 0x0001};
@@ -216,6 +233,11 @@ static int construct_secondary_tables(unsigned long *table_ptrs,
     if (!hpet) return -1;
     table_ptrs[nr_tables++] = (unsigned long)hpet;
 
+    /* WAET. */
+    waet = construct_waet();
+    if (!waet) return -1;
+    table_ptrs[nr_tables++] = (unsigned long)waet;
+
     if ( battery_port_exists() )
     {
         ssdt = mem_alloc(sizeof(ssdt_pm), 16);
index da61304f4645b7c099de819af3b408f68e83b65e..b2be89947e5cb4b7cd0ce6f81cf26ccfcf9a22a3 100644 (file)
@@ -136,6 +136,26 @@ struct acpi_20_rsdp Rsdp = {
     .length    = sizeof(struct acpi_20_rsdp)
 };
 
+#define ACPI_WAET_RTC_GOOD      0x00000001
+#define ACPI_WAET_PM_TIMER_GOOD 0x00000002
+
+#define ACPI_WAET_FLAGS (ACPI_WAET_RTC_GOOD | \
+                         ACPI_WAET_PM_TIMER_GOOD)
+
+struct acpi_20_waet Waet = {
+    .header = {
+        .signature    = ACPI_2_0_WAET_SIGNATURE,
+        .length       = sizeof(struct acpi_20_waet),
+        .revision     = ACPI_2_0_WAET_REVISION,
+        .oem_id       = ACPI_OEM_ID, 
+        .oem_table_id = ACPI_OEM_TABLE_ID,
+        .oem_revision = ACPI_OEM_REVISION,
+        .creator_id   = ACPI_CREATOR_ID,
+        .creator_revision = ACPI_CREATOR_REVISION
+    },
+    .flags = ACPI_WAET_FLAGS
+};
+
 /*
  * Local variables:
  * mode: C