mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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>
This commit is contained in:
1 parent
17a92aa4d8
commit
ee3665984b
3 files changed
+52
No files matched your search
@@ -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 ()
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||