MMA : changing BOOT_STUB to COREBOOT region and few more things

(1) Added following new function.

cbfs_locate_file_in_region - to locate (and mmap) a file in a flash region
	This function is used to look for MMA blobs in "COREBOOT" cbfs region

(2) mma_setup_test.sh would write to "COREBOOT" region.

(3) changes in mma_automated_test.sh. Few MMA tests need system to be COLD
rebooted before test can start. mma_automated_test.sh would do COLD reboot
after each test, and so i would sync the filesystem before doing COLD reboot.

BRANCH=none
BUG=chrome-os-partner:43731
TEST=Build and Boot kunimitsu (FAB4). Able to locate MMA files in CBFS
Not tested on Glados.

Change-Id: I402f84f5c46720710704dfd32b9319c73c412e47
Signed-off-by: Pratik Prajapati <pratikkumar.v.prajapati@intel.com>
Reviewed-on: https://chromium-review.googlesource.com/328846
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
diff --git a/src/soc/intel/common/mma.c b/src/soc/intel/common/mma.c
index 3ac47e8..06aff31 100644
--- a/src/soc/intel/common/mma.c
+++ b/src/soc/intel/common/mma.c
@@ -26,10 +26,12 @@
 #include "mma.h"
 #include <soc/romstage.h>
 #include <string.h>
+#include <fmap.h>
 
 #define MMA_TEST_METADATA_FILENAME      "mma_test_metadata.bin"
 #define MMA_TEST_NAME_TAG               "MMA_TEST_NAME"
 #define MMA_TEST_PARAM_TAG              "MMA_TEST_PARAM"
+#define MMA_CBFS_REGION			"COREBOOT"
 #define TEST_NAME_MAX_SIZE              30
 #define TEST_PARAM_MAX_SIZE             100
 #define FSP_MMA_RESULTS_GUID            { 0x8f4e928, 0xf5f, 0x46d4, \
@@ -116,6 +118,30 @@
 	return 0;
 }
 
+static void *cbfs_locate_file_in_region(const char *region_name, const char *file_name,
+        uint32_t file_type, uint32_t *file_size)
+{
+        struct region_device rdev;
+        struct cbfsf fh;
+
+        if (file_size != NULL)
+                *file_size = 0;
+
+        if (fmap_locate_area_as_rdev(region_name, &rdev) == 0) {
+                if (cbfs_locate(&fh, &rdev, file_name, &file_type) == 0) {
+                        if (file_size != NULL)
+                                *file_size = region_device_sz(&fh.data);
+                        return rdev_mmap_full(&fh.data);
+                } else
+                        printk(BIOS_DEBUG, "%s file not found in %s region\n",
+                                file_name, region_name);
+        } else
+                printk(BIOS_DEBUG,"%s region not found while looking for %s\n", region_name,
+                        file_name);
+
+        return NULL;
+}
+
 void setup_mma(MEMORY_INIT_UPD *memory_params)
 {
 	void *mma_test_metadata, *mma_test_content, *mma_test_param;
@@ -131,8 +157,9 @@
 	memory_params->MmaTestConfigPtr = 0;
 	memory_params->MmaTestConfigSize = 0;
 
-	mma_test_metadata = cbfs_boot_map_with_leak(MMA_TEST_METADATA_FILENAME,
-			CBFS_TYPE_MMA , &mma_test_metadata_file_len);
+	mma_test_metadata = cbfs_locate_file_in_region(MMA_CBFS_REGION,
+				MMA_TEST_METADATA_FILENAME, CBFS_TYPE_MMA,
+				&mma_test_metadata_file_len);
 
 	if (!mma_test_metadata) {
 		printk(BIOS_DEBUG, "MMA setup failed: Failed to read %s\n",
@@ -158,16 +185,18 @@
 	printk(BIOS_DEBUG, "Got MMA_TEST_NAME=%s MMA_TEST_PARAM=%s\n",
 			test_filename, test_param_filename);
 
-	mma_test_content = cbfs_boot_map_with_leak(test_filename,
-				CBFS_TYPE_EFI , &mma_test_content_file_len);
+	mma_test_content = cbfs_locate_file_in_region(MMA_CBFS_REGION,
+				test_filename, CBFS_TYPE_EFI,
+				&mma_test_content_file_len);
 	if (!mma_test_content) {
 		printk(BIOS_DEBUG, "MMA setup failed: Failed to read %s.\n",
 		test_filename);
 		return;
 	}
 
-	mma_test_param = cbfs_boot_map_with_leak(test_param_filename,
-				CBFS_TYPE_MMA , &mma_test_param_file_len);
+	mma_test_param = cbfs_locate_file_in_region(MMA_CBFS_REGION,
+				test_param_filename, CBFS_TYPE_MMA,
+				&mma_test_param_file_len);
 	if (!mma_test_param) {
 		printk(BIOS_DEBUG, "MMA setup failed: Failed to read %s.\n",
 				test_param_filename);
diff --git a/util/mma/mma_automated_test.sh b/util/mma/mma_automated_test.sh
index edca4f1..08e2bc2 100755
--- a/util/mma/mma_automated_test.sh
+++ b/util/mma/mma_automated_test.sh
@@ -68,6 +68,10 @@
 }
 
 main() {
+	# sleep 30 sec, before we start. This would give some time if we want
+	# to stop automation.
+	sleep 30s
+	mkdir -p "${MMA_LOCAL_DATA_STORAGE}"
 	# Exit is there are no tests
 	[ -e "${MMA_AUTOMATED_TEST_CONFIG}" ] || exit 0
 
@@ -91,7 +95,15 @@
 	get_mma_autotest_params
 	${MMA_SETUP_TEST_TOOL} set ${MMA_TEST_NAME} ${MMA_TEST_PARAM}
 
-	reboot
+	# sync the filesystem, hoping this would minimize
+	# the chances of fs corruption
+	sync
+	sleep 2s
+	sync
+	sleep 2s
+	sync
+	sleep 2s
+	ectool reboot_ec
 }
 
 main "$@"
diff --git a/util/mma/mma_setup_test.sh b/util/mma/mma_setup_test.sh
index d96b793..7742aa9 100755
--- a/util/mma/mma_setup_test.sh
+++ b/util/mma/mma_setup_test.sh
@@ -94,7 +94,7 @@
 
 write_flash() {
 	printf "Writing back flash contents "${flashrom_temp_image}"\n"
-	flashrom -p host -w "${flashrom_temp_image}" -i BOOT_STUB --fast-verify || \
+	flashrom -p host -w "${flashrom_temp_image}" --fast-verify || \
 		{
 			printf "failed to read flash\n" ;
 			exit -1;
@@ -184,7 +184,7 @@
 	remove_file_if_exists "${flashrom_temp_image}"
 
 	printf "Reading flash contents to "${flashrom_temp_image}"\n"
-	flashrom -p host -r "${flashrom_temp_image}" -i BOOT_STUB || \
+	flashrom -p host -r "${flashrom_temp_image}" || \
 		{
 			printf "failed to read flash\n" ;
 			exit -1;