diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2014-08-25 18:49:25 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2014-08-25 18:49:25 +0100 |
commit | a44a12b78a7e9a3dc59e5b10b09a0bc934c693f1 (patch) | |
tree | cb3321d309b92bd15082518574ede30aa18010bc /hw/i386/acpi-build.c | |
parent | 3dd359c2d34c6abf385d58da863f337b39702585 (diff) | |
parent | 187de915e8d06aaf82be206aebc551c82bf0670c (diff) | |
download | hqemu-a44a12b78a7e9a3dc59e5b10b09a0bc934c693f1.zip hqemu-a44a12b78a7e9a3dc59e5b10b09a0bc934c693f1.tar.gz |
Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging
pci, pc fixes, features
A bunch of bugfixes - these will make sense for 2.1.1
ACPI support for TPM and partial ARI support for PCIE.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
# gpg: Signature made Sun 24 Aug 2014 23:16:35 BST using RSA key ID D28D5469
# gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>"
# gpg: aka "Michael S. Tsirkin <mst@redhat.com>"
* remotes/mst/tags/for_upstream:
pcie: fix trailing whitespace
ioh3420: Enable ARI forwarding
ioh3420: Remove obsoleted, unused ioh3420_init function
pcie: Rename the pcie_cap_ari_* functions to pcie_cap_arifwd_*
pcie: Fix incorrect write to the ari capability next function field
ssdt-tpm: add generated hex file to git
Add ACPI tables for TPM
pc: reserve more memory for ACPI for new machine types
pcihp: fix possible array out of bounds
pci_bridge: manually destroy memory regions within PCIBridgeWindows
hostmem: set MPOL_MF_MOVE
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw/i386/acpi-build.c')
-rw-r--r-- | hw/i386/acpi-build.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index 10b84d0..85e5834 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -40,6 +40,8 @@ #include "hw/loader.h" #include "hw/isa/isa.h" #include "hw/acpi/memory_hotplug.h" +#include "sysemu/tpm.h" +#include "hw/acpi/tpm.h" /* Supported chipsets: */ #include "hw/acpi/piix4.h" @@ -88,6 +90,7 @@ typedef struct AcpiPmInfo { typedef struct AcpiMiscInfo { bool has_hpet; + bool has_tpm; DECLARE_BITMAP(slot_hotplug_enable, PCI_SLOT_MAX); const unsigned char *dsdt_code; unsigned dsdt_size; @@ -210,6 +213,7 @@ static void acpi_get_pm_info(AcpiPmInfo *pm) static void acpi_get_misc_info(AcpiMiscInfo *info) { info->has_hpet = hpet_find(); + info->has_tpm = tpm_find(); info->pvpanic_port = pvpanic_port(); } @@ -698,6 +702,7 @@ static inline char acpi_get_hex(uint32_t val) #include "hw/i386/ssdt-misc.hex" #include "hw/i386/ssdt-pcihp.hex" +#include "hw/i386/ssdt-tpm.hex" static void build_append_notify_method(GArray *device, const char *name, @@ -1201,6 +1206,39 @@ build_hpet(GArray *table_data, GArray *linker) (void *)hpet, "HPET", sizeof(*hpet), 1); } +static void +build_tpm_tcpa(GArray *table_data, GArray *linker) +{ + Acpi20Tcpa *tcpa = acpi_data_push(table_data, sizeof *tcpa); + /* the log area will come right after the TCPA table */ + uint64_t log_area_start_address = acpi_data_len(table_data); + + tcpa->platform_class = cpu_to_le16(TPM_TCPA_ACPI_CLASS_CLIENT); + tcpa->log_area_minimum_length = cpu_to_le32(TPM_LOG_AREA_MINIMUM_SIZE); + tcpa->log_area_start_address = cpu_to_le64(log_area_start_address); + + /* log area start address to be filled by Guest linker */ + bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE, + ACPI_BUILD_TABLE_FILE, + table_data, &tcpa->log_area_start_address, + sizeof(tcpa->log_area_start_address)); + + build_header(linker, table_data, + (void *)tcpa, "TCPA", sizeof(*tcpa), 2); + + /* now only get the log area and with that modify table_data */ + acpi_data_push(table_data, TPM_LOG_AREA_MINIMUM_SIZE); +} + +static void +build_tpm_ssdt(GArray *table_data, GArray *linker) +{ + void *tpm_ptr; + + tpm_ptr = acpi_data_push(table_data, sizeof(ssdt_tpm_aml)); + memcpy(tpm_ptr, ssdt_tpm_aml, sizeof(ssdt_tpm_aml)); +} + typedef enum { MEM_AFFINITY_NOFLAGS = 0, MEM_AFFINITY_ENABLED = (1 << 0), @@ -1531,6 +1569,13 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables) acpi_add_table(table_offsets, tables->table_data); build_hpet(tables->table_data, tables->linker); } + if (misc.has_tpm) { + acpi_add_table(table_offsets, tables->table_data); + build_tpm_tcpa(tables->table_data, tables->linker); + + acpi_add_table(table_offsets, tables->table_data); + build_tpm_ssdt(tables->table_data, tables->linker); + } if (guest_info->numa_nodes) { acpi_add_table(table_offsets, tables->table_data); build_srat(tables->table_data, tables->linker, &cpu, guest_info); |