aboutsummaryrefslogtreecommitdiffstats
path: root/tools/firmware/hvmloader/acpi/build.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/firmware/hvmloader/acpi/build.c')
-rw-r--r--tools/firmware/hvmloader/acpi/build.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/tools/firmware/hvmloader/acpi/build.c b/tools/firmware/hvmloader/acpi/build.c
index 247c3b5928..e33cc04795 100644
--- a/tools/firmware/hvmloader/acpi/build.c
+++ b/tools/firmware/hvmloader/acpi/build.c
@@ -62,11 +62,18 @@ static int uart_exists(uint16_t uart_base)
return ((b == 0) && (c == 0xf));
}
+static int hpet_exists(unsigned long hpet_base)
+{
+ uint32_t hpet_id = *(uint32_t *)hpet_base;
+ return ((hpet_id >> 16) == 0x8086);
+}
+
static int construct_bios_info_table(uint8_t *buf)
{
struct bios_info {
uint8_t com1_present:1;
uint8_t com2_present:1;
+ uint8_t hpet_present:1;
uint32_t pci_min, pci_len;
} *bios_info = (struct bios_info *)buf;
@@ -75,6 +82,8 @@ static int construct_bios_info_table(uint8_t *buf)
bios_info->com1_present = uart_exists(0x3f8);
bios_info->com2_present = uart_exists(0x2f8);
+ bios_info->hpet_present = hpet_exists(ACPI_HPET_ADDRESS);
+
bios_info->pci_min = 0xf0000000;
bios_info->pci_len = 0x0c000000;
@@ -272,9 +281,12 @@ static int construct_secondary_tables(uint8_t *buf, unsigned long *table_ptrs)
}
/* HPET. */
- hpet = (struct acpi_20_hpet *)&buf[offset];
- offset += construct_hpet(hpet);
- table_ptrs[nr_tables++] = (unsigned long)hpet;
+ if ( hpet_exists(ACPI_HPET_ADDRESS) )
+ {
+ hpet = (struct acpi_20_hpet *)&buf[offset];
+ offset += construct_hpet(hpet);
+ table_ptrs[nr_tables++] = (unsigned long)hpet;
+ }
/* Processor Object SSDT. */
table_ptrs[nr_tables++] = (unsigned long)&buf[offset];