fconf: Populate properties from dtb during bl2 setup

Use the dtb provided by bl1 as configuration file for fconf.

Change-Id: I3f466ad9b7047e1a361d94e71ac6d693e31496d9
Signed-off-by: Louis Mayencourt <louis.mayencourt@arm.com>
diff --git a/include/lib/fconf/fconf.h b/include/lib/fconf/fconf.h
index 5a5837f..f58ff57 100644
--- a/include/lib/fconf/fconf.h
+++ b/include/lib/fconf/fconf.h
@@ -47,4 +47,15 @@
  */
 void fconf_populate(uintptr_t config);
 
+/* FCONF specific getter */
+#define fconf__dtb_getter(prop)	fconf_dtb_info.prop
+
+/* Structure used to locally keep a reference to the config dtb. */
+struct fconf_dtb_info_t {
+	uintptr_t base_addr;
+	size_t size;
+};
+
+extern struct fconf_dtb_info_t fconf_dtb_info;
+
 #endif /* FCONF_H */
diff --git a/lib/fconf/fconf.c b/lib/fconf/fconf.c
index 7e0b00b..2ca1bdc 100644
--- a/lib/fconf/fconf.c
+++ b/lib/fconf/fconf.c
@@ -7,18 +7,17 @@
 #include <assert.h>
 
 #include <common/debug.h>
+#include <common/fdt_wrappers.h>
 #include <lib/fconf/fconf.h>
 #include <libfdt.h>
 #include <plat/common/platform.h>
 #include <platform_def.h>
 
-static uintptr_t tb_fw_cfg_dtb;
-static size_t tb_fw_cfg_dtb_size;
+struct fconf_dtb_info_t fconf_dtb_info;
 
 void fconf_load_config(void)
 {
 	int err;
-	image_desc_t *desc;
 
 	image_info_t arm_tb_fw_info = {
 		.h.type = (uint8_t)PARAM_IMAGE_BINARY,
@@ -27,7 +26,7 @@
 		.h.attr = 0,
 		.image_base = ARM_TB_FW_CONFIG_BASE,
 		.image_max_size = (uint32_t)
-			(ARM_TB_FW_CONFIG_LIMIT - ARM_TB_FW_CONFIG_BASE)
+				(ARM_TB_FW_CONFIG_LIMIT - ARM_TB_FW_CONFIG_BASE)
 	};
 
 	VERBOSE("FCONF: Loading FW_CONFIG\n");
@@ -39,15 +38,19 @@
 	}
 
 	/* At this point we know that a DTB is indeed available */
-	tb_fw_cfg_dtb = arm_tb_fw_info.image_base;
-	tb_fw_cfg_dtb_size = (size_t)arm_tb_fw_info.image_size;
+	fconf_dtb_info.base_addr = arm_tb_fw_info.image_base;
+	fconf_dtb_info.size = (size_t)arm_tb_fw_info.image_size;
+
+#if !BL2_AT_EL3
+	image_desc_t *desc;
 
 	/* The BL2 ep_info arg0 is modified to point to FW_CONFIG */
 	desc = bl1_plat_get_image_desc(BL2_IMAGE_ID);
 	assert(desc != NULL);
-	desc->ep_info.args.arg0 = tb_fw_cfg_dtb;
+	desc->ep_info.args.arg0 = arm_tb_fw_info.image_base;
+#endif
 
-	INFO("FCONF: FW_CONFIG loaded at address = 0x%lx\n", tb_fw_cfg_dtb);
+	INFO("FCONF: FW_CONFIG loaded at address = 0x%lx\n", arm_tb_fw_info.image_base);
 }
 
 void fconf_populate(uintptr_t config)
@@ -76,4 +79,7 @@
 			panic();
 		}
 	}
+
+	/* save local pointer to the config dtb */
+	fconf_dtb_info.base_addr = config;
 }
diff --git a/plat/arm/common/arm_bl2_setup.c b/plat/arm/common/arm_bl2_setup.c
index cdf87ca..5f83bcc 100644
--- a/plat/arm/common/arm_bl2_setup.c
+++ b/plat/arm/common/arm_bl2_setup.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2020, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -14,6 +14,7 @@
 #include <common/debug.h>
 #include <common/desc_image_load.h>
 #include <drivers/generic_delay_timer.h>
+#include <lib/fconf/fconf.h>
 #ifdef SPD_opteed
 #include <lib/optee_utils.h>
 #endif
@@ -58,11 +59,13 @@
 	/* Setup the BL2 memory layout */
 	bl2_tzram_layout = *mem_layout;
 
+	/* Fill the properties struct with the info from the config dtb */
+	if (tb_fw_config != 0U) {
+		fconf_populate(tb_fw_config);
+	}
+
 	/* Initialise the IO layer and register platform IO devices */
 	plat_arm_io_setup();
-
-	if (tb_fw_config != 0U)
-		arm_bl2_set_tb_cfg_addr((void *)tb_fw_config);
 }
 
 void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3)