Add image_id to bl1_plat_handle_post/pre_image_load()

This patch adds an argument to bl1_plat_post/pre_image_load() APIs
to make it more future proof. The default implementation of
these are moved to `plat_bl1_common.c` file.

These APIs are now invoked appropriately in the FWU code path prior
to or post image loading by BL1 and are not restricted
to LOAD_IMAGE_V2.

The patch also reorganizes some common platform files. The previous
`plat_bl2_el3_common.c` and `platform_helpers_default.c` files are
merged into a new `plat_bl_common.c` file.

NOTE: The addition of an argument to the above mentioned platform APIs
is not expected to have a great impact because these APIs were only
recently added and are unlikely to be used.

Change-Id: I0519caaee0f774dd33638ff63a2e597ea178c453
Signed-off-by: Soby Mathew <soby.mathew@arm.com>
diff --git a/Makefile b/Makefile
index 83b8808..06422ea 100644
--- a/Makefile
+++ b/Makefile
@@ -192,8 +192,8 @@
 				common/${ARCH}/debug.S			\
 				lib/${ARCH}/cache_helpers.S		\
 				lib/${ARCH}/misc_helpers.S		\
+				plat/common/plat_bl_common.c		\
 				plat/common/plat_log_common.c		\
-				plat/common/platform_helpers_default.c	\
 				plat/common/${ARCH}/plat_common.c	\
 				plat/common/${ARCH}/platform_helpers.S	\
 				${COMPILER_RT_SRCS}			\
diff --git a/bl1/bl1_fwu.c b/bl1/bl1_fwu.c
index 07a7fc8..3878083 100644
--- a/bl1/bl1_fwu.c
+++ b/bl1/bl1_fwu.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -350,6 +350,15 @@
 		return -ENOMEM;
 	}
 
+	/* Allow the platform to handle pre-image load before copying */
+	if (image_desc->state == IMAGE_STATE_RESET) {
+		if (bl1_plat_handle_pre_image_load(image_id) != 0) {
+			ERROR("BL1-FWU: Failure in pre-image load of image id %d\n",
+					image_id);
+			return -EPERM;
+		}
+	}
+
 	/* Everything looks sane. Go ahead and copy the block of data. */
 	dest_addr = image_desc->image_info.image_base + image_desc->copied_size;
 	memcpy((void *) dest_addr, (const void *) image_src, block_size);
@@ -474,6 +483,18 @@
 	/* Indicate that image is in authenticated state. */
 	image_desc->state = IMAGE_STATE_AUTHENTICATED;
 
+	/* Allow the platform to handle post-image load */
+	result = bl1_plat_handle_post_image_load(image_id);
+	if (result != 0) {
+		ERROR("BL1-FWU: Failure %d in post-image load of image id %d\n",
+				result, image_id);
+		/*
+		 * Panic here as the platform handling of post-image load is
+		 * not correct.
+		 */
+		plat_error_handler(result);
+	}
+
 	/*
 	 * Flush image_info to memory so that other
 	 * secure world images can see changes.
diff --git a/bl1/bl1_main.c b/bl1/bl1_main.c
index 91b5f0b..fe09070 100644
--- a/bl1/bl1_main.c
+++ b/bl1/bl1_main.c
@@ -177,13 +177,13 @@
 
 	INFO("BL1: Loading BL2\n");
 
-#if LOAD_IMAGE_V2
-	err = bl1_plat_handle_pre_image_load();
+	err = bl1_plat_handle_pre_image_load(BL2_IMAGE_ID);
 	if (err) {
 		ERROR("Failure in pre image load handling of BL2 (%d)\n", err);
 		plat_error_handler(err);
 	}
 
+#if LOAD_IMAGE_V2
 	err = load_auth_image(BL2_IMAGE_ID, image_info);
 #else
 	/* Load the BL2 image */
@@ -200,14 +200,14 @@
 		plat_error_handler(err);
 	}
 
-#if LOAD_IMAGE_V2
 	/* Allow platform to handle image information. */
-	err = bl1_plat_handle_post_image_load();
+	err = bl1_plat_handle_post_image_load(BL2_IMAGE_ID);
 	if (err) {
 		ERROR("Failure in post image load handling of BL2 (%d)\n", err);
 		plat_error_handler(err);
 	}
 
