diff mbox

[5/5] ARM: omap5: add fdt secure dram reservation fixup

Message ID 1472794824-6032-6-git-send-email-d-allred@ti.com
State New
Headers show

Commit Message

Allred, Daniel Sept. 2, 2016, 5:40 a.m. UTC
Adds a secure dram reservation fixup for secure
devices, when a region in the emif has been set aside
for secure world use. The size is defined by the
CONFIG_TI_SECURE_EMIF_TOTAL_REGION_SIZE config option.

Signed-off-by: Daniel Allred <d-allred@ti.com>

---
 arch/arm/cpu/armv7/omap5/fdt.c | 64 ++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 62 insertions(+), 2 deletions(-)

-- 
2.7.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Comments

Andrew Davis Sept. 7, 2016, 7:48 p.m. UTC | #1
On 09/02/2016 12:40 AM, Daniel Allred wrote:
> Adds a secure dram reservation fixup for secure

> devices, when a region in the emif has been set aside

> for secure world use. The size is defined by the

> CONFIG_TI_SECURE_EMIF_TOTAL_REGION_SIZE config option.

> 

> Signed-off-by: Daniel Allred <d-allred@ti.com>

> ---

>  arch/arm/cpu/armv7/omap5/fdt.c | 64 ++++++++++++++++++++++++++++++++++++++++--

>  1 file changed, 62 insertions(+), 2 deletions(-)

> 

> diff --git a/arch/arm/cpu/armv7/omap5/fdt.c b/arch/arm/cpu/armv7/omap5/fdt.c

> index 0493cd1..da8d59b 100644

> --- a/arch/arm/cpu/armv7/omap5/fdt.c

> +++ b/arch/arm/cpu/armv7/omap5/fdt.c

> @@ -153,13 +153,73 @@ static int ft_hs_fixup_sram(void *fdt, bd_t *bd)

>  static int ft_hs_fixup_sram(void *fdt, bd_t *bd) { return 0; }

>  #endif

>  

> +#if (CONFIG_TI_SECURE_EMIF_TOTAL_REGION_SIZE != 0)

> +static int ft_hs_fixup_dram(void *fdt, bd_t *bd)

> +{

> +	const char *path, *subpath;

> +	int offs;

> +	u32 sec_mem_start = CONFIG_TI_SECURE_EMIF_REGION_START;

> +	u32 sec_mem_size = CONFIG_TI_SECURE_EMIF_TOTAL_REGION_SIZE;

> +	fdt64_t temp[2];

> +

> +	/* If start address is zero, place at end of DRAM */

> +	if (0 == sec_mem_start)

> +		sec_mem_start =

> +			(CONFIG_SYS_SDRAM_BASE +

> +			(omap_sdram_size() - sec_mem_size));

> +

> +	/* Delete any original secure_reserved node */

> +	path = "/reserved-memory/secure_reserved";

> +	offs = fdt_path_offset(fdt, path);

> +	if (offs >= 0)

> +		fdt_del_node(fdt, offs);

> +

> +	/* Add new secure_reserved node */

> +	path = "/reserved-memory";

> +	offs = fdt_path_offset(fdt, path);

> +	if (offs < 0) {

> +		debug("Node %s not found\n", path);

> +		path = "/";

> +		subpath = "reserved-memory";

> +		fdt_path_offset(fdt, path);


Are we supposed to be doing something with the result of this call? Who
sets 'offs' in this case?

> +		offs = fdt_add_subnode(fdt, offs, subpath);

> +		if (offs < 0) {

> +			printf("Could not create %s%s node.\n", path, subpath);

> +			return 1;

> +		}

> +		path = "/reserved-memory";

> +		offs = fdt_path_offset(fdt, path);

> +	}

> +

> +	subpath = "secure_reserved";

> +	offs = fdt_add_subnode(fdt, offs, subpath);

> +	if (offs < 0) {

> +		printf("Could not create %s%s node.\n", path, subpath);

> +		return 1;

> +	}

> +

> +	temp[0] = cpu_to_fdt64(((u64)sec_mem_start));

> +	temp[1] = cpu_to_fdt64(((u64)sec_mem_size));

> +	fdt_setprop_string(fdt, offs, "compatible",

> +			   "ti,dra7-secure-memory");

> +	fdt_setprop_string(fdt, offs, "status", "okay");

> +	fdt_setprop(fdt, offs, "no-map", NULL, 0);

> +	fdt_setprop(fdt, offs, "reg", temp, sizeof(temp));

> +

> +	return 0;

> +}

> +#else

> +static int ft_hs_fixup_dram(void *fdt, bd_t *bd) { return 0; }

> +#endif

> +

>  static void ft_hs_fixups(void *fdt, bd_t *bd)

