From 8c7b55f9322351db6b23b8e928efc9546313dcdf Mon Sep 17 00:00:00 2001 From: Chandni Cherukuri Date: Fri, 17 Aug 2018 11:23:46 +0530 Subject: [PATCH] plat/arm/sgi: add system-id node in HW_CONFIG dts Dynamically populating the 'system-id' node in the HW_CONFIG dts makes it difficult to enforce memory overlap checks. So add the system-id node in the HW_CONFIG dts file as a place holder with 'platform-id' and 'config-id' set to zero. The code at BL2 stage determines the values of 'platform-id' and 'config-id' at runtime and updates the corresponding fields in the system-id node of HW_CONFIG dts. Change-Id: I2ca9980b994ac418da8afa0c72716ede10aff68a Signed-off-by: Chandni Cherukuri --- plat/arm/board/sgi575/fdts/sgi575.dts | 10 +++++++++ plat/arm/css/sgi/sgi_image_load.c | 29 ++++++++++++++++----------- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/plat/arm/board/sgi575/fdts/sgi575.dts b/plat/arm/board/sgi575/fdts/sgi575.dts index be9920cb..1e1ea14b 100644 --- a/plat/arm/board/sgi575/fdts/sgi575.dts +++ b/plat/arm/board/sgi575/fdts/sgi575.dts @@ -8,4 +8,14 @@ / { /* compatible string */ compatible = "arm,sgi575"; + + /* + * Place holder for system-id node with default values. The + * value of platform-id and config-id will be set to the + * correct values during the BL2 stage of boot. + */ + system-id { + platform-id = <0x0>; + config-id = <0x0>; + }; }; diff --git a/plat/arm/css/sgi/sgi_image_load.c b/plat/arm/css/sgi/sgi_image_load.c index 09403f88..52dcf889 100644 --- a/plat/arm/css/sgi/sgi_image_load.c +++ b/plat/arm/css/sgi/sgi_image_load.c @@ -4,6 +4,7 @@ * SPDX-License-Identifier: BSD-3-Clause */ +#include #include #include #include @@ -13,6 +14,7 @@ * This function inserts Platform information via device tree nodes as, * system-id { * platform-id = <0>; + * config-id = <0>; * } ******************************************************************************/ static int plat_sgi_append_config_node(void) @@ -20,7 +22,7 @@ static int plat_sgi_append_config_node(void) bl_mem_params_node_t *mem_params; void *fdt; int nodeoffset, err; - unsigned int platid = 0; + unsigned int platid = 0, platcfg = 0; char *platform_name; mem_params = get_bl_mem_params_node(HW_CONFIG_ID); @@ -45,31 +47,34 @@ static int plat_sgi_append_config_node(void) } if (strcmp(platform_name, "arm,sgi575") == 0) { - platid = mmio_read_32(SSC_VERSION); + platid = mmio_read_32(SSC_VERSION) & SSC_VERSION_PART_NUM_MASK; + platcfg = (mmio_read_32(SSC_VERSION) >> SSC_VERSION_CONFIG_SHIFT) + & SSC_VERSION_CONFIG_MASK; } else { WARN("Invalid platform\n"); return -1; } - /* Increase DTB blob by 512 byte */ - err = fdt_open_into(fdt, fdt, mem_params->image_info.image_size + 512); - if (err < 0) { - ERROR("Failed to open HW_CONFIG DTB\n"); + nodeoffset = fdt_subnode_offset(fdt, 0, "system-id"); + if (nodeoffset < 0) { + ERROR("Failed to get system-id node offset\n"); return -1; } - /* Create "/system-id" node */ - nodeoffset = fdt_add_subnode(fdt, 0, "system-id"); - if (nodeoffset < 0) { - ERROR("Failed to add node system-id\n"); + err = fdt_setprop_u32(fdt, nodeoffset, "platform-id", platid); + if (err < 0) { + ERROR("Failed to set platform-id\n"); return -1; } - err = fdt_setprop_u32(fdt, nodeoffset, "platform-id", platid); + err = fdt_setprop_u32(fdt, nodeoffset, "config-id", platcfg); if (err < 0) { - ERROR("Failed to add node platform-id\n"); + ERROR("Failed to set config-id\n"); return -1; } + + flush_dcache_range((uintptr_t)fdt, mem_params->image_info.image_size); + return 0; } -- 2.30.2