+#if LOAD_IMAGE_V2
 	/*
 	 * Create a new layout of memory for BL2 as seen by BL1 i.e.
 	 * tell it the amount of total and free memory available.
diff --git a/bl2/bl2.mk b/bl2/bl2.mk
index 9d75286..a856fb7 100644
--- a/bl2/bl2.mk
+++ b/bl2/bl2.mk
@@ -29,7 +29,6 @@
 else
 BL2_SOURCES		+=	bl2/${ARCH}/bl2_el3_entrypoint.S	\
 				bl2/${ARCH}/bl2_el3_exceptions.S	\
-				plat/common/plat_bl2_el3_common.c	\
 				lib/cpus/${ARCH}/cpu_helpers.S		\
 				lib/cpus/errata_report.c
 BL2_LINKERFILE		:=	bl2/bl2_el3.ld.S
diff --git a/docs/porting-guide.rst b/docs/porting-guide.rst
index de05e03..71c7a93 100644
--- a/docs/porting-guide.rst
+++ b/docs/porting-guide.rst
@@ -1264,24 +1264,24 @@
 
 ::
 
-    Argument : void
+    Argument : unsigned int image_id
     Return   : int
 
 This function can be used by the platforms to update/use image information
-for BL2. This function is currently invoked in BL1 before loading BL2,
-when LOAD\_IMAGE\_V2 is enabled.
+corresponding to ``image_id``. This function is invoked in BL1, both in cold
+boot and FWU code path, before loading the image.
 
 Function : bl1\_plat\_handle\_post\_image\_load() [optional]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 ::
 
-    Argument : void
+    Argument : unsigned int image_id
     Return   : int
 
 This function can be used by the platforms to update/use image information
-for BL2. This function is currently invoked in BL1 after loading BL2,
-when LOAD\_IMAGE\_V2 is enabled.
+corresponding to ``image_id``. This function is invoked in BL1, both in cold
+boot and FWU code path, after loading and authenticating the image.
 
 Function : bl1\_plat\_fwu\_done() [optional]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/include/plat/common/platform.h b/include/plat/common/platform.h
index e2f1cfd..5c06725 100644
--- a/include/plat/common/platform.h
+++ b/include/plat/common/platform.h
@@ -155,15 +155,12 @@
  */
 __dead2 void bl1_plat_fwu_done(void *client_cookie, void *reserved);
 
-#if LOAD_IMAGE_V2
 /*
- * This function can be used by the platforms to update/use image
- * information for BL2.
+ * This BL1 function can be used by the platforms to update/use image
+ * information for a given `image_id`.
  */
-int bl1_plat_handle_pre_image_load(void);
-int bl1_plat_handle_post_image_load(void);
-
-#endif /* LOAD_IMAGE_V2 */
+int bl1_plat_handle_pre_image_load(unsigned int image_id);
+int bl1_plat_handle_post_image_load(unsigned int image_id);
 
 /*******************************************************************************
  * Mandatory BL2 functions
diff --git a/plat/common/plat_bl1_common.c b/plat/common/plat_bl1_common.c
index b92cf54..cee34ae 100644
--- a/plat/common/plat_bl1_common.c
+++ b/plat/common/plat_bl1_common.c
@@ -9,6 +9,7 @@
 #include <bl_common.h>
 #include <debug.h>
 #include <errno.h>
+#include <platform.h>
 #include <platform_def.h>
 
 /*
@@ -21,6 +22,8 @@
 #pragma weak bl1_plat_set_ep_info
 #pragma weak bl1_plat_get_image_desc
 #pragma weak bl1_plat_fwu_done
+#pragma weak bl1_plat_handle_pre_image_load
+#pragma weak bl1_plat_handle_post_image_load
 
 
 unsigned int bl1_plat_get_next_image_id(void)
@@ -35,6 +38,16 @@
 
 }
 
+int bl1_plat_handle_pre_image_load(unsigned int image_id)
+{
+	return 0;
+}
+
+int bl1_plat_handle_post_image_load(unsigned int image_id)
+{
+	return 0;
+}
+
 /*
  * Following is the default definition that always
  * returns BL2 image details.
diff --git a/plat/common/plat_bl2_el3_common.c b/plat/common/plat_bl2_el3_common.c
deleted file mode 100644
index 358a02d..0000000
--- a/plat/common/plat_bl2_el3_common.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <arch_helpers.h>
-#include <assert.h>
-#include <bl_common.h>
-#include <debug.h>
-#include <errno.h>
-#include <platform_def.h>
-
-/*
- * The following platform functions are weakly defined. They
- * are default implementations that allow BL2 to compile in
- * absence of real definitions. The Platforms may override
- * with more complex definitions.
- */
-#pragma weak bl2_el3_plat_prepare_exit
-
-void bl2_el3_plat_prepare_exit(void)
-{
-}
diff --git a/plat/common/platform_helpers_default.c b/plat/common/plat_bl_common.c
similarity index 61%
rename from plat/common/platform_helpers_default.c
rename to plat/common/plat_bl_common.c
index ce1a731..4123df3 100644
--- a/plat/common/platform_helpers_default.c
+++ b/plat/common/plat_bl_common.c
@@ -1,40 +1,36 @@
 /*
- * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
 
 #include <arch_helpers.h>
-#include <platform.h>
+#include <assert.h>
+#include <bl_common.h>
+#include <debug.h>
+#include <errno.h>
 
 /*
- * Placeholder functions which can be redefined by each platfrom.
+ * The following platform functions are weakly defined. The Platforms
+ * may redefine with strong definition.
  */
-
+#pragma weak bl2_el3_plat_prepare_exit
 #pragma weak plat_error_handler
-#pragma weak bl1_plat_handle_pre_image_load
-#pragma weak bl1_plat_handle_post_image_load
 #pragma weak bl2_plat_preload_setup
 #pragma weak bl2_plat_handle_pre_image_load
 #pragma weak bl2_plat_handle_post_image_load
 #pragma weak plat_try_next_boot_source
 
+void bl2_el3_plat_prepare_exit(void)
+{
+}
+
 void __dead2 plat_error_handler(int err)
 {
 	while (1)
 		wfi();
 }
 
-int bl1_plat_handle_pre_image_load(void)
-{
-	return 0;
-}
-
-int bl1_plat_handle_post_image_load(void)
-{
-	return 0;
-}
-
 void bl2_plat_preload_setup(void)
 {
 }