>  {

>  	/* Check we are running on an HS/EMU device type */

>  	if (GP_DEVICE != get_device_type()) {

>  		if ((ft_hs_fixup_crossbar(fdt, bd) == 0) &&

>  		    (ft_hs_disable_rng(fdt, bd) == 0) &&

> -		    (ft_hs_fixup_sram(fdt, bd) == 0))

> +		    (ft_hs_fixup_sram(fdt, bd) == 0) &&

> +		    (ft_hs_fixup_dram(fdt, bd) == 0))

>  			return;

>  	} else {

>  		printf("ERROR: Incorrect device type (GP) detected!");

> @@ -171,7 +231,7 @@ static void ft_hs_fixups(void *fdt, bd_t *bd)

>  static void ft_hs_fixups(void *fdt, bd_t *bd)

>  {

>  }

> -#endif

> +#endif /* #ifdef CONFIG_TI_SECURE_DEVICE */

>  

>  /*

>   * Place for general cpu/SoC FDT fixups. Board specific

> 

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot
diff mbox

Patch

diff --git a/arch/arm/cpu/armv7/omap5/fdt.c b/arch/arm/cpu/armv7/omap5/fdt.c
index 0493cd1..da8d59b 100644
--- a/arch/arm/cpu/armv7/omap5/fdt.c
+++ b/arch/arm/cpu/armv7/omap5/fdt.c
@@ -153,13 +153,73 @@  static int ft_hs_fixup_sram(void *fdt, bd_t *bd)
 static int ft_hs_fixup_sram(void *fdt, bd_t *bd) { return 0; }
 #endif
 
+#if (CONFIG_TI_SECURE_EMIF_TOTAL_REGION_SIZE != 0)
+static int ft_hs_fixup_dram(void *fdt, bd_t *bd)
+{
+	const char *path, *subpath;
+	int offs;
+	u32 sec_mem_start = CONFIG_TI_SECURE_EMIF_REGION_START;
+	u32 sec_mem_size = CONFIG_TI_SECURE_EMIF_TOTAL_REGION_SIZE;
+	fdt64_t temp[2];
+
+	/* If start address is zero, place at end of DRAM */
+	if (0 == sec_mem_start)
+		sec_mem_start =
+			(CONFIG_SYS_SDRAM_BASE +
+			(omap_sdram_size() - sec_mem_size));
+
+	/* Delete any original secure_reserved node */
+	path = "/reserved-memory/secure_reserved";
+	offs = fdt_path_offset(fdt, path);
+	if (offs >= 0)
+		fdt_del_node(fdt, offs);
+
+	/* Add new secure_reserved node */
+	path = "/reserved-memory";
+	offs = fdt_path_offset(fdt, path);
+	if (offs < 0) {
+		debug("Node %s not found\n", path);
+		path = "/";
+		subpath = "reserved-memory";
+		fdt_path_offset(fdt, path);
+		offs = fdt_add_subnode(fdt, offs, subpath);
+		if (offs < 0) {
+			printf("Could not create %s%s node.\n", path, subpath);
+			return 1;
+		}
+		path = "/reserved-memory";
+		offs = fdt_path_offset(fdt, path);
+	}
+
+	subpath = "secure_reserved";
+	offs = fdt_add_subnode(fdt, offs, subpath);
+	if (offs < 0) {
+		printf("Could not create %s%s node.\n", path, subpath);
+		return 1;
+	}
+
+	temp[0] = cpu_to_fdt64(((u64)sec_mem_start));
+	temp[1] = cpu_to_fdt64(((u64)sec_mem_size));
+	fdt_setprop_string(fdt, offs, "compatible",
+			   "ti,dra7-secure-memory");
+	fdt_setprop_string(fdt, offs, "status", "okay");
+	fdt_setprop(fdt, offs, "no-map", NULL, 0);
+	fdt_setprop(fdt, offs, "reg", temp, sizeof(temp));
+
+	return 0;
+}
+#else
+static int ft_hs_fixup_dram(void *fdt, bd_t *bd) { return 0; }
+#endif
+
 static void ft_hs_fixups(void *fdt, bd_t *bd)
 {
 	/* Check we are running on an HS/EMU device type */
 	if (GP_DEVICE != get_device_type()) {
 		if ((ft_hs_fixup_crossbar(fdt, bd) == 0) &&
 		    (ft_hs_disable_rng(fdt, bd) == 0) &&
-		    (ft_hs_fixup_sram(fdt, bd) == 0))
+		    (ft_hs_fixup_sram(fdt, bd) == 0) &&
+		    (ft_hs_fixup_dram(fdt, bd) == 0))
 			return;
 	} else {
 		printf("ERROR: Incorrect device type (GP) detected!");
@@ -171,7 +231,7 @@  static void ft_hs_fixups(void *fdt, bd_t *bd)
 static void ft_hs_fixups(void *fdt, bd_t *bd)
 {
 }
-#endif
+#endif /* #ifdef CONFIG_TI_SECURE_DEVICE */
 
 /*
  * Place for general cpu/SoC FDT fixups. Board specific