mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 17:53:56 -06:00
acpi: build TPM Physical Presence interface
The TPM Physical Presence interface consists of an ACPI part, a shared memory part, and code in the firmware. Users can send messages to the firmware by writing a code into the shared memory through invoking the ACPI code. When a reboot happens, the firmware looks for the code and acts on it by sending sequences of commands to the TPM. This patch adds the ACPI code. It is similar to the one in EDK2 but doesn't assume that SMIs are necessary to use. It uses a similar datastructure for the shared memory as EDK2 does so that EDK2 and SeaBIOS could both make use of it. I extended the shared memory data structure with an array of 256 bytes, one for each code that could be implemented. The array contains flags describing the individual codes. This decouples the ACPI implementation from the firmware implementation. The underlying TCG specification is accessible from the following page. https://trustedcomputinggroup.org/tcg-physical-presence-interface-specification/ This patch implements version 1.30. Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com> [ Marc-André - ACPI code improvements and windows fixes ] Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Tested-by: Stefan Berger <stefanb@linux.ibm.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
0fe2466903
commit
ac6dd31e3f
6 changed files with 514 additions and 3 deletions
|
@ -1802,6 +1802,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
|
|||
uint32_t nr_mem = machine->ram_slots;
|
||||
int root_bus_limit = 0xFF;
|
||||
PCIBus *bus = NULL;
|
||||
TPMIf *tpm = tpm_find();
|
||||
int i;
|
||||
|
||||
dsdt = init_aml_allocator();
|
||||
|
@ -2139,7 +2140,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
|
|||
/* Scan all PCI buses. Generate tables to support hotplug. */
|
||||
build_append_pci_bus_devices(scope, bus, pm->pcihp_bridge_en);
|
||||
|
||||
if (TPM_IS_TIS(tpm_find())) {
|
||||
if (TPM_IS_TIS(tpm)) {
|
||||
dev = aml_device("ISA.TPM");
|
||||
aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0C31")));
|
||||
aml_append(dev, aml_name_decl("_STA", aml_int(0xF)));
|
||||
|
@ -2153,6 +2154,9 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
|
|||
*/
|
||||
/* aml_append(crs, aml_irq_no_flags(TPM_TIS_IRQ)); */
|
||||
aml_append(dev, aml_name_decl("_CRS", crs));
|
||||
|
||||
tpm_build_ppi_acpi(tpm, dev);
|
||||
|
||||
aml_append(scope, dev);
|
||||
}
|
||||
|
||||
|
@ -2160,7 +2164,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
|
|||
}
|
||||
}
|
||||
|
||||
if (TPM_IS_CRB(tpm_find())) {
|
||||
if (TPM_IS_CRB(tpm)) {
|
||||
dev = aml_device("TPM");
|
||||
aml_append(dev, aml_name_decl("_HID", aml_string("MSFT0101")));
|
||||
crs = aml_resource_template();
|
||||
|
@ -2172,6 +2176,8 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
|
|||
aml_append(method, aml_return(aml_int(0x0f)));
|
||||
aml_append(dev, method);
|
||||
|
||||
tpm_build_ppi_acpi(tpm, dev);
|
||||
|
||||
aml_append(sb_scope, dev);
|
||||
}
|
||||
|
||||
|
@ -2894,7 +2900,7 @@ void acpi_setup(void)
|
|||
tpm_config = (FwCfgTPMConfig) {
|
||||
.tpmppi_address = cpu_to_le32(TPM_PPI_ADDR_BASE),
|
||||
.tpm_version = tpm_get_version(tpm),
|
||||
.tpmppi_version = TPM_PPI_VERSION_NONE
|
||||
.tpmppi_version = TPM_PPI_VERSION_1_30
|
||||
};
|
||||
fw_cfg_add_file(pcms->fw_cfg, "etc/tpm/config",
|
||||
&tpm_config, sizeof tpm_config);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue