[coreboot-gerrit] Patch set updated for coreboot: soc/intel/common: Add store/restore for variable MRC data

Andrey Petrov (andrey.petrov@intel.com) gerrit at coreboot.org
Fri Nov 11 18:10:51 CET 2016


Andrey Petrov (andrey.petrov at intel.com) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/17320

-gerrit

commit 7688563e5ddad5a6fdfa73dab4ac85c336f664db
Author: Andrey Petrov <andrey.petrov at intel.com>
Date:   Tue Nov 8 08:30:06 2016 -0800

    soc/intel/common: Add store/restore for variable MRC data
    
    Piggy-back on existing MRC cache infrastructure to store variable MRC data.
    
    Only one set of data can be valid at given point of time. Currently this
    magically happens because region alignment is forced to 0x1000 and region
    itself is of the same size. This needs to be somehow programatically
    enforced.
    
    Change-Id: I8a660d356ca760b8ff9907396fb9b34cb16cf1db
    Signed-off-by: Andrey Petrov <andrey.petrov at intel.com>
---
 src/commonlib/include/commonlib/cbmem_id.h |  1 +
 src/soc/intel/common/Kconfig               |  4 ++
 src/soc/intel/common/mrc_cache.c           | 86 ++++++++++++++++++++----------
 src/soc/intel/common/mrc_cache.h           |  3 ++
 4 files changed, 66 insertions(+), 28 deletions(-)

diff --git a/src/commonlib/include/commonlib/cbmem_id.h b/src/commonlib/include/commonlib/cbmem_id.h
index 7d97bff..701f7e3 100644
--- a/src/commonlib/include/commonlib/cbmem_id.h
+++ b/src/commonlib/include/commonlib/cbmem_id.h
@@ -41,6 +41,7 @@
 #define CBMEM_ID_MMA_DATA	0x4D4D4144
 #define CBMEM_ID_MPTABLE	0x534d5054
 #define CBMEM_ID_MRCDATA	0x4d524344
+#define CBMEM_ID_VAR_MRCDATA	0x4d524345
 #define CBMEM_ID_MTC		0xcb31d31c
 #define CBMEM_ID_NONE		0x00000000
 #define CBMEM_ID_PIRQ		0x49525154
diff --git a/src/soc/intel/common/Kconfig b/src/soc/intel/common/Kconfig
index 5d8bf66..735d23a 100644
--- a/src/soc/intel/common/Kconfig
+++ b/src/soc/intel/common/Kconfig
@@ -31,6 +31,10 @@ config HAS_RECOVERY_MRC_CACHE
 	bool
 	default n
 
+config MRC_SETTINGS_VARIABLE_DATA
+	bool
+	default n
+
 endif # CACHE_MRC_SETTINGS
 
 config DISPLAY_MTRRS
diff --git a/src/soc/intel/common/mrc_cache.c b/src/soc/intel/common/mrc_cache.c
index 7b66043..4ed6e03 100644
--- a/src/soc/intel/common/mrc_cache.c
+++ b/src/soc/intel/common/mrc_cache.c
@@ -235,6 +235,16 @@ int mrc_cache_get_current(const struct mrc_saved_data **cache)
 	return mrc_cache_get_current_with_version(cache, 0);
 }
 
+int mrc_cache_get_vardata(const struct mrc_saved_data **cache)
+{
+	struct mrc_data_region region;
+
+	if (mrc_cache_get_region(VARIABLE_MRC_CACHE, &region) < 0)
+		return -1;
+
+	return __mrc_cache_get_current(&region, cache, 0);
+}
+
 /* Fill in mrc_saved_data structure with payload. */
 static void mrc_cache_fill(struct mrc_saved_data *cache, const void *data,
                            size_t size, uint32_t version)
@@ -247,15 +257,15 @@ static void mrc_cache_fill(struct mrc_saved_data *cache, const void *data,
 	                                      cache->size);
 }
 
