Add support to load BL31 in DRAM
authorDavid Wang <david.wang@arm.com>
Mon, 7 Mar 2016 03:02:57 +0000 (11:02 +0800)
committerDavid Wang <david.wang@arm.com>
Thu, 31 Mar 2016 02:14:01 +0000 (10:14 +0800)
This patch adds an option to the ARM common platforms to load BL31 in the
TZC secured DRAM instead of the default secure SRAM.

To enable this feature, set `ARM_BL31_IN_DRAM` to 1 in build options.
If TSP is present, then setting this option also sets the TSP location
to DRAM and ignores the `ARM_TSP_RAM_LOCATION` build flag.

To use this feature, BL2 platform code must map in the DRAM used by
BL31. The macro ARM_MAP_BL31_SEC_DRAM is provided for this purpose.
Currently, only the FVP BL2 platform code maps in this DRAM.

Change-Id: If5f7cc9deb569cfe68353a174d4caa48acd78d67

docs/user-guide.md
include/plat/arm/board/common/board_arm_def.h
include/plat/arm/common/arm_def.h
plat/arm/board/fvp/aarch64/fvp_common.c
plat/arm/board/fvp/include/platform_def.h
plat/arm/common/arm_bl2_setup.c
plat/arm/common/arm_common.mk

index ea10a81ef6550e3c514e7441f1bb1b39f0182e37..f1cc990f197d73563ec6bdb6554a0d1ce9f6f72c 100644 (file)
@@ -495,6 +495,12 @@ map is explained in the [Firmware Design].
     that wish to optimise memory usage for page tables need to set this flag to 1
     and must override the related macros.
 
+*   'ARM_BL31_IN_DRAM': Boolean option to select loading of BL31 in TZC secured
+    DRAM. By default, BL31 is in the secure SRAM. Set this flag to 1 to load
+    BL31 in TZC secured DRAM. If TSP is present, then setting this option also
+    sets the TSP location to DRAM and ignores the `ARM_TSP_RAM_LOCATION` build
+    flag.
+
 #### ARM CSS platform specific build options
 
 *   `CSS_DETECT_PRE_1_7_0_SCP`: Boolean flag to detect SCP version
index b065537d33103a64c51c97bdda3f3a45ae54aa7f..d70fbb466fca59433ac8b17f615a746d6013634c 100644 (file)
  */
 #if IMAGE_BL31 || IMAGE_BL32
 # define PLAT_ARM_MMAP_ENTRIES         6
-# define MAX_XLAT_TABLES               3
-#else
-# define PLAT_ARM_MMAP_ENTRIES         9
 # define MAX_XLAT_TABLES               4
+#else
+# define PLAT_ARM_MMAP_ENTRIES         10
+# define MAX_XLAT_TABLES               5
 #endif
 
 #endif /* ARM_BOARD_OPTIMISE_MMAP */
index d04f9d6ff8366d5f9f6daa187b45dc8b11716ec6..18fe7180688239d1aa9b87b904d845c3adce984d 100644 (file)
                                                TSP_SEC_MEM_SIZE,       \
                                                MT_MEMORY | MT_RW | MT_SECURE)
 
+#if ARM_BL31_IN_DRAM
+#define ARM_MAP_BL31_SEC_DRAM          MAP_REGION_FLAT(                \
+                                               BL31_BASE,              \
+                                               PLAT_ARM_MAX_BL31_SIZE, \
+                                               MT_MEMORY | MT_RW | MT_SECURE)
+#endif
 
 /*
  * The number of regions like RO(code), coherent and data required by
 /*******************************************************************************
  * BL2 specific defines.
  ******************************************************************************/
+#if ARM_BL31_IN_DRAM
+/*
+ * BL31 is loaded in the DRAM.
+ * Put BL2 just below BL1.
+ */
+#define BL2_BASE                       (BL1_RW_BASE - PLAT_ARM_MAX_BL2_SIZE)
+#define BL2_LIMIT                      BL1_RW_BASE
+#else
 /*
  * Put BL2 just below BL31.
  */
 #define BL2_BASE                       (BL31_BASE - PLAT_ARM_MAX_BL2_SIZE)
 #define BL2_LIMIT                      BL31_BASE
+#endif
 
 /*******************************************************************************
  * BL31 specific defines.
  ******************************************************************************/
+#if ARM_BL31_IN_DRAM
+/*
+ * Put BL31 at the bottom of TZC secured DRAM
+ */
+#define BL31_BASE                      ARM_AP_TZC_DRAM1_BASE
+#define BL31_LIMIT                     (ARM_AP_TZC_DRAM1_BASE +        \
+                                               PLAT_ARM_MAX_BL31_SIZE)
+#else
 /*
  * Put BL31 at the top of the Trusted SRAM.
  */
                                                PLAT_ARM_MAX_BL31_SIZE)
 #define BL31_PROGBITS_LIMIT            BL1_RW_BASE
 #define BL31_LIMIT                     (ARM_BL_RAM_BASE + ARM_BL_RAM_SIZE)
+#endif
 
 /*******************************************************************************
  * BL32 specific defines.
  * Trusted DRAM (if available) or the DRAM region secured by the TrustZone
  * controller.
  */
