x86/acpi: Add BERT table

Create a structure for the Boot Error Record Table, and a generic
table generator function.

BUG=b:65446699
TEST=inspect BERT region, and dmesg, on full patch stack.  Use test
     data plus a failing Grunt system.

Change-Id: Ibeef4347678598f9f967797202a4ae6b25ee5538
Signed-off-by: Marshall Dawson <marshalldawson3rd@gmail.com>
Reviewed-on: https://review.coreboot.org/28472
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Martin Roth <martinroth@google.com>
This commit is contained in:
Marshall Dawson 2018-09-04 13:45:26 -06:00 committed by Martin Roth
parent 44705c6e5e
commit 1d8d369dad
2 changed files with 29 additions and 0 deletions

View File

@ -958,6 +958,27 @@ void acpi_write_hest(acpi_hest_t *hest,
header->checksum = acpi_checksum((void *)hest, header->length); header->checksum = acpi_checksum((void *)hest, header->length);
} }
/* ACPI 3.0b */
void acpi_write_bert(acpi_bert_t *bert, uintptr_t region, size_t length)
{
acpi_header_t *header = &(bert->header);
memset(bert, 0, sizeof(acpi_bert_t));
memcpy(header->signature, "BERT", 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_bert_t);
header->revision = get_acpi_table_revision(BERT);
bert->error_region = region;
bert->region_length = length;
/* Calculate checksums. */
header->checksum = acpi_checksum((void *)bert, header->length);
}
#if IS_ENABLED(CONFIG_COMMON_FADT) #if IS_ENABLED(CONFIG_COMMON_FADT)
void acpi_create_fadt(acpi_fadt_t *fadt, acpi_facs_t *facs, void *dsdt) void acpi_create_fadt(acpi_fadt_t *fadt, acpi_facs_t *facs, void *dsdt)
{ {

View File

@ -644,6 +644,13 @@ typedef struct acpi_hest_hen {
u32 error_threshold_win; u32 error_threshold_win;
} __packed acpi_hest_hen_t; } __packed acpi_hest_hen_t;
/* BERT (Boot Error Record Table) */
typedef struct acpi_bert {
struct acpi_table_header header;
u32 region_length;
u64 error_region;
} __packed acpi_bert_t;
/* Generic Error Data Entry (ACPI spec v6.2-A, table 382) */ /* Generic Error Data Entry (ACPI spec v6.2-A, table 382) */
typedef struct acpi_hest_generic_data { typedef struct acpi_hest_generic_data {
guid_t section_type; guid_t section_type;
@ -751,6 +758,7 @@ unsigned long acpi_fill_madt(unsigned long current);
unsigned long acpi_fill_mcfg(unsigned long current); unsigned long acpi_fill_mcfg(unsigned long current);
unsigned long acpi_fill_ivrs_ioapic(acpi_ivrs_t *ivrs, unsigned long current); unsigned long acpi_fill_ivrs_ioapic(acpi_ivrs_t *ivrs, unsigned long current);
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);
void acpi_write_bert(acpi_bert_t *bert, uintptr_t region, size_t length);
void acpi_create_fadt(acpi_fadt_t *fadt, acpi_facs_t *facs, void *dsdt); void acpi_create_fadt(acpi_fadt_t *fadt, acpi_facs_t *facs, void *dsdt);
#if IS_ENABLED(CONFIG_COMMON_FADT) #if IS_ENABLED(CONFIG_COMMON_FADT)
void acpi_fill_fadt(acpi_fadt_t *fadt); void acpi_fill_fadt(acpi_fadt_t *fadt);