]> git.baikalelectronics.ru Git - arm-tf.git/commitdiff
stm32mp1: use last page of SYSRAM as SCMI shared memory
authorEtienne Carriere <etienne.carriere@st.com>
Sun, 8 Dec 2019 07:17:56 +0000 (08:17 +0100)
committerEtienne Carriere <etienne.carriere@st.com>
Tue, 23 Jun 2020 07:22:45 +0000 (09:22 +0200)
SCMI shared memory is used to exchange message payloads between
secure SCMI services and non-secure SCMI agents. It is mapped
uncached (device) mainly to conform to existing support in
the Linux kernel. Note that executive messages are mostly short
(few 32bit words) hence not using cache will not penalize much
performances.

Platform stm32mp1 shall configure ETZPC to harden properly the
secure and non-secure areas of the SYSRAM address space, that before
CPU accesses the shared memory when mapped non-secure.

This change defines STM32MP_SEC_SYSRAM_BASE/STM32MP_SEC_SYSRAM_SIZE and
STM32MP_NS_SYSRAM_BASE/STM32MP_NS_SYSRAM_SIZE.

Change-Id: I71ff02a359b9668ae1c5a71b5f102cf3d310f289
Signed-off-by: Etienne Carriere <etienne.carriere@st.com>
plat/st/stm32mp1/sp_min/sp_min_setup.c
plat/st/stm32mp1/stm32mp1_def.h
plat/st/stm32mp1/stm32mp1_private.c

index e1799eda6292db3d43d31fb4c7b0684a800aec27..1f96239c8372fb69827c18f370eb47e3799a53b6 100644 (file)
@@ -77,7 +77,25 @@ entry_point_info_t *sp_min_plat_get_bl33_ep_info(void)
        return next_image_info;
 }
 
+CASSERT((STM32MP_SEC_SYSRAM_BASE == STM32MP_SYSRAM_BASE) &&
+       ((STM32MP_SEC_SYSRAM_BASE + STM32MP_SEC_SYSRAM_SIZE) <=
+        (STM32MP_SYSRAM_BASE + STM32MP_SYSRAM_SIZE)),
+       assert_secure_sysram_fits_at_begining_of_sysram);
+
+#ifdef STM32MP_NS_SYSRAM_BASE
+CASSERT((STM32MP_NS_SYSRAM_BASE >= STM32MP_SEC_SYSRAM_BASE) &&
+       ((STM32MP_NS_SYSRAM_BASE + STM32MP_NS_SYSRAM_SIZE) ==
+        (STM32MP_SYSRAM_BASE + STM32MP_SYSRAM_SIZE)),
+       assert_non_secure_sysram_fits_at_end_of_sysram);
+
+CASSERT((STM32MP_NS_SYSRAM_BASE & (PAGE_SIZE_4KB - U(1))) == 0U,
+       assert_non_secure_sysram_base_is_4kbyte_aligned);
+
+#define TZMA1_SECURE_RANGE \
+       (((STM32MP_NS_SYSRAM_BASE - STM32MP_SYSRAM_BASE) >> FOUR_KB_SHIFT) - 1U)
+#else
 #define TZMA1_SECURE_RANGE             STM32MP1_ETZPC_TZMA_ALL_SECURE
+#endif /* STM32MP_NS_SYSRAM_BASE */
 #define TZMA0_SECURE_RANGE             STM32MP1_ETZPC_TZMA_ALL_SECURE
 
 static void stm32mp1_etzpc_early_setup(void)
index 0a12b6e57fa64b36cb3a095e79b36bdd5ef3a3dc..4fae2d70cb8dee8ae7ff276b71631bd90ec6d4bb 100644 (file)
 #define STM32MP_SYSRAM_BASE            U(0x2FFC0000)
 #define STM32MP_SYSRAM_SIZE            U(0x00040000)
 
+#define STM32MP_NS_SYSRAM_SIZE         PAGE_SIZE
+#define STM32MP_NS_SYSRAM_BASE         (STM32MP_SYSRAM_BASE + \
+                                        STM32MP_SYSRAM_SIZE - \
+                                        STM32MP_NS_SYSRAM_SIZE)
+
+#define STM32MP_SEC_SYSRAM_BASE                STM32MP_SYSRAM_BASE
+#define STM32MP_SEC_SYSRAM_SIZE                (STM32MP_SYSRAM_SIZE - \
+                                        STM32MP_NS_SYSRAM_SIZE)
+
 /* DDR configuration */
 #define STM32MP_DDR_BASE               U(0xC0000000)
 #define STM32MP_DDR_MAX_SIZE           U(0x40000000)   /* Max 1GB */