-#if ARM_TSP_RAM_LOCATION_ID == ARM_TRUSTED_SRAM_ID
+#if ARM_BL31_IN_DRAM
+# define TSP_SEC_MEM_BASE              (ARM_AP_TZC_DRAM1_BASE +        \
+                                               PLAT_ARM_MAX_BL31_SIZE)
+# define TSP_SEC_MEM_SIZE              (ARM_AP_TZC_DRAM1_SIZE -        \
+                                               PLAT_ARM_MAX_BL31_SIZE)
+# define BL32_BASE                     (ARM_AP_TZC_DRAM1_BASE +        \
+                                               PLAT_ARM_MAX_BL31_SIZE)
+# define BL32_LIMIT                    (ARM_AP_TZC_DRAM1_BASE +        \
+                                               ARM_AP_TZC_DRAM1_SIZE)
+#elif ARM_TSP_RAM_LOCATION_ID == ARM_TRUSTED_SRAM_ID
 # define TSP_SEC_MEM_BASE              ARM_BL_RAM_BASE
 # define TSP_SEC_MEM_SIZE              ARM_BL_RAM_SIZE
 # define TSP_PROGBITS_LIMIT            BL2_BASE
  * FWU Images: NS_BL1U, BL2U & NS_BL2U defines.
  ******************************************************************************/
 #define BL2U_BASE                      BL2_BASE
+#if ARM_BL31_IN_DRAM
+#define BL2U_LIMIT                     BL1_RW_BASE
+#else
 #define BL2U_LIMIT                     BL31_BASE
+#endif
 #define NS_BL2U_BASE                   ARM_NS_DRAM1_BASE
 #define NS_BL1U_BASE                   (PLAT_ARM_NVM_BASE + 0x03EB8000)
 
index f684d97757151677b3a805bfc56994cea338c525..1de99991bb4a7d764938bcacd2c2c5a1b3c3c3a8 100644 (file)
@@ -97,6 +97,9 @@ const mmap_region_t plat_arm_mmap[] = {
        MAP_DEVICE2,
        ARM_MAP_NS_DRAM1,
        ARM_MAP_TSP_SEC_MEM,
+#if ARM_BL31_IN_DRAM
+       ARM_MAP_BL31_SEC_DRAM,
+#endif
        {0}
 };
 #endif
index a8267dec15e91f16a50d8d5ed5d2fe2806b581a3..3428cb51dad1219a7bbb2c6a7b4596502c4363b8 100644 (file)
  * PLAT_ARM_MAX_BL1_RW_SIZE is calculated using the current BL1 RW debug size
  * plus a little space for growth.
  */
-#if TRUSTED_BOARD_BOOT
-# define PLAT_ARM_MAX_BL1_RW_SIZE      0x9000
-#else
-# define PLAT_ARM_MAX_BL1_RW_SIZE      0x6000
-#endif
+#define PLAT_ARM_MAX_BL1_RW_SIZE       0xA000
 
 /*
  * PLAT_ARM_MAX_BL2_SIZE is calculated using the current BL2 debug size plus a
index 97c2bca3525a2b081f39ee71d5b9d046f203cbd2..a528830a6819ec070fdcc175455fa5a1fff2b679 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2016, ARM Limited and Contributors. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -96,11 +96,27 @@ static bl2_to_bl31_params_mem_t bl31_params_mem;
 #pragma weak bl2_plat_get_bl33_meminfo
 #pragma weak bl2_plat_set_bl33_ep_info
 
-
+#if ARM_BL31_IN_DRAM
+meminfo_t *bl2_plat_sec_mem_layout(void)
+{
+       static meminfo_t bl2_dram_layout
+               __aligned(CACHE_WRITEBACK_GRANULE) = {
+               .total_base = BL31_BASE,
+               .total_size = (ARM_AP_TZC_DRAM1_BASE +
+                               ARM_AP_TZC_DRAM1_SIZE) - BL31_BASE,
+               .free_base = BL31_BASE,
+               .free_size = (ARM_AP_TZC_DRAM1_BASE +
+                               ARM_AP_TZC_DRAM1_SIZE) - BL31_BASE
+       };
+
+       return &bl2_dram_layout;
+}
+#else
 meminfo_t *bl2_plat_sec_mem_layout(void)
 {
        return &bl2_tzram_layout;
 }
+#endif
 
 /*******************************************************************************
  * This function assigns a pointer to the memory that the platform has kept
index 425e0d367a4620546075b53791a5bde4808e3520..973e583e20db24b2ed32130f0ec007066e35c871 100644 (file)
@@ -77,6 +77,11 @@ ARM_CONFIG_CNTACR            :=      1
 $(eval $(call assert_boolean,ARM_CONFIG_CNTACR))
 $(eval $(call add_define,ARM_CONFIG_CNTACR))
 
+# Process ARM_BL31_IN_DRAM flag
+ARM_BL31_IN_DRAM               :=      0
+$(eval $(call assert_boolean,ARM_BL31_IN_DRAM))
+$(eval $(call add_define,ARM_BL31_IN_DRAM))
+
 PLAT_INCLUDES          +=      -Iinclude/common/tbbr                           \
                                -Iinclude/plat/arm/common                       \
                                -Iinclude/plat/arm/common/aarch64