summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFelix Held <felix-coreboot@felixheld.de>2021-05-28 16:11:43 +0200
committerFelix Held <felix-coreboot@felixheld.de>2021-06-08 18:22:01 +0000
commitfba479267b0294f3d6cf43bf751ffd3dc300cf25 (patch)
treedb3f73ad63514b14fff7af255edc26570b3dcf91 /src
parent24b1c54226d5a676547c5b0203dd5787fa5a1143 (diff)
acpi: rework BERT ACPI table generation logic
Check if the ACPI_BERT Kconfig option is selected and only then try to generate the BERT table. Also remove the acpi_is_boot_error_src_present weak function from the ACPI global compilation unit and use the return value of acpi_soc_get_bert_region to determine if there is a valid BERT region with logged errors. Signed-off-by: Felix Held <felix-coreboot@felixheld.de> Change-Id: I2a281f5f636010ba3b2e7e097e9cf53683022aea Reviewed-on: https://review.coreboot.org/c/coreboot/+/55054 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org> Reviewed-by: Marshall Dawson <marshalldawson3rd@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/acpi/acpi.c22
-rw-r--r--src/include/acpi/acpi.h1
-rw-r--r--src/soc/intel/common/block/acpi/acpi_bert.c44
3 files changed, 32 insertions, 35 deletions
diff --git a/src/acpi/acpi.c b/src/acpi/acpi.c
index 2326169928..d7d7d3de24 100644
--- a/src/acpi/acpi.c
+++ b/src/acpi/acpi.c
@@ -1560,11 +1560,6 @@ unsigned long acpi_create_lpi_desc_ncst(acpi_lpi_desc_ncst_t *lpi_desc, uint16_t
}
/* BERT helpers */
-bool __weak acpi_is_boot_error_src_present(void)
-{
- return false;
-}
-
__weak enum cb_err acpi_soc_get_bert_region(void **region, size_t *length)
{
return CB_ERR;
@@ -1813,18 +1808,19 @@ unsigned long write_acpi_tables(unsigned long start)
current = acpi_align_current(current);
- if (acpi_is_boot_error_src_present()) {
+ if (CONFIG(ACPI_BERT)) {
void *region;
size_t size;
- printk(BIOS_DEBUG, "ACPI: * BERT\n");
bert = (acpi_bert_t *) current;
- acpi_soc_get_bert_region(&region, &size);
- acpi_write_bert(bert, (uintptr_t)region, size);
- if (bert->header.length >= sizeof(acpi_bert_t)) {
- current += bert->header.length;
- acpi_add_table(rsdp, bert);
+ if (acpi_soc_get_bert_region(&region, &size) == CB_SUCCESS) {
+ printk(BIOS_DEBUG, "ACPI: * BERT\n");
+ acpi_write_bert(bert, (uintptr_t)region, size);
+ if (bert->header.length >= sizeof(acpi_bert_t)) {
+ current += bert->header.length;
+ acpi_add_table(rsdp, bert);
+ }
+ current = acpi_align_current(current);
}
- current = acpi_align_current(current);
}
printk(BIOS_DEBUG, "current = %lx\n", current);
diff --git a/src/include/acpi/acpi.h b/src/include/acpi/acpi.h
index 7b0a7757bf..b1eb664db2 100644
--- a/src/include/acpi/acpi.h
+++ b/src/include/acpi/acpi.h
@@ -1341,7 +1341,6 @@ void acpi_create_lpit(acpi_lpit_t *lpit);
unsigned long acpi_create_lpi_desc_ncst(acpi_lpi_desc_ncst_t *lpi_desc, uint16_t uid);
/* For crashlog. */
-bool acpi_is_boot_error_src_present(void);
enum cb_err acpi_soc_get_bert_region(void **region, size_t *length);
/* For ACPI S3 support. */
diff --git a/src/soc/intel/common/block/acpi/acpi_bert.c b/src/soc/intel/common/block/acpi/acpi_bert.c
index 168f3294b6..d35c6c01aa 100644
--- a/src/soc/intel/common/block/acpi/acpi_bert.c
+++ b/src/soc/intel/common/block/acpi/acpi_bert.c
@@ -7,6 +7,25 @@
#include <intelblocks/acpi.h>
#include <intelblocks/crashlog.h>
+static bool boot_error_src_present(void)
+{
+ if (!CONFIG(SOC_INTEL_CRASHLOG)) {
+ printk(BIOS_DEBUG, "Crashlog disabled.\n");
+ return false;
+ }
+
+ if (!discover_crashlog()) {
+ printk(BIOS_SPEW, "Crashlog discovery result: crashlog not found\n");
+ return false;
+ }
+
+ collect_pmc_and_cpu_crashlog_from_srams();
+
+ /* Discovery tables sizes can be larger than the actual valid collected data */
+ u32 crashlog_size = cl_get_total_data_size();
+
+ return (crashlog_size > 0);
+}
enum cb_err acpi_soc_get_bert_region(void **region, size_t *length)
{
@@ -14,6 +33,10 @@ enum cb_err acpi_soc_get_bert_region(void **region, size_t *length)
size_t cpu_record_size, pmc_record_size;
void *cl_data = NULL;
+ if (!boot_error_src_present()) {
+ return CB_ERR;
+ }
+
if (!cl_get_total_data_size()) {
printk(BIOS_ERR, "Error: No crashlog record present\n");
return CB_ERR;
@@ -71,24 +94,3 @@ enum cb_err acpi_soc_get_bert_region(void **region, size_t *length)
return CB_SUCCESS;
}
-
-bool acpi_is_boot_error_src_present(void)
-{
-
- if (!CONFIG(SOC_INTEL_CRASHLOG)) {
- printk(BIOS_DEBUG, "Crashlog disabled.\n");
- return false;
- }
-
- if (!discover_crashlog()) {
- printk(BIOS_SPEW, "Crashlog discovery result: crashlog not found\n");
- return false;
- }
-
- collect_pmc_and_cpu_crashlog_from_srams();
-
- /* Discovery tables sizes can be larger than the actual valid collected data */
- u32 crashlog_size = cl_get_total_data_size();
-
- return (crashlog_size > 0);
-}