@@ -81,18 +90,18 @@ enum ddr_type {
 /* 256 Octets reserved for header */
 #define STM32MP_HEADER_SIZE            U(0x00000100)
 
-#define STM32MP_BINARY_BASE            (STM32MP_SYSRAM_BASE +          \
+#define STM32MP_BINARY_BASE            (STM32MP_SEC_SYSRAM_BASE +      \
                                         STM32MP_PARAM_LOAD_SIZE +      \
                                         STM32MP_HEADER_SIZE)
 
-#define STM32MP_BINARY_SIZE            (STM32MP_SYSRAM_SIZE -          \
+#define STM32MP_BINARY_SIZE            (STM32MP_SEC_SYSRAM_SIZE -      \
                                         (STM32MP_PARAM_LOAD_SIZE +     \
                                          STM32MP_HEADER_SIZE))
 
 #ifdef AARCH32_SP_OPTEE
 #define STM32MP_BL32_SIZE              U(0)
 
-#define STM32MP_OPTEE_BASE             STM32MP_SYSRAM_BASE
+#define STM32MP_OPTEE_BASE             STM32MP_SEC_SYSRAM_BASE
 
 #define STM32MP_OPTEE_SIZE             (STM32MP_DTB_BASE -  \
                                         STM32MP_OPTEE_BASE)
@@ -104,8 +113,8 @@ enum ddr_type {
 #endif
 #endif
 
-#define STM32MP_BL32_BASE              (STM32MP_SYSRAM_BASE + \
-                                        STM32MP_SYSRAM_SIZE - \
+#define STM32MP_BL32_BASE              (STM32MP_SEC_SYSRAM_BASE + \
+                                        STM32MP_SEC_SYSRAM_SIZE - \
                                         STM32MP_BL32_SIZE)
 
 #ifdef AARCH32_SP_OPTEE
index 779228d4a0290e7f220e552e3594a69e69644d3e..fd60db282bfba506e63f1b596bf0e49980a081d2 100644 (file)
                                         BOARD_ID_REVISION_SHIFT)
 #define BOARD_ID2BOM(_id)              ((_id) & BOARD_ID_BOM_MASK)
 
-#define MAP_SRAM       MAP_REGION_FLAT(STM32MP_SYSRAM_BASE, \
+#if defined(IMAGE_BL2)
+#define MAP_SEC_SYSRAM MAP_REGION_FLAT(STM32MP_SYSRAM_BASE, \
                                        STM32MP_SYSRAM_SIZE, \
                                        MT_MEMORY | \
                                        MT_RW | \
                                        MT_SECURE | \
                                        MT_EXECUTE_NEVER)
+#elif defined(IMAGE_BL32)
+#define MAP_SEC_SYSRAM MAP_REGION_FLAT(STM32MP_SEC_SYSRAM_BASE, \
+                                       STM32MP_SEC_SYSRAM_SIZE, \
+                                       MT_MEMORY | \
+                                       MT_RW | \
+                                       MT_SECURE | \
+                                       MT_EXECUTE_NEVER)
+
+/* Non-secure SYSRAM is used a uncached memory for SCMI message transfer */
+#define MAP_NS_SYSRAM  MAP_REGION_FLAT(STM32MP_NS_SYSRAM_BASE, \
+                                       STM32MP_NS_SYSRAM_SIZE, \
+                                       MT_DEVICE | \
+                                       MT_RW | \
+                                       MT_NS | \
+                                       MT_EXECUTE_NEVER)
+#endif
 
 #define MAP_DEVICE1    MAP_REGION_FLAT(STM32MP1_DEVICE1_BASE, \
                                        STM32MP1_DEVICE1_SIZE, \
@@ -53,7 +70,7 @@
 
 #if defined(IMAGE_BL2)
 static const mmap_region_t stm32mp1_mmap[] = {
-       MAP_SRAM,
+       MAP_SEC_SYSRAM,
        MAP_DEVICE1,
        MAP_DEVICE2,
        {0}
@@ -61,7 +78,8 @@ static const mmap_region_t stm32mp1_mmap[] = {
 #endif
 #if defined(IMAGE_BL32)
 static const mmap_region_t stm32mp1_mmap[] = {
-       MAP_SRAM,
+       MAP_SEC_SYSRAM,
+       MAP_NS_SYSRAM,
        MAP_DEVICE1,
        MAP_DEVICE2,
        {0}