summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/drivers/intel/fsp2_0/Kconfig.debug_blob10
-rw-r--r--src/drivers/intel/fsp2_0/Makefile.inc2
-rw-r--r--src/drivers/intel/fsp2_0/fsp_error_info_hob.c14
-rw-r--r--src/drivers/intel/fsp2_0/hand_off_block.c23
-rw-r--r--src/drivers/intel/fsp2_0/include/fsp/soc_binding.h4
-rw-r--r--src/drivers/intel/fsp2_0/include/fsp/util.h2
6 files changed, 55 insertions, 0 deletions
diff --git a/src/drivers/intel/fsp2_0/Kconfig.debug_blob b/src/drivers/intel/fsp2_0/Kconfig.debug_blob
index e9e6053c64..3436c06e56 100644
--- a/src/drivers/intel/fsp2_0/Kconfig.debug_blob
+++ b/src/drivers/intel/fsp2_0/Kconfig.debug_blob
@@ -45,6 +45,16 @@ config DISPLAY_FSP_VERSION_INFO_2
Select this option to display Firmware version information
using new header 'FirmwareVersionInfo.h'.
+config ENABLE_FSP_ERROR_INFO
+ bool "Enable FSP Error Information"
+ default n
+ depends on PLATFORM_USES_FSP2_1
+ help
+ Select this option to enable FSP Error information. FSP detects certain errors
+ and notifies coreboot of a fatal error occurring during the execution of the FSP.
+ Although it's defined in FSP v2.1 but has only been verified on Intel Xeon-SP
+ Sapphire Rapids.
+
config HAVE_GPIO_SNAPSHOT_VERIFY_SUPPORT
bool
default n
diff --git a/src/drivers/intel/fsp2_0/Makefile.inc b/src/drivers/intel/fsp2_0/Makefile.inc
index f11ebee102..ae82833fc2 100644
--- a/src/drivers/intel/fsp2_0/Makefile.inc
+++ b/src/drivers/intel/fsp2_0/Makefile.inc
@@ -15,6 +15,7 @@ romstage-y += util.c
romstage-y += memory_init.c
romstage-$(CONFIG_MMA) += mma_core.c
romstage-y += cbmem.c
+romstage-$(CONFIG_ENABLE_FSP_ERROR_INFO) += fsp_error_info_hob.c
ramstage-y += debug.c
ramstage-$(CONFIG_FSP_USES_CB_DEBUG_EVENT_HANDLER) += fsp_debug_event.c
@@ -31,6 +32,7 @@ ramstage-$(CONFIG_DISPLAY_UPD_DATA) += upd_display.c
ramstage-y += util.c
ramstage-$(CONFIG_CACHE_MRC_SETTINGS) += save_mrc_data.c
ramstage-$(CONFIG_MMA) += mma_core.c
+ramstage-$(CONFIG_ENABLE_FSP_ERROR_INFO) += fsp_error_info_hob.c
ifneq ($(CONFIG_NO_FSP_TEMP_RAM_EXIT),y)
postcar-$(CONFIG_FSP_CAR) += temp_ram_exit.c
diff --git a/src/drivers/intel/fsp2_0/fsp_error_info_hob.c b/src/drivers/intel/fsp2_0/fsp_error_info_hob.c
new file mode 100644
index 0000000000..9c27ec7246
--- /dev/null
+++ b/src/drivers/intel/fsp2_0/fsp_error_info_hob.c
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#include <console/console.h>
+#include <fsp/util.h>
+
+void display_fsp_error_info_hob(const void *hob)
+{
+ const FSP_ERROR_INFO_HOB *fsp_error_info_hob = (FSP_ERROR_INFO_HOB *)hob;
+ printk(BIOS_ERR, "FspErrorInfoHob->CallerId = ");
+ fsp_print_guid(BIOS_CRIT, &fsp_error_info_hob->CallerId);
+ printk(BIOS_ERR, "\nFspErrorInfoHob->ErrorType = ");
+ fsp_print_guid(BIOS_CRIT, &fsp_error_info_hob->ErrorType);
+ printk(BIOS_ERR, "\nFspErrorInfoHob->Status = %x\n", fsp_error_info_hob->Status);
+}
diff --git a/src/drivers/intel/fsp2_0/hand_off_block.c b/src/drivers/intel/fsp2_0/hand_off_block.c
index aae1ff8fad..f6af894877 100644
--- a/src/drivers/intel/fsp2_0/hand_off_block.c
+++ b/src/drivers/intel/fsp2_0/hand_off_block.c
@@ -32,6 +32,11 @@ const uint8_t fsp_nv_storage_guid[16] = {
0xb3, 0xdc, 0x27, 0x0b, 0x7b, 0xa9, 0xe4, 0xb0
};
+const uint8_t fsp_error_info_guid[16] = {
+ 0x88, 0x6a, 0x1e, 0x61, 0xb7, 0xad, 0x01, 0x43,
+ 0x93, 0xff, 0xe4, 0x73, 0x04, 0xb4, 0x3d, 0xa6
+};
+
static const uint8_t uuid_fv_info[16] = {
0x2e, 0x72, 0x8e, 0x79, 0xb2, 0x15, 0x13, 0x4e,
0x8a, 0xe9, 0x6b, 0xa3, 0x0f, 0xf7, 0xf1, 0x67
@@ -356,3 +361,21 @@ void fsp_find_bootloader_tolum(struct range_entry *re)
if (fsp_find_range_hob(re, fsp_bootloader_tolum_guid))
die("9.3: FSP_BOOTLOADER_TOLUM_HOB missing!\n");
}
+
+bool fsp_display_error_info(void)
+{
+ if (!CONFIG(ENABLE_FSP_ERROR_INFO))
+ return false;
+
+ const struct hob_header *hob;
+ size_t size;
+
+ hob = (const struct hob_header *)fsp_find_extension_hob_by_guid(
+ fsp_error_info_guid, &size);
+ if (hob != NULL) {
+ display_fsp_error_info_hob(hob);
+ return true;
+ }
+
+ return false;
+}
diff --git a/src/drivers/intel/fsp2_0/include/fsp/soc_binding.h b/src/drivers/intel/fsp2_0/include/fsp/soc_binding.h
index 8392a03adc..02cd4e04e5 100644
--- a/src/drivers/intel/fsp2_0/include/fsp/soc_binding.h
+++ b/src/drivers/intel/fsp2_0/include/fsp/soc_binding.h
@@ -33,6 +33,10 @@
#include <FirmwareVersionInfo.h>
#endif
+#if CONFIG(ENABLE_FSP_ERROR_INFO)
+#include <FspErrorInfoHob.h>
+#endif
+
#pragma pack(pop)
#endif
diff --git a/src/drivers/intel/fsp2_0/include/fsp/util.h b/src/drivers/intel/fsp2_0/include/fsp/util.h
index 566fad99f4..5ff5814642 100644
--- a/src/drivers/intel/fsp2_0/include/fsp/util.h
+++ b/src/drivers/intel/fsp2_0/include/fsp/util.h
@@ -137,6 +137,8 @@ const struct hob_resource *fsp_hob_header_to_resource(
const struct hob_header *fsp_next_hob(const struct hob_header *parent);
bool fsp_guid_compare(const uint8_t guid1[16], const uint8_t guid2[16]);
void fsp_find_bootloader_tolum(struct range_entry *re);
+bool fsp_display_error_info(void);
+void display_fsp_error_info_hob(const void *hob);
void fsp_get_version(char *buf);
/* fsp_verify_upd_header_signature calls die() on signature mismatch */
void fsp_verify_upd_header_signature(uint64_t upd_signature, uint64_t expected_signature);