From 8c7b55f9322351db6b23b8e928efc9546313dcdf Mon Sep 17 00:00:00 2001
From: Chandni Cherukuri <chandni.cherukuri@arm.com>
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 <chandni.cherukuri@arm.com>
---
 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 be9920cbc..1e1ea14b0 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 09403f884..52dcf889e 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 <arch_helpers.h>
 #include <debug.h>
 #include <desc_image_load.h>
 #include <libfdt.h>
@@ -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;
 }
 
-- 
GitLab