Merge "Add support to pass the nt_fw_config DTB to OP-TEE." into integration
diff --git a/common/desc_image_load.c b/common/desc_image_load.c
index 0769226..47c80aa 100644
--- a/common/desc_image_load.c
+++ b/common/desc_image_load.c
@@ -214,11 +214,12 @@
 {
 	bl_params_node_t *params_node;
 	unsigned int fw_config_id;
-	uintptr_t hw_config_base = 0, fw_config_base;
-#if defined(SPD_spmd)
+#ifdef SPD_spmd
 	uint32_t fw_config_size = 0;
 #endif
+	uintptr_t fw_config_base;
 	bl_mem_params_node_t *mem_params;
+	uintptr_t hw_config_base = 0;
 
 	assert(bl2_to_next_bl_params != NULL);
 
@@ -227,6 +228,7 @@
 	 * if available.
 	 */
 	mem_params = get_bl_mem_params_node(HW_CONFIG_ID);
+
 	if (mem_params != NULL)
 		hw_config_base = mem_params->image_info.image_base;
 
@@ -240,8 +242,16 @@
 			fw_config_id = SOC_FW_CONFIG_ID;
 			break;
 		case BL32_IMAGE_ID:
+		/*
+		 * At the moment, OPTEE cannot accept a DTB in secure memory,
+		 * so fall back and use NT_FW_CONFIG instead.
+		 * This MUST be fixed as soon as OPTEE has support to
+		 * receive DTBs in secure memory.
+		 */
+#ifndef SPD_opteed
 			fw_config_id = TOS_FW_CONFIG_ID;
 			break;
+#endif
 		case BL33_IMAGE_ID:
 			fw_config_id = NT_FW_CONFIG_ID;
 			break;
@@ -254,38 +264,57 @@
 			mem_params = get_bl_mem_params_node(fw_config_id);
 			if (mem_params != NULL) {
 				fw_config_base = mem_params->image_info.image_base;
-#if defined(SPD_spmd)
+#ifdef SPD_spmd
 				fw_config_size =
 					mem_params->image_info.image_size;
 #endif
 			}
 		}
+
+#ifdef SPD_opteed
 		/*
-		 * Pass hw and tb_fw config addresses to next images. NOTE - for
-		 * EL3 runtime images (BL31 for AArch64 and BL32 for AArch32),
-		 * arg0 is already used by generic code. Take care of not
-		 * overwriting the previous initialisations.
+		 * If SPD_opteed is enabled, arg[0,2] are populated by
+		 * parse_optee_header(), which is called by
+		 * arm_bl2_handle_post_image_load(). The meaning of the
+		 * arguments are:
+		 * arg0 <-- MODE_RW
+		 * arg1 <-- Paged image base
+		 * arg2 <-- Paged image size
 		 */
-		if (params_node == bl2_to_next_bl_params->head) {
-			if (params_node->ep_info->args.arg1 == 0U)
-				params_node->ep_info->args.arg1 =
+		if (params_node->image_id == BL32_IMAGE_ID) {
+			params_node->ep_info->args.arg3 = fw_config_base;
+		} else {
+#endif
+			/*
+			 * Pass hw and tb_fw config addresses to next images.
+			 * NOTE - for EL3 runtime images (BL31 for AArch64
+			 * and BL32 for AArch32), arg0 is already used by
+			 * generic code. Take care of not overwriting the
+			 * previous initialisations.
+			 */
+			if (params_node == bl2_to_next_bl_params->head) {
+				if (params_node->ep_info->args.arg1 == 0U)
+					params_node->ep_info->args.arg1 =
 								fw_config_base;
-			if (params_node->ep_info->args.arg2 == 0U)
-				params_node->ep_info->args.arg2 =
+				if (params_node->ep_info->args.arg2 == 0U)
+					params_node->ep_info->args.arg2 =
 								hw_config_base;
-		} else {
-			if (params_node->ep_info->args.arg0 == 0U)
-				params_node->ep_info->args.arg0 =
+			} else {
+				if (params_node->ep_info->args.arg0 == 0U)
+					params_node->ep_info->args.arg0 =
 								fw_config_base;
-			if (params_node->ep_info->args.arg1 == 0U)
-				params_node->ep_info->args.arg1 =
+				if (params_node->ep_info->args.arg1 == 0U)
+					params_node->ep_info->args.arg1 =
 								hw_config_base;
-#if defined(SPD_spmd)
-			if (params_node->ep_info->args.arg2 == 0U)
-				params_node->ep_info->args.arg2 =
+#ifdef SPD_spmd
+				if (params_node->ep_info->args.arg2 == 0U)
+					params_node->ep_info->args.arg2 =
 								fw_config_size;
 #endif
+			}
+#ifdef SPD_opteed
 		}
+#endif
 	}
 }