fconf: enhancements to firmware configuration framework

A populate() function essentially captures the value of a property,
defined by a platform, into a fconf related c structure. Such a
callback is usually platform specific and is associated to a specific
configuration source.
For example, a populate() function which captures the hardware topology
of the platform can only parse HW_CONFIG DTB. Hence each populator
function must be registered with a specific 'config_type' identifier.
It broadly represents a logical grouping of configuration properties
which is usually a device tree source file.

Example:
> TB_FW: properties related to trusted firmware such as IO policies,
	 base address of other DTBs, mbedtls heap info etc.
> HW_CONFIG: properties related to hardware configuration of the SoC
	 such as topology, GIC controller, PSCI hooks, CPU ID etc.

This patch modifies FCONF_REGISTER_POPULATOR macro and fconf_populate()
to register and invoke the appropriate callbacks selectively based on
configuration type.

Change-Id: I6f63b1fd7a8729c6c9137d5b63270af1857bb44a
Signed-off-by: Madhukar Pappireddy <madhukar.pappireddy@arm.com>
diff --git a/lib/fconf/fconf.c b/lib/fconf/fconf.c
index a6da56b..9ce4635 100644
--- a/lib/fconf/fconf.c
+++ b/lib/fconf/fconf.c
@@ -53,17 +53,17 @@
 	INFO("FCONF: FW_CONFIG loaded at address = 0x%lx\n", arm_tb_fw_info.image_base);
 }
 
-void fconf_populate(uintptr_t config)
+void fconf_populate(const char *config_type, uintptr_t config)
 {
 	assert(config != 0UL);
 
 	/* Check if the pointer to DTB is correct */
 	if (fdt_check_header((void *)config) != 0) {
-		ERROR("FCONF: Invalid DTB file passed for FW_CONFIG\n");
+		ERROR("FCONF: Invalid DTB file passed for %s\n", config_type);
 		panic();
 	}
 
-	INFO("FCONF: Reading firmware configuration file from: 0x%lx\n", config);
+	INFO("FCONF: Reading %s firmware configuration file from: 0x%lx\n", config_type, config);
 
 	/* Go through all registered populate functions */
 	IMPORT_SYM(struct fconf_populator *, __FCONF_POPULATOR_START__, start);
@@ -73,10 +73,12 @@
 	for (populator = start; populator != end; populator++) {
 		assert((populator->info != NULL) && (populator->populate != NULL));
 
-		INFO("FCONF: Reading firmware configuration information for: %s\n", populator->info);
-		if (populator->populate(config) != 0) {
-			/* TODO: handle property miss */
-			panic();
+		if (strcmp(populator->config_type, config_type) == 0) {
+			INFO("FCONF: Reading firmware configuration information for: %s\n", populator->info);
+			if (populator->populate(config) != 0) {
+				/* TODO: handle property miss */
+				panic();
+			}
 		}
 	}