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>
diff --git a/src/acpi/acpi.c b/src/acpi/acpi.c
index 2326169..d7d7d3d 100644
--- a/src/acpi/acpi.c
+++ b/src/acpi/acpi.c
@@ -1560,11 +1560,6 @@
 }
 
 /* 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 @@
 
 	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 7b0a775..b1eb664 100644
--- a/src/include/acpi/acpi.h
+++ b/src/include/acpi/acpi.h
@@ -1341,7 +1341,6 @@
 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 168f329..d35c6c0 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 @@
 	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 @@
 
 	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);
-}