Unverified Commit f478253d authored by davidcunado-arm's avatar davidcunado-arm Committed by GitHub
Browse files

Merge pull request #1232 from masahir0y/uniphier

uniphier: migrate to BL2-AT-EL3
parents 73ba5d40 247fc043
...@@ -3,26 +3,28 @@ ARM Trusted Firmware for Socionext UniPhier SoCs ...@@ -3,26 +3,28 @@ ARM Trusted Firmware for Socionext UniPhier SoCs
Socionext UniPhier ARMv8-A SoCs use ARM Trusted Firmware as the secure world Socionext UniPhier ARMv8-A SoCs use ARM Trusted Firmware as the secure world
firmware, supporting BL1, BL2, and BL31. firmware, supporting BL2 and BL31.
UniPhier SoC family implements its internal boot ROM, so BL1 is used as pseudo UniPhier SoC family implements its internal boot ROM, which loads 64KB [1]_
ROM (i.e. runs in RAM). The internal boot ROM loads 64KB [1]_ image from a image from a non-volatile storage to the on-chip SRAM, and jumps over to it.
non-volatile storage to the on-chip SRAM. Unfortunately, BL1 does not fit in ARM Trusted Firmware provides a special mode, BL2-AT-EL3, which enables BL2 to
the 64KB limit if `Trusted Board Boot`_ (TBB) is enabled. To solve this problem, execute at EL3. It is useful for platforms with non-TF boot ROM, like UniPhier.
Socionext provides a first stage loader called `UniPhier BL`_. This loader runs Here, a problem is BL2 does not fit in the 64KB limit if `Trusted Board Boot`_
in the on-chip SRAM, initializes the DRAM, expands BL1 there, and hands the (TBB) is enabled. To solve this issue, Socionext provides a first stage loader
control over to it. Therefore, all images of ARM Trusted Firmware run in DRAM. called `UniPhier BL`_. This loader runs in the on-chip SRAM, initializes the
DRAM, expands BL2 there, and hands the control over to it. Therefore, all images
of ARM Trusted Firmware run in DRAM.
The UniPhier platform works with/without TBB. See below for the build process The UniPhier platform works with/without TBB. See below for the build process
of each case. The image authentication for the UniPhier platform fully of each case. The image authentication for the UniPhier platform fully
complies with the Trusted Board Boot Requirements (TBBR) specification. complies with the Trusted Board Boot Requirements (TBBR) specification.
The UniPhier BL does not implement the authentication functionality, that is, The UniPhier BL does not implement the authentication functionality, that is,
it can not verify the BL1 image by itself. Instead, the UniPhier BL assures it can not verify the BL2 image by itself. Instead, the UniPhier BL assures
the BL1 validity in a different way; BL1 is GZIP-compressed and appended to the BL2 validity in a different way; BL2 is GZIP-compressed and appended to
the UniPhier BL. The concatenation of the UniPhier BL and the compressed BL1 the UniPhier BL. The concatenation of the UniPhier BL and the compressed BL2
fits in the 64KB limit. The concatenated image is loaded by the boot ROM fits in the 64KB limit. The concatenated image is loaded by the internal boot
(and verified if the chip fuses are blown). ROM (and verified if the chip fuses are blown).
Boot Flow Boot Flow
...@@ -31,32 +33,32 @@ Boot Flow ...@@ -31,32 +33,32 @@ Boot Flow
1. The Boot ROM 1. The Boot ROM
This is hard-wired ROM, so never corrupted. It loads the UniPhier BL (with This is hard-wired ROM, so never corrupted. It loads the UniPhier BL (with
compressed-BL1 appended) into the on-chip SRAM. If the SoC fuses are blown, compressed-BL2 appended) into the on-chip SRAM. If the SoC fuses are blown,
the image is verified by the SoC's own method. the image is verified by the SoC's own method.
2. UniPhier BL 2. UniPhier BL
This runs in the on-chip SRAM. After the minimum SoC initialization and DRAM This runs in the on-chip SRAM. After the minimum SoC initialization and DRAM
setup, it decompresses the appended BL1 image into the DRAM, then jumps to setup, it decompresses the appended BL2 image into the DRAM, then jumps to
the BL1 entry. the BL2 entry.
3. BL1 3. BL2 (at EL3)
This runs in the DRAM. It extracts BL2 from FIP (Firmware Image Package). This runs in the DRAM. It extracts more images such as BL31, BL33 (optionally
If TBB is enabled, the BL2 is authenticated by the standard mechanism of ARM SCP_BL2, BL32 as well) from Firmware Image Package (FIP). If TBB is enabled,
Trusted Firmware. they are all authenticated by the standard mechanism of ARM Trusted Firmware.
After loading all the images, it jumps to the BL31 entry.
4. BL2, BL31, and more 4. BL31, BL32, and BL33
They all run in the DRAM, and are authenticated by the standard mechanism if They all run in the DRAM. See `Firmware Design`_ for details.
TBB is enabled. See `Firmware Design`_ for details.
Basic Build Basic Build
----------- -----------
BL1 must be compressed for the reason above. The UniPhier's platform makefile BL2 must be compressed for the reason above. The UniPhier's platform makefile
provides a build target ``bl1_gzip`` for this. provides a build target ``bl2_gzip`` for this.
For a non-secure boot loader (aka BL33), U-Boot is well supported for UniPhier For a non-secure boot loader (aka BL33), U-Boot is well supported for UniPhier
SoCs. The U-Boot image (``u-boot.bin``) must be built in advance. For the build SoCs. The U-Boot image (``u-boot.bin``) must be built in advance. For the build
...@@ -64,11 +66,11 @@ procedure of U-Boot, refer to the document in the `U-Boot`_ project. ...@@ -64,11 +66,11 @@ procedure of U-Boot, refer to the document in the `U-Boot`_ project.
To build minimum functionality for UniPhier (without TBB):: To build minimum functionality for UniPhier (without TBB)::
make CROSS_COMPILE=<gcc-prefix> PLAT=uniphier BL33=<path-to-BL33> bl1_gzip fip make CROSS_COMPILE=<gcc-prefix> PLAT=uniphier BL33=<path-to-BL33> bl2_gzip fip
Output images: Output images:
- ``bl1.bin.gzip`` - ``bl2.bin.gz``
- ``fip.bin`` - ``fip.bin``
......
/* /*
* Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -27,29 +27,20 @@ ...@@ -27,29 +27,20 @@
#define PLAT_MAX_OFF_STATE 2 #define PLAT_MAX_OFF_STATE 2
#define PLAT_MAX_RET_STATE 1 #define PLAT_MAX_RET_STATE 1
#define UNIPHIER_SEC_DRAM_BASE 0x81000000 #define UNIPHIER_SEC_DRAM_BASE 0x80000000
#define UNIPHIER_SEC_DRAM_LIMIT 0x82000000 #define UNIPHIER_SEC_DRAM_LIMIT 0x82000000
#define UNIPHIER_SEC_DRAM_SIZE ((UNIPHIER_SEC_DRAM_LIMIT) - \ #define UNIPHIER_SEC_DRAM_SIZE ((UNIPHIER_SEC_DRAM_LIMIT) - \
(UNIPHIER_SEC_DRAM_BASE)) (UNIPHIER_SEC_DRAM_BASE))
#define BL1_RO_BASE 0x80000000 #define BL2_BASE (UNIPHIER_SEC_DRAM_BASE)
#define BL1_RO_LIMIT 0x80018000 #define BL2_LIMIT ((BL2_BASE) + 0x00020000)
#define BL1_RW_LIMIT (UNIPHIER_SEC_DRAM_LIMIT)
#define BL1_RW_BASE ((BL1_RW_LIMIT) - 0x00040000)
#define BL2_LIMIT (BL1_RW_BASE) #define BL31_BASE (BL2_LIMIT)
#define BL2_BASE ((BL2_LIMIT) - 0x00040000)
#define BL31_BASE (UNIPHIER_SEC_DRAM_BASE)
#define BL31_LIMIT ((BL31_BASE) + 0x00080000) #define BL31_LIMIT ((BL31_BASE) + 0x00080000)
#define BL32_BASE (BL31_LIMIT) #define BL32_BASE (BL31_LIMIT)
#define BL32_LIMIT (UNIPHIER_SEC_DRAM_LIMIT) #define BL32_LIMIT (UNIPHIER_SEC_DRAM_LIMIT)
#define UNIPHIER_BLOCK_BUF_SIZE 0x00400000
#define UNIPHIER_BLOCK_BUF_BASE ((BL2_BASE) - \
(UNIPHIER_BLOCK_BUF_SIZE))
#define PLAT_PHY_ADDR_SPACE_SIZE (1ULL << 32) #define PLAT_PHY_ADDR_SPACE_SIZE (1ULL << 32)
#define PLAT_VIRT_ADDR_SPACE_SIZE (1ULL << 32) #define PLAT_VIRT_ADDR_SPACE_SIZE (1ULL << 32)
...@@ -63,7 +54,6 @@ ...@@ -63,7 +54,6 @@
#define TSP_SEC_MEM_BASE (BL32_BASE) #define TSP_SEC_MEM_BASE (BL32_BASE)
#define TSP_SEC_MEM_SIZE ((BL32_LIMIT) - (BL32_BASE)) #define TSP_SEC_MEM_SIZE ((BL32_LIMIT) - (BL32_BASE))
#define TSP_PROGBITS_LIMIT (UNIPHIER_BLOCK_BUF_BASE)
#define TSP_IRQ_SEC_PHY_TIMER 29 #define TSP_IRQ_SEC_PHY_TIMER 29
#endif /* __PLATFORM_DEF_H__ */ #endif /* __PLATFORM_DEF_H__ */
# #
# Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. # Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
# #
# SPDX-License-Identifier: BSD-3-Clause # SPDX-License-Identifier: BSD-3-Clause
# #
override COLD_BOOT_SINGLE_CPU := 1 override BL2_AT_EL3 := 1
override ENABLE_PLAT_COMPAT := 0 override COLD_BOOT_SINGLE_CPU := 1
override LOAD_IMAGE_V2 := 1 override ENABLE_PLAT_COMPAT := 0
override USE_COHERENT_MEM := 1 override LOAD_IMAGE_V2 := 1
override USE_TBBR_DEFS := 1 override PROGRAMMABLE_RESET_ADDRESS := 1
override ENABLE_SVE_FOR_NS := 0 override USE_COHERENT_MEM := 1
override USE_TBBR_DEFS := 1
override ENABLE_SVE_FOR_NS := 0
# Cortex-A53 revision r0p4-51rel0 # Cortex-A53 revision r0p4-51rel0
# needed for LD20, unneeded for LD11, PXs3 (no ACE) # needed for LD20, unneeded for LD11, PXs3 (no ACE)
...@@ -27,18 +29,7 @@ include lib/xlat_tables_v2/xlat_tables.mk ...@@ -27,18 +29,7 @@ include lib/xlat_tables_v2/xlat_tables.mk
PLAT_PATH := plat/socionext/uniphier PLAT_PATH := plat/socionext/uniphier
PLAT_INCLUDES := -I$(PLAT_PATH)/include PLAT_INCLUDES := -I$(PLAT_PATH)/include
# IO sources for BL1, BL2 # common sources for BL2, BL31 (and BL32 if SPD=tspd)
IO_SOURCES := drivers/io/io_block.c \
drivers/io/io_fip.c \
drivers/io/io_memmap.c \
drivers/io/io_storage.c \
$(PLAT_PATH)/uniphier_boot_device.c \
$(PLAT_PATH)/uniphier_emmc.c \
$(PLAT_PATH)/uniphier_io_storage.c \
$(PLAT_PATH)/uniphier_nand.c \
$(PLAT_PATH)/uniphier_usb.c
# common sources for BL1, BL2, BL31
PLAT_BL_COMMON_SOURCES += drivers/console/aarch64/console.S \ PLAT_BL_COMMON_SOURCES += drivers/console/aarch64/console.S \
$(PLAT_PATH)/uniphier_console.S \ $(PLAT_PATH)/uniphier_console.S \
$(PLAT_PATH)/uniphier_helpers.S \ $(PLAT_PATH)/uniphier_helpers.S \
...@@ -46,17 +37,21 @@ PLAT_BL_COMMON_SOURCES += drivers/console/aarch64/console.S \ ...@@ -46,17 +37,21 @@ PLAT_BL_COMMON_SOURCES += drivers/console/aarch64/console.S \
$(PLAT_PATH)/uniphier_xlat_setup.c \ $(PLAT_PATH)/uniphier_xlat_setup.c \
${XLAT_TABLES_LIB_SRCS} ${XLAT_TABLES_LIB_SRCS}
BL1_SOURCES += lib/cpus/aarch64/cortex_a53.S \
lib/cpus/aarch64/cortex_a72.S \
$(PLAT_PATH)/uniphier_bl1_helpers.S \
$(PLAT_PATH)/uniphier_bl1_setup.c \
$(IO_SOURCES)
BL2_SOURCES += common/desc_image_load.c \ BL2_SOURCES += common/desc_image_load.c \
drivers/io/io_block.c \
drivers/io/io_fip.c \
drivers/io/io_memmap.c \
drivers/io/io_storage.c \
lib/cpus/aarch64/cortex_a53.S \
lib/cpus/aarch64/cortex_a72.S \
$(PLAT_PATH)/uniphier_bl2_setup.c \ $(PLAT_PATH)/uniphier_bl2_setup.c \
$(PLAT_PATH)/uniphier_boot_device.c \
$(PLAT_PATH)/uniphier_emmc.c \
$(PLAT_PATH)/uniphier_image_desc.c \ $(PLAT_PATH)/uniphier_image_desc.c \
$(PLAT_PATH)/uniphier_io_storage.c \
$(PLAT_PATH)/uniphier_nand.c \
$(PLAT_PATH)/uniphier_scp.c \ $(PLAT_PATH)/uniphier_scp.c \
$(IO_SOURCES) $(PLAT_PATH)/uniphier_usb.c
BL31_SOURCES += drivers/arm/cci/cci.c \ BL31_SOURCES += drivers/arm/cci/cci.c \
drivers/arm/gic/common/gic_common.c \ drivers/arm/gic/common/gic_common.c \
...@@ -82,7 +77,7 @@ include drivers/auth/mbedtls/mbedtls_x509.mk ...@@ -82,7 +77,7 @@ include drivers/auth/mbedtls/mbedtls_x509.mk
PLAT_INCLUDES += -Iinclude/common/tbbr PLAT_INCLUDES += -Iinclude/common/tbbr
TBB_SOURCES := drivers/auth/auth_mod.c \ BL2_SOURCES += drivers/auth/auth_mod.c \
drivers/auth/crypto_mod.c \ drivers/auth/crypto_mod.c \
drivers/auth/img_parser_mod.c \ drivers/auth/img_parser_mod.c \
drivers/auth/tbbr/tbbr_cot.c \ drivers/auth/tbbr/tbbr_cot.c \
...@@ -90,14 +85,10 @@ TBB_SOURCES := drivers/auth/auth_mod.c \ ...@@ -90,14 +85,10 @@ TBB_SOURCES := drivers/auth/auth_mod.c \
$(PLAT_PATH)/uniphier_rotpk.S \ $(PLAT_PATH)/uniphier_rotpk.S \
$(PLAT_PATH)/uniphier_tbbr.c $(PLAT_PATH)/uniphier_tbbr.c
BL1_SOURCES += $(TBB_SOURCES)
BL2_SOURCES += $(TBB_SOURCES)
ROT_KEY = $(BUILD_PLAT)/rot_key.pem ROT_KEY = $(BUILD_PLAT)/rot_key.pem
ROTPK_HASH = $(BUILD_PLAT)/rotpk_sha256.bin ROTPK_HASH = $(BUILD_PLAT)/rotpk_sha256.bin
$(eval $(call add_define_val,ROTPK_HASH,'"$(ROTPK_HASH)"')) $(eval $(call add_define_val,ROTPK_HASH,'"$(ROTPK_HASH)"'))
$(BUILD_PLAT)/bl1/uniphier_rotpk.o: $(ROTPK_HASH)
$(BUILD_PLAT)/bl2/uniphier_rotpk.o: $(ROTPK_HASH) $(BUILD_PLAT)/bl2/uniphier_rotpk.o: $(ROTPK_HASH)
certificates: $(ROT_KEY) certificates: $(ROT_KEY)
...@@ -112,8 +103,8 @@ $(ROTPK_HASH): $(ROT_KEY) ...@@ -112,8 +103,8 @@ $(ROTPK_HASH): $(ROT_KEY)
endif endif
.PHONY: bl1_gzip .PHONY: bl2_gzip
bl1_gzip: $(BUILD_PLAT)/bl1.bin.gzip bl2_gzip: $(BUILD_PLAT)/bl2.bin.gz
%.gzip: % %.gz: %
@echo " GZIP $@" @echo " GZIP $@"
$(Q)gzip -n -f -9 $< --stdout > $@ $(Q)gzip -n -f -9 $< --stdout > $@
/* /*
* Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -67,7 +67,9 @@ void uniphier_gic_pcpu_init(void); ...@@ -67,7 +67,9 @@ void uniphier_gic_pcpu_init(void);
unsigned int uniphier_calc_core_pos(u_register_t mpidr); unsigned int uniphier_calc_core_pos(u_register_t mpidr);
#define UNIPHIER_NS_DRAM_BASE 0x84000000 #define UNIPHIER_NS_DRAM_BASE 0x84000000
#define UNIPHIER_NS_DRAM_SIZE 0x01000000 #define UNIPHIER_NS_DRAM_LIMIT 0x85000000
#define UNIPHIER_NS_DRAM_SIZE ((UNIPHIER_NS_DRAM_LIMIT) - \
(UNIPHIER_NS_DRAM_BASE))
#define UNIPHIER_BL33_BASE (UNIPHIER_NS_DRAM_BASE) #define UNIPHIER_BL33_BASE (UNIPHIER_NS_DRAM_BASE)
#define UNIPHIER_BL33_MAX_SIZE 0x00100000 #define UNIPHIER_BL33_MAX_SIZE 0x00100000
...@@ -76,4 +78,9 @@ unsigned int uniphier_calc_core_pos(u_register_t mpidr); ...@@ -76,4 +78,9 @@ unsigned int uniphier_calc_core_pos(u_register_t mpidr);
(UNIPHIER_BL33_MAX_SIZE)) (UNIPHIER_BL33_MAX_SIZE))
#define UNIPHIER_SCP_MAX_SIZE 0x00020000 #define UNIPHIER_SCP_MAX_SIZE 0x00020000
#define UNIPHIER_BLOCK_BUF_BASE ((UNIPHIER_SCP_BASE) + \
(UNIPHIER_SCP_MAX_SIZE))
#define UNIPHIER_BLOCK_BUF_SIZE ((UNIPHIER_NS_DRAM_LIMIT) - \
(UNIPHIER_BLOCK_BUF_BASE))
#endif /* __UNIPHIER_H__ */ #endif /* __UNIPHIER_H__ */
/*
* Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <arch.h>
#include <asm_macros.S>
.globl plat_get_my_entrypoint
func plat_get_my_entrypoint
mov x0, #0
ret
endfunc plat_get_my_entrypoint
/*
* Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <arch_helpers.h>
#include <bl_common.h>
#include <console.h>
#include <debug.h>
#include <errno.h>
#include <platform.h>
#include <platform_def.h>
#include <xlat_mmu_helpers.h>
#include "uniphier.h"
void bl1_early_platform_setup(void)
{
uniphier_console_setup();
}
void bl1_plat_arch_setup(void)
{
uniphier_mmap_setup(UNIPHIER_SEC_DRAM_BASE, UNIPHIER_SEC_DRAM_SIZE,
NULL);
enable_mmu_el3(0);
}
void bl1_platform_setup(void)
{
unsigned int soc;
int ret;
soc = uniphier_get_soc_id();
if (soc == UNIPHIER_SOC_UNKNOWN) {
ERROR("unsupported SoC\n");
plat_error_handler(-ENOTSUP);
}
ret = uniphier_io_setup(soc);
if (ret) {
ERROR("failed to setup io devices\n");
plat_error_handler(ret);
}
}
static meminfo_t uniphier_tzram_layout = {
.total_base = UNIPHIER_SEC_DRAM_BASE,
.total_size = UNIPHIER_SEC_DRAM_SIZE,
};
meminfo_t *bl1_plat_sec_mem_layout(void)
{
return &uniphier_tzram_layout;
}
/* /*
* Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -15,13 +15,11 @@ ...@@ -15,13 +15,11 @@
#include "uniphier.h" #include "uniphier.h"
static meminfo_t uniphier_bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE);
static int uniphier_bl2_kick_scp; static int uniphier_bl2_kick_scp;
void bl2_early_platform_setup(meminfo_t *mem_layout) void bl2_el3_early_platform_setup(u_register_t x0, u_register_t x1,
u_register_t x2, u_register_t x3)
{ {
uniphier_bl2_tzram_layout = *mem_layout;
uniphier_console_setup(); uniphier_console_setup();
} }
...@@ -32,7 +30,7 @@ static const struct mmap_region uniphier_bl2_mmap[] = { ...@@ -32,7 +30,7 @@ static const struct mmap_region uniphier_bl2_mmap[] = {
{ .size = 0 }, { .size = 0 },
}; };
void bl2_plat_arch_setup(void) void bl2_el3_plat_arch_setup(void)
{ {
unsigned int soc; unsigned int soc;
int skip_scp = 0; int skip_scp = 0;
...@@ -40,7 +38,7 @@ void bl2_plat_arch_setup(void) ...@@ -40,7 +38,7 @@ void bl2_plat_arch_setup(void)
uniphier_mmap_setup(UNIPHIER_SEC_DRAM_BASE, UNIPHIER_SEC_DRAM_SIZE, uniphier_mmap_setup(UNIPHIER_SEC_DRAM_BASE, UNIPHIER_SEC_DRAM_SIZE,
uniphier_bl2_mmap); uniphier_bl2_mmap);
enable_mmu_el1(0); enable_mmu_el3(0);
soc = uniphier_get_soc_id(); soc = uniphier_get_soc_id();
if (soc == UNIPHIER_SOC_UNKNOWN) { if (soc == UNIPHIER_SOC_UNKNOWN) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment