GK SDK 源码库: XMIPCLinuxV100R005C00SPC030 (kernel/tools/open_source excluded)
This commit is contained in:
+136
@@ -0,0 +1,136 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <platform_def.h>
|
||||
|
||||
#include <common/bl_common.h>
|
||||
#include <common/desc_image_load.h>
|
||||
#include <plat/common/platform.h>
|
||||
|
||||
/*******************************************************************************
|
||||
* Following descriptor provides BL image/ep information that gets used
|
||||
* by BL2 to load the images and also subset of this information is
|
||||
* passed to next BL image. The image loading sequence is managed by
|
||||
* populating the images in required loading order. The image execution
|
||||
* sequence is managed by populating the `next_handoff_image_id` with
|
||||
* the next executable image id.
|
||||
******************************************************************************/
|
||||
static bl_mem_params_node_t bl2_mem_params_descs[] = {
|
||||
|
||||
/* Fill BL31 related information */
|
||||
{
|
||||
.image_id = BL31_IMAGE_ID,
|
||||
|
||||
SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP,
|
||||
VERSION_2, entry_point_info_t,
|
||||
SECURE | EXECUTABLE | EP_FIRST_EXE),
|
||||
.ep_info.pc = BL31_BASE,
|
||||
.ep_info.spsr = SPSR_64(MODE_EL3, MODE_SP_ELX,
|
||||
DISABLE_ALL_EXCEPTIONS),
|
||||
#if DEBUG
|
||||
.ep_info.args.arg1 = RPI3_BL31_PLAT_PARAM_VAL,
|
||||
#endif
|
||||
SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
|
||||
VERSION_2, image_info_t,
|
||||
IMAGE_ATTRIB_PLAT_SETUP),
|
||||
.image_info.image_base = BL31_BASE,
|
||||
.image_info.image_max_size = BL31_LIMIT - BL31_BASE,
|
||||
|
||||
# ifdef BL32_BASE
|
||||
.next_handoff_image_id = BL32_IMAGE_ID,
|
||||
# else
|
||||
.next_handoff_image_id = BL33_IMAGE_ID,
|
||||
# endif
|
||||
},
|
||||
|
||||
# ifdef BL32_BASE
|
||||
/* Fill BL32 related information */
|
||||
{
|
||||
.image_id = BL32_IMAGE_ID,
|
||||
|
||||
SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP,
|
||||
VERSION_2, entry_point_info_t,
|
||||
SECURE | EXECUTABLE),
|
||||
.ep_info.pc = BL32_BASE,
|
||||
|
||||
SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
|
||||
VERSION_2, image_info_t, 0),
|
||||
.image_info.image_base = BL32_BASE,
|
||||
.image_info.image_max_size = BL32_LIMIT - BL32_BASE,
|
||||
|
||||
.next_handoff_image_id = BL33_IMAGE_ID,
|
||||
},
|
||||
|
||||
/*
|
||||
* Fill BL32 external 1 related information.
|
||||
* A typical use for extra1 image is with OP-TEE where it is the pager
|
||||
* image.
|
||||
*/
|
||||
{
|
||||
.image_id = BL32_EXTRA1_IMAGE_ID,
|
||||
|
||||
SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP,
|
||||
VERSION_2, entry_point_info_t,
|
||||
SECURE | NON_EXECUTABLE),
|
||||
|
||||
SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
|
||||
VERSION_2, image_info_t,
|
||||
IMAGE_ATTRIB_SKIP_LOADING),
|
||||
.image_info.image_base = BL32_BASE,
|
||||
.image_info.image_max_size = BL32_LIMIT - BL32_BASE,
|
||||
|
||||
.next_handoff_image_id = INVALID_IMAGE_ID,
|
||||
},
|
||||
|
||||
/*
|
||||
* Fill BL32 external 2 related information.
|
||||
* A typical use for extra2 image is with OP-TEE where it is the paged
|
||||
* image.
|
||||
*/
|
||||
{
|
||||
.image_id = BL32_EXTRA2_IMAGE_ID,
|
||||
|
||||
SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP,
|
||||
VERSION_2, entry_point_info_t,
|
||||
SECURE | NON_EXECUTABLE),
|
||||
|
||||
SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
|
||||
VERSION_2, image_info_t,
|
||||
IMAGE_ATTRIB_SKIP_LOADING),
|
||||
#ifdef SPD_opteed
|
||||
.image_info.image_base = RPI3_OPTEE_PAGEABLE_LOAD_BASE,
|
||||
.image_info.image_max_size = RPI3_OPTEE_PAGEABLE_LOAD_SIZE,
|
||||
#endif
|
||||
.next_handoff_image_id = INVALID_IMAGE_ID,
|
||||
},
|
||||
# endif /* BL32_BASE */
|
||||
|
||||
/* Fill BL33 related information */
|
||||
{
|
||||
.image_id = BL33_IMAGE_ID,
|
||||
SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP,
|
||||
VERSION_2, entry_point_info_t,
|
||||
NON_SECURE | EXECUTABLE),
|
||||
# ifdef PRELOADED_BL33_BASE
|
||||
.ep_info.pc = PRELOADED_BL33_BASE,
|
||||
|
||||
SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
|
||||
VERSION_2, image_info_t,
|
||||
IMAGE_ATTRIB_SKIP_LOADING),
|
||||
# else
|
||||
.ep_info.pc = PLAT_RPI3_NS_IMAGE_OFFSET,
|
||||
|
||||
SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
|
||||
VERSION_2, image_info_t, 0),
|
||||
.image_info.image_base = PLAT_RPI3_NS_IMAGE_OFFSET,
|
||||
.image_info.image_max_size = PLAT_RPI3_NS_IMAGE_MAX_SIZE,
|
||||
# endif /* PRELOADED_BL33_BASE */
|
||||
|
||||
.next_handoff_image_id = INVALID_IMAGE_ID,
|
||||
}
|
||||
};
|
||||
|
||||
REGISTER_BL_IMAGE_DESCS(bl2_mem_params_descs)
|
||||
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
#ifndef PLAT_MACROS_S
|
||||
#define PLAT_MACROS_S
|
||||
|
||||
/* ---------------------------------------------
|
||||
* The below required platform porting macro
|
||||
* prints out relevant platform registers
|
||||
* whenever an unhandled exception is taken in
|
||||
* BL31.
|
||||
* Clobbers: x0 - x10, x16, x17, sp
|
||||
* ---------------------------------------------
|
||||
*/
|
||||
.macro plat_crash_print_regs
|
||||
.endm
|
||||
|
||||
#endif /* PLAT_MACROS_S */
|
||||
@@ -0,0 +1,263 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef PLATFORM_DEF_H
|
||||
#define PLATFORM_DEF_H
|
||||
|
||||
#include <arch.h>
|
||||
#include <common/tbbr/tbbr_img_def.h>
|
||||
#include <lib/utils_def.h>
|
||||
#include <plat/common/common_def.h>
|
||||
|
||||
#include "rpi_hw.h"
|
||||
|
||||
/* Special value used to verify platform parameters from BL2 to BL31 */
|
||||
#define RPI3_BL31_PLAT_PARAM_VAL ULL(0x0F1E2D3C4B5A6978)
|
||||
|
||||
#define PLATFORM_STACK_SIZE ULL(0x1000)
|
||||
|
||||
#define PLATFORM_MAX_CPUS_PER_CLUSTER U(4)
|
||||
#define PLATFORM_CLUSTER_COUNT U(1)
|
||||
#define PLATFORM_CLUSTER0_CORE_COUNT PLATFORM_MAX_CPUS_PER_CLUSTER
|
||||
#define PLATFORM_CORE_COUNT PLATFORM_CLUSTER0_CORE_COUNT
|
||||
|
||||
#define RPI_PRIMARY_CPU U(0)
|
||||
|
||||
#define PLAT_MAX_PWR_LVL MPIDR_AFFLVL1
|
||||
#define PLAT_NUM_PWR_DOMAINS (PLATFORM_CLUSTER_COUNT + \
|
||||
PLATFORM_CORE_COUNT)
|
||||
|
||||
#define PLAT_MAX_RET_STATE U(1)
|
||||
#define PLAT_MAX_OFF_STATE U(2)
|
||||
|
||||
/* Local power state for power domains in Run state. */
|
||||
#define PLAT_LOCAL_STATE_RUN U(0)
|
||||
/* Local power state for retention. Valid only for CPU power domains */
|
||||
#define PLAT_LOCAL_STATE_RET U(1)
|
||||
/*
|
||||
* Local power state for OFF/power-down. Valid for CPU and cluster power
|
||||
* domains.
|
||||
*/
|
||||
#define PLAT_LOCAL_STATE_OFF U(2)
|
||||
|
||||
/*
|
||||
* Macros used to parse state information from State-ID if it is using the
|
||||
* recommended encoding for State-ID.
|
||||
*/
|
||||
#define PLAT_LOCAL_PSTATE_WIDTH U(4)
|
||||
#define PLAT_LOCAL_PSTATE_MASK ((U(1) << PLAT_LOCAL_PSTATE_WIDTH) - 1)
|
||||
|
||||
/*
|
||||
* Some data must be aligned on the biggest cache line size in the platform.
|
||||
* This is known only to the platform as it might have a combination of
|
||||
* integrated and external caches.
|
||||
*/
|
||||
#define CACHE_WRITEBACK_SHIFT U(6)
|
||||
#define CACHE_WRITEBACK_GRANULE (U(1) << CACHE_WRITEBACK_SHIFT)
|
||||
|
||||
/*
|
||||
* Partition memory into secure ROM, non-secure DRAM, secure "SRAM", and
|
||||
* secure DRAM. Note that this is all actually DRAM with different names,
|
||||
* there is no Secure RAM in the Raspberry Pi 3.
|
||||
*/
|
||||
#if RPI3_USE_UEFI_MAP
|
||||
#define SEC_ROM_BASE ULL(0x00000000)
|
||||
#define SEC_ROM_SIZE ULL(0x00010000)
|
||||
|
||||
/* FIP placed after ROM to append it to BL1 with very little padding. */
|
||||
#define PLAT_RPI3_FIP_BASE ULL(0x00020000)
|
||||
#define PLAT_RPI3_FIP_MAX_SIZE ULL(0x00010000)
|
||||
|
||||
/* Reserve 2M of secure SRAM and DRAM, starting at 2M */
|
||||
#define SEC_SRAM_BASE ULL(0x00200000)
|
||||
#define SEC_SRAM_SIZE ULL(0x00100000)
|
||||
|
||||
#define SEC_DRAM0_BASE ULL(0x00300000)
|
||||
#define SEC_DRAM0_SIZE ULL(0x00100000)
|
||||
|
||||
/* Windows on ARM requires some RAM at 4M */
|
||||
#define NS_DRAM0_BASE ULL(0x00400000)
|
||||
#define NS_DRAM0_SIZE ULL(0x00C00000)
|
||||
#else
|
||||
#define SEC_ROM_BASE ULL(0x00000000)
|
||||
#define SEC_ROM_SIZE ULL(0x00020000)
|
||||
|
||||
/* FIP placed after ROM to append it to BL1 with very little padding. */
|
||||
#define PLAT_RPI3_FIP_BASE ULL(0x00020000)
|
||||
#define PLAT_RPI3_FIP_MAX_SIZE ULL(0x001E0000)
|
||||
|
||||
/* We have 16M of memory reserved starting at 256M */
|
||||
#define SEC_SRAM_BASE ULL(0x10000000)
|
||||
#define SEC_SRAM_SIZE ULL(0x00100000)
|
||||
|
||||
#define SEC_DRAM0_BASE ULL(0x10100000)
|
||||
#define SEC_DRAM0_SIZE ULL(0x00F00000)
|
||||
/* End of reserved memory */
|
||||
|
||||
#define NS_DRAM0_BASE ULL(0x11000000)
|
||||
#define NS_DRAM0_SIZE ULL(0x01000000)
|
||||
#endif /* RPI3_USE_UEFI_MAP */
|
||||
|
||||
/*
|
||||
* BL33 entrypoint.
|
||||
*/
|
||||
#define PLAT_RPI3_NS_IMAGE_OFFSET NS_DRAM0_BASE
|
||||
#define PLAT_RPI3_NS_IMAGE_MAX_SIZE NS_DRAM0_SIZE
|
||||
|
||||
/*
|
||||
* I/O registers.
|
||||
*/
|
||||
#define DEVICE0_BASE RPI_IO_BASE
|
||||
#define DEVICE0_SIZE RPI_IO_SIZE
|
||||
|
||||
/*
|
||||
* Arm TF lives in SRAM, partition it here
|
||||
*/
|
||||
#define SHARED_RAM_BASE SEC_SRAM_BASE
|
||||
#define SHARED_RAM_SIZE ULL(0x00001000)
|
||||
|
||||
#define BL_RAM_BASE (SHARED_RAM_BASE + SHARED_RAM_SIZE)
|
||||
#define BL_RAM_SIZE (SEC_SRAM_SIZE - SHARED_RAM_SIZE)
|
||||
|
||||
/*
|
||||
* Mailbox to control the secondary cores.All secondary cores are held in a wait
|
||||
* loop in cold boot. To release them perform the following steps (plus any
|
||||
* additional barriers that may be needed):
|
||||
*
|
||||
* uint64_t *entrypoint = (uint64_t *)PLAT_RPI3_TM_ENTRYPOINT;
|
||||
* *entrypoint = ADDRESS_TO_JUMP_TO;
|
||||
*
|
||||
* uint64_t *mbox_entry = (uint64_t *)PLAT_RPI3_TM_HOLD_BASE;
|
||||
* mbox_entry[cpu_id] = PLAT_RPI3_TM_HOLD_STATE_GO;
|
||||
*
|
||||
* sev();
|
||||
*/
|
||||
#define PLAT_RPI3_TRUSTED_MAILBOX_BASE SHARED_RAM_BASE
|
||||
|
||||
/* The secure entry point to be used on warm reset by all CPUs. */
|
||||
#define PLAT_RPI3_TM_ENTRYPOINT PLAT_RPI3_TRUSTED_MAILBOX_BASE
|
||||
#define PLAT_RPI3_TM_ENTRYPOINT_SIZE ULL(8)
|
||||
|
||||
/* Hold entries for each CPU. */
|
||||
#define PLAT_RPI3_TM_HOLD_BASE (PLAT_RPI3_TM_ENTRYPOINT + \
|
||||
PLAT_RPI3_TM_ENTRYPOINT_SIZE)
|
||||
#define PLAT_RPI3_TM_HOLD_ENTRY_SIZE ULL(8)
|
||||
#define PLAT_RPI3_TM_HOLD_SIZE (PLAT_RPI3_TM_HOLD_ENTRY_SIZE * \
|
||||
PLATFORM_CORE_COUNT)
|
||||
|
||||
#define PLAT_RPI3_TRUSTED_MAILBOX_SIZE (PLAT_RPI3_TM_ENTRYPOINT_SIZE + \
|
||||
PLAT_RPI3_TM_HOLD_SIZE)
|
||||
|
||||
#define PLAT_RPI3_TM_HOLD_STATE_WAIT ULL(0)
|
||||
#define PLAT_RPI3_TM_HOLD_STATE_GO ULL(1)
|
||||
#define PLAT_RPI3_TM_HOLD_STATE_BSP_OFF ULL(2)
|
||||
|
||||
/*
|
||||
* BL1 specific defines.
|
||||
*
|
||||
* BL1 RW data is relocated from ROM to RAM at runtime so we need 2 sets of
|
||||
* addresses.
|
||||
*
|
||||
* Put BL1 RW at the top of the Secure SRAM. BL1_RW_BASE is calculated using
|
||||
* the current BL1 RW debug size plus a little space for growth.
|
||||
*/
|
||||
#define PLAT_MAX_BL1_RW_SIZE ULL(0x12000)
|
||||
|
||||
#define BL1_RO_BASE SEC_ROM_BASE
|
||||
#define BL1_RO_LIMIT (SEC_ROM_BASE + SEC_ROM_SIZE)
|
||||
#define BL1_RW_BASE (BL1_RW_LIMIT - PLAT_MAX_BL1_RW_SIZE)
|
||||
#define BL1_RW_LIMIT (BL_RAM_BASE + BL_RAM_SIZE)
|
||||
|
||||
/*
|
||||
* BL2 specific defines.
|
||||
*
|
||||
* Put BL2 just below BL31. BL2_BASE is calculated using the current BL2 debug
|
||||
* size plus a little space for growth.
|
||||
*/
|
||||
#define PLAT_MAX_BL2_SIZE ULL(0x2C000)
|
||||
|
||||
#define BL2_BASE (BL2_LIMIT - PLAT_MAX_BL2_SIZE)
|
||||
#define BL2_LIMIT BL31_BASE
|
||||
|
||||
/*
|
||||
* BL31 specific defines.
|
||||
*
|
||||
* Put BL31 at the top of the Trusted SRAM. BL31_BASE is calculated using the
|
||||
* current BL31 debug size plus a little space for growth.
|
||||
*/
|
||||
#define PLAT_MAX_BL31_SIZE ULL(0x20000)
|
||||
|
||||
#define BL31_BASE (BL31_LIMIT - PLAT_MAX_BL31_SIZE)
|
||||
#define BL31_LIMIT (BL_RAM_BASE + BL_RAM_SIZE)
|
||||
#define BL31_PROGBITS_LIMIT BL1_RW_BASE
|
||||
|
||||
/*
|
||||
* BL32 specific defines.
|
||||
*
|
||||
* BL32 can execute from Secure SRAM or Secure DRAM.
|
||||
*/
|
||||
#define BL32_SRAM_BASE BL_RAM_BASE
|
||||
#define BL32_SRAM_LIMIT BL31_BASE
|
||||
#define BL32_DRAM_BASE SEC_DRAM0_BASE
|
||||
#define BL32_DRAM_LIMIT (SEC_DRAM0_BASE + SEC_DRAM0_SIZE)
|
||||
|
||||
#ifdef SPD_opteed
|
||||
/* Load pageable part of OP-TEE at end of allocated DRAM space for BL32 */
|
||||
#define RPI3_OPTEE_PAGEABLE_LOAD_SIZE 0x080000 /* 512KB */
|
||||
#define RPI3_OPTEE_PAGEABLE_LOAD_BASE (BL32_DRAM_LIMIT - \
|
||||
RPI3_OPTEE_PAGEABLE_LOAD_SIZE)
|
||||
#endif
|
||||
|
||||
#define SEC_SRAM_ID 0
|
||||
#define SEC_DRAM_ID 1
|
||||
|
||||
#if RPI3_BL32_RAM_LOCATION_ID == SEC_SRAM_ID
|
||||
# define BL32_MEM_BASE BL_RAM_BASE
|
||||
# define BL32_MEM_SIZE BL_RAM_SIZE
|
||||
# define BL32_BASE BL32_SRAM_BASE
|
||||
# define BL32_LIMIT BL32_SRAM_LIMIT
|
||||
#elif RPI3_BL32_RAM_LOCATION_ID == SEC_DRAM_ID
|
||||
# define BL32_MEM_BASE SEC_DRAM0_BASE
|
||||
# define BL32_MEM_SIZE SEC_DRAM0_SIZE
|
||||
# define BL32_BASE BL32_DRAM_BASE
|
||||
# define BL32_LIMIT BL32_DRAM_LIMIT
|
||||
#else
|
||||
# error "Unsupported RPI3_BL32_RAM_LOCATION_ID value"
|
||||
#endif
|
||||
#define BL32_SIZE (BL32_LIMIT - BL32_BASE)
|
||||
|
||||
#ifdef SPD_none
|
||||
#undef BL32_BASE
|
||||
#endif /* SPD_none */
|
||||
|
||||
/*
|
||||
* Other memory-related defines.
|
||||
*/
|
||||
#define PLAT_PHY_ADDR_SPACE_SIZE (ULL(1) << 32)
|
||||
#define PLAT_VIRT_ADDR_SPACE_SIZE (ULL(1) << 32)
|
||||
|
||||
#define MAX_MMAP_REGIONS 8
|
||||
#define MAX_XLAT_TABLES 4
|
||||
|
||||
#define MAX_IO_DEVICES U(3)
|
||||
#define MAX_IO_HANDLES U(4)
|
||||
|
||||
#define MAX_IO_BLOCK_DEVICES U(1)
|
||||
|
||||
/*
|
||||
* Serial-related constants.
|
||||
*/
|
||||
#define PLAT_RPI_MINI_UART_BASE RPI3_MINI_UART_BASE
|
||||
#define PLAT_RPI_PL011_UART_BASE RPI3_PL011_UART_BASE
|
||||
#define PLAT_RPI_PL011_UART_CLOCK RPI3_PL011_UART_CLOCK
|
||||
#define PLAT_RPI_UART_BAUDRATE ULL(115200)
|
||||
|
||||
/*
|
||||
* System counter
|
||||
*/
|
||||
#define SYS_COUNTER_FREQ_IN_TICKS ULL(19200000)
|
||||
|
||||
#endif /* PLATFORM_DEF_H */
|
||||
@@ -0,0 +1,114 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef RPI_HW_H
|
||||
#define RPI_HW_H
|
||||
|
||||
#include <lib/utils_def.h>
|
||||
|
||||
/*
|
||||
* Peripherals
|
||||
*/
|
||||
|
||||
#define RPI_IO_BASE ULL(0x3F000000)
|
||||
#define RPI_IO_SIZE ULL(0x01000000)
|
||||
|
||||
/*
|
||||
* ARM <-> VideoCore mailboxes
|
||||
*/
|
||||
#define RPI3_MBOX_OFFSET ULL(0x0000B880)
|
||||
#define RPI3_MBOX_BASE (RPI_IO_BASE + RPI3_MBOX_OFFSET)
|
||||
/* VideoCore -> ARM */
|
||||
#define RPI3_MBOX0_READ_OFFSET ULL(0x00000000)
|
||||
#define RPI3_MBOX0_PEEK_OFFSET ULL(0x00000010)
|
||||
#define RPI3_MBOX0_SENDER_OFFSET ULL(0x00000014)
|
||||
#define RPI3_MBOX0_STATUS_OFFSET ULL(0x00000018)
|
||||
#define RPI3_MBOX0_CONFIG_OFFSET ULL(0x0000001C)
|
||||
/* ARM -> VideoCore */
|
||||
#define RPI3_MBOX1_WRITE_OFFSET ULL(0x00000020)
|
||||
#define RPI3_MBOX1_PEEK_OFFSET ULL(0x00000030)
|
||||
#define RPI3_MBOX1_SENDER_OFFSET ULL(0x00000034)
|
||||
#define RPI3_MBOX1_STATUS_OFFSET ULL(0x00000038)
|
||||
#define RPI3_MBOX1_CONFIG_OFFSET ULL(0x0000003C)
|
||||
/* Mailbox status constants */
|
||||
#define RPI3_MBOX_STATUS_FULL_MASK U(0x80000000) /* Set if full */
|
||||
#define RPI3_MBOX_STATUS_EMPTY_MASK U(0x40000000) /* Set if empty */
|
||||
|
||||
/*
|
||||
* Power management, reset controller, watchdog.
|
||||
*/
|
||||
#define RPI3_IO_PM_OFFSET ULL(0x00100000)
|
||||
#define RPI3_PM_BASE (RPI_IO_BASE + RPI3_IO_PM_OFFSET)
|
||||
/* Registers on top of RPI3_PM_BASE. */
|
||||
#define RPI3_PM_RSTC_OFFSET ULL(0x0000001C)
|
||||
#define RPI3_PM_RSTS_OFFSET ULL(0x00000020)
|
||||
#define RPI3_PM_WDOG_OFFSET ULL(0x00000024)
|
||||
/* Watchdog constants */
|
||||
#define RPI3_PM_PASSWORD U(0x5A000000)
|
||||
#define RPI3_PM_RSTC_WRCFG_MASK U(0x00000030)
|
||||
#define RPI3_PM_RSTC_WRCFG_FULL_RESET U(0x00000020)
|
||||
/*
|
||||
* The RSTS register is used by the VideoCore firmware when booting the
|
||||
* Raspberry Pi to know which partition to boot from. The partition value is
|
||||
* formed by bits 0, 2, 4, 6, 8 and 10. Partition 63 is used by said firmware
|
||||
* to indicate halt.
|
||||
*/
|
||||
#define RPI3_PM_RSTS_WRCFG_HALT U(0x00000555)
|
||||
|
||||
/*
|
||||
* Hardware random number generator.
|
||||
*/
|
||||
#define RPI3_IO_RNG_OFFSET ULL(0x00104000)
|
||||
#define RPI3_RNG_BASE (RPI_IO_BASE + RPI3_IO_RNG_OFFSET)
|
||||
#define RPI3_RNG_CTRL_OFFSET ULL(0x00000000)
|
||||
#define RPI3_RNG_STATUS_OFFSET ULL(0x00000004)
|
||||
#define RPI3_RNG_DATA_OFFSET ULL(0x00000008)
|
||||
#define RPI3_RNG_INT_MASK_OFFSET ULL(0x00000010)
|
||||
/* Enable/disable RNG */
|
||||
#define RPI3_RNG_CTRL_ENABLE U(0x1)
|
||||
#define RPI3_RNG_CTRL_DISABLE U(0x0)
|
||||
/* Number of currently available words */
|
||||
#define RPI3_RNG_STATUS_NUM_WORDS_SHIFT U(24)
|
||||
#define RPI3_RNG_STATUS_NUM_WORDS_MASK U(0xFF)
|
||||
/* Value to mask interrupts caused by the RNG */
|
||||
#define RPI3_RNG_INT_MASK_DISABLE U(0x1)
|
||||
|
||||
/*
|
||||
* Serial ports:
|
||||
* 'Mini UART' in the BCM docucmentation is the 8250 compatible UART.
|
||||
* There is also a PL011 UART, multiplexed to the same pins.
|
||||
*/
|
||||
#define RPI3_IO_MINI_UART_OFFSET ULL(0x00215040)
|
||||
#define RPI3_MINI_UART_BASE (RPI_IO_BASE + RPI3_IO_MINI_UART_OFFSET)
|
||||
#define RPI3_IO_PL011_UART_OFFSET ULL(0x00201000)
|
||||
#define RPI3_PL011_UART_BASE (RPI_IO_BASE + RPI3_IO_PL011_UART_OFFSET)
|
||||
#define RPI3_PL011_UART_CLOCK ULL(48000000)
|
||||
|
||||
/*
|
||||
* GPIO controller
|
||||
*/
|
||||
#define RPI3_IO_GPIO_OFFSET ULL(0x00200000)
|
||||
#define RPI3_GPIO_BASE (RPI_IO_BASE + RPI3_IO_GPIO_OFFSET)
|
||||
|
||||
/*
|
||||
* SDHost controller
|
||||
*/
|
||||
#define RPI3_IO_SDHOST_OFFSET ULL(0x00202000)
|
||||
#define RPI3_SDHOST_BASE (RPI_IO_BASE + RPI3_IO_SDHOST_OFFSET)
|
||||
|
||||
/*
|
||||
* Local interrupt controller
|
||||
*/
|
||||
#define RPI3_INTC_BASE_ADDRESS ULL(0x40000000)
|
||||
/* Registers on top of RPI3_INTC_BASE_ADDRESS */
|
||||
#define RPI3_INTC_CONTROL_OFFSET ULL(0x00000000)
|
||||
#define RPI3_INTC_PRESCALER_OFFSET ULL(0x00000008)
|
||||
#define RPI3_INTC_MBOX_CONTROL_OFFSET ULL(0x00000050)
|
||||
#define RPI3_INTC_MBOX_CONTROL_SLOT3_FIQ ULL(0x00000080)
|
||||
#define RPI3_INTC_PENDING_FIQ_OFFSET ULL(0x00000070)
|
||||
#define RPI3_INTC_PENDING_FIQ_MBOX3 ULL(0x00000080)
|
||||
|
||||
#endif /* RPI_HW_H */
|
||||
@@ -0,0 +1,221 @@
|
||||
#
|
||||
# Copyright (c) 2013-2020, ARM Limited and Contributors. All rights reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
#
|
||||
|
||||
include lib/libfdt/libfdt.mk
|
||||
include lib/xlat_tables_v2/xlat_tables.mk
|
||||
|
||||
PLAT_INCLUDES := -Iplat/rpi/common/include \
|
||||
-Iplat/rpi/rpi3/include
|
||||
|
||||
PLAT_BL_COMMON_SOURCES := drivers/ti/uart/aarch64/16550_console.S \
|
||||
drivers/arm/pl011/aarch64/pl011_console.S \
|
||||
drivers/gpio/gpio.c \
|
||||
drivers/delay_timer/delay_timer.c \
|
||||
drivers/rpi3/gpio/rpi3_gpio.c \
|
||||
plat/rpi/common/aarch64/plat_helpers.S \
|
||||
plat/rpi/common/rpi3_common.c \
|
||||
${XLAT_TABLES_LIB_SRCS}
|
||||
|
||||
BL1_SOURCES += drivers/io/io_fip.c \
|
||||
drivers/io/io_memmap.c \
|
||||
drivers/io/io_storage.c \
|
||||
lib/cpus/aarch64/cortex_a53.S \
|
||||
plat/common/aarch64/platform_mp_stack.S \
|
||||
plat/rpi/rpi3/rpi3_bl1_setup.c \
|
||||
plat/rpi/common/rpi3_io_storage.c \
|
||||
drivers/rpi3/mailbox/rpi3_mbox.c \
|
||||
plat/rpi/rpi3/rpi_mbox_board.c
|
||||
|
||||
BL2_SOURCES += common/desc_image_load.c \
|
||||
drivers/io/io_fip.c \
|
||||
drivers/io/io_memmap.c \
|
||||
drivers/io/io_storage.c \
|
||||
drivers/delay_timer/generic_delay_timer.c \
|
||||
drivers/io/io_block.c \
|
||||
drivers/mmc/mmc.c \
|
||||
drivers/rpi3/sdhost/rpi3_sdhost.c \
|
||||
plat/common/aarch64/platform_mp_stack.S \
|
||||
plat/rpi/rpi3/aarch64/rpi3_bl2_mem_params_desc.c \
|
||||
plat/rpi/rpi3/rpi3_bl2_setup.c \
|
||||
plat/rpi/common/rpi3_image_load.c \
|
||||
plat/rpi/common/rpi3_io_storage.c
|
||||
|
||||
BL31_SOURCES += lib/cpus/aarch64/cortex_a53.S \
|
||||
plat/common/plat_psci_common.c \
|
||||
plat/rpi/rpi3/rpi3_bl31_setup.c \
|
||||
plat/rpi/common/rpi3_pm.c \
|
||||
plat/rpi/common/rpi3_topology.c \
|
||||
${LIBFDT_SRCS}
|
||||
|
||||
# Tune compiler for Cortex-A53
|
||||
ifeq ($(notdir $(CC)),armclang)
|
||||
TF_CFLAGS_aarch64 += -mcpu=cortex-a53
|
||||
else ifneq ($(findstring clang,$(notdir $(CC))),)
|
||||
TF_CFLAGS_aarch64 += -mcpu=cortex-a53
|
||||
else
|
||||
TF_CFLAGS_aarch64 += -mtune=cortex-a53
|
||||
endif
|
||||
|
||||
# Platform Makefile target
|
||||
# ------------------------
|
||||
|
||||
RPI3_BL1_PAD_BIN := ${BUILD_PLAT}/bl1_pad.bin
|
||||
RPI3_ARMSTUB8_BIN := ${BUILD_PLAT}/armstub8.bin
|
||||
|
||||
# Add new default target when compiling this platform
|
||||
all: armstub
|
||||
|
||||
# This target concatenates BL1 and the FIP so that the base addresses match the
|
||||
# ones defined in the memory map
|
||||
armstub: bl1 fip
|
||||
@echo " CAT $@"
|
||||
${Q}cp ${BUILD_PLAT}/bl1.bin ${RPI3_BL1_PAD_BIN}
|
||||
${Q}truncate --size=131072 ${RPI3_BL1_PAD_BIN}
|
||||
${Q}cat ${RPI3_BL1_PAD_BIN} ${BUILD_PLAT}/fip.bin > ${RPI3_ARMSTUB8_BIN}
|
||||
@${ECHO_BLANK_LINE}
|
||||
@echo "Built $@ successfully"
|
||||
@${ECHO_BLANK_LINE}
|
||||
|
||||
# Build config flags
|
||||
# ------------------
|
||||
|
||||
# Enable all errata workarounds for Cortex-A53
|
||||
ERRATA_A53_826319 := 1
|
||||
ERRATA_A53_835769 := 1
|
||||
ERRATA_A53_836870 := 1
|
||||
ERRATA_A53_843419 := 1
|
||||
ERRATA_A53_855873 := 1
|
||||
|
||||
WORKAROUND_CVE_2017_5715 := 0
|
||||
|
||||
# Disable stack protector by default
|
||||
ENABLE_STACK_PROTECTOR := 0
|
||||
|
||||
# Reset to BL31 isn't supported
|
||||
RESET_TO_BL31 := 0
|
||||
|
||||
# Have different sections for code and rodata
|
||||
SEPARATE_CODE_AND_RODATA := 1
|
||||
|
||||
# Use Coherent memory
|
||||
USE_COHERENT_MEM := 1
|
||||
|
||||
# Platform build flags
|
||||
# --------------------
|
||||
|
||||
# BL33 images are in AArch64 by default
|
||||
RPI3_BL33_IN_AARCH32 := 0
|
||||
|
||||
# Assume that BL33 isn't the Linux kernel by default
|
||||
RPI3_DIRECT_LINUX_BOOT := 0
|
||||
|
||||
# UART to use at runtime. -1 means the runtime UART is disabled.
|
||||
# Any other value means the default UART will be used.
|
||||
RPI3_RUNTIME_UART := -1
|
||||
|
||||
# Use normal memory mapping for ROM, FIP, SRAM and DRAM
|
||||
RPI3_USE_UEFI_MAP := 0
|
||||
|
||||
# BL32 location
|
||||
RPI3_BL32_RAM_LOCATION := tdram
|
||||
ifeq (${RPI3_BL32_RAM_LOCATION}, tsram)
|
||||
RPI3_BL32_RAM_LOCATION_ID = SEC_SRAM_ID
|
||||
else ifeq (${RPI3_BL32_RAM_LOCATION}, tdram)
|
||||
RPI3_BL32_RAM_LOCATION_ID = SEC_DRAM_ID
|
||||
else
|
||||
$(error "Unsupported RPI3_BL32_RAM_LOCATION value")
|
||||
endif
|
||||
|
||||
# Process platform flags
|
||||
# ----------------------
|
||||
|
||||
$(eval $(call add_define,RPI3_BL32_RAM_LOCATION_ID))
|
||||
$(eval $(call add_define,RPI3_BL33_IN_AARCH32))
|
||||
$(eval $(call add_define,RPI3_DIRECT_LINUX_BOOT))
|
||||
ifdef RPI3_PRELOADED_DTB_BASE
|
||||
$(eval $(call add_define,RPI3_PRELOADED_DTB_BASE))
|
||||
endif
|
||||
$(eval $(call add_define,RPI3_RUNTIME_UART))
|
||||
$(eval $(call add_define,RPI3_USE_UEFI_MAP))
|
||||
|
||||
# Verify build config
|
||||
# -------------------
|
||||
#
|
||||
ifneq (${RPI3_DIRECT_LINUX_BOOT}, 0)
|
||||
ifndef RPI3_PRELOADED_DTB_BASE
|
||||
$(error Error: RPI3_PRELOADED_DTB_BASE needed if RPI3_DIRECT_LINUX_BOOT=1)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifneq (${RESET_TO_BL31}, 0)
|
||||
$(error Error: rpi3 needs RESET_TO_BL31=0)
|
||||
endif
|
||||
|
||||
ifeq (${ARCH},aarch32)
|
||||
$(error Error: AArch32 not supported on rpi3)
|
||||
endif
|
||||
|
||||
ifneq ($(ENABLE_STACK_PROTECTOR), 0)
|
||||
PLAT_BL_COMMON_SOURCES += drivers/rpi3/rng/rpi3_rng.c \
|
||||
plat/rpi/common/rpi3_stack_protector.c
|
||||
endif
|
||||
|
||||
ifeq (${SPD},opteed)
|
||||
BL2_SOURCES += \
|
||||
lib/optee/optee_utils.c
|
||||
endif
|
||||
|
||||
# Add the build options to pack Trusted OS Extra1 and Trusted OS Extra2 images
|
||||
# in the FIP if the platform requires.
|
||||
ifneq ($(BL32_EXTRA1),)
|
||||
$(eval $(call TOOL_ADD_IMG,BL32_EXTRA1,--tos-fw-extra1))
|
||||
endif
|
||||
ifneq ($(BL32_EXTRA2),)
|
||||
$(eval $(call TOOL_ADD_IMG,BL32_EXTRA2,--tos-fw-extra2))
|
||||
endif
|
||||
|
||||
ifneq (${TRUSTED_BOARD_BOOT},0)
|
||||
|
||||
include drivers/auth/mbedtls/mbedtls_crypto.mk
|
||||
include drivers/auth/mbedtls/mbedtls_x509.mk
|
||||
|
||||
AUTH_SOURCES := drivers/auth/auth_mod.c \
|
||||
drivers/auth/crypto_mod.c \
|
||||
drivers/auth/img_parser_mod.c \
|
||||
drivers/auth/tbbr/tbbr_cot_common.c
|
||||
|
||||
BL1_SOURCES += ${AUTH_SOURCES} \
|
||||
bl1/tbbr/tbbr_img_desc.c \
|
||||
plat/common/tbbr/plat_tbbr.c \
|
||||
plat/rpi/common/rpi3_trusted_boot.c \
|
||||
plat/rpi/common/rpi3_rotpk.S \
|
||||
drivers/auth/tbbr/tbbr_cot_bl1.c
|
||||
|
||||
BL2_SOURCES += ${AUTH_SOURCES} \
|
||||
plat/common/tbbr/plat_tbbr.c \
|
||||
plat/rpi/common/rpi3_trusted_boot.c \
|
||||
plat/rpi/common/rpi3_rotpk.S \
|
||||
drivers/auth/tbbr/tbbr_cot_bl2.c
|
||||
|
||||
ROT_KEY = $(BUILD_PLAT)/rot_key.pem
|
||||
ROTPK_HASH = $(BUILD_PLAT)/rotpk_sha256.bin
|
||||
|
||||
$(eval $(call add_define_val,ROTPK_HASH,'"$(ROTPK_HASH)"'))
|
||||
|
||||
$(BUILD_PLAT)/bl1/rpi3_rotpk.o: $(ROTPK_HASH)
|
||||
$(BUILD_PLAT)/bl2/rpi3_rotpk.o: $(ROTPK_HASH)
|
||||
|
||||
certificates: $(ROT_KEY)
|
||||
|
||||
$(ROT_KEY): | $(BUILD_PLAT)
|
||||
@echo " OPENSSL $@"
|
||||
$(Q)${OPENSSL_BIN_PATH}/openssl genrsa 2048 > $@ 2>/dev/null
|
||||
|
||||
$(ROTPK_HASH): $(ROT_KEY)
|
||||
@echo " OPENSSL $@"
|
||||
$(Q)${OPENSSL_BIN_PATH}/openssl rsa -in $< -pubout -outform DER 2>/dev/null |\
|
||||
${OPENSSL_BIN_PATH}/openssl dgst -sha256 -binary > $@ 2>/dev/null
|
||||
endif
|
||||
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <platform_def.h>
|
||||
|
||||
#include <arch.h>
|
||||
#include <arch_helpers.h>
|
||||
#include <common/bl_common.h>
|
||||
#include <common/debug.h>
|
||||
#include <lib/mmio.h>
|
||||
#include <lib/xlat_tables/xlat_mmu_helpers.h>
|
||||
#include <lib/xlat_tables/xlat_tables_defs.h>
|
||||
|
||||
#include <rpi_shared.h>
|
||||
|
||||
/* Data structure which holds the extents of the trusted SRAM for BL1 */
|
||||
static meminfo_t bl1_tzram_layout;
|
||||
|
||||
meminfo_t *bl1_plat_sec_mem_layout(void)
|
||||
{
|
||||
return &bl1_tzram_layout;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* Perform any BL1 specific platform actions.
|
||||
******************************************************************************/
|
||||
void bl1_early_platform_setup(void)
|
||||
{
|
||||
/* use the 19.2 MHz clock for the architected timer */
|
||||
mmio_write_32(RPI3_INTC_BASE_ADDRESS + RPI3_INTC_CONTROL_OFFSET, 0);
|
||||
mmio_write_32(RPI3_INTC_BASE_ADDRESS + RPI3_INTC_PRESCALER_OFFSET,
|
||||
0x80000000);
|
||||
|
||||
/* Initialize the console to provide early debug support */
|
||||
rpi3_console_init();
|
||||
|
||||
/* Allow BL1 to see the whole Trusted RAM */
|
||||
bl1_tzram_layout.total_base = BL_RAM_BASE;
|
||||
bl1_tzram_layout.total_size = BL_RAM_SIZE;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Perform the very early platform specific architecture setup. This only
|
||||
* does basic initialization. Later architectural setup (bl1_arch_setup())
|
||||
* does not do anything platform specific.
|
||||
*****************************************************************************/
|
||||
void bl1_plat_arch_setup(void)
|
||||
{
|
||||
rpi3_setup_page_tables(bl1_tzram_layout.total_base,
|
||||
bl1_tzram_layout.total_size,
|
||||
BL_CODE_BASE, BL1_CODE_END,
|
||||
BL1_RO_DATA_BASE, BL1_RO_DATA_END
|
||||
#if USE_COHERENT_MEM
|
||||
, BL_COHERENT_RAM_BASE, BL_COHERENT_RAM_END
|
||||
#endif
|
||||
);
|
||||
|
||||
enable_mmu_el3(0);
|
||||
}
|
||||
|
||||
void bl1_platform_setup(void)
|
||||
{
|
||||
uint32_t __unused rev;
|
||||
int __unused rc;
|
||||
|
||||
rc = rpi3_vc_hardware_get_board_revision(&rev);
|
||||
|
||||
if (rc == 0) {
|
||||
const char __unused *model, __unused *info;
|
||||
|
||||
switch (rev) {
|
||||
case 0xA02082:
|
||||
model = "Raspberry Pi 3 Model B";
|
||||
info = "(1GB, Sony, UK)";
|
||||
break;
|
||||
case 0xA22082:
|
||||
model = "Raspberry Pi 3 Model B";
|
||||
info = "(1GB, Embest, China)";
|
||||
break;
|
||||
case 0xA020D3:
|
||||
model = "Raspberry Pi 3 Model B+";
|
||||
info = "(1GB, Sony, UK)";
|
||||
break;
|
||||
default:
|
||||
model = "Unknown";
|
||||
info = "(Unknown)";
|
||||
ERROR("rpi3: Unknown board revision 0x%08x\n", rev);
|
||||
break;
|
||||
}
|
||||
|
||||
NOTICE("rpi3: Detected: %s %s [0x%08x]\n", model, info, rev);
|
||||
} else {
|
||||
ERROR("rpi3: Unable to detect board revision\n");
|
||||
}
|
||||
|
||||
/* Initialise the IO layer and register platform IO devices */
|
||||
plat_rpi3_io_setup();
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <platform_def.h>
|
||||
|
||||
#include <arch_helpers.h>
|
||||
#include <common/bl_common.h>
|
||||
#include <common/debug.h>
|
||||
#include <common/desc_image_load.h>
|
||||
#include <lib/optee_utils.h>
|
||||
#include <lib/xlat_tables/xlat_mmu_helpers.h>
|
||||
#include <lib/xlat_tables/xlat_tables_defs.h>
|
||||
#include <drivers/generic_delay_timer.h>
|
||||
#include <drivers/rpi3/gpio/rpi3_gpio.h>
|
||||
#include <drivers/rpi3/sdhost/rpi3_sdhost.h>
|
||||
|
||||
#include <rpi_shared.h>
|
||||
|
||||
/* Data structure which holds the extents of the trusted SRAM for BL2 */
|
||||
static meminfo_t bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE);
|
||||
|
||||
/* Data structure which holds the MMC info */
|
||||
static struct mmc_device_info mmc_info;
|
||||
|
||||
static void rpi3_sdhost_setup(void)
|
||||
{
|
||||
struct rpi3_sdhost_params params;
|
||||
|
||||
memset(¶ms, 0, sizeof(struct rpi3_sdhost_params));
|
||||
params.reg_base = RPI3_SDHOST_BASE;
|
||||
params.bus_width = MMC_BUS_WIDTH_1;
|
||||
params.clk_rate = 50000000;
|
||||
mmc_info.mmc_dev_type = MMC_IS_SD_HC;
|
||||
rpi3_sdhost_init(¶ms, &mmc_info);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* BL1 has passed the extents of the trusted SRAM that should be visible to BL2
|
||||
* in x0. This memory layout is sitting at the base of the free trusted SRAM.
|
||||
* Copy it to a safe location before its reclaimed by later BL2 functionality.
|
||||
******************************************************************************/
|
||||
|
||||
void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1,
|
||||
u_register_t arg2, u_register_t arg3)
|
||||
{
|
||||
meminfo_t *mem_layout = (meminfo_t *) arg1;
|
||||
|
||||
/* Initialize the console to provide early debug support */
|
||||
rpi3_console_init();
|
||||
|
||||
/* Enable arch timer */
|
||||
generic_delay_timer_init();
|
||||
|
||||
/* Setup GPIO driver */
|
||||
rpi3_gpio_init();
|
||||
|
||||
/* Setup the BL2 memory layout */
|
||||
bl2_tzram_layout = *mem_layout;
|
||||
|
||||
/* Setup SDHost driver */
|
||||
rpi3_sdhost_setup();
|
||||
|
||||
plat_rpi3_io_setup();
|
||||
}
|
||||
|
||||
void bl2_platform_setup(void)
|
||||
{
|
||||
/*
|
||||
* This is where a TrustZone address space controller and other
|
||||
* security related peripherals would be configured.
|
||||
*/
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* Perform the very early platform specific architectural setup here.
|
||||
******************************************************************************/
|
||||
void bl2_plat_arch_setup(void)
|
||||
{
|
||||
rpi3_setup_page_tables(bl2_tzram_layout.total_base,
|
||||
bl2_tzram_layout.total_size,
|
||||
BL_CODE_BASE, BL_CODE_END,
|
||||
BL_RO_DATA_BASE, BL_RO_DATA_END
|
||||
#if USE_COHERENT_MEM
|
||||
, BL_COHERENT_RAM_BASE, BL_COHERENT_RAM_END
|
||||
#endif
|
||||
);
|
||||
|
||||
enable_mmu_el1(0);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* This function can be used by the platforms to update/use image
|
||||
* information for given `image_id`.
|
||||
******************************************************************************/
|
||||
int bl2_plat_handle_post_image_load(unsigned int image_id)
|
||||
{
|
||||
int err = 0;
|
||||
bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id);
|
||||
#ifdef SPD_opteed
|
||||
bl_mem_params_node_t *pager_mem_params = NULL;
|
||||
bl_mem_params_node_t *paged_mem_params = NULL;
|
||||
#endif
|
||||
|
||||
assert(bl_mem_params != NULL);
|
||||
|
||||
switch (image_id) {
|
||||
case BL32_IMAGE_ID:
|
||||
#ifdef SPD_opteed
|
||||
pager_mem_params = get_bl_mem_params_node(BL32_EXTRA1_IMAGE_ID);
|
||||
assert(pager_mem_params);
|
||||
|
||||
paged_mem_params = get_bl_mem_params_node(BL32_EXTRA2_IMAGE_ID);
|
||||
assert(paged_mem_params);
|
||||
|
||||
err = parse_optee_header(&bl_mem_params->ep_info,
|
||||
&pager_mem_params->image_info,
|
||||
&paged_mem_params->image_info);
|
||||
if (err != 0)
|
||||
WARN("OPTEE header parse error.\n");
|
||||
#endif
|
||||
bl_mem_params->ep_info.spsr = rpi3_get_spsr_for_bl32_entry();
|
||||
break;
|
||||
|
||||
case BL33_IMAGE_ID:
|
||||
/* BL33 expects to receive the primary CPU MPID (through r0) */
|
||||
bl_mem_params->ep_info.args.arg0 = 0xffff & read_mpidr();
|
||||
bl_mem_params->ep_info.spsr = rpi3_get_spsr_for_bl33_entry();
|
||||
|
||||
/* Shutting down the SDHost driver to let BL33 drives SDHost.*/
|
||||
rpi3_sdhost_stop();
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Do nothing in default case */
|
||||
break;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -0,0 +1,226 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <libfdt.h>
|
||||
|
||||
#include <platform_def.h>
|
||||
|
||||
#include <common/bl_common.h>
|
||||
#include <lib/xlat_tables/xlat_mmu_helpers.h>
|
||||
#include <lib/xlat_tables/xlat_tables_defs.h>
|
||||
#include <plat/common/platform.h>
|
||||
|
||||
#include <rpi_shared.h>
|
||||
|
||||
/*
|
||||
* Placeholder variables for copying the arguments that have been passed to
|
||||
* BL31 from BL2.
|
||||
*/
|
||||
static entry_point_info_t bl32_image_ep_info;
|
||||
static entry_point_info_t bl33_image_ep_info;
|
||||
|
||||
/*******************************************************************************
|
||||
* Return a pointer to the 'entry_point_info' structure of the next image for
|
||||
* the security state specified. BL33 corresponds to the non-secure image type
|
||||
* while BL32 corresponds to the secure image type. A NULL pointer is returned
|
||||
* if the image does not exist.
|
||||
******************************************************************************/
|
||||
entry_point_info_t *bl31_plat_get_next_image_ep_info(uint32_t type)
|
||||
{
|
||||
entry_point_info_t *next_image_info;
|
||||
|
||||
assert(sec_state_is_valid(type) != 0);
|
||||
|
||||
next_image_info = (type == NON_SECURE)
|
||||
? &bl33_image_ep_info : &bl32_image_ep_info;
|
||||
|
||||
/* None of the images can have 0x0 as the entrypoint. */
|
||||
if (next_image_info->pc) {
|
||||
return next_image_info;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* Return entrypoint of BL33.
|
||||
******************************************************************************/
|
||||
uintptr_t plat_get_ns_image_entrypoint(void)
|
||||
{
|
||||
#ifdef PRELOADED_BL33_BASE
|
||||
return PRELOADED_BL33_BASE;
|
||||
#else
|
||||
return PLAT_RPI3_NS_IMAGE_OFFSET;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* Perform any BL31 early platform setup. Here is an opportunity to copy
|
||||
* parameters passed by the calling EL (S-EL1 in BL2 & EL3 in BL1) before
|
||||
* they are lost (potentially). This needs to be done before the MMU is
|
||||
* initialized so that the memory layout can be used while creating page
|
||||
* tables. BL2 has flushed this information to memory, so we are guaranteed
|
||||
* to pick up good data.
|
||||
******************************************************************************/
|
||||
void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
|
||||
u_register_t arg2, u_register_t arg3)
|
||||
|
||||
{
|
||||
/* Initialize the console to provide early debug support */
|
||||
rpi3_console_init();
|
||||
|
||||
/*
|
||||
* In debug builds, a special value is passed in 'arg1' to verify
|
||||
* platform parameters from BL2 to BL31. Not used in release builds.
|
||||
*/
|
||||
assert(arg1 == RPI3_BL31_PLAT_PARAM_VAL);
|
||||
|
||||
/* Check that params passed from BL2 are not NULL. */
|
||||
bl_params_t *params_from_bl2 = (bl_params_t *) arg0;
|
||||
|
||||
assert(params_from_bl2 != NULL);
|
||||
assert(params_from_bl2->h.type == PARAM_BL_PARAMS);
|
||||
assert(params_from_bl2->h.version >= VERSION_2);
|
||||
|
||||
bl_params_node_t *bl_params = params_from_bl2->head;
|
||||
|
||||
/*
|
||||
* Copy BL33 and BL32 (if present), entry point information.
|
||||
* They are stored in Secure RAM, in BL2's address space.
|
||||
*/
|
||||
while (bl_params) {
|
||||
if (bl_params->image_id == BL32_IMAGE_ID) {
|
||||
bl32_image_ep_info = *bl_params->ep_info;
|
||||
}
|
||||
|
||||
if (bl_params->image_id == BL33_IMAGE_ID) {
|
||||
bl33_image_ep_info = *bl_params->ep_info;
|
||||
}
|
||||
|
||||
bl_params = bl_params->next_params_info;
|
||||
}
|
||||
|
||||
if (bl33_image_ep_info.pc == 0) {
|
||||
panic();
|
||||
}
|
||||
|
||||
#if RPI3_DIRECT_LINUX_BOOT
|
||||
# if RPI3_BL33_IN_AARCH32
|
||||
/*
|
||||
* According to the file ``Documentation/arm/Booting`` of the Linux
|
||||
* kernel tree, Linux expects:
|
||||
* r0 = 0
|
||||
* r1 = machine type number, optional in DT-only platforms (~0 if so)
|
||||
* r2 = Physical address of the device tree blob
|
||||
*/
|
||||
VERBOSE("rpi3: Preparing to boot 32-bit Linux kernel\n");
|
||||
bl33_image_ep_info.args.arg0 = 0U;
|
||||
bl33_image_ep_info.args.arg1 = ~0U;
|
||||
bl33_image_ep_info.args.arg2 = (u_register_t) RPI3_PRELOADED_DTB_BASE;
|
||||
# else
|
||||
/*
|
||||
* According to the file ``Documentation/arm64/booting.txt`` of the
|
||||
* Linux kernel tree, Linux expects the physical address of the device
|
||||
* tree blob (DTB) in x0, while x1-x3 are reserved for future use and
|
||||
* must be 0.
|
||||
*/
|
||||
VERBOSE("rpi3: Preparing to boot 64-bit Linux kernel\n");
|
||||
bl33_image_ep_info.args.arg0 = (u_register_t) RPI3_PRELOADED_DTB_BASE;
|
||||
bl33_image_ep_info.args.arg1 = 0ULL;
|
||||
bl33_image_ep_info.args.arg2 = 0ULL;
|
||||
bl33_image_ep_info.args.arg3 = 0ULL;
|
||||
# endif /* RPI3_BL33_IN_AARCH32 */
|
||||
#endif /* RPI3_DIRECT_LINUX_BOOT */
|
||||
}
|
||||
|
||||
void bl31_plat_arch_setup(void)
|
||||
{
|
||||
rpi3_setup_page_tables(BL31_BASE, BL31_END - BL31_BASE,
|
||||
BL_CODE_BASE, BL_CODE_END,
|
||||
BL_RO_DATA_BASE, BL_RO_DATA_END
|
||||
#if USE_COHERENT_MEM
|
||||
, BL_COHERENT_RAM_BASE, BL_COHERENT_RAM_END
|
||||
#endif
|
||||
);
|
||||
|
||||
enable_mmu_el3(0);
|
||||
}
|
||||
|
||||
#ifdef RPI3_PRELOADED_DTB_BASE
|
||||
/*
|
||||
* Add information to the device tree (if any) about the reserved DRAM used by
|
||||
* the Trusted Firmware.
|
||||
*/
|
||||
static void rpi3_dtb_add_mem_rsv(void)
|
||||
{
|
||||
int i, regions, rc;
|
||||
uint64_t addr, size;
|
||||
void *dtb = (void *)RPI3_PRELOADED_DTB_BASE;
|
||||
|
||||
INFO("rpi3: Checking DTB...\n");
|
||||
|
||||
/* Return if no device tree is detected */
|
||||
if (fdt_check_header(dtb) != 0)
|
||||
return;
|
||||
|
||||
regions = fdt_num_mem_rsv(dtb);
|
||||
|
||||
VERBOSE("rpi3: Found %d mem reserve region(s)\n", regions);
|
||||
|
||||
/* We expect to find one reserved region that we can modify */
|
||||
if (regions < 1)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Look for the region that corresponds to the default boot firmware. It
|
||||
* starts at address 0, and it is not needed when the default firmware
|
||||
* is replaced by this port of the Trusted Firmware.
|
||||
*/
|
||||
for (i = 0; i < regions; i++) {
|
||||
if (fdt_get_mem_rsv(dtb, i, &addr, &size) != 0)
|
||||
continue;
|
||||
|
||||
if (addr != 0x0)
|
||||
continue;
|
||||
|
||||
VERBOSE("rpi3: Firmware mem reserve region found\n");
|
||||
|
||||
rc = fdt_del_mem_rsv(dtb, i);
|
||||
if (rc != 0) {
|
||||
INFO("rpi3: Can't remove mem reserve region (%d)\n", rc);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (i == regions) {
|
||||
VERBOSE("rpi3: Firmware mem reserve region not found\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Reserve all SRAM. As said in the documentation, this isn't actually
|
||||
* secure memory, so it is needed to tell BL33 that this is a reserved
|
||||
* memory region. It doesn't guarantee it won't use it, though.
|
||||
*/
|
||||
rc = fdt_add_mem_rsv(dtb, SEC_SRAM_BASE, SEC_SRAM_SIZE);
|
||||
if (rc != 0) {
|
||||
WARN("rpi3: Can't add mem reserve region (%d)\n", rc);
|
||||
}
|
||||
|
||||
INFO("rpi3: Reserved 0x%llx - 0x%llx in DTB\n", SEC_SRAM_BASE,
|
||||
SEC_SRAM_BASE + SEC_SRAM_SIZE);
|
||||
}
|
||||
#endif
|
||||
|
||||
void bl31_platform_setup(void)
|
||||
{
|
||||
#ifdef RPI3_PRELOADED_DTB_BASE
|
||||
/* Only modify a DTB if we know where to look for it */
|
||||
rpi3_dtb_add_mem_rsv();
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <platform_def.h>
|
||||
|
||||
#include <arch_helpers.h>
|
||||
|
||||
#include <drivers/rpi3/mailbox/rpi3_mbox.h>
|
||||
|
||||
#define RPI3_MBOX_BUFFER_SIZE U(256)
|
||||
static uint8_t __aligned(16) rpi3_mbox_buffer[RPI3_MBOX_BUFFER_SIZE];
|
||||
|
||||
/*******************************************************************************
|
||||
* Request board revision. Returns the revision and 0 on success, -1 on error.
|
||||
******************************************************************************/
|
||||
int rpi3_vc_hardware_get_board_revision(uint32_t *revision)
|
||||
{
|
||||
uint32_t tag_request_size = sizeof(uint32_t);
|
||||
rpi3_mbox_request_t *req = (rpi3_mbox_request_t *) rpi3_mbox_buffer;
|
||||
|
||||
assert(revision != NULL);
|
||||
|
||||
VERBOSE("rpi3: mbox: Sending request at %p\n", (void *)req);
|
||||
|
||||
req->size = sizeof(rpi3_mbox_buffer);
|
||||
req->code = RPI3_MBOX_PROCESS_REQUEST;
|
||||
|
||||
req->tags[0] = RPI3_TAG_HARDWARE_GET_BOARD_REVISION;
|
||||
req->tags[1] = tag_request_size; /* Space available for the response */
|
||||
req->tags[2] = RPI3_TAG_REQUEST;
|
||||
req->tags[3] = 0; /* Placeholder for the response */
|
||||
|
||||
req->tags[4] = RPI3_TAG_END;
|
||||
|
||||
rpi3_vc_mailbox_request_send(req, RPI3_MBOX_BUFFER_SIZE);
|
||||
|
||||
if (req->code != RPI3_MBOX_REQUEST_SUCCESSFUL) {
|
||||
ERROR("rpi3: mbox: Code = 0x%08x\n", req->code);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (req->tags[2] != (RPI3_TAG_IS_RESPONSE | tag_request_size)) {
|
||||
ERROR("rpi3: mbox: get board revision failed (0x%08x)\n",
|
||||
req->tags[2]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
*revision = req->tags[3];
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user