FWU: Add Firmware Update support in BL2U for ARM platforms
authorYatharth Kochar <yatharth.kochar@arm.com>
Wed, 14 Oct 2015 14:28:11 +0000 (15:28 +0100)
committerYatharth Kochar <yatharth.kochar@arm.com>
Wed, 9 Dec 2015 17:41:19 +0000 (17:41 +0000)
This patch adds support for Firmware update in BL2U for ARM
platforms such that TZC initialization is performed on all
ARM platforms and (optionally) transfer of SCP_BL2U image on
ARM CSS platforms.

BL2U specific functions are added to handle early_platform and
plat_arch setup. The MMU is configured to map in the BL2U
code/data area and other required memory.

Change-Id: I57863295a608cc06e6cbf078b7ce34cbd9733e4f

12 files changed:
include/plat/arm/board/common/board_arm_def.h
include/plat/arm/common/plat_arm.h
plat/arm/board/common/board_css_common.c
plat/arm/board/fvp/aarch64/fvp_common.c
plat/arm/board/fvp/fvp_bl2u_setup.c [new file with mode: 0644]
plat/arm/board/fvp/platform.mk
plat/arm/board/juno/platform.mk
plat/arm/common/arm_bl2u_setup.c [new file with mode: 0644]
plat/arm/common/arm_common.mk
plat/arm/css/common/css_bl2u_setup.c [new file with mode: 0644]
plat/arm/css/common/css_common.mk
plat/arm/soc/common/soc_css.mk

index dae5418000beb76cb9e5eb703f8bae67e1b2d314..b4e431348014fb4a73a9f6452be9a056aaadd5c3 100644 (file)
@@ -53,6 +53,8 @@
 # else
 #  define PLATFORM_STACK_SIZE 0x400
 # endif
+#elif IMAGE_BL2U
+# define PLATFORM_STACK_SIZE 0x200
 #elif IMAGE_BL31
 # define PLATFORM_STACK_SIZE 0x400
 #elif IMAGE_BL32
 #  define PLAT_ARM_MMAP_ENTRIES                8
 # endif
 #endif
+#if IMAGE_BL2U
+# if PLAT_fvp
+#  define PLAT_ARM_MMAP_ENTRIES                3
+# else
+#  define PLAT_ARM_MMAP_ENTRIES                4
+#endif
+#endif
 #if IMAGE_BL31
 #define PLAT_ARM_MMAP_ENTRIES          5
 #endif
 # else
 #  define MAX_XLAT_TABLES              4
 # endif /* PLAT_ */
+#elif IMAGE_BL2U
+# if PLAT_juno
+#  define MAX_XLAT_TABLES              3
+# else
+#  define MAX_XLAT_TABLES              4
+# endif /* PLAT_ */
 #elif IMAGE_BL31
 # define MAX_XLAT_TABLES               2
 #elif IMAGE_BL32
index f8541c75966278970ad2fc136a4f9404b2f7806d..bcb2e2b8aa92aa2feb18d8d684a7a6b12bb4fe36 100644 (file)
@@ -165,6 +165,12 @@ void arm_bl2_plat_arch_setup(void);
 uint32_t arm_get_spsr_for_bl32_entry(void);
 uint32_t arm_get_spsr_for_bl33_entry(void);
 
+/* BL2U utility functions */
+void arm_bl2u_early_platform_setup(struct meminfo *mem_layout,
+                               void *plat_info);
+void arm_bl2u_platform_setup(void);
+void arm_bl2u_plat_arch_setup(void);
+
 /* BL3-1 utility functions */
 void arm_bl31_early_platform_setup(bl31_params_t *from_bl2,
                                void *plat_params_from_bl2);
index 9af73f280af8dd335564b0106a9add0b666df039..62253f8c47535c0f020ad6a28fb10f603704ae2e 100644 (file)
@@ -60,6 +60,14 @@ const mmap_region_t plat_arm_mmap[] = {
        {0}
 };
 #endif
