summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/elog.h10
-rw-r--r--src/soc/intel/common/mrc_cache.c19
2 files changed, 29 insertions, 0 deletions
diff --git a/src/include/elog.h b/src/include/elog.h
index bdbafc2b19..7fdcda71a7 100644
--- a/src/include/elog.h
+++ b/src/include/elog.h
@@ -149,6 +149,16 @@ struct elog_event_data_me_extended {
#define ELOG_TYPE_WAKE 0xa8
#define ELOG_TYPE_FW_WAKE 0xa9
+/* Memory Cache Update */
+#define ELOG_TYPE_MEM_CACHE_UPDATE 0xaa
+#define ELOG_MEM_CACHE_UPDATE_SLOT_NORMAL 0
+#define ELOG_MEM_CACHE_UPDATE_STATUS_SUCCESS 0
+#define ELOG_MEM_CACHE_UPDATE_STATUS_FAIL 1
+struct elog_event_mem_cache_update {
+ u8 slot;
+ u8 status;
+} __attribute__ ((packed));
+
#if CONFIG_ELOG
/* Eventlog backing storage must be initialized before calling elog_init(). */
extern int elog_init(void);
diff --git a/src/soc/intel/common/mrc_cache.c b/src/soc/intel/common/mrc_cache.c
index c123da9dc7..bef3ba204c 100644
--- a/src/soc/intel/common/mrc_cache.c
+++ b/src/soc/intel/common/mrc_cache.c
@@ -17,6 +17,7 @@
#include <bootstate.h>
#include <console/console.h>
#include <cbmem.h>
+#include <elog.h>
#include <fmap.h>
#include <ip_checksum.h>
#include <vboot/vboot_common.h>
@@ -281,6 +282,18 @@ static int protect_mrc_cache(const struct mrc_data_region *region)
return 0;
}
+static void log_event_cache_update(uint8_t slot, uint8_t status)
+{
+ const int type = ELOG_TYPE_MEM_CACHE_UPDATE;
+ struct elog_event_mem_cache_update event = {
+ .slot = slot,
+ .status = status,
+ };
+
+ if (elog_add_event_raw(type, &event, sizeof(event)) < 0)
+ printk(BIOS_ERR, "Failed to log mem cache update event.\n");
+}
+
static void update_mrc_cache(void *unused)
{
const struct mrc_saved_data *current_boot;
@@ -336,7 +349,13 @@ static void update_mrc_cache(void *unused)
current_boot->size + sizeof(*current_boot))) {
printk(BIOS_DEBUG, "Failure writing MRC cache to %p.\n",
next_slot);
+ log_event_cache_update(ELOG_MEM_CACHE_UPDATE_SLOT_NORMAL,
+ ELOG_MEM_CACHE_UPDATE_STATUS_FAIL);
+ } else {
+ log_event_cache_update(ELOG_MEM_CACHE_UPDATE_SLOT_NORMAL,
+ ELOG_MEM_CACHE_UPDATE_STATUS_SUCCESS);
}
+
protect_mrc_cache(&region);
}