diff --git a/include/lib/fconf/fconf_dyn_cfg_getter.h b/include/lib/fconf/fconf_dyn_cfg_getter.h index 6e0e7fd..6f8da0d 100644 --- a/include/lib/fconf/fconf_dyn_cfg_getter.h +++ b/include/lib/fconf/fconf_dyn_cfg_getter.h @@ -21,7 +21,8 @@ struct dyn_cfg_dtb_info_t *dyn_cfg_dtb_info_getter(unsigned int config_id); int fconf_populate_dtb_registry(uintptr_t config); -/* Set fw_config information in global DTB array */ -void set_fw_config_info(uintptr_t config_addr, uint32_t config_max_size); +/* Set config information in global DTB array */ +void set_config_info(uintptr_t config_addr, uint32_t config_max_size, + unsigned int config_id); #endif /* FCONF_DYN_CFG_GETTER_H */ diff --git a/lib/fconf/fconf_dyn_cfg_getter.c b/lib/fconf/fconf_dyn_cfg_getter.c index 38a85f5..25dd7f9 100644 --- a/lib/fconf/fconf_dyn_cfg_getter.c +++ b/lib/fconf/fconf_dyn_cfg_getter.c @@ -14,64 +14,57 @@ /* We currently use FW, TB_FW, SOC_FW, TOS_FW, NT_FW and HW configs */ #define MAX_DTB_INFO U(6) +/* + * Compile time assert if FW_CONFIG_ID is 0 which is more + * unlikely as 0 is a valid image ID for FIP as per the current + * code but still to avoid code breakage in case of unlikely + * event when image IDs get changed. + */ +CASSERT(FW_CONFIG_ID != U(0), assert_invalid_fw_config_id); static struct dyn_cfg_dtb_info_t dtb_infos[MAX_DTB_INFO]; static OBJECT_POOL_ARRAY(dtb_info_pool, dtb_infos); /* - * This function is used to alloc memory for fw config information from - * global pool and set fw configuration information. - * Specifically used by BL1 to set fw_config information in global array + * This function is used to alloc memory for config information from + * global pool and set the configuration information. */ -void set_fw_config_info(uintptr_t config_addr, uint32_t config_max_size) +void set_config_info(uintptr_t config_addr, uint32_t config_max_size, + unsigned int config_id) { struct dyn_cfg_dtb_info_t *dtb_info; dtb_info = pool_alloc(&dtb_info_pool); dtb_info->config_addr = config_addr; dtb_info->config_max_size = config_max_size; - dtb_info->config_id = FW_CONFIG_ID; + dtb_info->config_id = config_id; } struct dyn_cfg_dtb_info_t *dyn_cfg_dtb_info_getter(unsigned int config_id) { unsigned int index; - struct dyn_cfg_dtb_info_t *info; /* Positions index to the proper config-id */ - for (index = 0; index < MAX_DTB_INFO; index++) { + for (index = 0U; index < MAX_DTB_INFO; index++) { if (dtb_infos[index].config_id == config_id) { - info = &dtb_infos[index]; - break; + return &dtb_infos[index]; } } - if (index == MAX_DTB_INFO) { - WARN("FCONF: Invalid config id %u\n", config_id); - info = NULL; - } + WARN("FCONF: Invalid config id %u\n", config_id); - return info; + return NULL; } int fconf_populate_dtb_registry(uintptr_t config) { int rc; int node, child; - struct dyn_cfg_dtb_info_t *dtb_info; /* As libfdt use void *, we can't avoid this cast */ const void *dtb = (void *)config; /* - * Compile time assert if FW_CONFIG_ID is 0 which is more - * unlikely as 0 is a valid image id for FIP as per the current - * code but still to avoid code breakage in case of unlikely - * event when image ids gets changed. - */ - CASSERT(FW_CONFIG_ID != 0, assert_invalid_fw_config_id); - - /* * In case of BL1, fw_config dtb information is already * populated in global dtb_infos array by 'set_fw_config_info' * function, Below check is present to avoid re-population of @@ -80,11 +73,9 @@ * Other BLs, satisfy below check and populate fw_config information * in global dtb_infos array. */ - if (dtb_infos[0].config_id == 0) { - dtb_info = pool_alloc(&dtb_info_pool); - dtb_info->config_addr = config; - dtb_info->config_max_size = fdt_totalsize(dtb); - dtb_info->config_id = FW_CONFIG_ID; + if (dtb_infos[0].config_id == 0U) { + uint32_t config_max_size = fdt_totalsize(dtb); + set_config_info(config, config_max_size, FW_CONFIG_ID); } /* Find the node offset point to "fconf,dyn_cfg-dtb_registry" compatible property */ @@ -96,37 +87,36 @@ } fdt_for_each_subnode(child, dtb, node) { - uint32_t val32; + uint32_t config_max_size, config_id; + uintptr_t config_addr; uint64_t val64; - dtb_info = pool_alloc(&dtb_info_pool); - /* Read configuration dtb information */ rc = fdt_read_uint64(dtb, child, "load-address", &val64); if (rc < 0) { ERROR("FCONF: Incomplete configuration property in dtb-registry.\n"); return rc; } - dtb_info->config_addr = (uintptr_t)val64; + config_addr = (uintptr_t)val64; - rc = fdt_read_uint32(dtb, child, "max-size", &val32); + rc = fdt_read_uint32(dtb, child, "max-size", &config_max_size); if (rc < 0) { ERROR("FCONF: Incomplete configuration property in dtb-registry.\n"); return rc; } - dtb_info->config_max_size = val32; - rc = fdt_read_uint32(dtb, child, "id", &val32); + rc = fdt_read_uint32(dtb, child, "id", &config_id); if (rc < 0) { ERROR("FCONF: Incomplete configuration property in dtb-registry.\n"); return rc; } - dtb_info->config_id = val32; VERBOSE("FCONF: dyn_cfg.dtb_registry cell found with:\n"); - VERBOSE("\tload-address = %lx\n", dtb_info->config_addr); - VERBOSE("\tmax-size = 0x%x\n", dtb_info->config_max_size); - VERBOSE("\tconfig-id = %u\n", dtb_info->config_id); + VERBOSE("\tload-address = %lx\n", config_addr); + VERBOSE("\tmax-size = 0x%x\n", config_max_size); + VERBOSE("\tconfig-id = %u\n", config_id); + + set_config_info(config_addr, config_max_size, config_id); } if ((child < 0) && (child != -FDT_ERR_NOTFOUND)) { diff --git a/plat/arm/common/arm_bl1_setup.c b/plat/arm/common/arm_bl1_setup.c index af4b4c9..4b2a062 100644 --- a/plat/arm/common/arm_bl1_setup.c +++ b/plat/arm/common/arm_bl1_setup.c @@ -163,7 +163,7 @@ /* Set global DTB info for fixed fw_config information */ fw_config_max_size = ARM_FW_CONFIG_LIMIT - ARM_FW_CONFIG_BASE; - set_fw_config_info(ARM_FW_CONFIG_BASE, fw_config_max_size); + set_config_info(ARM_FW_CONFIG_BASE, fw_config_max_size, FW_CONFIG_ID); /* Fill the device tree information struct with the info from the config dtb */ err = fconf_load_config(FW_CONFIG_ID);