-int mrc_cache_stash_data_with_version(const void *data, size_t size,
-					uint32_t version)
+static int _mrc_stash_data(const void *data, size_t size, uint32_t version,
+			    uint32_t cbmem_id)
 {
 	int cbmem_size;
 	struct mrc_saved_data *cache;
 
 	cbmem_size = sizeof(*cache) + ALIGN(size, 16);
 
-	cache = cbmem_add(CBMEM_ID_MRCDATA, cbmem_size);
+	cache = cbmem_add(cbmem_id, cbmem_size);
 
 	if (cache == NULL) {
 		printk(BIOS_ERR, "MRC: No space in cbmem for training data.\n");
@@ -273,6 +283,18 @@ int mrc_cache_stash_data_with_version(const void *data, size_t size,
 	return 0;
 }
 
+int mrc_cache_stash_data_with_version(const void *data, size_t size,
+					uint32_t version)
+{
+	return _mrc_stash_data(data, size, version, CBMEM_ID_MRCDATA);
+}
+
+int mrc_cache_stash_vardata(const void *data, size_t size)
+{
+	return _mrc_stash_data(data, size, 0, CBMEM_ID_VAR_MRCDATA);
+}
+
+
 int mrc_cache_stash_data(const void *data, size_t size)
 {
 	return mrc_cache_stash_data_with_version(data, size, 0);
@@ -336,39 +358,31 @@ static void log_event_cache_update(uint8_t slot, uint8_t status)
 		printk(BIOS_ERR, "Failed to log mem cache update event.\n");
 }
 
-static void update_mrc_region(void)
+static int update_mrc_cache_type(uint32_t cbmem_id, const char *region_name)
 {
 	const struct mrc_saved_data *current_boot;
 	const struct mrc_saved_data *current_saved;
 	const struct mrc_saved_data *next_slot;
 	struct mrc_data_region region;
-	const char *region_name = DEFAULT_MRC_CACHE;
-	uint8_t slot = ELOG_MEM_CACHE_UPDATE_SLOT_NORMAL;
 
 	printk(BIOS_DEBUG, "MRC: Updating cache data.\n");
 
-	if (vboot_recovery_mode_enabled() &&
-	    IS_ENABLED(CONFIG_HAS_RECOVERY_MRC_CACHE)) {
-		region_name = RECOVERY_MRC_CACHE;
-		slot = ELOG_MEM_CACHE_UPDATE_SLOT_RECOVERY;
-	}
-
 	printk(BIOS_ERR, "MRC: Cache region selected - %s\n", region_name);
 
 	if (mrc_cache_get_region(region_name, &region)) {
 		printk(BIOS_ERR, "MRC: Could not obtain cache region.\n");
-		return;
+		return -1;
 	}
 
-	current_boot = cbmem_find(CBMEM_ID_MRCDATA);
+	current_boot = cbmem_find(cbmem_id);
 	if (!current_boot) {
 		printk(BIOS_ERR, "MRC: No cache in cbmem.\n");
-		return;
+		return -1;
 	}
 
 	if (!mrc_cache_valid(&region, current_boot)) {
 		printk(BIOS_ERR, "MRC: Cache data in cbmem invalid.\n");
-		return;
+		return -1;
 	}
 
 	current_saved = NULL;
@@ -379,7 +393,7 @@ static void update_mrc_region(void)
 		    !memcmp(&current_saved->data[0], &current_boot->data[0],
 		            current_saved->size)) {
 			printk(BIOS_DEBUG, "MRC: Cache up to date.\n");
-			return;
+			return -1;
 		}
 	}
 
@@ -391,21 +405,14 @@ static void update_mrc_region(void)
 			if (nvm_erase(region.base, region.size) < 0) {
 				printk(BIOS_DEBUG, "MRC: Failure erasing "
 				       "region %s.\n", region_name);
-				return;
+				return -1;
 			}
 		}
 		next_slot = region.base;
 	}
 
