* [PATCH v5 0/3] vTPM/aarch64 ACPI support
@ 2020-06-16 9:34 Eric Auger
2020-06-16 9:34 ` [PATCH v5 1/3] acpi: Some build_tpm2() code reshape Eric Auger
` (2 more replies)
0 siblings, 3 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
Those patches bring MMIO TPM TIS ACPI support in machvirt.
On ARM, the TPM2 table is added when the TPM TIS sysbus
device is dynamically instantiated in machvirt.
Also the TPM2 device object is described in the DSDT.
Many thanks to Ard for his support.
Tested with LUKS partition automatic decryption. Also
tested with new bios-tables-test dedicated tests,
sent separately.
Best Regards
Eric
This series can be found at:
https://github.com/eauger/qemu/tree/v5.0-tpm-acpi-v5
History:
v4 -> v5:
- Move of build_tpm2() in the generic acpi code was upstreamed
but this does not correspond to latest proposed version.
- Rebase on top of edfcb1f21a
v3 -> v4:
- some rework in build_tpm2() as suggested by Igor
- Restored tpm presence check in acpi_dsdt_add_tpm()
- add the doc related patch
v2 -> v3:
- Rebase on top of Stefan's
"acpi: tpm: Do not build TCPA table for TPM 2"
- brings conversion to build_append
v1 -> v2:
- move build_tpm2() in the generic code (Michael)
- collect Stefan's R-b on 3/3
Eric Auger (3):
acpi: Some build_tpm2() code reshape
arm/acpi: Add the TPM2.0 device under the DSDT
docs/specs/tpm: ACPI boot now supported for TPM/ARM
docs/specs/tpm.rst | 2 --
hw/acpi/aml-build.c | 45 +++++++++++++++++++++++-----------------
hw/arm/virt-acpi-build.c | 34 ++++++++++++++++++++++++++++++
3 files changed, 60 insertions(+), 21 deletions(-)
--
2.20.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [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
end of thread, other threads:[~2020-06-16 9:39 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 ` [PATCH v5 3/3] docs/specs/tpm: ACPI boot now supported for TPM/ARM Eric Auger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).