summaryrefslogtreecommitdiff
path: root/src/soc/intel/meteorlake/crashlog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc/intel/meteorlake/crashlog.c')
-rw-r--r--src/soc/intel/meteorlake/crashlog.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/soc/intel/meteorlake/crashlog.c b/src/soc/intel/meteorlake/crashlog.c
index 219c7e8256..9d3c5d60e4 100644
--- a/src/soc/intel/meteorlake/crashlog.c
+++ b/src/soc/intel/meteorlake/crashlog.c
@@ -12,6 +12,8 @@
#include <soc/pci_devs.h>
#include <string.h>
+#define CRASHLOG_CONSUMED_MASK BIT(31)
+
/* global crashLog info */
static bool m_pmc_crashLog_support;
static bool m_pmc_crashLog_present;
@@ -364,6 +366,11 @@ static u32 get_disc_table_offset(void)
return offset;
}
+static bool is_crashlog_data_valid(u32 dw0)
+{
+ return (dw0 != 0x0 && dw0 != INVALID_CRASHLOG_RECORD);
+}
+
static bool cpu_cl_gen_discovery_table(void)
{
u32 bar_addr = 0, disc_tab_addr = 0;
@@ -373,6 +380,11 @@ static bool cpu_cl_gen_discovery_table(void)
return false;
disc_tab_addr = bar_addr + get_disc_table_offset();
+
+ u32 dw0 = read32((u32 *)disc_tab_addr);
+ if (!is_crashlog_data_valid(dw0))
+ return false;
+
memset(&cpu_cl_disc_tab, 0, sizeof(cpu_crashlog_discovery_table_t));
cpu_cl_disc_tab.header.data = ((u64)read32((u32 *)disc_tab_addr) +
((u64)read32((u32 *)(disc_tab_addr + 4)) << 32));
@@ -381,7 +393,18 @@ static bool cpu_cl_gen_discovery_table(void)
int cur_offset = 0;
for (int i = 0; i < cpu_cl_disc_tab.header.fields.count; i++) {
- cur_offset = 8 + 24*i;
+ cur_offset = 8 + 24 * i;
+
+ dw0 = read32((u32 *)disc_tab_addr + cur_offset);
+ if (!is_crashlog_data_valid(dw0))
+ continue;
+
+ if (dw0 & CRASHLOG_CONSUMED_MASK) {
+ printk(BIOS_DEBUG, "cpu crashlog records already consumed."
+ "id: 0x%x dw0: 0x%x\n", i, dw0);
+ break;
+ }
+
cpu_cl_disc_tab.buffers[i].data = ((u64)read32((u32 *)(disc_tab_addr +
cur_offset)) + ((u64)read32((u32 *)
(disc_tab_addr + cur_offset + 4)) << 32));