Commit 4a75b84a authored by Dan Handley's avatar Dan Handley
Browse files

Doc updates following platform port reorganization

Update the User Guide, Porting Guide and Firmware Design documents
to align them with the recent changes made to the FVP and Juno
platform ports.

Also fix some other historical inaccuracies.

Change-Id: I37aba4805f9044b1a047996d3e396c75f4a09176
parent 85135283
...@@ -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)"
......
...@@ -33,13 +33,21 @@ Modifications consist of: ...@@ -33,13 +33,21 @@ Modifications consist of:
* Setting up the execution context in a certain way, or * Setting up the execution context in a certain way, or
* Defining certain constants (for example #defines). * Defining certain constants (for example #defines).
The platform-specific functions and variables are all declared in The platform-specific functions and variables are declared in
[include/plat/common/platform.h]. The firmware provides a default implementation [include/plat/common/platform.h]. The firmware provides a default implementation
of variables and functions to fulfill the optional requirements. These of variables and functions to fulfill the optional requirements. These
implementations are all weakly defined; they are provided to ease the porting implementations are all weakly defined; they are provided to ease the porting
effort. Each platform port can override them with its own implementation if the effort. Each platform port can override them with its own implementation if the
default implementation is inadequate. default implementation is inadequate.
Platform ports that want to be aligned with standard ARM platforms (for example
FVP and Juno) may also use [include/plat/arm/common/plat_arm.h] and the
corresponding source files in `plat/arm/common/`. These provide standard
implementations for some of the required platform porting functions. However,
using these functions requires the platform port to implement additional
ARM standard platform porting functions. These additional functions are not
documented here.
Some modifications are common to all Boot Loader (BL) stages. Section 2 Some modifications are common to all Boot Loader (BL) stages. Section 2
discusses these in detail. The subsequent sections discuss the remaining discusses these in detail. The subsequent sections discuss the remaining
modifications for each BL stage in detail. modifications for each BL stage in detail.
...@@ -60,8 +68,8 @@ either mandatory or optional. ...@@ -60,8 +68,8 @@ either mandatory or optional.
---------------------------------- ----------------------------------
A platform port must enable the Memory Management Unit (MMU) with identity A platform port must enable the Memory Management Unit (MMU) with identity
mapped page tables, and enable both the instruction and data caches for each BL mapped page tables, and enable both the instruction and data caches for each BL
stage. In the ARM FVP port, each BL stage configures the MMU in its platform- stage. In ARM standard platforms, each BL stage configures the MMU in
specific architecture setup function, for example `blX_plat_arch_setup()`. the platform-specific architecture setup function, `blX_plat_arch_setup()`.
If the build option `USE_COHERENT_MEM` is enabled, each platform must allocate a If the build option `USE_COHERENT_MEM` is enabled, each platform must allocate a
block of identity mapped secure memory with Device-nGnRE attributes aligned to block of identity mapped secure memory with Device-nGnRE attributes aligned to
...@@ -87,18 +95,28 @@ for the firmware to work correctly. ...@@ -87,18 +95,28 @@ for the firmware to work correctly.
Each platform must ensure that a header file of this name is in the system Each platform must ensure that a header file of this name is in the system
include path with the following constants defined. This may require updating the include path with the following constants defined. This may require updating the
list of `PLAT_INCLUDES` in the `platform.mk` file. In the ARM FVP port, this list of `PLAT_INCLUDES` in the `platform.mk` file. In the ARM development
file is found in [plat/fvp/include/platform_def.h]. platforms, this file is found in `plat/arm/board/<plat_name>/include/`.
Platform ports may optionally use the file [include/plat/common/common_def.h],
which provides typical values for some of the constants below. These values are
likely to be suitable for all platform ports.
Platform ports that want to be aligned with standard ARM platforms (for example
FVP and Juno) may also use [include/plat/arm/common/arm_def.h], which provides
standard values for some of the constants below. However, this requires the
platform port to define additional platform porting constants in
`platform_def.h`. These additional constants are not documented here.
* **#define : PLATFORM_LINKER_FORMAT** * **#define : PLATFORM_LINKER_FORMAT**
Defines the linker format used by the platform, for example Defines the linker format used by the platform, for example
`elf64-littleaarch64` used by the FVP. `elf64-littleaarch64`.
* **#define : PLATFORM_LINKER_ARCH** * **#define : PLATFORM_LINKER_ARCH**
Defines the processor architecture for the linker by the platform, for Defines the processor architecture for the linker by the platform, for
example `aarch64` used by the FVP. example `aarch64`.
* **#define : PLATFORM_STACK_SIZE** * **#define : PLATFORM_STACK_SIZE**
...@@ -106,6 +124,11 @@ file is found in [plat/fvp/include/platform_def.h]. ...@@ -106,6 +124,11 @@ file is found in [plat/fvp/include/platform_def.h].
by [plat/common/aarch64/platform_mp_stack.S] and by [plat/common/aarch64/platform_mp_stack.S] and
[plat/common/aarch64/platform_up_stack.S]. [plat/common/aarch64/platform_up_stack.S].
* **define : CACHE_WRITEBACK_GRANULE**
Defines the size in bits of the largest cache line across all the cache
levels in the platform.
* **#define : FIRMWARE_WELCOME_STR** * **#define : FIRMWARE_WELCOME_STR**
Defines the character string printed by BL1 upon entry into the `bl1_main()` Defines the character string printed by BL1 upon entry into the `bl1_main()`
...@@ -156,26 +179,11 @@ file is found in [plat/fvp/include/platform_def.h]. ...@@ -156,26 +179,11 @@ file is found in [plat/fvp/include/platform_def.h].
Name of the BL3-3 Content certificate on the host file-system (mandatory Name of the BL3-3 Content certificate on the host file-system (mandatory
when Trusted Board Boot is enabled). when Trusted Board Boot is enabled).
* **#define : PLATFORM_CACHE_LINE_SIZE**
Defines the size (in bytes) of the largest cache line across all the cache
levels in the platform.
* **#define : PLATFORM_CLUSTER_COUNT**
Defines the total number of clusters implemented by the platform in the
system.
* **#define : PLATFORM_CORE_COUNT** * **#define : PLATFORM_CORE_COUNT**
Defines the total number of CPUs implemented by the platform across all Defines the total number of CPUs implemented by the platform across all
clusters in the system. clusters in the system.
* **#define : PLATFORM_MAX_CPUS_PER_CLUSTER**
Defines the maximum number of CPUs that can be implemented within a cluster
on the platform.
* **#define : PLATFORM_NUM_AFFS** * **#define : PLATFORM_NUM_AFFS**
Defines the total number of nodes in the affinity heirarchy at all affinity Defines the total number of nodes in the affinity heirarchy at all affinity
...@@ -301,6 +309,16 @@ platform, the following constants must also be defined: ...@@ -301,6 +309,16 @@ platform, the following constants must also be defined:
Defines the ID of the secure physical generic timer interrupt used by the Defines the ID of the secure physical generic timer interrupt used by the
TSP's interrupt handling code. TSP's interrupt handling code.
If the platform port uses the translation table library code, the following
constant must also be defined:
* **#define : MAX_XLAT_TABLES**
Defines the maximum number of translation tables that are allocated by the
translation table library code. To minimize the amount of runtime memory
used, choose the smallest value needed to map the required virtual addresses
for each BL stage.
If the platform port uses the IO storage framework, the following constants If the platform port uses the IO storage framework, the following constants
must also be defined: must also be defined:
...@@ -328,7 +346,7 @@ memory within the the per-cpu data to minimize wastage. ...@@ -328,7 +346,7 @@ memory within the the per-cpu data to minimize wastage.
structure for use by the platform layer. structure for use by the platform layer.
The following constants are optional. They should be defined when the platform The following constants are optional. They should be defined when the platform
memory layout implies some image overlaying like on FVP. memory layout implies some image overlaying like in ARM standard platforms.
* **#define : BL31_PROGBITS_LIMIT** * **#define : BL31_PROGBITS_LIMIT**
...@@ -342,8 +360,8 @@ memory layout implies some image overlaying like on FVP. ...@@ -342,8 +360,8 @@ memory layout implies some image overlaying like on FVP.
### File : plat_macros.S [mandatory] ### File : plat_macros.S [mandatory]
Each platform must ensure a file of this name is in the system include path with Each platform must ensure a file of this name is in the system include path with
the following macro defined. In the ARM FVP port, this file is found in the following macro defined. In the ARM development platforms, this file is
[plat/fvp/include/plat_macros.S]. found in `plat/arm/board/<plat_name>/include/plat_macros.S`.
* **Macro : plat_print_gic_regs** * **Macro : plat_print_gic_regs**
...@@ -354,25 +372,11 @@ the following macro defined. In the ARM FVP port, this file is found in ...@@ -354,25 +372,11 @@ the following macro defined. In the ARM FVP port, this file is found in
* **Macro : plat_print_interconnect_regs** * **Macro : plat_print_interconnect_regs**
This macro allows the crash reporting routine to print interconnect registers This macro allows the crash reporting routine to print interconnect
in case of an unhandled exception in BL3-1. This aids in debugging and registers in case of an unhandled exception in BL3-1. This aids in debugging
this macro can be defined to be empty in case interconnect register reporting and this macro can be defined to be empty in case interconnect register
is not desired. In the ARM FVP port, the CCI snoop control registers are reporting is not desired. In ARM standard platforms, the CCI snoop
reported. control registers are reported.
### Other mandatory modifications
The following mandatory modifications may be implemented in any file
the implementer chooses. In the ARM FVP port, they are implemented in
[plat/fvp/aarch64/plat_common.c].
* **Function : uint64_t plat_get_syscnt_freq(void)**
This function is used by the architecture setup code to retrieve the
counter frequency for the CPU's generic timer. This value will be
programmed into the `CNTFRQ_EL0` register.
In the ARM FVP port, it returns the base frequency of the system counter,
which is retrieved from the first entry in the frequency modes table.
2.2 Handling Reset 2.2 Handling Reset
...@@ -564,7 +568,7 @@ specific errata workarounds could also be implemented here. The api should ...@@ -564,7 +568,7 @@ specific errata workarounds could also be implemented here. The api should
preserve the values of callee saved registers x19 to x29. preserve the values of callee saved registers x19 to x29.
The default implementation doesn't do anything. If a platform needs to override The default implementation doesn't do anything. If a platform needs to override
the default implementation, refer to the [Firmware Design Guide] for general the default implementation, refer to the [Firmware Design] for general
guidelines regarding placement of code in a reset handler. guidelines regarding placement of code in a reset handler.
### Function : plat_disable_acp() ### Function : plat_disable_acp()
...@@ -626,6 +630,17 @@ The following functions need to be implemented by the platform port to enable ...@@ -626,6 +630,17 @@ The following functions need to be implemented by the platform port to enable
BL1 to perform the above tasks. BL1 to perform the above tasks.
### Function : bl1_early_platform_setup() [mandatory]
Argument : void
Return : void
This function executes with the MMU and data caches disabled. It is only called
by the primary CPU.
In ARM standard platforms, this function initializes the console and enables
snoop requests into the primary CPU's cluster.
### Function : bl1_plat_arch_setup() [mandatory] ### Function : bl1_plat_arch_setup() [mandatory]
Argument : void Argument : void
...@@ -633,11 +648,9 @@ BL1 to perform the above tasks. ...@@ -633,11 +648,9 @@ BL1 to perform the above tasks.
This function performs any platform-specific and architectural setup that the This function performs any platform-specific and architectural setup that the
platform requires. Platform-specific setup might include configuration of platform requires. Platform-specific setup might include configuration of
memory controllers, configuration of the interconnect to allow the cluster memory controllers and the interconnect.
to service cache snoop requests from another cluster, and so on.
In the ARM FVP port, this function enables CCI snoops into the cluster that the In ARM standard platforms, this function enables the MMU.
primary CPU is part of. It also enables the MMU.
This function helps fulfill requirement 2 above. This function helps fulfill requirement 2 above.
...@@ -651,8 +664,8 @@ This function executes with the MMU and data caches enabled. It is responsible ...@@ -651,8 +664,8 @@ This function executes with the MMU and data caches enabled. It is responsible
for performing any remaining platform-specific setup that can occur after the for performing any remaining platform-specific setup that can occur after the
MMU and data cache have been enabled. MMU and data cache have been enabled.
This function is also responsible for initializing the storage abstraction layer In ARM standard platforms, this function initializes the storage abstraction
which is used to load further bootloader images. layer used to load the next bootloader image.
This function helps fulfill requirement 3 above. This function helps fulfill requirement 3 above.
...@@ -692,8 +705,9 @@ structure. ...@@ -692,8 +705,9 @@ structure.
Depending upon where BL2 has been loaded in secure RAM (determined by Depending upon where BL2 has been loaded in secure RAM (determined by
`BL2_BASE`), BL1 calculates the amount of free memory available for BL2 to use. `BL2_BASE`), BL1 calculates the amount of free memory available for BL2 to use.
BL1 also ensures that its data sections resident in secure RAM are not visible BL1 also ensures that its data sections resident in secure RAM are not visible
to BL2. An illustration of how this is done in the ARM FVP port is given in the to BL2. An illustration of how this is done in ARM standard platforms is given
[User Guide], in the Section "Memory layout on Base FVP". in the **Memory layout on ARM development platforms** section in the
[Firmware Design].
### Function : bl1_plat_set_bl2_ep_info() [mandatory] ### Function : bl1_plat_set_bl2_ep_info() [mandatory]
...@@ -705,8 +719,6 @@ This function is called after loading BL2 image and it can be used to overwrite ...@@ -705,8 +719,6 @@ This function is called after loading BL2 image and it can be used to overwrite
the entry point set by loader and also set the security state and SPSR which the entry point set by loader and also set the security state and SPSR which
represents the entry point system state for BL2. represents the entry point system state for BL2.
On FVP, we are setting the security state and the SPSR for the BL2 entrypoint
3.2 Boot Loader Stage 2 (BL2) 3.2 Boot Loader Stage 2 (BL2)
----------------------------- -----------------------------
...@@ -772,6 +784,11 @@ variable as the original memory may be subsequently overwritten by BL2. The ...@@ -772,6 +784,11 @@ variable as the original memory may be subsequently overwritten by BL2. The
copied structure is made available to all BL2 code through the copied structure is made available to all BL2 code through the
`bl2_plat_sec_mem_layout()` function. `bl2_plat_sec_mem_layout()` function.
In ARM standard platforms, this function also initializes the storage
abstraction layer used to load further bootloader images. It is necessary to do
this early on platforms with a BL3-0 image, since the later `bl2_platform_setup`
must be done after BL3-0 is loaded.
### Function : bl2_plat_arch_setup() [mandatory] ### Function : bl2_plat_arch_setup() [mandatory]
...@@ -796,14 +813,11 @@ port does the necessary initialization in `bl2_plat_arch_setup()`. It is only ...@@ -796,14 +813,11 @@ port does the necessary initialization in `bl2_plat_arch_setup()`. It is only
called by the primary CPU. called by the primary CPU.
The purpose of this function is to perform any platform initialization The purpose of this function is to perform any platform initialization
specific to BL2. Platform security components are configured if required. specific to BL2.
For the Base FVP the TZC-400 TrustZone controller is configured to only
grant non-secure access to DRAM. This avoids aliasing between secure and
non-secure accesses in the TLB and cache - secure execution states can use
the NS attributes in the MMU translation tables to access the DRAM.
This function is also responsible for initializing the storage abstraction layer In ARM standard platforms, this function performs security setup, including
which is used to load further bootloader images. configuration of the TrustZone controller to allow non-secure masters access
to most of DRAM. Part of DRAM is reserved for secure world use.
### Function : bl2_plat_sec_mem_layout() [mandatory] ### Function : bl2_plat_sec_mem_layout() [mandatory]
...@@ -878,8 +892,8 @@ BL2 platform code returns a pointer which is used to populate the entry point ...@@ -878,8 +892,8 @@ BL2 platform code returns a pointer which is used to populate the entry point
information for BL3-1 entry point. The location pointed by it should be information for BL3-1 entry point. The location pointed by it should be
accessible from BL1 while processing the synchronous exception to run to BL3-1. accessible from BL1 while processing the synchronous exception to run to BL3-1.
On FVP this is allocated inside an bl2_to_bl31_params_mem structure which In ARM standard platforms this is allocated inside a bl2_to_bl31_params_mem
is allocated at an address pointed by PARAMS_BASE. structure in BL2 memory.
### Function : bl2_plat_set_bl31_ep_info() [mandatory] ### Function : bl2_plat_set_bl31_ep_info() [mandatory]
...@@ -891,8 +905,6 @@ This function is called after loading BL3-1 image and it can be used to ...@@ -891,8 +905,6 @@ This function is called after loading BL3-1 image and it can be used to
overwrite the entry point set by loader and also set the security state overwrite the entry point set by loader and also set the security state
and SPSR which represents the entry point system state for BL3-1. and SPSR which represents the entry point system state for BL3-1.
On FVP, we are setting the security state and the SPSR for the BL3-1
entrypoint.
### Function : bl2_plat_set_bl32_ep_info() [mandatory] ### Function : bl2_plat_set_bl32_ep_info() [mandatory]
...@@ -903,8 +915,6 @@ This function is called after loading BL3-2 image and it can be used to ...@@ -903,8 +915,6 @@ This function is called after loading BL3-2 image and it can be used to
overwrite the entry point set by loader and also set the security state overwrite the entry point set by loader and also set the security state
and SPSR which represents the entry point system state for BL3-2. and SPSR which represents the entry point system state for BL3-2.
On FVP, we are setting the security state and the SPSR for the BL3-2
entrypoint
### Function : bl2_plat_set_bl33_ep_info() [mandatory] ### Function : bl2_plat_set_bl33_ep_info() [mandatory]
...@@ -915,8 +925,6 @@ This function is called after loading BL3-3 image and it can be used to ...@@ -915,8 +925,6 @@ This function is called after loading BL3-3 image and it can be used to
overwrite the entry point set by loader and also set the security state overwrite the entry point set by loader and also set the security state
and SPSR which represents the entry point system state for BL3-3. and SPSR which represents the entry point system state for BL3-3.
On FVP, we are setting the security state and the SPSR for the BL3-3
entrypoint
### Function : bl2_plat_get_bl32_meminfo() [mandatory] ### Function : bl2_plat_get_bl32_meminfo() [mandatory]
...@@ -1012,12 +1020,10 @@ sub-structures into private variables if the original memory may be ...@@ -1012,12 +1020,10 @@ sub-structures into private variables if the original memory may be
subsequently overwritten by BL3-1 and similarly the `void *` pointing subsequently overwritten by BL3-1 and similarly the `void *` pointing
to the platform data also needs to be saved. to the platform data also needs to be saved.
On the ARM FVP port, BL2 passes a pointer to a `bl31_params` structure populated In ARM standard platforms, BL2 passes a pointer to a `bl31_params` structure
in the secure DRAM at address `0x6000000` in the bl31_params * argument and it in BL2 memory. BL3-1 copies the information in this pointer to internal data
does not use opaque pointer mentioned earlier. BL3-1 does not copy this structures.
information to internal data structures as it guarantees that the secure
DRAM memory will not be overwritten. It maintains an internal reference to this
information in the `bl2_to_bl31_params` variable.
### Function : bl31_plat_arch_setup() [mandatory] ### Function : bl31_plat_arch_setup() [mandatory]
...@@ -1044,12 +1050,11 @@ called by the primary CPU. ...@@ -1044,12 +1050,11 @@ called by the primary CPU.
The purpose of this function is to complete platform initialization so that both The purpose of this function is to complete platform initialization so that both
BL3-1 runtime services and normal world software can function correctly. BL3-1 runtime services and normal world software can function correctly.
The ARM FVP port does the following: In ARM standard platforms, this function does the following:
* Initializes the generic interrupt controller. * Initializes the generic interrupt controller.
* Configures the CLCD controller.
* Enables system-level implementation of the generic timer counter. * Enables system-level implementation of the generic timer counter.
* Grants access to the system counter timer module * Grants access to the system counter timer module
* Initializes the FVP power controller device * Initializes the power controller device
* Detects the system topology. * Detects the system topology.
...@@ -1068,6 +1073,17 @@ state. This function must return a pointer to the `entry_point_info` structure ...@@ -1068,6 +1073,17 @@ state. This function must return a pointer to the `entry_point_info` structure
(that was copied during `bl31_early_platform_setup()`) if the image exists. It (that was copied during `bl31_early_platform_setup()`) if the image exists. It
should return NULL otherwise. should return NULL otherwise.
### Function : plat_get_syscnt_freq() [mandatory]
Argument : void
Return : uint64_t
This function is used by the architecture setup code to retrieve the counter
frequency for the CPU's generic timer. This value will be programmed into the
`CNTFRQ_EL0` register. In ARM standard platforms, it returns the base frequency
of the system counter, which is retrieved from the first entry in the frequency
modes table.
3.3 Power State Coordination Interface (in BL3-1) 3.3 Power State Coordination Interface (in BL3-1)
------------------------------------------------ ------------------------------------------------
...@@ -1156,10 +1172,10 @@ handler routines for platform-specific power management actions by populating ...@@ -1156,10 +1172,10 @@ handler routines for platform-specific power management actions by populating
the passed pointer with a pointer to BL3-1's private `plat_pm_ops` structure. the passed pointer with a pointer to BL3-1's private `plat_pm_ops` structure.
A description of each member of this structure is given below. Please refer to A description of each member of this structure is given below. Please refer to
the ARM FVP specific implementation of these handlers in [plat/fvp/fvp_pm.c] the ARM FVP specific implementation of these handlers in
as an example. A platform port is expected to implement these handlers if the [plat/arm/board/fvp/fvp_pm.c] as an example. A platform port is expected to
corresponding PSCI operation is to be supported and these handlers are expected implement these handlers if the corresponding PSCI operation is to be supported
to succeed if the return type is `void`. and these handlers are expected to succeed if the return type is `void`.
#### plat_pm_ops.affinst_standby() #### plat_pm_ops.affinst_standby()
...@@ -1268,10 +1284,11 @@ state or EL3/S-EL1 in the secure state. The design of this framework is ...@@ -1268,10 +1284,11 @@ state or EL3/S-EL1 in the secure state. The design of this framework is
described in the [IMF Design Guide] described in the [IMF Design Guide]
A platform should export the following APIs to support the IMF. The following A platform should export the following APIs to support the IMF. The following
text briefly describes each api and its implementation on the FVP port. The API text briefly describes each api and its implementation in ARM standard
implementation depends upon the type of interrupt controller present in the platforms. The API implementation depends upon the type of interrupt controller
platform. The FVP implements an ARM Generic Interrupt Controller (ARM GIC) as present in the platform. ARM standard platforms implements an ARM Generic
per the version 2.0 of the [ARM GIC Architecture Specification] Interrupt Controller (ARM GIC) as per the version 2.0 of the
[ARM GIC Architecture Specification].
### Function : plat_interrupt_type_to_line() [mandatory] ### Function : plat_interrupt_type_to_line() [mandatory]
...@@ -1291,8 +1308,8 @@ security state of the originating execution context. The return result is the ...@@ -1291,8 +1308,8 @@ security state of the originating execution context. The return result is the
bit position in the `SCR_EL3` register of the respective interrupt trap: IRQ=1, bit position in the `SCR_EL3` register of the respective interrupt trap: IRQ=1,
FIQ=2. FIQ=2.
The FVP port configures the ARM GIC to signal S-EL1 interrupts as FIQs and ARM standard platforms configure the ARM GIC to signal S-EL1 interrupts
Non-secure interrupts as IRQs from either security state. as FIQs and Non-secure interrupts as IRQs from either security state.
### Function : plat_ic_get_pending_interrupt_type() [mandatory] ### Function : plat_ic_get_pending_interrupt_type() [mandatory]
...@@ -1306,9 +1323,9 @@ handler function. `INTR_TYPE_INVAL` is returned when there is no interrupt ...@@ -1306,9 +1323,9 @@ handler function. `INTR_TYPE_INVAL` is returned when there is no interrupt
pending. The valid interrupt types that can be returned are `INTR_TYPE_EL3`, pending. The valid interrupt types that can be returned are `INTR_TYPE_EL3`,
`INTR_TYPE_S_EL1` and `INTR_TYPE_NS`. `INTR_TYPE_S_EL1` and `INTR_TYPE_NS`.
The FVP port reads the _Highest Priority Pending Interrupt Register_ ARM standard platforms read the _Highest Priority Pending Interrupt
(`GICC_HPPIR`) to determine the id of the pending interrupt. The type of interrupt Register_ (`GICC_HPPIR`) to determine the id of the pending interrupt. The type
depends upon the id value as follows. of interrupt depends upon the id value as follows.
1. id < 1022 is reported as a S-EL1 interrupt 1. id < 1022 is reported as a S-EL1 interrupt
2. id = 1022 is reported as a Non-secure interrupt. 2. id = 1022 is reported as a Non-secure interrupt.
...@@ -1325,9 +1342,9 @@ platform IC. The IMF passes the id returned by this API to the registered ...@@ -1325,9 +1342,9 @@ platform IC. The IMF passes the id returned by this API to the registered
handler for the pending interrupt if the `IMF_READ_INTERRUPT_ID` build time flag handler for the pending interrupt if the `IMF_READ_INTERRUPT_ID` build time flag
is set. INTR_ID_UNAVAILABLE is returned when there is no interrupt pending. is set. INTR_ID_UNAVAILABLE is returned when there is no interrupt pending.
The FVP port reads the _Highest Priority Pending Interrupt Register_ ARM standard platforms read the _Highest Priority Pending Interrupt
(`GICC_HPPIR`) to determine the id of the pending interrupt. The id that is Register_ (`GICC_HPPIR`) to determine the id of the pending interrupt. The id
returned by API depends upon the value of the id read from the interrupt that is returned by API depends upon the value of the id read from the interrupt
controller as follows. controller as follows.
1. id < 1022. id is returned as is. 1. id < 1022. id is returned as is.
...@@ -1346,10 +1363,11 @@ This API is used by the CPU to indicate to the platform IC that processing of ...@@ -1346,10 +1363,11 @@ This API is used by the CPU to indicate to the platform IC that processing of
the highest pending interrupt has begun. It should return the id of the the highest pending interrupt has begun. It should return the id of the
interrupt which is being processed. interrupt which is being processed.
The FVP port reads the _Interrupt Acknowledge Register_ (`GICC_IAR`). This This function in ARM standard platforms reads the _Interrupt Acknowledge
changes the state of the highest priority pending interrupt from pending to Register_ (`GICC_IAR`). This changes the state of the highest priority pending
active in the interrupt controller. It returns the value read from the interrupt from pending to active in the interrupt controller. It returns the
`GICC_IAR`. This value is the id of the interrupt whose state has been changed. value read from the `GICC_IAR`. This value is the id of the interrupt whose
state has been changed.
The TSP uses this API to start processing of the secure physical timer The TSP uses this API to start processing of the secure physical timer
interrupt. interrupt.
...@@ -1365,7 +1383,7 @@ the interrupt corresponding to the id (passed as the parameter) has ...@@ -1365,7 +1383,7 @@ the interrupt corresponding to the id (passed as the parameter) has
finished. The id should be the same as the id returned by the finished. The id should be the same as the id returned by the
`plat_ic_acknowledge_interrupt()` API. `plat_ic_acknowledge_interrupt()` API.
The FVP port writes the id to the _End of Interrupt Register_ ARM standard platforms write the id to the _End of Interrupt Register_
(`GICC_EOIR`). This deactivates the corresponding interrupt in the interrupt (`GICC_EOIR`). This deactivates the corresponding interrupt in the interrupt
controller. controller.
...@@ -1384,10 +1402,12 @@ interrupt type (one of `INTR_TYPE_EL3`, `INTR_TYPE_S_EL1` and `INTR_TYPE_NS`) is ...@@ -1384,10 +1402,12 @@ interrupt type (one of `INTR_TYPE_EL3`, `INTR_TYPE_S_EL1` and `INTR_TYPE_NS`) is
returned depending upon how the interrupt has been configured by the platform returned depending upon how the interrupt has been configured by the platform
IC. IC.
The FVP port configures S-EL1 interrupts as Group0 interrupts and Non-secure This function in ARM standard platforms configures S-EL1 interrupts
interrupts as Group1 interrupts. It reads the group value corresponding to the as Group0 interrupts and Non-secure interrupts as Group1 interrupts. It reads
interrupt id from the relevant _Interrupt Group Register_ (`GICD_IGROUPRn`). It the group value corresponding to the interrupt id from the relevant _Interrupt
uses the group value to determine the type of interrupt. Group Register_ (`GICD_IGROUPRn`). It uses the group value to determine the
type of interrupt.
3.5 Crash Reporting mechanism (in BL3-1) 3.5 Crash Reporting mechanism (in BL3-1)
---------------------------------------------- ----------------------------------------------
...@@ -1409,9 +1429,6 @@ This API is used by the crash reporting mechanism to initialize the crash ...@@ -1409,9 +1429,6 @@ This API is used by the crash reporting mechanism to initialize the crash
console. It should only use the general purpose registers x0 to x2 to do the console. It should only use the general purpose registers x0 to x2 to do the
initialization and returns 1 on success. initialization and returns 1 on success.
The FVP port designates the `PL011_UART0` as the crash console and calls the
console_core_init() to initialize the console.
### Function : plat_crash_console_putc ### Function : plat_crash_console_putc
Argument : int Argument : int
...@@ -1422,9 +1439,6 @@ designated crash console. It should only use general purpose registers x1 and ...@@ -1422,9 +1439,6 @@ designated crash console. It should only use general purpose registers x1 and
x2 to do its work. The parameter and the return value are in general purpose x2 to do its work. The parameter and the return value are in general purpose
register x0. register x0.
The FVP port designates the `PL011_UART0` as the crash console and calls the
console_core_putc() to print the character on the console.
4. Build flags 4. Build flags
--------------- ---------------
...@@ -1493,10 +1507,10 @@ required in their respective `blx_platform_setup()` functions. Currently ...@@ -1493,10 +1507,10 @@ required in their respective `blx_platform_setup()` functions. Currently
storage access is only required by BL1 and BL2 phases. The `load_image()` storage access is only required by BL1 and BL2 phases. The `load_image()`
function uses the storage layer to access non-volatile platform storage. function uses the storage layer to access non-volatile platform storage.
It is mandatory to implement at least one storage driver. For the FVP the It is mandatory to implement at least one storage driver. For the ARM
Firmware Image Package(FIP) driver is provided as the default means to load data development platforms the Firmware Image Package (FIP) driver is provided as
from storage (see the "Firmware Image Package" section in the [User Guide]). the default means to load data from storage (see the "Firmware Image Package"
The storage layer is described in the header file section in the [User Guide]). The storage layer is described in the header file
`include/drivers/io/io_storage.h`. The implementation of the common library `include/drivers/io/io_storage.h`. The implementation of the common library
is in `drivers/io/io_storage.c` and the driver files are located in is in `drivers/io/io_storage.c` and the driver files are located in
`drivers/io/`. `drivers/io/`.
...@@ -1533,20 +1547,20 @@ amount of open resources per driver. ...@@ -1533,20 +1547,20 @@ amount of open resources per driver.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved._ _Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved._
[ARM GIC Architecture Specification]: http://arminfo.emea.arm.com/help/topic/com.arm.doc.ihi0048b/IHI0048B_gic_architecture_specification.pdf [ARM GIC Architecture Specification]: http://arminfo.emea.arm.com/help/topic/com.arm.doc.ihi0048b/IHI0048B_gic_architecture_specification.pdf
[IMF Design Guide]: interrupt-framework-design.md [IMF Design Guide]: interrupt-framework-design.md
[User Guide]: user-guide.md [User Guide]: user-guide.md
[FreeBSD]: http://www.freebsd.org [FreeBSD]: http://www.freebsd.org
[Firmware Design Guide]: firmware-design.md [Firmware Design]: firmware-design.md
[plat/common/aarch64/platform_mp_stack.S]: ../plat/common/aarch64/platform_mp_stack.S [plat/common/aarch64/platform_mp_stack.S]: ../plat/common/aarch64/platform_mp_stack.S
[plat/common/aarch64/platform_up_stack.S]: ../plat/common/aarch64/platform_up_stack.S [plat/common/aarch64/platform_up_stack.S]: ../plat/common/aarch64/platform_up_stack.S
[plat/fvp/include/platform_def.h]: ../plat/fvp/include/platform_def.h [plat/arm/board/fvp/fvp_pm.c]: ../plat/arm/board/fvp/fvp_pm.c
[plat/fvp/include/plat_macros.S]: ../plat/fvp/include/plat_macros.S
[plat/fvp/aarch64/plat_common.c]: ../plat/fvp/aarch64/plat_common.c
[plat/fvp/plat_pm.c]: ../plat/fvp/plat_pm.c
[include/runtime_svc.h]: ../include/runtime_svc.h [include/runtime_svc.h]: ../include/runtime_svc.h
[include/plat/arm/common/arm_def.h]: ../include/plat/arm/common/arm_def.h
[include/plat/common/common_def.h]: ../include/plat/common/common_def.h
[include/plat/common/platform.h]: ../include/plat/common/platform.h [include/plat/common/platform.h]: ../include/plat/common/platform.h
[include/plat/arm/common/plat_arm.h]: ../include/plat/arm/common/plat_arm.h]
...@@ -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:
......
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