-	if (nvm_write((void *)next_slot, current_boot,
-	               current_boot->size + sizeof(*current_boot))) {
-		printk(BIOS_DEBUG, "MRC: Failure writing MRC cache to %s:%p\n",
-		       region_name, next_slot);
-		log_event_cache_update(slot, ELOG_MEM_CACHE_UPDATE_STATUS_FAIL);
-	} else {
-		log_event_cache_update(slot,
-				       ELOG_MEM_CACHE_UPDATE_STATUS_SUCCESS);
-	}
+	return nvm_write((void *)next_slot, current_boot, current_boot->size +
+			    sizeof(*current_boot));
 }
 
 static void protect_mrc_region(void)
@@ -429,7 +436,30 @@ static void protect_mrc_region(void)
 
 static void update_mrc_cache(void *unused)
 {
-	update_mrc_region();
+	uint8_t slot;
+	const char *region_name;
+	uint32_t elog_res;
+
+	if (vboot_recovery_mode_enabled() &&
+	    IS_ENABLED(CONFIG_HAS_RECOVERY_MRC_CACHE)) {
+		region_name = RECOVERY_MRC_CACHE;
+		slot = ELOG_MEM_CACHE_UPDATE_SLOT_RECOVERY;
+	} else {
+		region_name = DEFAULT_MRC_CACHE;
+		slot = ELOG_MEM_CACHE_UPDATE_SLOT_NORMAL;
+	}
+
+	if (update_mrc_cache_type(CBMEM_ID_MRCDATA, region_name)) {
+		printk(BIOS_DEBUG, "MRC: Failure writing MRC cache to %s\n", region_name);
+		elog_res = ELOG_MEM_CACHE_UPDATE_STATUS_FAIL;
+	} else
+		elog_res = ELOG_MEM_CACHE_UPDATE_STATUS_SUCCESS;
+
+	log_event_cache_update(slot, elog_res);
+
+	if (IS_ENABLED(CONFIG_MRC_SETTINGS_VARIABLE_DATA))
+		update_mrc_cache_type(CBMEM_ID_VAR_MRCDATA, VARIABLE_MRC_CACHE);
+
 	protect_mrc_region();
 }
 
diff --git a/src/soc/intel/common/mrc_cache.h b/src/soc/intel/common/mrc_cache.h
index 850acd6..b67e593 100644
--- a/src/soc/intel/common/mrc_cache.h
+++ b/src/soc/intel/common/mrc_cache.h
@@ -20,6 +20,7 @@
 #include <stdint.h>
 
 #define DEFAULT_MRC_CACHE	"RW_MRC_CACHE"
+#define VARIABLE_MRC_CACHE	"RW_VAR_MRC_CACHE"
 #define RECOVERY_MRC_CACHE	"RECOVERY_MRC_CACHE"
 #define UNIFIED_MRC_CACHE	"UNIFIED_MRC_CACHE"
 
@@ -36,6 +37,7 @@ struct mrc_saved_data {
 int mrc_cache_get_current(const struct mrc_saved_data **cache);
 int mrc_cache_get_current_with_version(const struct mrc_saved_data **cache,
 					uint32_t version);
+int mrc_cache_get_vardata(const struct mrc_saved_data **cache);
 int mrc_cache_get_current_from_region(const struct mrc_saved_data **cache,
 				      uint32_t version,
 				      const char *region_name);
@@ -44,5 +46,6 @@ int mrc_cache_get_current_from_region(const struct mrc_saved_data **cache,
 int mrc_cache_stash_data(const void *data, size_t size);
 int mrc_cache_stash_data_with_version(const void *data, size_t size,
 					uint32_t version);
+int mrc_cache_stash_vardata(const void *data, size_t size);
 
 #endif /* _COMMON_MRC_CACHE_H_ */



More information about the coreboot-gerrit mailing list