aboutsummaryrefslogtreecommitdiffstats
path: root/tools/firmware
diff options
context:
space:
mode:
authorAndrew Cooper <andrew.cooper3@citrix.com>2011-10-14 18:11:25 +0100
committerAndrew Cooper <andrew.cooper3@citrix.com>2011-10-14 18:11:25 +0100
commitee3665984b795ee3a4f56cf3d93ca697ce857f6f (patch)
treedcd0b5ee7b2edc640edc04752300875fb29dfe4f /tools/firmware
parent17a92aa4d84cddd1c4190ab31618a06730c20d95 (diff)
downloadxen-ee3665984b795ee3a4f56cf3d93ca697ce857f6f.tar.gz
xen-ee3665984b795ee3a4f56cf3d93ca697ce857f6f.tar.bz2
xen-ee3665984b795ee3a4f56cf3d93ca697ce857f6f.zip
hvmloader: Add the WAET since Microsoft are demanding it for Windows 8
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>
Diffstat (limited to 'tools/firmware')
-rw-r--r--tools/firmware/hvmloader/acpi/acpi2_0.h10
-rw-r--r--tools/firmware/hvmloader/acpi/build.c22
-rw-r--r--tools/firmware/hvmloader/acpi/static_tables.c20
3 files changed, 52 insertions, 0 deletions
diff --git a/tools/firmware/hvmloader/acpi/acpi2_0.h b/tools/firmware/hvmloader/acpi/acpi2_0.h
index dcc362ad5d..7fa8f5bab8 100644
--- a/tools/firmware/hvmloader/acpi/acpi2_0.h
+++ b/tools/firmware/hvmloader/acpi/acpi2_0.h
@@ -297,6 +297,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.
*/
#define ACPI_PCAT_COMPAT (1 << 0)
@@ -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 ()
diff --git a/tools/firmware/hvmloader/acpi/build.c b/tools/firmware/hvmloader/acpi/build.c
index 61ed7ff3c0..d8222b1955 100644
--- a/tools/firmware/hvmloader/acpi/build.c
+++ b/tools/firmware/hvmloader/acpi/build.c
@@ -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);
diff --git a/tools/firmware/hvmloader/acpi/static_tables.c b/tools/firmware/hvmloader/acpi/static_tables.c
index da61304f46..b2be89947e 100644
--- a/tools/firmware/hvmloader/acpi/static_tables.c
+++ b/tools/firmware/hvmloader/acpi/static_tables.c
@@ -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