acpi: Add support for reporting CrashLog in BERT table

Crash Data are collected and sent to the OS via the ACPI BERT.

BUG=None
TEST=Built, and BERT successfully generated in the crashLog flow.

Signed-off-by: Francois Toguo <francois.toguo.fotso@intel.com>
Change-Id: I00e390d735d61beac2e89a726e39119d9b06b3df
Signed-off-by: Nikunj A. Dadhania <nikunj.dadhania@intel.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/49799
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
diff --git a/src/acpi/acpi.c b/src/acpi/acpi.c
index 05ada08..fc13689 100644
--- a/src/acpi/acpi.c
+++ b/src/acpi/acpi.c
@@ -1331,6 +1331,14 @@
 	return lpi_desc->header.length;
 }
 
+/* BERT helpers */
+bool __weak acpi_is_boot_error_src_present(void)
+{
+	return false;
+}
+
+__weak void acpi_soc_fill_bert(acpi_bert_t *bert, void **region, size_t *length) {}
+
 unsigned long __weak fw_cfg_acpi_tables(unsigned long start)
 {
 	return 0;
@@ -1352,6 +1360,7 @@
 	acpi_tpm2_t *tpm2;
 	acpi_madt_t *madt;
 	acpi_lpit_t *lpit;
+	acpi_bert_t *bert;
 	struct device *dev;
 	unsigned long fw;
 	size_t slic_size, dsdt_size;
@@ -1573,6 +1582,20 @@
 
 	current = acpi_align_current(current);
 
+	if (acpi_is_boot_error_src_present()) {
+		void *region;
+		size_t size;
+		printk(BIOS_DEBUG, "ACPI:    * BERT\n");
+		bert = (acpi_bert_t *) current;
+		acpi_soc_fill_bert(bert, &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);
+		}
+		current = acpi_align_current(current);
+	}
+
 	printk(BIOS_DEBUG, "current = %lx\n", current);
 
 	for (dev = all_devices; dev; dev = dev->next) {