Commit 5e3325e7 authored by Victor Chong's avatar Victor Chong
Browse files

hikey960: Add BL32 (OP-TEE) support


Signed-off-by: default avatarVictor Chong <victor.chong@linaro.org>
Acked-by: default avatarHaojian Zhuang <haojian.zhuang@linaro.org>
parent af026541
...@@ -14,6 +14,9 @@ Code Locations ...@@ -14,6 +14,9 @@ Code Locations
- ARM Trusted Firmware: - ARM Trusted Firmware:
`link <https://github.com/ARM-software/arm-trusted-firmware>`__ `link <https://github.com/ARM-software/arm-trusted-firmware>`__
- OP-TEE:
`link <https://github.com/OP-TEE/optee_os>`__
- edk2: - edk2:
`link <https://github.com/96boards-hikey/edk2/tree/testing/hikey960_v2.5>`__ `link <https://github.com/96boards-hikey/edk2/tree/testing/hikey960_v2.5>`__
...@@ -62,7 +65,7 @@ Build Procedure ...@@ -62,7 +65,7 @@ Build Procedure
EDK2_OUTPUT_DIR=${EDK2_DIR}/Build/HiKey960/${BUILD_OPTION}_${AARCH64_TOOLCHAIN} EDK2_OUTPUT_DIR=${EDK2_DIR}/Build/HiKey960/${BUILD_OPTION}_${AARCH64_TOOLCHAIN}
cd ${EDK2_DIR} cd ${EDK2_DIR}
# Build UEFI & ARM Trust Firmware # Build UEFI & ARM Trust Firmware
${UEFI_TOOLS_DIR}/uefi-build.sh -b ${BUILD_OPTION} -a ../arm-trusted-firmware hikey960 ${UEFI_TOOLS_DIR}/uefi-build.sh -b ${BUILD_OPTION} -a ../arm-trusted-firmware -s ../optee_os hikey960
# Generate l-loader.bin # Generate l-loader.bin
cd ${BUILD_PATH}/l-loader cd ${BUILD_PATH}/l-loader
ln -sf ${EDK2_OUTPUT_DIR}/FV/bl1.bin ln -sf ${EDK2_OUTPUT_DIR}/FV/bl1.bin
......
...@@ -37,6 +37,10 @@ ...@@ -37,6 +37,10 @@
HIKEY960_UFS_DESC_SIZE, \ HIKEY960_UFS_DESC_SIZE, \
MT_MEMORY | MT_RW | MT_NS) MT_MEMORY | MT_RW | MT_NS)
#define MAP_TSP_MEM MAP_REGION_FLAT(TSP_SEC_MEM_BASE, \
TSP_SEC_MEM_SIZE, \
MT_MEMORY | MT_RW | MT_SECURE)
/* /*
* Table of regions for different BL stages to map using the MMU. * Table of regions for different BL stages to map using the MMU.
* This doesn't include Trusted RAM as the 'mem_layout' argument passed to * This doesn't include Trusted RAM as the 'mem_layout' argument passed to
...@@ -56,6 +60,7 @@ static const mmap_region_t hikey960_mmap[] = { ...@@ -56,6 +60,7 @@ static const mmap_region_t hikey960_mmap[] = {
static const mmap_region_t hikey960_mmap[] = { static const mmap_region_t hikey960_mmap[] = {
MAP_DDR, MAP_DDR,
MAP_DEVICE, MAP_DEVICE,
MAP_TSP_MEM,
{0} {0}
}; };
#endif #endif
...@@ -63,6 +68,15 @@ static const mmap_region_t hikey960_mmap[] = { ...@@ -63,6 +68,15 @@ static const mmap_region_t hikey960_mmap[] = {
#if IMAGE_BL31 #if IMAGE_BL31
static const mmap_region_t hikey960_mmap[] = { static const mmap_region_t hikey960_mmap[] = {
MAP_DEVICE, MAP_DEVICE,
MAP_TSP_MEM,
{0}
};
#endif
#if IMAGE_BL32
static const mmap_region_t hikey960_mmap[] = {
MAP_DEVICE,
MAP_DDR,
{0} {0}
}; };
#endif #endif
......
...@@ -177,6 +177,41 @@ void bl2_plat_set_bl31_ep_info(image_info_t *image, ...@@ -177,6 +177,41 @@ void bl2_plat_set_bl31_ep_info(image_info_t *image,
DISABLE_ALL_EXCEPTIONS); DISABLE_ALL_EXCEPTIONS);
} }
/*******************************************************************************
* Before calling this function BL32 is loaded in memory and its entrypoint
* is set by load_image. This is a placeholder for the platform to change
* the entrypoint of BL32 and set SPSR and security state.
* On Hikey we only set the security state of the entrypoint
******************************************************************************/
#ifdef BL32_BASE
void bl2_plat_set_bl32_ep_info(image_info_t *bl32_image_info,
entry_point_info_t *bl32_ep_info)
{
SET_SECURITY_STATE(bl32_ep_info->h.attr, SECURE);
/*
* The Secure Payload Dispatcher service is responsible for
* setting the SPSR prior to entry into the BL32 image.
*/
bl32_ep_info->spsr = 0;
}
/*******************************************************************************
* Populate the extents of memory available for loading BL32
******************************************************************************/
void bl2_plat_get_bl32_meminfo(meminfo_t *bl32_meminfo)
{
/*
* Populate the extents of memory available for loading BL32.
*/
bl32_meminfo->total_base = BL32_BASE;
bl32_meminfo->free_base = BL32_BASE;
bl32_meminfo->total_size =
(TSP_SEC_MEM_BASE + TSP_SEC_MEM_SIZE) - BL32_BASE;
bl32_meminfo->free_size =
(TSP_SEC_MEM_BASE + TSP_SEC_MEM_SIZE) - BL32_BASE;
}
#endif /* BL32_BASE */
void bl2_plat_set_bl33_ep_info(image_info_t *image, void bl2_plat_set_bl33_ep_info(image_info_t *image,
entry_point_info_t *bl33_ep_info) entry_point_info_t *bl33_ep_info)
{ {
......
...@@ -16,6 +16,25 @@ ...@@ -16,6 +16,25 @@
#define DEVICE_BASE 0xE0000000 #define DEVICE_BASE 0xE0000000
#define DEVICE_SIZE 0x20000000 #define DEVICE_SIZE 0x20000000
/* Memory location options for TSP */
#define HIKEY960_SRAM_ID 0
#define HIKEY960_DRAM_ID 1
/*
* DDR for OP-TEE (32MB from 0x3E00000-0x3FFFFFFF) is divided in several
* regions:
* - Secure DDR (default is the top 16MB) used by OP-TEE
* - Non-secure DDR used by OP-TEE (shared memory and padding) (4MB)
* - Secure DDR (4MB aligned on 4MB) for OP-TEE's "Secure Data Path" feature
* - Non-secure DDR (8MB) reserved for OP-TEE's future use
*/
#define DDR_SEC_SIZE 0x01000000
#define DDR_SEC_BASE 0x3F000000
#define DDR_SDP_SIZE 0x00400000
#define DDR_SDP_BASE (DDR_SEC_BASE - 0x400000 /* align */ - \
DDR_SDP_SIZE)
/* /*
* PL011 related constants * PL011 related constants
*/ */
......
...@@ -69,6 +69,10 @@ static const io_uuid_spec_t bl31_uuid_spec = { ...@@ -69,6 +69,10 @@ static const io_uuid_spec_t bl31_uuid_spec = {
.uuid = UUID_EL3_RUNTIME_FIRMWARE_BL31, .uuid = UUID_EL3_RUNTIME_FIRMWARE_BL31,
}; };
static const io_uuid_spec_t bl32_uuid_spec = {
.uuid = UUID_SECURE_PAYLOAD_BL32,
};
static const io_uuid_spec_t bl33_uuid_spec = { static const io_uuid_spec_t bl33_uuid_spec = {
.uuid = UUID_NON_TRUSTED_FIRMWARE_BL33, .uuid = UUID_NON_TRUSTED_FIRMWARE_BL33,
}; };
...@@ -94,6 +98,11 @@ static const struct plat_io_policy policies[] = { ...@@ -94,6 +98,11 @@ static const struct plat_io_policy policies[] = {
(uintptr_t)&bl31_uuid_spec, (uintptr_t)&bl31_uuid_spec,
check_fip check_fip
}, },
[BL32_IMAGE_ID] = {
&fip_dev_handle,
(uintptr_t)&bl32_uuid_spec,
check_fip
},
[BL33_IMAGE_ID] = { [BL33_IMAGE_ID] = {
&fip_dev_handle, &fip_dev_handle,
(uintptr_t)&bl33_uuid_spec, (uintptr_t)&bl33_uuid_spec,
......
...@@ -63,6 +63,27 @@ ...@@ -63,6 +63,27 @@
#define BL31_BASE (BL2_LIMIT) /* 1AC5_8000 */ #define BL31_BASE (BL2_LIMIT) /* 1AC5_8000 */
#define BL31_LIMIT (BL31_BASE + 0x40000) /* 1AC9_8000 */ #define BL31_LIMIT (BL31_BASE + 0x40000) /* 1AC9_8000 */
/*
* BL3-2 specific defines.
*/
/*
* The TSP currently executes from TZC secured area of DRAM.
*/
#define BL32_DRAM_BASE DDR_SEC_BASE
#define BL32_DRAM_LIMIT (DDR_SEC_BASE+DDR_SEC_SIZE)
#if (HIKEY960_TSP_RAM_LOCATION_ID == HIKEY960_DRAM_ID)
#define TSP_SEC_MEM_BASE BL32_DRAM_BASE
#define TSP_SEC_MEM_SIZE (BL32_DRAM_LIMIT - BL32_DRAM_BASE)
#define BL32_BASE BL32_DRAM_BASE
#define BL32_LIMIT BL32_DRAM_LIMIT
#elif (HIKEY960_TSP_RAM_LOCATION_ID == HIKEY960_SRAM_ID)
#error "SRAM storage of TSP payload is currently unsupported"
#else
#error "Currently unsupported HIKEY960_TSP_LOCATION_ID value"
#endif
#define NS_BL1U_BASE (BL31_LIMIT) /* 1AC9_8000 */ #define NS_BL1U_BASE (BL31_LIMIT) /* 1AC9_8000 */
#define NS_BL1U_SIZE (0x00100000) #define NS_BL1U_SIZE (0x00100000)
#define NS_BL1U_LIMIT (NS_BL1U_BASE + NS_BL1U_SIZE) #define NS_BL1U_LIMIT (NS_BL1U_BASE + NS_BL1U_SIZE)
...@@ -70,7 +91,7 @@ ...@@ -70,7 +91,7 @@
#define HIKEY960_NS_IMAGE_OFFSET (0x1AC18000) /* offset in l-loader */ #define HIKEY960_NS_IMAGE_OFFSET (0x1AC18000) /* offset in l-loader */
#define HIKEY960_NS_TMP_OFFSET (0x1AE00000) #define HIKEY960_NS_TMP_OFFSET (0x1AE00000)
#define SCP_BL2_BASE BL31_BASE #define SCP_BL2_BASE BL31_BASE /* 1AC5_8000 */
#define SCP_MEM_BASE (0x89C80000) #define SCP_MEM_BASE (0x89C80000)
#define SCP_MEM_SIZE (0x00040000) #define SCP_MEM_SIZE (0x00040000)
...@@ -80,7 +101,7 @@ ...@@ -80,7 +101,7 @@
*/ */
#define ADDR_SPACE_SIZE (1ull << 32) #define ADDR_SPACE_SIZE (1ull << 32)
#if IMAGE_BL1 || IMAGE_BL2 || IMAGE_BL31 #if IMAGE_BL1 || IMAGE_BL2 || IMAGE_BL31 || IMAGE_BL32
#define MAX_XLAT_TABLES 3 #define MAX_XLAT_TABLES 3
#endif #endif
......
...@@ -4,11 +4,22 @@ ...@@ -4,11 +4,22 @@
# SPDX-License-Identifier: BSD-3-Clause # SPDX-License-Identifier: BSD-3-Clause
# #
# On Hikey960, the TSP can execute from TZC secure area in DRAM.
HIKEY960_TSP_RAM_LOCATION := dram
ifeq (${HIKEY960_TSP_RAM_LOCATION}, dram)
HIKEY960_TSP_RAM_LOCATION_ID = HIKEY960_DRAM_ID
else ifeq (${HIKEY960_TSP_RAM_LOCATION}, sram)
HIKEY960_TSP_RAM_LOCATION_ID := HIKEY960_SRAM_ID
else
$(error "Currently unsupported HIKEY960_TSP_RAM_LOCATION value")
endif
CRASH_CONSOLE_BASE := PL011_UART6_BASE CRASH_CONSOLE_BASE := PL011_UART6_BASE
COLD_BOOT_SINGLE_CPU := 1 COLD_BOOT_SINGLE_CPU := 1
PROGRAMMABLE_RESET_ADDRESS := 1 PROGRAMMABLE_RESET_ADDRESS := 1
# Process flags # Process flags
$(eval $(call add_define,HIKEY960_TSP_RAM_LOCATION_ID))
$(eval $(call add_define,CRASH_CONSOLE_BASE)) $(eval $(call add_define,CRASH_CONSOLE_BASE))
ENABLE_PLAT_COMPAT := 0 ENABLE_PLAT_COMPAT := 0
......
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