src/arch/x86/acpi.c: Create log area and extend TPM2 table

According to newest TCG ACPI Specification for Family 1.2 and 2.0
Version 1.2, Revision 8, TPM2 ACPI table has two more fields LAML and LASA.

Update the table structure definition, create the log area for TPM2 in
coreboot tables and fill the missing fields in TPM2 table. TPM2 should be
now probed well in SeaBIOS rel-1.12.0 or master.

Tested on apu2 with Infineon SLB9665 TT2.0.

Signed-off-by: Michał Żygowski <michal.zygowski@3mdeb.com>
Change-Id: Ie482cba0a3093aae996f7431251251f145fe64f3
Signed-off-by: Michał Żygowski <michal.zygowski@3mdeb.com>
Reviewed-on: https://review.coreboot.org/c/29800
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com>
This commit is contained in:
Michał Żygowski 2018-11-22 16:57:50 +01:00 committed by Philipp Deppenwiese
parent 6b522c31aa
commit 6e8692e184
3 changed files with 43 additions and 0 deletions

View File

@ -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);
}

View File

@ -199,6 +199,8 @@ typedef struct acpi_tpm2 {
u64 control_area;
u32 start_method;
u8 msp[12];
u32 laml;
u64 lasa;
} __packed acpi_tpm2_t;
typedef struct acpi_mcfg_mmconfig {

View File

@ -65,6 +65,7 @@
#define CBMEM_ID_TCPA_LOG 0x54435041
#define CBMEM_ID_TCPA_TCG_LOG 0x54445041
#define CBMEM_ID_TIMESTAMP 0x54494d45
#define CBMEM_ID_TPM2_TCG_LOG 0x54504d32
#define CBMEM_ID_VBOOT_HANDOFF 0x780074f0
#define CBMEM_ID_VBOOT_SEL_REG 0x780074f1
#define CBMEM_ID_VBOOT_WORKBUF 0x78007343
@ -121,6 +122,7 @@
{ CBMEM_ID_TCPA_LOG, "TCPA LOG " }, \
{ CBMEM_ID_TCPA_TCG_LOG, "TCPA TCGLOG" }, \
{ CBMEM_ID_TIMESTAMP, "TIME STAMP " }, \
{ CBMEM_ID_TPM2_TCG_LOG, "TPM2 TCGLOG" }, \
{ CBMEM_ID_VBOOT_HANDOFF, "VBOOT " }, \
{ CBMEM_ID_VBOOT_SEL_REG, "VBOOT SEL " }, \
{ CBMEM_ID_VBOOT_WORKBUF, "VBOOT WORK " }, \