+#if IMAGE_BL2U
+const mmap_region_t plat_arm_mmap[] = {
+       ARM_MAP_SHARED_RAM,
+       CSS_MAP_DEVICE,
+       SOC_CSS_MAP_DEVICE,
+       {0}
+};
+#endif
 #if IMAGE_BL31
 const mmap_region_t plat_arm_mmap[] = {
        ARM_MAP_SHARED_RAM,
index 42a903487bee8bb5ac75e7d806e132d5df86f53a..305505d3053428a18580e12ae6ef994bef405bf5 100644 (file)
@@ -101,6 +101,13 @@ const mmap_region_t plat_arm_mmap[] = {
        {0}
 };
 #endif
+#if IMAGE_BL2U
+const mmap_region_t plat_arm_mmap[] = {
+       MAP_DEVICE0,
+       V2M_MAP_IOFPGA,
+       {0}
+};
+#endif
 #if IMAGE_BL31
 const mmap_region_t plat_arm_mmap[] = {
        ARM_MAP_SHARED_RAM,
diff --git a/plat/arm/board/fvp/fvp_bl2u_setup.c b/plat/arm/board/fvp/fvp_bl2u_setup.c
new file mode 100644 (file)
index 0000000..b26f0e0
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2013-2015, 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:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <plat_arm.h>
+#include "fvp_def.h"
+#include "fvp_private.h"
+
+void bl2u_early_platform_setup(meminfo_t *mem_layout, void *plat_info)
+{
+       arm_bl2u_early_platform_setup(mem_layout, plat_info);
+
+       /* Initialize the platform config for future decision making */
+       fvp_config_setup();
+}
index b6f073943908367a94057845931fe95f8538b1c7..cb5f5d7ed34d16b26de18b099e1e1a747361d05f 100644 (file)
@@ -83,6 +83,9 @@ BL2_SOURCES           +=      drivers/arm/sp804/sp804_delay_timer.c           \
                                plat/arm/board/fvp/fvp_io_storage.c             \
                                plat/arm/board/fvp/fvp_security.c
 
+BL2U_SOURCES           +=      plat/arm/board/fvp/fvp_bl2u_setup.c             \
+                               plat/arm/board/fvp/fvp_security.c
+
 BL31_SOURCES           +=      lib/cpus/aarch64/aem_generic.S                  \
                                lib/cpus/aarch64/cortex_a53.S                   \
                                lib/cpus/aarch64/cortex_a57.S                   \
index 152bd01d427ab71fd9c386d61a8b74387906f87a..fae30e7e1966f5bc4c5e8986a3d8b9e526663553 100644 (file)
@@ -47,6 +47,8 @@ BL1_SOURCES           +=      lib/cpus/aarch64/cortex_a53.S           \
 BL2_SOURCES            +=      plat/arm/board/juno/juno_security.c     \
                                plat/arm/board/juno/juno_err.c
 
+BL2U_SOURCES           +=      plat/arm/board/juno/juno_security.c
+
 BL31_SOURCES           +=      lib/cpus/aarch64/cortex_a53.S           \
                                lib/cpus/aarch64/cortex_a57.S           \
                                lib/cpus/aarch64/cortex_a72.S           \
diff --git a/plat/arm/common/arm_bl2u_setup.c b/plat/arm/common/arm_bl2u_setup.c
new file mode 100644 (file)
index 0000000..5b7354b
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2015, 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:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <arch_helpers.h>
+#include <arm_def.h>
+#include <bl_common.h>
+#include <console.h>
+#include <platform_def.h>
+#include <plat_arm.h>
+#include <string.h>
+
+
+/*
+ * The next 2 constants identify the extents of the code & RO data region.
+ * These addresses are used by the MMU setup code and therefore they must be
+ * page-aligned.  It is the responsibility of the linker script to ensure that
+ * __RO_START__ and __RO_END__ linker symbols refer to page-aligned addresses.
+ */
+#define BL2U_RO_BASE (unsigned long)(&__RO_START__)
+#define BL2U_RO_LIMIT (unsigned long)(&__RO_END__)
+
+#if USE_COHERENT_MEM
+/*
+ * The next 2 constants identify the extents of the coherent memory region.
+ * These addresses are used by the MMU setup code and therefore they must be
+ * page-aligned.  It is the responsibility of the linker script to ensure that
+ * __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols refer to
+ * page-aligned addresses.
+ */
+#define BL2U_COHERENT_RAM_BASE (unsigned long)(&__COHERENT_RAM_START__)
+#define BL2U_COHERENT_RAM_LIMIT (unsigned long)(&__COHERENT_RAM_END__)
+#endif
+
+/* Weak definitions may be overridden in specific ARM standard platform */
+#pragma weak bl2u_platform_setup
+#pragma weak bl2u_early_platform_setup
+#pragma weak bl2u_plat_arch_setup
+
+/*
+ * Perform ARM standard platform setup for BL2U
+ */
+void arm_bl2u_platform_setup(void)
+{
+       /* Initialize the secure environment */
+       plat_arm_security_setup();
+}
+
+void bl2u_platform_setup(void)
+{
+       arm_bl2u_platform_setup();
+}
+
+void arm_bl2u_early_platform_setup(meminfo_t *mem_layout, void *plat_info)
+{
+       /* Initialize the console to provide early debug support */
+       console_init(PLAT_ARM_BOOT_UART_BASE, PLAT_ARM_BOOT_UART_CLK_IN_HZ,
+                       ARM_CONSOLE_BAUDRATE);
+}
+
+/*******************************************************************************
+ * BL1 can pass platform dependent information to BL2U in x1.
+ * In case of ARM CSS platforms x1 contains SCP_BL2U image info.
+ * In case of ARM FVP platforms x1 is not used.
+ * In both cases, x0 contains the extents of the memory available to BL2U
+ ******************************************************************************/
+void bl2u_early_platform_setup(meminfo_t *mem_layout, void *plat_info)
+{
+       arm_bl2u_early_platform_setup(mem_layout, plat_info);
+}
+
+/*******************************************************************************
+ * Perform the very early platform specific architectural setup here. At the
+ * moment this is only initializes the mmu in a quick and dirty way.
+ * The memory that is used by BL2U is only mapped.
+ ******************************************************************************/
+void arm_bl2u_plat_arch_setup(void)
+{
+       arm_configure_mmu_el1(BL2U_RO_LIMIT,
+                             BL31_LIMIT,
+                             BL2U_RO_BASE,
+                             BL2U_RO_LIMIT
+#if USE_COHERENT_MEM
+                             ,
+                             BL2U_COHERENT_RAM_BASE,
+                             BL2U_COHERENT_RAM_LIMIT
+#endif
+               );
+}
+
+void bl2u_plat_arch_setup(void)
+{
+       arm_bl2u_plat_arch_setup();
+}
index 37dfb7e63313b596355260c3246e48d662f50497..2d4e08c61fc508077559d0d7caa711b6e2c1f23a 100644 (file)
@@ -106,6 +106,11 @@ BL2_SOURCES                +=      drivers/arm/tzc400/tzc400.c                     \
                                plat/arm/common/arm_security.c                  \
                                plat/common/aarch64/platform_up_stack.S
 
+BL2U_SOURCES           +=      drivers/arm/tzc400/tzc400.c                     \
+                               plat/arm/common/arm_bl2u_setup.c                \
+                               plat/arm/common/arm_security.c                  \
+                               plat/common/aarch64/platform_up_stack.S
+
 BL31_SOURCES           +=      drivers/arm/cci/cci.c                           \
                                drivers/arm/ccn/ccn.c                           \
                                drivers/arm/tzc400/tzc400.c                     \
diff --git a/plat/arm/css/common/css_bl2u_setup.c b/plat/arm/css/common/css_bl2u_setup.c
new file mode 100644 (file)
index 0000000..878b6fa
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2015, 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:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <bl_common.h>
+#include <debug.h>
+#include <plat_arm.h>
+#include "css_scp_bootloader.h"
+
+/* Weak definition may be overridden in specific CSS based platform */
+#pragma weak bl2u_plat_handle_scp_bl2u
+
+/* Data structure which holds the SCP_BL2U image info for BL2U */
+static image_info_t scp_bl2u_image_info;
+
+/*******************************************************************************
+ * BL1 can pass platform dependent information to BL2U in x1.
+ * In case of ARM CSS platforms x1 contains SCP_BL2U image info.
+ * In case of ARM FVP platforms x1 is not used.
+ * In both cases, x0 contains the extents of the memory available to BL2U
+ ******************************************************************************/
+void bl2u_early_platform_setup(meminfo_t *mem_layout, void *plat_info)
+{
+       if (!plat_info)
+               panic();
+
+       arm_bl2u_early_platform_setup(mem_layout, plat_info);
+
+       scp_bl2u_image_info = *(image_info_t *)plat_info;
+}
+
+/*******************************************************************************
+ * Transfer SCP_BL2U from Trusted RAM using the SCP Download protocol.
+ ******************************************************************************/
+int bl2u_plat_handle_scp_bl2u(void)
+{
+       int ret;
+
+       INFO("BL2U: Initiating SCP_BL2U transfer to SCP\n");
+
+       ret = scp_bootloader_transfer((void *)scp_bl2u_image_info.image_base,
+               scp_bl2u_image_info.image_size);
+
+       if (ret == 0)
+               INFO("BL2U: SCP_BL2U transferred to SCP\n");
+       else
+               ERROR("BL2U: SCP_BL2U transfer failure\n");
+
+       return ret;
+}
index d79c956f28ab60a1073fbe874c91c230c2523d78..161254184b39a3483f1841c68b525a9d97b26550 100644 (file)
@@ -41,6 +41,11 @@ BL2_SOURCES          +=      plat/arm/css/common/css_bl2_setup.c             \
                                plat/arm/css/common/css_scp_bootloader.c        \
                                plat/arm/css/common/css_scpi.c
 
+BL2U_SOURCES           +=      plat/arm/css/common/css_bl2u_setup.c            \
+                               plat/arm/css/common/css_mhu.c                   \
+                               plat/arm/css/common/css_scp_bootloader.c        \
+                               plat/arm/css/common/css_scpi.c
+
 BL31_SOURCES           +=      plat/arm/css/common/css_mhu.c                   \
                                plat/arm/css/common/css_pm.c                    \
                                plat/arm/css/common/css_scpi.c                  \
index f80cbcebef92349d597a2cd3816ba948859fbe32..7ae8fdb72bef1a47c77068424530b6c6c591cdf1 100644 (file)
@@ -36,4 +36,6 @@ BL1_SOURCES           +=      plat/arm/soc/common/soc_css_security.c
 
 BL2_SOURCES            +=      plat/arm/soc/common/soc_css_security.c
 
+BL2U_SOURCES           +=      plat/arm/soc/common/soc_css_security.c
+
 BL31_SOURCES           +=      plat/arm/soc/common/soc_css_security.c