SPM: SGI: Map memory allocated for secure partitions
authorSughosh Ganu <[email protected]>
Wed, 16 May 2018 11:49:56 +0000 (17:19 +0530)
committerSughosh Ganu <[email protected]>
Thu, 26 Jul 2018 16:32:39 +0000 (22:02 +0530)
The secure partition manager reserves chunks of memory which are used
for the S-EL0 StandaloneMM image and the buffers required for
communication between the Non-Secure world with the StandaloneMM
image. Add the memory chunks to relevant arrays for mapping the
regions of memory with corresponding attributes.

Change-Id: If371d1afee0a50ca7cacd55e16aeaca949d5062b
Signed-off-by: Sughosh Ganu <[email protected]>
plat/arm/css/sgi/include/platform_def.h
plat/arm/css/sgi/sgi_plat.c

index 09f281af889c0cbfb952902f77417dd5b1a8ff2d..3b0cfb62b4af3f551f4299e4ed9de6777d82466e 100644 (file)
 #define PLAT_ARM_GICC_BASE             0x2C000000
 #define PLAT_ARM_GICR_BASE             0x300C0000
 
+/* Map the secure region for access from S-EL0 */
+#define PLAT_ARM_SECURE_MAP_DEVICE     MAP_REGION_FLAT(        \
+                                       SOC_CSS_DEVICE_BASE,    \
+                                       SOC_CSS_DEVICE_SIZE,    \
+                                       MT_DEVICE | MT_RW | MT_SECURE | MT_USER)
+
 #if RAS_EXTENSION
 /* Allocate 128KB for CPER buffers */
 #define PLAT_SP_BUF_BASE               ULL(0x20000)
index 7e1d4e207946c1cdccbff91fc2ee10e433c34f43..fccd01f0dfffb33032d9c88772118dc4c3544f6c 100644 (file)
@@ -5,11 +5,13 @@
  */
 
 #include <arm_def.h>
+#include <arm_spm_def.h>
 #include <bl_common.h>
 #include <ccn.h>
 #include <debug.h>
 #include <plat_arm.h>
 #include <platform.h>
+#include <secure_partition.h>
 #include "../../../../bl1/bl1_private.h"
 
 #if USE_COHERENT_MEM
@@ -57,6 +59,9 @@ const mmap_region_t plat_arm_mmap[] = {
        ARM_MAP_NS_DRAM1,
 #if ARM_BL31_IN_DRAM
        ARM_MAP_BL31_SEC_DRAM,
+#endif
+#if ENABLE_SPM
+       ARM_SP_IMAGE_MMAP,
 #endif
        {0}
 };
@@ -67,8 +72,72 @@ const mmap_region_t plat_arm_mmap[] = {
        V2M_MAP_IOFPGA,
        CSS_SGI_MAP_DEVICE,
        SOC_CSS_MAP_DEVICE,
+#if ENABLE_SPM
+       ARM_SPM_BUF_EL3_MMAP,
+#endif
        {0}
 };
+
+#if ENABLE_SPM && defined(IMAGE_BL31)
+const mmap_region_t plat_arm_secure_partition_mmap[] = {
+       PLAT_ARM_SECURE_MAP_DEVICE,
+       ARM_SP_IMAGE_MMAP,
+       ARM_SP_IMAGE_NS_BUF_MMAP,
+       ARM_SP_IMAGE_RW_MMAP,
+       ARM_SPM_BUF_EL0_MMAP,
+       {0}
+};
+#endif /* ENABLE_SPM && defined(IMAGE_BL31) */
 #endif
 
 ARM_CASSERT_MMAP
+
+#if ENABLE_SPM && defined(IMAGE_BL31)
+/*
+ * Boot information passed to a secure partition during initialisation. Linear
+ * indices in MP information will be filled at runtime.
+ */
+static secure_partition_mp_info_t sp_mp_info[] = {
+       [0] = {0x81000000, 0},
+       [1] = {0x81000100, 0},
+       [2] = {0x81000200, 0},
+       [3] = {0x81000300, 0},
+       [4] = {0x81010000, 0},
+       [5] = {0x81010100, 0},
+       [6] = {0x81010200, 0},
+       [7] = {0x81010300, 0},
+};
+
+const secure_partition_boot_info_t plat_arm_secure_partition_boot_info = {
+       .h.type              = PARAM_SP_IMAGE_BOOT_INFO,
+       .h.version           = VERSION_1,
+       .h.size              = sizeof(secure_partition_boot_info_t),
+       .h.attr              = 0,
+       .sp_mem_base         = ARM_SP_IMAGE_BASE,
+       .sp_mem_limit        = ARM_SP_IMAGE_LIMIT,
+       .sp_image_base       = ARM_SP_IMAGE_BASE,
+       .sp_stack_base       = PLAT_SP_IMAGE_STACK_BASE,
+       .sp_heap_base        = ARM_SP_IMAGE_HEAP_BASE,
+       .sp_ns_comm_buf_base = ARM_SP_IMAGE_NS_BUF_BASE,
+       .sp_shared_buf_base  = PLAT_SPM_BUF_BASE,
+       .sp_image_size       = ARM_SP_IMAGE_SIZE,
+       .sp_pcpu_stack_size  = PLAT_SP_IMAGE_STACK_PCPU_SIZE,
+       .sp_heap_size        = ARM_SP_IMAGE_HEAP_SIZE,
+       .sp_ns_comm_buf_size = ARM_SP_IMAGE_NS_BUF_SIZE,
+       .sp_shared_buf_size  = PLAT_SPM_BUF_SIZE,
+       .num_sp_mem_regions  = ARM_SP_IMAGE_NUM_MEM_REGIONS,
+       .num_cpus            = PLATFORM_CORE_COUNT,
+       .mp_info             = &sp_mp_info[0],
+};
+
+const struct mmap_region *plat_get_secure_partition_mmap(void *cookie)
+{
+       return plat_arm_secure_partition_mmap;
+}
+
+const struct secure_partition_boot_info *plat_get_secure_partition_boot_info(
+               void *cookie)
+{
+       return &plat_arm_secure_partition_boot_info;
+}
+#endif /* ENABLE_SPM && defined(IMAGE_BL31) */