Commit 4731e8f0 authored by danh-arm's avatar danh-arm
Browse files

Merge pull request #295 from danh-arm/dh/plat-port-reorg

ARM platform port reorganization
parents 6403a306 4a75b84a
# #
# Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. # Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
...@@ -126,9 +126,14 @@ BL_COMMON_SOURCES := common/bl_common.c \ ...@@ -126,9 +126,14 @@ BL_COMMON_SOURCES := common/bl_common.c \
BUILD_BASE := ./build BUILD_BASE := ./build
BUILD_PLAT := ${BUILD_BASE}/${PLAT}/${BUILD_TYPE} BUILD_PLAT := ${BUILD_BASE}/${PLAT}/${BUILD_TYPE}
PLATFORMS := $(shell ls -I common plat/) PLAT_MAKEFILE := platform.mk
# Generate the platforms list by recursively searching for all directories
# under /plat containing a PLAT_MAKEFILE. Append each platform with a `|`
# char and strip out the final '|'.
PLATFORMS := $(shell find plat/ -name '${PLAT_MAKEFILE}' -print0 | \
sed -r 's%[^\x00]*\/([^/]*)\/${PLAT_MAKEFILE}\x00%\1|%g' | \
sed -r 's/\|$$//')
SPDS := $(shell ls -I none services/spd) SPDS := $(shell ls -I none services/spd)
HELP_PLATFORMS := $(shell echo ${PLATFORMS} | sed 's/ /|/g')
# Convenience function for adding build definitions # Convenience function for adding build definitions
# $(eval $(call add_define,FOO)) will have: # $(eval $(call add_define,FOO)) will have:
...@@ -144,9 +149,10 @@ $(and $(patsubst 0,,$(value $(1))),$(patsubst 1,,$(value $(1))),$(error $(1) mus ...@@ -144,9 +149,10 @@ $(and $(patsubst 0,,$(value $(1))),$(patsubst 1,,$(value $(1))),$(error $(1) mus
endef endef
ifeq (${PLAT},) ifeq (${PLAT},)
$(error "Error: Unknown platform. Please use PLAT=<platform name> to specify the platform.") $(error "Error: Unknown platform. Please use PLAT=<platform name> to specify the platform")
endif endif
ifeq ($(findstring ${PLAT},${PLATFORMS}),) PLAT_MAKEFILE_FULL := $(shell find plat/ -wholename '*/${PLAT}/${PLAT_MAKEFILE}')
ifeq ($(PLAT_MAKEFILE_FULL),)
$(error "Error: Invalid platform. The following platforms are available: ${PLATFORMS}") $(error "Error: Invalid platform. The following platforms are available: ${PLATFORMS}")
endif endif
...@@ -155,7 +161,7 @@ all: msg_start ...@@ -155,7 +161,7 @@ all: msg_start
msg_start: msg_start:
@echo "Building ${PLAT}" @echo "Building ${PLAT}"
include plat/${PLAT}/platform.mk include ${PLAT_MAKEFILE_FULL}
# Include the CPU specific operations makefile. By default all CPU errata # Include the CPU specific operations makefile. By default all CPU errata
# workarounds and CPU specifc optimisations are disabled. This can be # workarounds and CPU specifc optimisations are disabled. This can be
...@@ -225,6 +231,9 @@ CFLAGS += -g ...@@ -225,6 +231,9 @@ CFLAGS += -g
ASFLAGS += -g -Wa,--gdwarf-2 ASFLAGS += -g -Wa,--gdwarf-2
endif endif
# Process PLAT flag
$(eval $(call add_define,PLAT_${PLAT}))
# Process NS_TIMER_SWITCH flag # Process NS_TIMER_SWITCH flag
$(eval $(call assert_boolean,NS_TIMER_SWITCH)) $(eval $(call assert_boolean,NS_TIMER_SWITCH))
$(eval $(call add_define,NS_TIMER_SWITCH)) $(eval $(call add_define,NS_TIMER_SWITCH))
...@@ -633,7 +642,7 @@ cscope: ...@@ -633,7 +642,7 @@ cscope:
${Q}cscope -b -q -k ${Q}cscope -b -q -k
help: help:
@echo "usage: ${MAKE} PLAT=<${HELP_PLATFORMS}> [OPTIONS] [TARGET]" @echo "usage: ${MAKE} PLAT=<${PLATFORMS}> [OPTIONS] [TARGET]"
@echo "" @echo ""
@echo "PLAT is used to specify which platform you wish to build." @echo "PLAT is used to specify which platform you wish to build."
@echo "If no platform is specified, PLAT defaults to: ${DEFAULT_PLAT}" @echo "If no platform is specified, PLAT defaults to: ${DEFAULT_PLAT}"
......
/* /*
* Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -114,21 +114,36 @@ void bl1_main(void) ...@@ -114,21 +114,36 @@ void bl1_main(void)
INFO("BL1: RAM 0x%lx - 0x%lx\n", BL1_RAM_BASE, BL1_RAM_LIMIT); INFO("BL1: RAM 0x%lx - 0x%lx\n", BL1_RAM_BASE, BL1_RAM_LIMIT);
#if DEBUG
unsigned long sctlr_el3 = read_sctlr_el3();
#endif
image_info_t bl2_image_info = { {0} }; image_info_t bl2_image_info = { {0} };
entry_point_info_t bl2_ep = { {0} }; entry_point_info_t bl2_ep = { {0} };
meminfo_t *bl1_tzram_layout; meminfo_t *bl1_tzram_layout;
meminfo_t *bl2_tzram_layout = 0x0; meminfo_t *bl2_tzram_layout = 0x0;
int err; int err;
#if DEBUG
unsigned long val;
/* /*
* Ensure that MMU/Caches and coherency are turned on * Ensure that MMU/Caches and coherency are turned on
*/ */
assert(sctlr_el3 | SCTLR_M_BIT); val = read_sctlr_el3();
assert(sctlr_el3 | SCTLR_C_BIT); assert(val | SCTLR_M_BIT);
assert(sctlr_el3 | SCTLR_I_BIT); assert(val | SCTLR_C_BIT);
assert(val | SCTLR_I_BIT);
/*
* Check that Cache Writeback Granule (CWG) in CTR_EL0 matches the
* provided platform value
*/
val = (read_ctr_el0() >> CTR_CWG_SHIFT) & CTR_CWG_MASK;
/*
* If CWG is zero, then no CWG information is available but we can
* at least check the platform value is less than the architectural
* maximum.
*/
if (val != 0)
assert(CACHE_WRITEBACK_GRANULE == SIZE_FROM_LOG2_WORDS(val));
else
assert(CACHE_WRITEBACK_GRANULE <= MAX_CACHE_LINE_SIZE);
#endif
/* Perform remaining generic architectural setup from EL3 */ /* Perform remaining generic architectural setup from EL3 */
bl1_arch_setup(); bl1_arch_setup();
......
...@@ -52,7 +52,7 @@ $(eval $(call add_define,TSP_INIT_ASYNC)) ...@@ -52,7 +52,7 @@ $(eval $(call add_define,TSP_INIT_ASYNC))
# Include the platform-specific TSP Makefile # Include the platform-specific TSP Makefile
# If no platform-specific TSP Makefile exists, it means TSP is not supported # If no platform-specific TSP Makefile exists, it means TSP is not supported
# on this platform. # on this platform.
TSP_PLAT_MAKEFILE := plat/${PLAT}/tsp/tsp-${PLAT}.mk TSP_PLAT_MAKEFILE := $(shell find plat/ -wholename '*/${PLAT}/tsp/tsp-${PLAT}.mk')
ifeq (,$(wildcard ${TSP_PLAT_MAKEFILE})) ifeq (,$(wildcard ${TSP_PLAT_MAKEFILE}))
$(error TSP is not supported on platform ${PLAT}) $(error TSP is not supported on platform ${PLAT})
else else
......
/* /*
* Copyright (c) 2014, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -58,9 +58,9 @@ void tsp_update_sync_fiq_stats(uint32_t type, uint64_t elr_el3) ...@@ -58,9 +58,9 @@ void tsp_update_sync_fiq_stats(uint32_t type, uint64_t elr_el3)
#if LOG_LEVEL >= LOG_LEVEL_VERBOSE #if LOG_LEVEL >= LOG_LEVEL_VERBOSE
spin_lock(&console_lock); spin_lock(&console_lock);
VERBOSE("TSP: cpu 0x%x sync fiq request from 0x%llx\n", VERBOSE("TSP: cpu 0x%lx sync fiq request from 0x%lx\n",
mpidr, elr_el3); mpidr, elr_el3);
VERBOSE("TSP: cpu 0x%x: %d sync fiq requests, %d sync fiq returns\n", VERBOSE("TSP: cpu 0x%lx: %d sync fiq requests, %d sync fiq returns\n",
mpidr, mpidr,
tsp_stats[linear_id].sync_fiq_count, tsp_stats[linear_id].sync_fiq_count,
tsp_stats[linear_id].sync_fiq_ret_count); tsp_stats[linear_id].sync_fiq_ret_count);
...@@ -104,9 +104,9 @@ int32_t tsp_fiq_handler(void) ...@@ -104,9 +104,9 @@ int32_t tsp_fiq_handler(void)
tsp_stats[linear_id].fiq_count++; tsp_stats[linear_id].fiq_count++;
#if LOG_LEVEL >= LOG_LEVEL_VERBOSE #if LOG_LEVEL >= LOG_LEVEL_VERBOSE
spin_lock(&console_lock); spin_lock(&console_lock);
VERBOSE("TSP: cpu 0x%x handled fiq %d\n", VERBOSE("TSP: cpu 0x%lx handled fiq %d\n",
mpidr, id); mpidr, id);
VERBOSE("TSP: cpu 0x%x: %d fiq requests\n", VERBOSE("TSP: cpu 0x%lx: %d fiq requests\n",
mpidr, tsp_stats[linear_id].fiq_count); mpidr, tsp_stats[linear_id].fiq_count);
spin_unlock(&console_lock); spin_unlock(&console_lock);
#endif #endif
...@@ -121,8 +121,8 @@ int32_t tsp_irq_received(void) ...@@ -121,8 +121,8 @@ int32_t tsp_irq_received(void)
tsp_stats[linear_id].irq_count++; tsp_stats[linear_id].irq_count++;
#if LOG_LEVEL >= LOG_LEVEL_VERBOSE #if LOG_LEVEL >= LOG_LEVEL_VERBOSE
spin_lock(&console_lock); spin_lock(&console_lock);
VERBOSE("TSP: cpu 0x%x received irq\n", mpidr); VERBOSE("TSP: cpu 0x%lx received irq\n", mpidr);
VERBOSE("TSP: cpu 0x%x: %d irq requests\n", VERBOSE("TSP: cpu 0x%lx: %d irq requests\n",
mpidr, tsp_stats[linear_id].irq_count); mpidr, tsp_stats[linear_id].irq_count);
spin_unlock(&console_lock); spin_unlock(&console_lock);
#endif #endif
......
...@@ -38,12 +38,6 @@ ...@@ -38,12 +38,6 @@
#include <tsp.h> #include <tsp.h>
#include "tsp_private.h" #include "tsp_private.h"
/*******************************************************************************
* Declarations of linker defined symbols which will help us find the layout
* of trusted SRAM
******************************************************************************/
extern unsigned long __RO_START__;
extern unsigned long __BL32_END__;
/******************************************************************************* /*******************************************************************************
* Lock to control access to the console * Lock to control access to the console
......
/* /*
* Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -137,7 +137,7 @@ void reserve_mem(uint64_t *free_base, size_t *free_size, ...@@ -137,7 +137,7 @@ void reserve_mem(uint64_t *free_base, size_t *free_size,
if (pos == BOTTOM) if (pos == BOTTOM)
*free_base = addr + size; *free_base = addr + size;
VERBOSE("Reserved %u bytes (discarded %u bytes %s)\n", VERBOSE("Reserved 0x%lx bytes (discarded 0x%lx bytes %s)\n",
reserved_size, discard_size, reserved_size, discard_size,
pos == TOP ? "above" : "below"); pos == TOP ? "above" : "below");
} }
......
...@@ -88,13 +88,9 @@ This stage begins execution from the platform's reset vector at EL3. The reset ...@@ -88,13 +88,9 @@ This stage begins execution from the platform's reset vector at EL3. The reset
address is platform dependent but it is usually located in a Trusted ROM area. address is platform dependent but it is usually located in a Trusted ROM area.
The BL1 data section is copied to trusted SRAM at runtime. The BL1 data section is copied to trusted SRAM at runtime.
On the ARM FVP port, BL1 code starts execution from the reset vector at address On the ARM development platforms, BL1 code starts execution from the reset
`0x00000000` (trusted ROM). The BL1 data section is copied to the start of vector defined by the constant `BL1_RO_BASE`. The BL1 data section is copied
trusted SRAM at address `0x04000000`. to the top of trusted SRAM as defined by the constant `BL1_RW_BASE`.
On the Juno ARM development platform port, BL1 code starts execution at
`0x0BEC0000` (FLASH). The BL1 data section is copied to trusted SRAM at address
`0x04001000.
The functionality implemented by this stage is as follows. The functionality implemented by this stage is as follows.
...@@ -189,9 +185,9 @@ BL1 performs minimal architectural initialization as follows. ...@@ -189,9 +185,9 @@ BL1 performs minimal architectural initialization as follows.
#### Platform initialization #### Platform initialization
BL1 enables issuing of snoop and DVM (Distributed Virtual Memory) requests from BL1 enables issuing of snoop and DVM (Distributed Virtual Memory) requests from
the CCI-400 slave interface corresponding to the cluster that includes the the CCI slave interface corresponding to the cluster that includes the
primary CPU. BL1 also initializes UART0 (PL011 console), which enables access to primary CPU. BL1 also initializes a UART (PL011 console), which enables access
the `printf` family of functions in BL1. to the `printf` family of functions in BL1.
#### BL2 image load and execution #### BL2 image load and execution
...@@ -247,7 +243,7 @@ platform-specific mechanism. It calculates the limits of DRAM (main memory) ...@@ -247,7 +243,7 @@ platform-specific mechanism. It calculates the limits of DRAM (main memory)
to determine whether there is enough space to load the BL3-3 image. A platform to determine whether there is enough space to load the BL3-3 image. A platform
defined base address is used to specify the load address for the BL3-1 image. defined base address is used to specify the load address for the BL3-1 image.
It also defines the extents of memory available for use by the BL3-2 image. It also defines the extents of memory available for use by the BL3-2 image.
BL2 also initializes UART0 (PL011 console), which enables access to the BL2 also initializes a UART (PL011 console), which enables access to the
`printf` family of functions in BL2. Platform security is initialized to allow `printf` family of functions in BL2. Platform security is initialized to allow
access to controlled components. The storage abstraction layer is initialized access to controlled components. The storage abstraction layer is initialized
which is used to load further bootloader images. which is used to load further bootloader images.
...@@ -258,8 +254,8 @@ Some systems have a separate System Control Processor (SCP) for power, clock, ...@@ -258,8 +254,8 @@ Some systems have a separate System Control Processor (SCP) for power, clock,
reset and system control. BL2 loads the optional BL3-0 image from platform reset and system control. BL2 loads the optional BL3-0 image from platform
storage into a platform-specific region of secure memory. The subsequent storage into a platform-specific region of secure memory. The subsequent
handling of BL3-0 is platform specific. For example, on the Juno ARM development handling of BL3-0 is platform specific. For example, on the Juno ARM development
platform port the image is transferred into SCP memory using the SCPI protocol platform port the image is transferred into SCP's internal memory using the Boot
after being loaded in the trusted SRAM memory at address `0x04009000`. The SCP Over MHU (BOM) protocol after being loaded in the trusted SRAM memory. The SCP
executes BL3-0 and signals to the Application Processor (AP) for BL2 execution executes BL3-0 and signals to the Application Processor (AP) for BL2 execution
to continue. to continue.
...@@ -338,7 +334,7 @@ the clock frequency of the system counter, which is provided by the platform. ...@@ -338,7 +334,7 @@ the clock frequency of the system counter, which is provided by the platform.
BL3-1 performs detailed platform initialization, which enables normal world BL3-1 performs detailed platform initialization, which enables normal world
software to function correctly. It also retrieves entrypoint information for software to function correctly. It also retrieves entrypoint information for
the BL3-3 image loaded by BL2 from the platform defined memory address populated the BL3-3 image loaded by BL2 from the platform defined memory address populated
by BL2. BL3-1 also initializes UART0 (PL011 console), which enables by BL2. BL3-1 also initializes a UART (PL011 console), which enables
access to the `printf` family of functions in BL3-1. It enables the system access to the `printf` family of functions in BL3-1. It enables the system
level implementation of the generic timer through the memory mapped interface. level implementation of the generic timer through the memory mapped interface.
...@@ -460,7 +456,8 @@ the CPU caches if it is provided by an earlier boot stage and then accessed by ...@@ -460,7 +456,8 @@ the CPU caches if it is provided by an earlier boot stage and then accessed by
BL3-1 platform code before the caches are enabled. BL3-1 platform code before the caches are enabled.
ARM Trusted Firmware's BL2 implementation passes a `bl31_params` structure in ARM Trusted Firmware's BL2 implementation passes a `bl31_params` structure in
`X0` and the FVP port interprets this in the BL3-1 platform code. `X0` and the ARM development platforms interpret this in the BL3-1 platform
code.
##### MMU, Data caches & Coherency ##### MMU, Data caches & Coherency
...@@ -490,7 +487,7 @@ BL3-1 to detect which information is present and respond appropriately. The ...@@ -490,7 +487,7 @@ BL3-1 to detect which information is present and respond appropriately. The
The structures using this format are `entry_point_info`, `image_info` and The structures using this format are `entry_point_info`, `image_info` and
`bl31_params`. The code that allocates and populates these structures must set `bl31_params`. The code that allocates and populates these structures must set
the header fields appropriately, and the `SET_PARA_HEAD()` a macro is defined the header fields appropriately, and the `SET_PARAM_HEAD()` a macro is defined
to simplify this action. to simplify this action.
#### Required CPU state for BL3-1 Warm boot initialization #### Required CPU state for BL3-1 Warm boot initialization
...@@ -870,10 +867,10 @@ before returning through EL3 and running the non-trusted firmware (BL3-3): ...@@ -870,10 +867,10 @@ before returning through EL3 and running the non-trusted firmware (BL3-3):
6. Crash Reporting in BL3-1 6. Crash Reporting in BL3-1
---------------------------- ----------------------------
The BL3-1 implements a scheme for reporting the processor state when an unhandled BL3-1 implements a scheme for reporting the processor state when an unhandled
exception is encountered. The reporting mechanism attempts to preserve all the exception is encountered. The reporting mechanism attempts to preserve all the
register contents and report it via the default serial output. The general purpose register contents and report it via a dedicated UART (PL011 console). BL3-1
registers, EL3, Secure EL1 and some EL2 state registers are reported. reports the general purpose, EL3, Secure EL1 and some EL2 state registers.
A dedicated per-CPU crash stack is maintained by BL3-1 and this is retrieved via A dedicated per-CPU crash stack is maintained by BL3-1 and this is retrieved via
the per-CPU pointer cache. The implementation attempts to minimise the memory the per-CPU pointer cache. The implementation attempts to minimise the memory
...@@ -1253,27 +1250,37 @@ on FVP, BL3-1 and TSP need to know the limit address that their PROGBITS ...@@ -1253,27 +1250,37 @@ on FVP, BL3-1 and TSP need to know the limit address that their PROGBITS
sections must not overstep. The platform code must provide those. sections must not overstep. The platform code must provide those.
#### Memory layout on ARM FVPs #### Memory layout on ARM development platforms
The following list describes the memory layout on the ARM development platforms:
The following list describes the memory layout on the FVP: * A 4KB page of shared memory is used for communication between Trusted
Firmware and the platform's power controller. This is located at the base of
Trusted SRAM. The amount of Trusted SRAM available to load the bootloader
images is reduced by the size of the shared memory.
* A 4KB page of shared memory is used to store the entrypoint mailboxes The shared memory is used to store the entrypoint mailboxes for each CPU.
and the parameters passed between bootloaders. The shared memory is located On Juno, this is also used for the MHU payload when passing messages to and
at the base of the Trusted SRAM. The amount of Trusted SRAM available to from the SCP.
load the bootloader images will be reduced by the size of the shared memory.
* BL1 is originally sitting in the Trusted ROM at address `0x0`. Its * On FVP, BL1 is originally sitting in the Trusted ROM at address `0x0`. On
read-write data are relocated at the top of the Trusted SRAM at runtime. Juno, BL1 resides in flash memory at address `0x0BEC0000`. BL1 read-write
data are relocated to the top of Trusted SRAM at runtime.
* BL3-1 is loaded at the top of the Trusted SRAM, such that its NOBITS * BL3-1 is loaded at the top of the Trusted SRAM, such that its NOBITS
sections will overwrite BL1 R/W data. sections will overwrite BL1 R/W data. This implies that BL1 global variables
remain valid only until execution reaches the BL3-1 entry point during
a cold boot.
* BL2 is loaded below BL3-1. * BL2 is loaded below BL3-1.
* On Juno, BL3-0 is loaded temporarily into the BL3-1 memory region and
transfered to the SCP before being overwritten by BL3-1.
* BL3-2 can be loaded in one of the following locations: * BL3-2 can be loaded in one of the following locations:
* Trusted SRAM * Trusted SRAM
* Trusted DRAM * Trusted DRAM (FVP only)
* Secure region of DRAM (top 16MB of DRAM configured by the TrustZone * Secure region of DRAM (top 16MB of DRAM configured by the TrustZone
controller) controller)
...@@ -1282,9 +1289,13 @@ overlay BL2. This memory layout is designed to give the BL3-2 image as much ...@@ -1282,9 +1289,13 @@ overlay BL2. This memory layout is designed to give the BL3-2 image as much
memory as possible when it is loaded into Trusted SRAM. memory as possible when it is loaded into Trusted SRAM.
The location of the BL3-2 image will result in different memory maps. This is The location of the BL3-2 image will result in different memory maps. This is
illustrated in the following diagrams using the TSP as an example. illustrated for both FVP and Juno in the following diagrams, using the TSP as
an example.
Note: Loading the BL3-2 image in TZC secured DRAM doesn't change the memory
layout of the other images in Trusted SRAM.
**TSP in Trusted SRAM (default option):** **FVP with TSP in Trusted SRAM (default option):**
Trusted SRAM Trusted SRAM
0x04040000 +----------+ loaded by BL2 ------------------ 0x04040000 +----------+ loaded by BL2 ------------------
...@@ -1305,7 +1316,7 @@ illustrated in the following diagrams using the TSP as an example. ...@@ -1305,7 +1316,7 @@ illustrated in the following diagrams using the TSP as an example.
0x00000000 +----------+ 0x00000000 +----------+
**TSP in Trusted DRAM:** **FVP with TSP in Trusted DRAM:**
Trusted DRAM Trusted DRAM
0x08000000 +----------+ 0x08000000 +----------+
...@@ -1330,7 +1341,7 @@ illustrated in the following diagrams using the TSP as an example. ...@@ -1330,7 +1341,7 @@ illustrated in the following diagrams using the TSP as an example.
| BL1 (ro) | | BL1 (ro) |
0x00000000 +----------+ 0x00000000 +----------+
**TSP in the TZC-Secured DRAM:** **FVP with TSP in TZC-Secured DRAM:**
DRAM DRAM
0xffffffff +----------+ 0xffffffff +----------+
...@@ -1359,43 +1370,8 @@ illustrated in the following diagrams using the TSP as an example. ...@@ -1359,43 +1370,8 @@ illustrated in the following diagrams using the TSP as an example.
| BL1 (ro) | | BL1 (ro) |
0x00000000 +----------+ 0x00000000 +----------+
Moving the TSP image out of the Trusted SRAM doesn't change the memory layout
of the other boot loader images in Trusted SRAM.
#### Memory layout on Juno ARM development platform
The following list describes the memory layout on Juno:
* Trusted SRAM at 0x04000000 contains the MHU page, BL1 r/w section, BL2
image, BL3-1 image and, optionally, the BL3-2 image.
* The MHU 4 KB page is used as communication channel between SCP and AP. It
also contains the entrypoint mailboxes for the AP. Mailboxes are stored in
the first 128 bytes of the MHU page.
* BL1 resides in flash memory at address `0x0BEC0000`. Its read-write data **Juno with BL3-2 in Trusted SRAM (default option):**
section is relocated to the top of the Trusted SRAM at runtime.
* BL3-1 is loaded at the top of the Trusted SRAM, such that its NOBITS
sections will overwrite BL1 R/W data. This implies that BL1 global variables
will remain valid only until execution reaches the BL3-1 entry point during
a cold boot.
* BL2 is loaded below BL3-1.
* BL3-0 is loaded temporarily into the BL3-1 memory region and transfered to
the SCP before being overwritten by BL3-1.
* The BL3-2 image is optional and can be loaded into one of these two
locations: Trusted SRAM (right after the MHU page) or DRAM (14 MB starting
at 0xFF000000 and secured by the TrustZone controller). When loaded into
Trusted SRAM, its NOBITS sections are allowed to overlap BL2.
Depending on the location of the BL3-2 image, it will result in different memory
maps, illustrated by the following diagrams.
**BL3-2 in Trusted SRAM (default option):**
Flash0 Flash0
0x0C000000 +----------+ 0x0C000000 +----------+
...@@ -1420,7 +1396,7 @@ maps, illustrated by the following diagrams. ...@@ -1420,7 +1396,7 @@ maps, illustrated by the following diagrams.
0x04000000 +----------+ 0x04000000 +----------+
**BL3-2 in the secure region of DRAM:** **Juno with BL3-2 in TZC-secured DRAM:**
DRAM DRAM
0xFFE00000 +----------+ 0xFFE00000 +----------+
...@@ -1453,9 +1429,6 @@ maps, illustrated by the following diagrams. ...@@ -1453,9 +1429,6 @@ maps, illustrated by the following diagrams.
| MHU | | MHU |
0x04000000 +----------+ 0x04000000 +----------+
Loading the BL3-2 image in DRAM doesn't change the memory layout of the other
images in Trusted SRAM.
10. Firmware Image Package (FIP) 10. Firmware Image Package (FIP)
--------------------------------- ---------------------------------
...@@ -1524,15 +1497,16 @@ The tool can be found in `tools/fip_create`. ...@@ -1524,15 +1497,16 @@ The tool can be found in `tools/fip_create`.
### Loading from a Firmware Image Package (FIP) ### Loading from a Firmware Image Package (FIP)
The Firmware Image Package (FIP) driver can load images from a binary package on The Firmware Image Package (FIP) driver can load images from a binary package on
non-volatile platform storage. For the FVPs this is currently NOR FLASH. non-volatile platform storage. For the ARM development platforms, this is
currently NOR FLASH.
Bootloader images are loaded according to the platform policy as specified in Bootloader images are loaded according to the platform policy as specified by
`plat/<platform>/plat_io_storage.c`. For the FVPs this means the platform will the function `plat_get_image_source()`. For the ARM development platforms, this
attempt to load images from a Firmware Image Package located at the start of NOR means the platform will attempt to load images from a Firmware Image Package
FLASH0. located at the start of NOR FLASH0.
Currently the FVP's policy only allows loading of a known set of images. The The ARM development platforms' policy is to only allow loading of a known set of
platform policy can be modified to allow additional images. images. The platform policy can be modified to allow additional images.
11. Use of coherent memory in Trusted Firmware 11. Use of coherent memory in Trusted Firmware
...@@ -1743,7 +1717,6 @@ Trusted Firmware code is logically divided between the three boot loader ...@@ -1743,7 +1717,6 @@ Trusted Firmware code is logically divided between the three boot loader
stages mentioned in the previous sections. The code is also divided into the stages mentioned in the previous sections. The code is also divided into the
following categories (present as directories in the source code): following categories (present as directories in the source code):
* **Architecture specific.** This could be AArch32 or AArch64.
* **Platform specific.** Choice of architecture specific code depends upon * **Platform specific.** Choice of architecture specific code depends upon
the platform. the platform.
* **Common code.** This is platform and architecture agnostic code. * **Common code.** This is platform and architecture agnostic code.
...@@ -1761,7 +1734,6 @@ categories. Based upon the above, the code layout looks like this: ...@@ -1761,7 +1734,6 @@ categories. Based upon the above, the code layout looks like this:
bl1 Yes No No bl1 Yes No No
bl2 No Yes No bl2 No Yes No
bl31 No No Yes bl31 No No Yes
arch Yes Yes Yes
plat Yes Yes Yes plat Yes Yes Yes
drivers Yes No Yes drivers Yes No Yes
common Yes Yes Yes common Yes Yes Yes
...@@ -1795,7 +1767,7 @@ kernel at boot time. These can be found in the `fdts` directory. ...@@ -1795,7 +1767,7 @@ kernel at boot time. These can be found in the `fdts` directory.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved._ _Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved._
[ARM ARM]: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0487a.e/index.html "ARMv8-A Reference Manual (ARM DDI0487A.E)" [ARM ARM]: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0487a.e/index.html "ARMv8-A Reference Manual (ARM DDI0487A.E)"
[PSCI]: http://infocenter.arm.com/help/topic/com.arm.doc.den0022c/DEN0022C_Power_State_Coordination_Interface.pdf "Power State Coordination Interface PDD (ARM DEN 0022C)" [PSCI]: http://infocenter.arm.com/help/topic/com.arm.doc.den0022c/DEN0022C_Power_State_Coordination_Interface.pdf "Power State Coordination Interface PDD (ARM DEN 0022C)"
......
This diff is collapsed.
...@@ -206,8 +206,8 @@ performed. ...@@ -206,8 +206,8 @@ performed.
wants the timer registers to be saved and restored. wants the timer registers to be saved and restored.
* `PLAT`: Choose a platform to build ARM Trusted Firmware for. The chosen * `PLAT`: Choose a platform to build ARM Trusted Firmware for. The chosen
platform name must be the name of one of the directories under the `plat/` platform name must be subdirectory of any depth under `plat/`, and must
directory other than `common`. contain a platform makefile named `platform.mk`.
* `SPD`: Choose a Secure Payload Dispatcher component to be built into the * `SPD`: Choose a Secure Payload Dispatcher component to be built into the
Trusted Firmware. The value should be the path to the directory containing Trusted Firmware. The value should be the path to the directory containing
...@@ -320,21 +320,16 @@ performed. ...@@ -320,21 +320,16 @@ performed.
* `BL33_KEY`: This option is used when `GENERATE_COT=1`. It specifies the * `BL33_KEY`: This option is used when `GENERATE_COT=1`. It specifies the
file that contains the BL3-3 private key in PEM format. file that contains the BL3-3 private key in PEM format.
#### FVP specific build options #### ARM development platform specific build options
* `FVP_TSP_RAM_LOCATION`: location of the TSP binary. Options: * `ARM_TSP_RAM_LOCATION_ID`: location of the TSP binary. Options:
- `tsram` : Trusted SRAM (default option) - `tsram` : Trusted SRAM (default option)
- `tdram` : Trusted DRAM - `tdram` : Trusted DRAM (if available)
- `dram` : Secure region in DRAM (configured by the TrustZone controller) - `dram` : Secure region in DRAM (configured by the TrustZone controller)
For a better understanding of FVP options, the FVP memory map is explained in For a better understanding of these options, the ARM development platform memory
the [Firmware Design]. map is explained in the [Firmware Design].
#### Juno specific build options
* `PLAT_TSP_LOCATION`: location of the TSP binary. Options:
- `tsram` : Trusted SRAM (default option)
- `dram` : Secure region in DRAM (set by the TrustZone controller)
### Creating a Firmware Image Package ### Creating a Firmware Image Package
...@@ -409,8 +404,8 @@ When debugging logic problems it might also be useful to disable all compiler ...@@ -409,8 +404,8 @@ When debugging logic problems it might also be useful to disable all compiler
optimizations by using `-O0`. optimizations by using `-O0`.
NOTE: Using `-O0` could cause output images to be larger and base addresses NOTE: Using `-O0` could cause output images to be larger and base addresses
might need to be recalculated (see the "Memory layout of BL images" section in might need to be recalculated (see the **Memory layout on ARM development
the [Firmware Design]). platforms** section in the [Firmware Design]).
Extra debug options can be passed to the build system by setting `CFLAGS`: Extra debug options can be passed to the build system by setting `CFLAGS`:
...@@ -461,7 +456,7 @@ FVP_AARCH64_EFI.fd as BL3-3 image: ...@@ -461,7 +456,7 @@ FVP_AARCH64_EFI.fd as BL3-3 image:
The `cert_create` tool can be built separately through the following commands: The `cert_create` tool can be built separately through the following commands:
$ cd tools/cert_create $ cd tools/cert_create
$ make [DEBUG=1] [V=1] $ make PLAT=<platform> [DEBUG=1] [V=1]
`DEBUG=1` builds the tool in debug mode. `V=1` makes the build process more `DEBUG=1` builds the tool in debug mode. `V=1` makes the build process more
verbose. The following command should be used to obtain help about the tool: verbose. The following command should be used to obtain help about the tool:
......
/* /*
* Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -31,40 +31,17 @@ ...@@ -31,40 +31,17 @@
#include <asm_macros.S> #include <asm_macros.S>
#include <pl011.h> #include <pl011.h>
.globl console_init /*
.globl console_putc * Pull in generic functions to provide backwards compatibility for
* platform makefiles
*/
#include "../../console/console.S"
.globl console_core_init .globl console_core_init
.globl console_core_putc .globl console_core_putc
.globl console_getc .globl console_core_getc
/*
* The console base is in the data section and not in .bss
* even though it is zero-init. In particular, this allows
* the console functions to start using this variable before
* the runtime memory is initialized for images which do not
* need to copy the .data section from ROM to RAM.
*/
.section .data.console_base ; .align 3
console_base: .quad 0x0
/* -----------------------------------------------
* int console_init(unsigned long base_addr,
* unsigned int uart_clk, unsigned int baud_rate)
* Function to initialize the console without a
* C Runtime to print debug information. It saves
* the console base to the data section.
* In: x0 - console base address
* w1 - Uart clock in Hz
* w2 - Baud rate
* out: return 1 on success.
* Clobber list : x1 - x3
* -----------------------------------------------
*/
func console_init
adrp x3, console_base
str x0, [x3, :lo12:console_base]
b console_core_init
endfunc console_init
/* ----------------------------------------------- /* -----------------------------------------------
* int console_core_init(unsigned long base_addr, * int console_core_init(unsigned long base_addr,
...@@ -76,16 +53,16 @@ endfunc console_init ...@@ -76,16 +53,16 @@ endfunc console_init
* In: x0 - console base address * In: x0 - console base address
* w1 - Uart clock in Hz * w1 - Uart clock in Hz
* w2 - Baud rate * w2 - Baud rate
* Out: return 1 on success * Out: return 1 on success else 0 on error
* Clobber list : x1, x2 * Clobber list : x1, x2
* ----------------------------------------------- * -----------------------------------------------
*/ */
func console_core_init func console_core_init
/* Check the input base address */ /* Check the input base address */
cbz x0, init_fail cbz x0, core_init_fail
/* Check baud rate and uart clock for sanity */ /* Check baud rate and uart clock for sanity */
cbz w1, init_fail cbz w1, core_init_fail
cbz w2, init_fail cbz w2, core_init_fail
/* Program the baudrate */ /* Program the baudrate */
/* Divisor = (Uart clock * 4) / baudrate */ /* Divisor = (Uart clock * 4) / baudrate */
lsl w1, w1, #2 lsl w1, w1, #2
...@@ -106,28 +83,14 @@ func console_core_init ...@@ -106,28 +83,14 @@ func console_core_init
mov w1, #(PL011_UARTCR_RXE | PL011_UARTCR_TXE | PL011_UARTCR_UARTEN) mov w1, #(PL011_UARTCR_RXE | PL011_UARTCR_TXE | PL011_UARTCR_UARTEN)
str w1, [x0, #UARTCR] str w1, [x0, #UARTCR]
mov w0, #1 mov w0, #1
init_fail: ret
core_init_fail:
mov w0, wzr
ret ret
endfunc console_core_init endfunc console_core_init
/* ---------------------------------------------
* int console_putc(int c)
* Function to output a character over the
* console. It returns the character printed on
* success or -1 on error.
* In : x0 - character to be printed
* Out : return -1 on error else return character.
* Clobber list : x1, x2
* ---------------------------------------------
*/
func console_putc
adrp x2, console_base
ldr x1, [x2, :lo12:console_base]
b console_core_putc
endfunc console_putc
/* -------------------------------------------------------- /* --------------------------------------------------------
* int console_core_putc(int c, unsigned int base_addr) * int console_core_putc(int c, unsigned long base_addr)
* Function to output a character over the console. It * Function to output a character over the console. It
* returns the character printed on success or -1 on error. * returns the character printed on success or -1 on error.
* In : w0 - character to be printed * In : w0 - character to be printed
...@@ -160,24 +123,24 @@ putc_error: ...@@ -160,24 +123,24 @@ putc_error:
endfunc console_core_putc endfunc console_core_putc
/* --------------------------------------------- /* ---------------------------------------------
* int console_getc(void) * int console_core_getc(unsigned long base_addr)
* Function to get a character from the console. * Function to get a character from the console.
* It returns the character grabbed on success * It returns the character grabbed on success
* or -1 on error. * or -1 on error.
* In : x0 - console base address
* Clobber list : x0, x1 * Clobber list : x0, x1
* --------------------------------------------- * ---------------------------------------------
*/ */
func console_getc func console_core_getc
adrp x0, console_base cbz x0, getc_error
ldr x1, [x0, :lo12:console_base]
cbz x1, getc_error
1: 1:
/* Check if the receive FIFO is empty */ /* Check if the receive FIFO is empty */
ldr w0, [x1, #UARTFR] ldr w1, [x0, #UARTFR]
tbnz w0, #PL011_UARTFR_RXFE_BIT, 1b tbnz w1, #PL011_UARTFR_RXFE_BIT, 1b
ldr w0, [x1, #UARTDR] ldr w1, [x0, #UARTDR]
mov w0, w1
ret ret
getc_error: getc_error:
mov w0, #-1 mov w0, #-1
ret ret
endfunc console_getc endfunc console_core_getc
/* /*
* Copyright (c) 2014, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -191,15 +191,41 @@ void tzc_init(uint64_t base) ...@@ -191,15 +191,41 @@ void tzc_init(uint64_t base)
BUILD_CONFIG_NR_MASK) + 1; BUILD_CONFIG_NR_MASK) + 1;
} }
/*
* `tzc_configure_region0` is used to program region 0 into the TrustZone
* controller. Region 0 covers the whole address space that is not mapped
* to any other region, and is enabled on all filters; this cannot be
* changed. This function only changes the access permissions.
*/
void tzc_configure_region0(tzc_region_attributes_t sec_attr,
uint32_t ns_device_access)
{
assert(tzc.base);
VERBOSE("TZC : Configuring region 0 (sec_attr=0x%x, ns_devs=0x%x)\n",
sec_attr, ns_device_access);
assert(sec_attr <= TZC_REGION_S_RDWR);
/* Set secure attributes on region 0 */
tzc_write_region_attributes(tzc.base, 0,
sec_attr << REG_ATTR_SEC_SHIFT);
/*
* Specify which non-secure devices have permission to access
* region 0.
*/
tzc_write_region_id_access(tzc.base, 0, ns_device_access);
}
/* /*
* `tzc_configure_region` is used to program regions into the TrustZone * `tzc_configure_region` is used to program regions into the TrustZone
* controller. A region can be associated with more than one filter. The * controller. A region can be associated with more than one filter. The
* associated filters are passed in as a bitmap (bit0 = filter0). * associated filters are passed in as a bitmap (bit0 = filter0).
* NOTE: * NOTE:
* The region 0 covers the whole address space and is enabled on all filters, * Region 0 is special; it is preferable to use tzc_configure_region0
* this cannot be changed. It is, however, possible to change some region 0 * for this region (see comment for that function).
* permissions.
*/ */
void tzc_configure_region(uint32_t filters, void tzc_configure_region(uint32_t filters,
uint8_t region, uint8_t region,
...@@ -210,6 +236,13 @@ void tzc_configure_region(uint32_t filters, ...@@ -210,6 +236,13 @@ void tzc_configure_region(uint32_t filters,
{ {
assert(tzc.base); assert(tzc.base);
VERBOSE("TZC : Configuring region (filters=0x%x, region=%d, ...\n",
filters, region);
VERBOSE("TZC : ... base=0x%lx, top=0x%lx, ...\n",
region_base, region_top);
VERBOSE("TZC : ... sec_attr=0x%x, ns_devs=0x%x)\n",
sec_attr, ns_device_access);
/* Do range checks on filters and regions. */ /* Do range checks on filters and regions. */
assert(((filters >> tzc.num_filters) == 0) && assert(((filters >> tzc.num_filters) == 0) &&
(region < tzc.num_regions)); (region < tzc.num_regions));
......
/*
* 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 <asm_macros.S>
.globl console_init
.globl console_putc
.globl console_getc
/*
* The console base is in the data section and not in .bss
* even though it is zero-init. In particular, this allows
* the console functions to start using this variable before
* the runtime memory is initialized for images which do not
* need to copy the .data section from ROM to RAM.
*/
.section .data.console_base ; .align 3
console_base: .quad 0x0
/* -----------------------------------------------
* int console_init(unsigned long base_addr,
* unsigned int uart_clk, unsigned int baud_rate)
* Function to initialize the console without a
* C Runtime to print debug information. It saves
* the console base to the data section.
* In: x0 - console base address
* w1 - Uart clock in Hz
* w2 - Baud rate
* out: return 1 on success else 0 on error
* Clobber list : x1 - x3
* -----------------------------------------------
*/
func console_init
/* Check the input base address */
cbz x0, init_fail
adrp x3, console_base
str x0, [x3, :lo12:console_base]
b console_core_init
init_fail:
ret
endfunc console_init
/* ---------------------------------------------
* int console_putc(int c)
* Function to output a character over the
* console. It returns the character printed on
* success or -1 on error.
* In : x0 - character to be printed
* Out : return -1 on error else return character.
* Clobber list : x1, x2
* ---------------------------------------------
*/
func console_putc
adrp x2, console_base
ldr x1, [x2, :lo12:console_base]
b console_core_putc
endfunc console_putc
/* ---------------------------------------------
* int console_getc(void)
* Function to get a character from the console.
* It returns the character grabbed on success
* or -1 on error.
* Clobber list : x0, x1
* ---------------------------------------------
*/
func console_getc
adrp x1, console_base
ldr x0, [x1, :lo12:console_base]
b console_core_getc
endfunc console_getc
/*
* 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 <asm_macros.S>
/*
* This file contains a skeleton console implementation that can
* be used as basis for a real console implementation by platforms
* that do not contain PL011 hardware.
*/
.globl console_core_init
.globl console_core_putc
.globl console_core_getc
/* -----------------------------------------------
* int console_core_init(unsigned long base_addr,
* unsigned int uart_clk, unsigned int baud_rate)
* Function to initialize the console without a
* C Runtime to print debug information. This
* function will be accessed by console_init and
* crash reporting.
* In: x0 - console base address
* w1 - Uart clock in Hz
* w2 - Baud rate
* Out: return 1 on success else 0 on error
* Clobber list : x1, x2
* -----------------------------------------------
*/
func console_core_init
/* Check the input base address */
cbz x0, core_init_fail
/* Check baud rate and uart clock for sanity */
cbz w1, core_init_fail
cbz w2, core_init_fail
/* Insert implementation here */
mov w0, #1
ret
core_init_fail:
mov w0, wzr
ret
endfunc console_core_init
/* --------------------------------------------------------
* int console_core_putc(int c, unsigned long base_addr)
* Function to output a character over the console. It
* returns the character printed on success or -1 on error.
* In : w0 - character to be printed
* x1 - console base address
* Out : return -1 on error else return character.
* Clobber list : x2
* --------------------------------------------------------
*/
func console_core_putc
/* Check the input parameter */
cbz x1, putc_error
/* Insert implementation here */
ret
putc_error:
mov w0, #-1
ret
endfunc console_core_putc
/* ---------------------------------------------
* int console_core_getc(unsigned long base_addr)
* Function to get a character from the console.
* It returns the character grabbed on success
* or -1 on error.
* In : x0 - console base address
* Clobber list : x0, x1
* ---------------------------------------------
*/
func console_core_getc
cbz x0, getc_error
/* Insert implementation here */
ret
getc_error:
mov w0, #-1
ret
endfunc console_core_getc
/* /*
* Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -27,6 +27,8 @@ ...@@ -27,6 +27,8 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __ASM_MACROS_S__
#define __ASM_MACROS_S__
#include <arch.h> #include <arch.h>
...@@ -204,3 +206,5 @@ wait_for_entrypoint: ...@@ -204,3 +206,5 @@ wait_for_entrypoint:
_mov_imm16 \_reg, (\_val), 48 _mov_imm16 \_reg, (\_val), 48
.endif .endif
.endm .endm
#endif /* __ASM_MACROS_S__ */
/* /*
* Copyright (c) 2014, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -27,6 +27,8 @@ ...@@ -27,6 +27,8 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __ASSERT_MACROS_S__
#define __ASSERT_MACROS_S__
/* /*
* Assembler macro to enable asm_assert. Use this macro wherever * Assembler macro to enable asm_assert. Use this macro wherever
...@@ -47,3 +49,5 @@ ...@@ -47,3 +49,5 @@
mov x1, __LINE__ ;\ mov x1, __LINE__ ;\
b asm_assert ;\ b asm_assert ;\
300: 300:
#endif /* __ASSERT_MACROS_S__ */
...@@ -110,6 +110,26 @@ ...@@ -110,6 +110,26 @@
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
/*
* Declarations of linker defined symbols to help determine memory layout of
* BL images
*/
extern unsigned long __RO_START__;
extern unsigned long __RO_END__;
#if IMAGE_BL2
extern unsigned long __BL2_END__;
#elif IMAGE_BL31
extern unsigned long __BL31_END__;
#elif IMAGE_BL32
extern unsigned long __BL32_END__;
#endif /* IMAGE_BLX */
#if USE_COHERENT_MEM
extern unsigned long __COHERENT_RAM_START__;
extern unsigned long __COHERENT_RAM_END__;
#endif
/******************************************************************************* /*******************************************************************************
* Structure used for telling the next BL how much of a particular type of * Structure used for telling the next BL how much of a particular type of
* memory is available for its use and how much is already used. * memory is available for its use and how much is already used.
......
/* /*
* Copyright (c) 2014, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
#ifndef __TZC400_H__ #ifndef __TZC400_H__
#define __TZC400_H__ #define __TZC400_H__
#include <stdint.h>
#define BUILD_CONFIG_OFF 0x000 #define BUILD_CONFIG_OFF 0x000
#define ACTION_OFF 0x004 #define ACTION_OFF 0x004
...@@ -148,9 +147,13 @@ ...@@ -148,9 +147,13 @@
#define TZC_REGION_ACCESS_RDWR(id) \ #define TZC_REGION_ACCESS_RDWR(id) \
(TZC_REGION_ACCESS_RD(id) | TZC_REGION_ACCESS_WR(id)) (TZC_REGION_ACCESS_RD(id) | TZC_REGION_ACCESS_WR(id))
/* Filters are bit mapped 0 to 3. */
#define TZC400_COMPONENT_ID 0xb105f00d #define TZC400_COMPONENT_ID 0xb105f00d
#ifndef __ASSEMBLY__
#include <stdint.h>
/******************************************************************************* /*******************************************************************************
* Function & variable prototypes * Function & variable prototypes
******************************************************************************/ ******************************************************************************/
...@@ -187,6 +190,8 @@ typedef enum { ...@@ -187,6 +190,8 @@ typedef enum {
void tzc_init(uint64_t base); void tzc_init(uint64_t base);
void tzc_configure_region0(tzc_region_attributes_t sec_attr,
uint32_t ns_device_access);
void tzc_configure_region(uint32_t filters, void tzc_configure_region(uint32_t filters,
uint8_t region, uint8_t region,
uint64_t region_base, uint64_t region_base,
...@@ -197,5 +202,6 @@ void tzc_enable_filters(void); ...@@ -197,5 +202,6 @@ void tzc_enable_filters(void);
void tzc_disable_filters(void); void tzc_disable_filters(void);
void tzc_set_action(tzc_action_t action); void tzc_set_action(tzc_action_t action);
#endif /* __ASSEMBLY__ */
#endif /* __TZC400__ */ #endif /* __TZC400__ */
/* /*
* Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -302,6 +302,23 @@ ...@@ -302,6 +302,23 @@
((endian) & SPSR_E_MASK) << SPSR_E_SHIFT | \ ((endian) & SPSR_E_MASK) << SPSR_E_SHIFT | \
((aif) & SPSR_AIF_MASK) << SPSR_AIF_SHIFT) ((aif) & SPSR_AIF_MASK) << SPSR_AIF_SHIFT)
/*
* CTR_EL0 definitions
*/
#define CTR_CWG_SHIFT 24
#define CTR_CWG_MASK 0xf
#define CTR_ERG_SHIFT 20
#define CTR_ERG_MASK 0xf
#define CTR_DMINLINE_SHIFT 16
#define CTR_DMINLINE_MASK 0xf
#define CTR_L1IP_SHIFT 14
#define CTR_L1IP_MASK 0x3
#define CTR_IMINLINE_SHIFT 0
#define CTR_IMINLINE_MASK 0xf
#define MAX_CACHE_LINE_SIZE 0x800 /* 2KB */
#define SIZE_FROM_LOG2_WORDS(n) (4 << (n))
/* Physical timer control register bit fields shifts and masks */ /* Physical timer control register bit fields shifts and masks */
#define CNTP_CTL_ENABLE_SHIFT 0 #define CNTP_CTL_ENABLE_SHIFT 0
......
/* /*
* Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -281,6 +281,8 @@ DEFINE_SYSREG_RW_FUNCS(vmpidr_el2) ...@@ -281,6 +281,8 @@ DEFINE_SYSREG_RW_FUNCS(vmpidr_el2)
DEFINE_SYSREG_READ_FUNC(isr_el1) DEFINE_SYSREG_READ_FUNC(isr_el1)
DEFINE_SYSREG_READ_FUNC(ctr_el0)
/* GICv3 System Registers */ /* GICv3 System Registers */
DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el1, ICC_SRE_EL1) DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el1, ICC_SRE_EL1)
......
/* /*
* Copyright (c) 2014, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -27,6 +27,8 @@ ...@@ -27,6 +27,8 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __CPU_MACROS_S__
#define __CPU_MACROS_S__
#include <arch.h> #include <arch.h>
...@@ -80,3 +82,5 @@ CPU_OPS_SIZE = . ...@@ -80,3 +82,5 @@ CPU_OPS_SIZE = .
.quad \_name\()_cpu_reg_dump .quad \_name\()_cpu_reg_dump
#endif #endif
.endm .endm
#endif /* __CPU_MACROS_S__ */
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