board: stm32mp1: reserve memory for OP-TEE in device tree
authorPatrick Delaunay <patrick.delaunay@st.com>
Wed, 18 Mar 2020 08:22:48 +0000 (09:22 +0100)
committerPatrick Delaunay <patrick.delaunay@st.com>
Thu, 14 May 2020 07:02:12 +0000 (09:02 +0200)
Add reserve memory for OP-TEE in U-Boot and in kernel device tree:
- no more reduce the DDR size in "memory" node:
  CONFIG_SYS_MEM_TOP_HIDE is no more used
- U-Boot device-tree defines the needed "reserved-memory" for OP-TEE
  and U-Boot should not use this reserved memory: board_get_usable_ram_top
  use lmb lib to found the first free region, the not reserved
  memory, enough to relocate U-Boot: the needed size of U-Boot
  is estimated with gd->mon_len + CONFIG_SYS_MALLOC_LEN.
- the optee node ("optee@...": firmware with compatible "linaro,optee-tz")
  and the associated "reserved-memory" are deactivated in kernel device
  tree when OP-TEE is not detected by U-Boot to prevent kernel issue
  (memory is reserved but not used, optee driver probe failed).

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
Reviewed-by: Patrice Chotard <patrice.chotard@st.com>
arch/arm/dts/stm32mp157c-ed1.dts
arch/arm/dts/stm32mp15xx-dkx.dtsi
arch/arm/mach-stm32mp/dram_init.c
arch/arm/mach-stm32mp/fdt.c
include/configs/stm32mp1.h

index 54af7c97b376a4041c1d854cd3a12edd300f1c71..05d53264055e5b31c919cd611645f6a5350e2546 100644 (file)
                        reg = <0xe8000000 0x8000000>;
                        no-map;
                };
+
+               optee@fe000000 {
+                       reg = <0xfe000000 0x02000000>;
+                       no-map;
+               };
        };
 
        aliases {
index 42d3f0cb2d7f8200ca4101d3800d6b0b628ca91a..9ce10a52f06cc9eb645ad479af690721b51a070f 100644 (file)
                        reg = <0xd4000000 0x4000000>;
                        no-map;
                };
+
+               optee@de000000 {
+                       reg = <0xde000000 0x02000000>;
+                       no-map;
+               };
        };
 
        led {
index 7688b3e315e3facd6f686dbdcf325a800e3b9f7b..3233415eff7c1298f7561ca8d324cd5298167260 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <common.h>
 #include <dm.h>
+#include <lmb.h>
 #include <ram.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -31,3 +32,20 @@ int dram_init(void)
 
        return 0;
 }
+
+ulong board_get_usable_ram_top(ulong total_size)
+{
+       phys_addr_t reg;
+       struct lmb lmb;
+
+       /* found enough not-reserved memory to relocated U-Boot */
+       lmb_init(&lmb);
+       lmb_add(&lmb, gd->ram_base, gd->ram_size);
+       boot_fdt_add_mem_rsv_regions(&lmb, (void *)gd->fdt_blob);
+       reg = lmb_alloc(&lmb, CONFIG_SYS_MALLOC_LEN + total_size, SZ_4K);
+
+       if (reg)
+               return ALIGN(reg + CONFIG_SYS_MALLOC_LEN + total_size, SZ_4K);
+
+       return gd->ram_top;
+}
index 3ee7d6a83377211106bdeee112d6b526026a0dc8..ae82270e4241f0e8c0e388ace2004bab2bb5dbc6 100644 (file)
@@ -218,6 +218,26 @@ static void stm32_fdt_disable(void *fdt, int offset, u32 addr,
                       string, addr, name);
 }
 
+static void stm32_fdt_disable_optee(void *blob)
+{
+       int off, node;
+
+       off = fdt_node_offset_by_compatible(blob, -1, "linaro,optee-tz");
+       if (off >= 0 && fdtdec_get_is_enabled(blob, off))
+               fdt_status_disabled(blob, off);
+
+       /* Disabled "optee@..." reserved-memory node */
+       off = fdt_path_offset(blob, "/reserved-memory/");
+       if (off < 0)
+               return;
+       for (node = fdt_first_subnode(blob, off);
+            node >= 0;
+            node = fdt_next_subnode(blob, node)) {
+               if (!strncmp(fdt_get_name(blob, node, NULL), "optee@", 6))
+                       fdt_status_disabled(blob, node);
+       }
+}
+
 /*
  * This function is called right before the kernel is booted. "blob" is the
  * device tree that will be passed to the kernel.
@@ -302,5 +322,8 @@ int ft_system_setup(void *blob, bd_t *bd)
                                       "st,package", pkg, false);
        }
 
+       if (!CONFIG_IS_ENABLED(STM32MP1_OPTEE))
+               stm32_fdt_disable_optee(blob);
+
        return ret;
 }
index 19e2b3b31e0aa92eba807464cfd3e9c3fe20b6dc..feb4cc21a9f746fa7a1bce2a9d4ac16a5fa14768 100644 (file)
 #define CONFIG_SYS_SDRAM_BASE                  STM32_DDR_BASE
 #define CONFIG_SYS_INIT_SP_ADDR                        CONFIG_SYS_TEXT_BASE
 
-#ifdef CONFIG_STM32MP1_OPTEE
-#define CONFIG_SYS_MEM_TOP_HIDE                        SZ_32M
-#endif /* CONFIG_STM32MP1_OPTEE */
-
 /*
  * Console I/O buffer size
  */