Add TCPA table.
This allows SeaBIOS to fill it as necessary. This is needed to make BitLocker work. Change-Id: I35858cd31a90c799ee1a240547c4b4a80fa13dd8 Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com> Reviewed-on: http://review.coreboot.org/10274 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <pgeorgi@google.com>
This commit is contained in:
parent
43931f61b9
commit
f44ac13db2
|
@ -250,6 +250,61 @@ void acpi_create_mcfg(acpi_mcfg_t *mcfg)
|
||||||
header->checksum = acpi_checksum((void *)mcfg, header->length);
|
header->checksum = acpi_checksum((void *)mcfg, header->length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *get_tcpa_log(u32 *size)
|
||||||
|
{
|
||||||
|
const struct cbmem_entry *ce;
|
||||||
|
const u32 tcpa_default_log_len = 0x10000;
|
||||||
|
void *lasa;
|
||||||
|
ce = cbmem_entry_find(CBMEM_ID_TCPA_LOG);
|
||||||
|
if (ce) {
|
||||||
|
lasa = cbmem_entry_start(ce);
|
||||||
|
*size = cbmem_entry_size(ce);
|
||||||
|
printk(BIOS_DEBUG, "TCPA log found at %p\n", lasa);
|
||||||
|
return lasa;
|
||||||
|
}
|
||||||
|
lasa = cbmem_add(CBMEM_ID_TCPA_LOG, tcpa_default_log_len);
|
||||||
|
if (!lasa) {
|
||||||
|
printk(BIOS_ERR, "TCPA log creation failed\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
printk(BIOS_DEBUG, "TCPA log created at %p\n", lasa);
|
||||||
|
memset (lasa, 0, tcpa_default_log_len);
|
||||||
|
|
||||||
|
*size = tcpa_default_log_len;
|
||||||
|
return lasa;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void acpi_create_tcpa(acpi_tcpa_t *tcpa)
|
||||||
|
{
|
||||||
|
acpi_header_t *header = &(tcpa->header);
|
||||||
|
u32 tcpa_log_len;
|
||||||
|
void *lasa;
|
||||||
|
|
||||||
|
memset((void *)tcpa, 0, sizeof(acpi_tcpa_t));
|
||||||
|
|
||||||
|
lasa = get_tcpa_log(&tcpa_log_len);
|
||||||
|
if (!lasa) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fill out header fields. */
|
||||||
|
memcpy(header->signature, "TCPA", 4);
|
||||||
|
memcpy(header->oem_id, OEM_ID, 6);
|
||||||
|
memcpy(header->oem_table_id, ACPI_TABLE_CREATOR, 8);
|
||||||
|
memcpy(header->asl_compiler_id, ASLC, 4);
|
||||||
|
|
||||||
|
header->length = sizeof(acpi_tcpa_t);
|
||||||
|
header->revision = 2;
|
||||||
|
|
||||||
|
tcpa->platform_class = 0;
|
||||||
|
tcpa->laml = tcpa_log_len;
|
||||||
|
tcpa->lasa = (u32) lasa;
|
||||||
|
|
||||||
|
/* Calculate checksum. */
|
||||||
|
header->checksum = acpi_checksum((void *)tcpa, header->length);
|
||||||
|
}
|
||||||
|
|
||||||
void acpi_create_ssdt_generator(acpi_header_t *ssdt, const char *oem_table_id)
|
void acpi_create_ssdt_generator(acpi_header_t *ssdt, const char *oem_table_id)
|
||||||
{
|
{
|
||||||
unsigned long current = (unsigned long)ssdt + sizeof(acpi_header_t);
|
unsigned long current = (unsigned long)ssdt + sizeof(acpi_header_t);
|
||||||
|
@ -688,6 +743,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_header_t *ssdt;
|
acpi_header_t *ssdt;
|
||||||
acpi_header_t *dsdt;
|
acpi_header_t *dsdt;
|
||||||
acpi_mcfg_t *mcfg;
|
acpi_mcfg_t *mcfg;
|
||||||
|
acpi_tcpa_t *tcpa;
|
||||||
acpi_madt_t *madt;
|
acpi_madt_t *madt;
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
unsigned long fw;
|
unsigned long fw;
|
||||||
|
@ -805,6 +861,15 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_add_table(rsdp, mcfg);
|
acpi_add_table(rsdp, mcfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printk(BIOS_DEBUG, "ACPI: * TCPA\n");
|
||||||
|
tcpa = (acpi_tcpa_t *) current;
|
||||||
|
acpi_create_tcpa(tcpa);
|
||||||
|
if (tcpa->header.length >= sizeof(acpi_tcpa_t)) {
|
||||||
|
current += tcpa->header.length;
|
||||||
|
ALIGN_CURRENT;
|
||||||
|
acpi_add_table(rsdp, tcpa);
|
||||||
|
}
|
||||||
|
|
||||||
printk(BIOS_DEBUG, "ACPI: * MADT\n");
|
printk(BIOS_DEBUG, "ACPI: * MADT\n");
|
||||||
|
|
||||||
madt = (acpi_madt_t *) current;
|
madt = (acpi_madt_t *) current;
|
||||||
|
|
|
@ -129,6 +129,13 @@ typedef struct acpi_mcfg {
|
||||||
u8 reserved[8];
|
u8 reserved[8];
|
||||||
} __attribute__ ((packed)) acpi_mcfg_t;
|
} __attribute__ ((packed)) acpi_mcfg_t;
|
||||||
|
|
||||||
|
typedef struct acpi_tcpa {
|
||||||
|
struct acpi_table_header header;
|
||||||
|
u16 platform_class;
|
||||||
|
u32 laml;
|
||||||
|
u64 lasa;
|
||||||
|
} __attribute__ ((packed)) acpi_tcpa_t;
|
||||||
|
|
||||||
typedef struct acpi_mcfg_mmconfig {
|
typedef struct acpi_mcfg_mmconfig {
|
||||||
u32 base_address;
|
u32 base_address;
|
||||||
u32 base_reserved;
|
u32 base_reserved;
|
||||||
|
|
|
@ -79,6 +79,7 @@
|
||||||
#define CBMEM_ID_VBOOT_HANDOFF 0x780074f0
|
#define CBMEM_ID_VBOOT_HANDOFF 0x780074f0
|
||||||
#define CBMEM_ID_VBOOT_WORKBUF 0x78007343
|
#define CBMEM_ID_VBOOT_WORKBUF 0x78007343
|
||||||
#define CBMEM_ID_WIFI_CALIBRATION 0x57494649
|
#define CBMEM_ID_WIFI_CALIBRATION 0x57494649
|
||||||
|
#define CBMEM_ID_TCPA_LOG 0x54435041
|
||||||
|
|
||||||
#ifndef __ASSEMBLER__
|
#ifndef __ASSEMBLER__
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
Loading…
Reference in New Issue