summaryrefslogtreecommitdiff
path: root/src/arch/x86/acpi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/x86/acpi.c')
-rw-r--r--src/arch/x86/acpi.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/arch/x86/acpi.c b/src/arch/x86/acpi.c
index f54aa19271..3b33f1ba7f 100644
--- a/src/arch/x86/acpi.c
+++ b/src/arch/x86/acpi.c
@@ -308,12 +308,47 @@ static void acpi_create_tcpa(acpi_tcpa_t *tcpa)
header->checksum = acpi_checksum((void *)tcpa, header->length);
}
+static void *get_tpm2_log(u32 *size)
+{
+ const struct cbmem_entry *ce;
+ const u32 tpm2_default_log_len = 0x10000;
+ void *lasa;
+ ce = cbmem_entry_find(CBMEM_ID_TPM2_TCG_LOG);
+ if (ce) {
+ lasa = cbmem_entry_start(ce);
+ *size = cbmem_entry_size(ce);
+ printk(BIOS_DEBUG, "TPM2 log found at %p\n", lasa);
+ return lasa;
+ }
+ lasa = cbmem_add(CBMEM_ID_TPM2_TCG_LOG, tpm2_default_log_len);
+ if (!lasa) {
+ printk(BIOS_ERR, "TPM2 log creation failed\n");
+ return NULL;
+ }
+
+ printk(BIOS_DEBUG, "TPM2 log created at %p\n", lasa);
+ memset(lasa, 0, tpm2_default_log_len);
+
+ *size = tpm2_default_log_len;
+ return lasa;
+}
+
static void acpi_create_tpm2(acpi_tpm2_t *tpm2)
{
acpi_header_t *header = &(tpm2->header);
+ u32 tpm2_log_len;
+ void *lasa;
memset((void *)tpm2, 0, sizeof(acpi_tpm2_t));
+ /*
+ * Some payloads like SeaBIOS depend on log area to use TPM2.
+ * Get the memory size and address of TPM2 log area or initialize it.
+ */
+ lasa = get_tpm2_log(&tpm2_log_len);
+ if (!lasa)
+ tpm2_log_len = 0;
+
/* Fill out header fields. */
memcpy(header->signature, "TPM2", 4);
memcpy(header->oem_id, OEM_ID, 6);
@@ -331,6 +366,10 @@ static void acpi_create_tpm2(acpi_tpm2_t *tpm2)
tpm2->start_method = 6;
memset(tpm2->msp, 0, sizeof(tpm2->msp));
+ /* Fill the log area size and start address fields. */
+ tpm2->laml = tpm2_log_len;
+ tpm2->lasa = (uintptr_t) lasa;
+
/* Calculate checksum. */
header->checksum = acpi_checksum((void *)tpm2, header->length);
}