* [PATCH v5 1/3] acpi: Some build_tpm2() code reshape
2020-06-16 9:34 [PATCH v5 0/3] vTPM/aarch64 ACPI support Eric Auger
@ 2020-06-16 9:34 ` Eric Auger
2020-06-16 9:34 ` [PATCH v5 2/3] arm/acpi: Add the TPM2.0 device under the DSDT Eric Auger
2020-06-16 9:34 ` [PATCH v5 3/3] docs/specs/tpm: ACPI boot now supported for TPM/ARM Eric Auger
2 siblings, 0 replies; 4+ messages in thread
From: Eric Auger @ 2020-06-16 9:34 UTC (permalink / raw)
To: eric.auger.pro, eric.auger, stefanb, qemu-devel, qemu-arm,
peter.maydell, mst, imammedo
Cc: thuth, lersek, drjones, shannon.zhaosl, marcandre.lureau, philmd,
ardb
Remove any reference to Acpi20TPM2 and adopt an implementation
similar to build_ghes_v2().
Signed-off-by: Eric Auger <eric.auger@redhat.com>
Suggested-by: Igor Mammedov <imammedo@redhat.com>
---
hw/acpi/aml-build.c | 45 ++++++++++++++++++++++++++-------------------
1 file changed, 26 insertions(+), 19 deletions(-)
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index 2cb7b991ef..6e2d7d19f9 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -1880,46 +1880,53 @@ build_hdr:
void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog)
{
- Acpi20TPM2 *tpm2_ptr = acpi_data_push(table_data, sizeof(AcpiTableHeader));
- unsigned log_addr_size = sizeof(tpm2_ptr->log_area_start_address);
- unsigned log_addr_offset =
- (char *)&tpm2_ptr->log_area_start_address - table_data->data;
uint8_t start_method_params[12] = {};
+ unsigned log_addr_offset, tpm2_start;
+ uint64_t control_area_start_address;
TPMIf *tpmif = tpm_find();
+ uint32_t start_method;
+ void *tpm2_ptr;
- /* platform class */
+ tpm2_start = table_data->len;
+ tpm2_ptr = acpi_data_push(table_data, sizeof(AcpiTableHeader));
+
+ /* Platform Class */
build_append_int_noprefix(table_data, TPM2_ACPI_CLASS_CLIENT, 2);
- /* reserved */
+ /* Reserved */
build_append_int_noprefix(table_data, 0, 2);
if (TPM_IS_TIS_ISA(tpmif) || TPM_IS_TIS_SYSBUS(tpmif)) {
- /* address of control area */
- build_append_int_noprefix(table_data, 0, 8);
- /* start method */
- build_append_int_noprefix(table_data, TPM2_START_METHOD_MMIO, 4);
+ control_area_start_address = 0;
+ start_method = TPM2_START_METHOD_MMIO;
} else if (TPM_IS_CRB(tpmif)) {
- build_append_int_noprefix(table_data, TPM_CRB_ADDR_CTRL, 8);
- build_append_int_noprefix(table_data, TPM2_START_METHOD_CRB, 4);
+ control_area_start_address = TPM_CRB_ADDR_CTRL;
+ start_method = TPM2_START_METHOD_CRB;
} else {
- g_warn_if_reached();
+ g_assert_not_reached();
}
+ /* Address of Control Area */
+ build_append_int_noprefix(table_data, control_area_start_address, 8);
+ /* Start Method */
+ build_append_int_noprefix(table_data, start_method, 4);
- /* platform specific parameters */
- g_array_append_vals(table_data, &start_method_params, 12);
+ /* Platform Specific Parameters */
+ g_array_append_vals(table_data, &start_method_params,
+ ARRAY_SIZE(start_method_params));
- /* log area minimum length */
+ /* Log Area Minimum Length */
build_append_int_noprefix(table_data, TPM_LOG_AREA_MINIMUM_SIZE, 4);
acpi_data_push(tcpalog, TPM_LOG_AREA_MINIMUM_SIZE);
bios_linker_loader_alloc(linker, ACPI_BUILD_TPMLOG_FILE, tcpalog, 1,
false);
- /* log area start address to be filled by Guest linker */
+ log_addr_offset = table_data->len;
build_append_int_noprefix(table_data, 0, 8);
+ /* Log Area Start Address to be filled by Guest linker */
bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE,
- log_addr_offset, log_addr_size,
+ log_addr_offset, 8,
ACPI_BUILD_TPMLOG_FILE, 0);
build_header(linker, table_data,
- (void *)tpm2_ptr, "TPM2", sizeof(*tpm2_ptr), 4, NULL, NULL);
+ tpm2_ptr, "TPM2", table_data->len - tpm2_start, 4, NULL, NULL);
}
/* ACPI 5.0: 6.4.3.8.2 Serial Bus Connection Descriptors */
--
2.20.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v5 2/3] arm/acpi: Add the TPM2.0 device under the DSDT
2020-06-16 9:34 [PATCH v5 0/3] vTPM/aarch64 ACPI support Eric Auger
2020-06-16 9:34 ` [PATCH v5 1/3] acpi: Some build_tpm2() code reshape Eric Auger
@ 2020-06-16 9:34 ` Eric Auger
2020-06-16 9:34 ` [PATCH v5 3/3] docs/specs/tpm: ACPI boot now supported for TPM/ARM Eric Auger
2 siblings, 0 replies; 4+ messages in thread
From: Eric Auger @ 2020-06-16 9:34 UTC (permalink / raw)
To: eric.auger.pro, eric.auger, stefanb, qemu-devel, qemu-arm,
peter.maydell, mst, imammedo
Cc: thuth, lersek, drjones, shannon.zhaosl, marcandre.lureau, philmd,
ardb
In case it is dynamically instantiated, add the TPM 2.0 device object
under the DSDT table in the ACPI namespace. Its HID is MSFT0101
while its current resource settings (CRS) property is initialized
with the guest physical address and MMIO size of the device.
Signed-off-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
---
v3 -> v4:
- check the presence of the tpm in acpi_dsdt_add_tpm
as it was done in v2
v2 -> v3:
- use SYS_BUS_DEVICE() instead of
(SysBusDevice *)object_dynamic_cast(OBJECT())
v1 -> v2:
- use memory_region_size
- fix mingw compilation issue by casting to uint32_t
- added Stefan's R-b
---
hw/arm/virt-acpi-build.c | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index ca31f70f7f..1384a2cf2a 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -46,6 +46,7 @@
#include "hw/pci/pci.h"
#include "hw/arm/virt.h"
#include "hw/mem/nvdimm.h"
+#include "hw/platform-bus.h"
#include "sysemu/numa.h"
#include "sysemu/reset.h"
#include "sysemu/tpm.h"
@@ -364,6 +365,38 @@ static void acpi_dsdt_add_power_button(Aml *scope)
aml_append(scope, dev);
}
+static void acpi_dsdt_add_tpm(Aml *scope, VirtMachineState *vms)
+{
+ PlatformBusDevice *pbus = PLATFORM_BUS_DEVICE(vms->platform_bus_dev);
+ hwaddr pbus_base = vms->memmap[VIRT_PLATFORM_BUS].base;
+ SysBusDevice *sbdev = SYS_BUS_DEVICE(tpm_find());
+ MemoryRegion *sbdev_mr;
+ hwaddr tpm_base;
+
+ if (!sbdev) {
+ return;
+ }
+
+ tpm_base = platform_bus_get_mmio_addr(pbus, sbdev, 0);
+ assert(tpm_base != -1);
+
+ tpm_base += pbus_base;
+
+ sbdev_mr = sysbus_mmio_get_region(sbdev, 0);
+
+ Aml *dev = aml_device("TPM0");
+ aml_append(dev, aml_name_decl("_HID", aml_string("MSFT0101")));
+ aml_append(dev, aml_name_decl("_UID", aml_int(0)));
+
+ Aml *crs = aml_resource_template();
+ aml_append(crs,
+ aml_memory32_fixed(tpm_base,
+ (uint32_t)memory_region_size(sbdev_mr),
+ AML_READ_WRITE));
+ aml_append(dev, aml_name_decl("_CRS", crs));
+ aml_append(scope, dev);
+}
+
static void
build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
{
@@ -762,6 +795,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
}
acpi_dsdt_add_power_button(scope);
+ acpi_dsdt_add_tpm(scope, vms);
aml_append(dsdt, scope);
--
2.20.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v5 3/3] docs/specs/tpm: ACPI boot now supported for TPM/ARM
2020-06-16 9:34 [PATCH v5 0/3] vTPM/aarch64 ACPI support Eric Auger
2020-06-16 9:34 ` [PATCH v5 1/3] acpi: Some build_tpm2() code reshape Eric Auger
2020-06-16 9:34 ` [PATCH v5 2/3] arm/acpi: Add the TPM2.0 device under the DSDT Eric Auger
@ 2020-06-16 9:34 ` Eric Auger
2 siblings, 0 replies; 4+ messages in thread
From: Eric Auger @ 2020-06-16 9:34 UTC (permalink / raw)
To: eric.auger.pro, eric.auger, stefanb, qemu-devel, qemu-arm,
peter.maydell, mst, imammedo
Cc: thuth, lersek, drjones, shannon.zhaosl, marcandre.lureau, philmd,
ardb
ACPI boot now is supported. Let's remove the comment
saying it is not.
Signed-off-by: Eric Auger <eric.auger@redhat.com>
---
docs/specs/tpm.rst | 2 --
1 file changed, 2 deletions(-)
diff --git a/docs/specs/tpm.rst b/docs/specs/tpm.rst
index 5e61238bc5..eeeb93730a 100644
--- a/docs/specs/tpm.rst
+++ b/docs/specs/tpm.rst
@@ -346,8 +346,6 @@ In case an Arm virt machine is emulated, use the following command line:
-drive if=pflash,format=raw,file=flash0.img,readonly \
-drive if=pflash,format=raw,file=flash1.img
- On Arm, ACPI boot with TPM is not yet supported.
-
In case SeaBIOS is used as firmware, it should show the TPM menu item
after entering the menu with 'ESC'.
--
2.20.1
^ permalink raw reply related [flat|nested] 4+ messages in thread