xref: /rk3399_ARM-atf/docs/design/reset-design.rst (revision 8aa050554b996406231a66a048b56fa03ba220c8)
1*8aa05055SPaul BeesleyCPU Reset
2*8aa05055SPaul Beesley=========
340d553cfSPaul Beesley
440d553cfSPaul Beesley
540d553cfSPaul Beesley
640d553cfSPaul Beesley
740d553cfSPaul Beesley.. contents::
840d553cfSPaul Beesley
940d553cfSPaul BeesleyThis document describes the high-level design of the framework to handle CPU
1040d553cfSPaul Beesleyresets in Trusted Firmware-A (TF-A). It also describes how the platform
1140d553cfSPaul Beesleyintegrator can tailor this code to the system configuration to some extent,
1240d553cfSPaul Beesleyresulting in a simplified and more optimised boot flow.
1340d553cfSPaul Beesley
1440d553cfSPaul BeesleyThis document should be used in conjunction with the `Firmware Design`_, which
1540d553cfSPaul Beesleyprovides greater implementation details around the reset code, specifically
1640d553cfSPaul Beesleyfor the cold boot path.
1740d553cfSPaul Beesley
1840d553cfSPaul BeesleyGeneral reset code flow
1940d553cfSPaul Beesley-----------------------
2040d553cfSPaul Beesley
2140d553cfSPaul BeesleyThe TF-A reset code is implemented in BL1 by default. The following high-level
2240d553cfSPaul Beesleydiagram illustrates this:
2340d553cfSPaul Beesley
2440d553cfSPaul Beesley|Default reset code flow|
2540d553cfSPaul Beesley
2640d553cfSPaul BeesleyThis diagram shows the default, unoptimised reset flow. Depending on the system
2740d553cfSPaul Beesleyconfiguration, some of these steps might be unnecessary. The following sections
2840d553cfSPaul Beesleyguide the platform integrator by indicating which build options exclude which
2940d553cfSPaul Beesleysteps, depending on the capability of the platform.
3040d553cfSPaul Beesley
3140d553cfSPaul BeesleyNote: If BL31 is used as the TF-A entry point instead of BL1, the diagram
3240d553cfSPaul Beesleyabove is still relevant, as all these operations will occur in BL31 in
3340d553cfSPaul Beesleythis case. Please refer to section 6 "Using BL31 entrypoint as the reset
3440d553cfSPaul Beesleyaddress" for more information.
3540d553cfSPaul Beesley
3640d553cfSPaul BeesleyProgrammable CPU reset address
3740d553cfSPaul Beesley------------------------------
3840d553cfSPaul Beesley
3940d553cfSPaul BeesleyBy default, TF-A assumes that the CPU reset address is not programmable.
4040d553cfSPaul BeesleyTherefore, all CPUs start at the same address (typically address 0) whenever
4140d553cfSPaul Beesleythey reset. Further logic is then required to identify whether it is a cold or
4240d553cfSPaul Beesleywarm boot to direct CPUs to the right execution path.
4340d553cfSPaul Beesley
4440d553cfSPaul BeesleyIf the reset vector address (reflected in the reset vector base address register
4540d553cfSPaul Beesley``RVBAR_EL3``) is programmable then it is possible to make each CPU start directly
4640d553cfSPaul Beesleyat the right address, both on a cold and warm reset. Therefore, the boot type
4740d553cfSPaul Beesleydetection can be skipped, resulting in the following boot flow:
4840d553cfSPaul Beesley
4940d553cfSPaul Beesley|Reset code flow with programmable reset address|
5040d553cfSPaul Beesley
5140d553cfSPaul BeesleyTo enable this boot flow, compile TF-A with ``PROGRAMMABLE_RESET_ADDRESS=1``.
5240d553cfSPaul BeesleyThis option only affects the TF-A reset image, which is BL1 by default or BL31 if
5340d553cfSPaul Beesley``RESET_TO_BL31=1``.
5440d553cfSPaul Beesley
5540d553cfSPaul BeesleyOn both the FVP and Juno platforms, the reset vector address is not programmable
5640d553cfSPaul Beesleyso both ports use ``PROGRAMMABLE_RESET_ADDRESS=0``.
5740d553cfSPaul Beesley
5840d553cfSPaul BeesleyCold boot on a single CPU
5940d553cfSPaul Beesley-------------------------
6040d553cfSPaul Beesley
6140d553cfSPaul BeesleyBy default, TF-A assumes that several CPUs may be released out of reset.
6240d553cfSPaul BeesleyTherefore, the cold boot code has to arbitrate access to hardware resources
6340d553cfSPaul Beesleyshared amongst CPUs. This is done by nominating one of the CPUs as the primary,
6440d553cfSPaul Beesleywhich is responsible for initialising shared hardware and coordinating the boot
6540d553cfSPaul Beesleyflow with the other CPUs.
6640d553cfSPaul Beesley
6740d553cfSPaul BeesleyIf the platform guarantees that only a single CPU will ever be brought up then
6840d553cfSPaul Beesleyno arbitration is required. The notion of primary/secondary CPU itself no longer
6940d553cfSPaul Beesleyapplies. This results in the following boot flow:
7040d553cfSPaul Beesley
7140d553cfSPaul Beesley|Reset code flow with single CPU released out of reset|
7240d553cfSPaul Beesley
7340d553cfSPaul BeesleyTo enable this boot flow, compile TF-A with ``COLD_BOOT_SINGLE_CPU=1``. This
7440d553cfSPaul Beesleyoption only affects the TF-A reset image, which is BL1 by default or BL31 if
7540d553cfSPaul Beesley``RESET_TO_BL31=1``.
7640d553cfSPaul Beesley
7740d553cfSPaul BeesleyOn both the FVP and Juno platforms, although only one core is powered up by
7840d553cfSPaul Beesleydefault, there are platform-specific ways to release any number of cores out of
7940d553cfSPaul Beesleyreset. Therefore, both platform ports use ``COLD_BOOT_SINGLE_CPU=0``.
8040d553cfSPaul Beesley
8140d553cfSPaul BeesleyProgrammable CPU reset address, Cold boot on a single CPU
8240d553cfSPaul Beesley---------------------------------------------------------
8340d553cfSPaul Beesley
8440d553cfSPaul BeesleyIt is obviously possible to combine both optimisations on platforms that have
8540d553cfSPaul Beesleya programmable CPU reset address and which release a single CPU out of reset.
8640d553cfSPaul BeesleyThis results in the following boot flow:
8740d553cfSPaul Beesley
8840d553cfSPaul Beesley
8940d553cfSPaul Beesley|Reset code flow with programmable reset address and single CPU released out of reset|
9040d553cfSPaul Beesley
9140d553cfSPaul BeesleyTo enable this boot flow, compile TF-A with both ``COLD_BOOT_SINGLE_CPU=1``
9240d553cfSPaul Beesleyand ``PROGRAMMABLE_RESET_ADDRESS=1``. These options only affect the TF-A reset
9340d553cfSPaul Beesleyimage, which is BL1 by default or BL31 if ``RESET_TO_BL31=1``.
9440d553cfSPaul Beesley
9540d553cfSPaul BeesleyUsing BL31 entrypoint as the reset address
9640d553cfSPaul Beesley------------------------------------------
9740d553cfSPaul Beesley
9840d553cfSPaul BeesleyOn some platforms the runtime firmware (BL3x images) for the application
9940d553cfSPaul Beesleyprocessors are loaded by some firmware running on a secure system processor
10040d553cfSPaul Beesleyon the SoC, rather than by BL1 and BL2 running on the primary application
10140d553cfSPaul Beesleyprocessor. For this type of SoC it is desirable for the application processor
10240d553cfSPaul Beesleyto always reset to BL31 which eliminates the need for BL1 and BL2.
10340d553cfSPaul Beesley
10440d553cfSPaul BeesleyTF-A provides a build-time option ``RESET_TO_BL31`` that includes some additional
10540d553cfSPaul Beesleylogic in the BL31 entry point to support this use case.
10640d553cfSPaul Beesley
10740d553cfSPaul BeesleyIn this configuration, the platform's Trusted Boot Firmware must ensure that
10840d553cfSPaul BeesleyBL31 is loaded to its runtime address, which must match the CPU's ``RVBAR_EL3``
10940d553cfSPaul Beesleyreset vector base address, before the application processor is powered on.
11040d553cfSPaul BeesleyAdditionally, platform software is responsible for loading the other BL3x images
11140d553cfSPaul Beesleyrequired and providing entry point information for them to BL31. Loading these
11240d553cfSPaul Beesleyimages might be done by the Trusted Boot Firmware or by platform code in BL31.
11340d553cfSPaul Beesley
11440d553cfSPaul BeesleyAlthough the Arm FVP platform does not support programming the reset base
11540d553cfSPaul Beesleyaddress dynamically at run-time, it is possible to set the initial value of the
11640d553cfSPaul Beesley``RVBAR_EL3`` register at start-up. This feature is provided on the Base FVP only.
11740d553cfSPaul BeesleyIt allows the Arm FVP port to support the ``RESET_TO_BL31`` configuration, in
11840d553cfSPaul Beesleywhich case the ``bl31.bin`` image must be loaded to its run address in Trusted
11940d553cfSPaul BeesleySRAM and all CPU reset vectors be changed from the default ``0x0`` to this run
12040d553cfSPaul Beesleyaddress. See the `User Guide`_ for details of running the FVP models in this way.
12140d553cfSPaul Beesley
12240d553cfSPaul BeesleyAlthough technically it would be possible to program the reset base address with
12340d553cfSPaul Beesleythe right support in the SCP firmware, this is currently not implemented so the
12440d553cfSPaul BeesleyJuno port doesn't support the ``RESET_TO_BL31`` configuration.
12540d553cfSPaul Beesley
12640d553cfSPaul BeesleyThe ``RESET_TO_BL31`` configuration requires some additions and changes in the
12740d553cfSPaul BeesleyBL31 functionality:
12840d553cfSPaul Beesley
12940d553cfSPaul BeesleyDetermination of boot path
13040d553cfSPaul Beesley~~~~~~~~~~~~~~~~~~~~~~~~~~
13140d553cfSPaul Beesley
13240d553cfSPaul BeesleyIn this configuration, BL31 uses the same reset framework and code as the one
13340d553cfSPaul Beesleydescribed for BL1 above. Therefore, it is affected by the
13440d553cfSPaul Beesley``PROGRAMMABLE_RESET_ADDRESS`` and ``COLD_BOOT_SINGLE_CPU`` build options in the
13540d553cfSPaul Beesleysame way.
13640d553cfSPaul Beesley
13740d553cfSPaul BeesleyIn the default, unoptimised BL31 reset flow, on a warm boot a CPU is directed
13840d553cfSPaul Beesleyto the PSCI implementation via a platform defined mechanism. On a cold boot,
13940d553cfSPaul Beesleythe platform must place any secondary CPUs into a safe state while the primary
14040d553cfSPaul BeesleyCPU executes a modified BL31 initialization, as described below.
14140d553cfSPaul Beesley
14240d553cfSPaul BeesleyPlatform initialization
14340d553cfSPaul Beesley~~~~~~~~~~~~~~~~~~~~~~~
14440d553cfSPaul Beesley
14540d553cfSPaul BeesleyIn this configuration, when the CPU resets to BL31 there are no parameters that
14640d553cfSPaul Beesleycan be passed in registers by previous boot stages. Instead, the platform code
14740d553cfSPaul Beesleyin BL31 needs to know, or be able to determine, the location of the BL32 (if
14840d553cfSPaul Beesleyrequired) and BL33 images and provide this information in response to the
14940d553cfSPaul Beesley``bl31_plat_get_next_image_ep_info()`` function.
15040d553cfSPaul Beesley
15140d553cfSPaul BeesleyAdditionally, platform software is responsible for carrying out any security
15240d553cfSPaul Beesleyinitialisation, for example programming a TrustZone address space controller.
15340d553cfSPaul BeesleyThis might be done by the Trusted Boot Firmware or by platform code in BL31.
15440d553cfSPaul Beesley
15540d553cfSPaul Beesley--------------
15640d553cfSPaul Beesley
15740d553cfSPaul Beesley*Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.*
15840d553cfSPaul Beesley
15940d553cfSPaul Beesley.. _Firmware Design: firmware-design.rst
16040d553cfSPaul Beesley.. _User Guide: ../getting_started/user-guide.rst
16140d553cfSPaul Beesley
16240d553cfSPaul Beesley.. |Default reset code flow| image:: ../diagrams/default_reset_code.png?raw=true
16340d553cfSPaul Beesley.. |Reset code flow with programmable reset address| image:: ../diagrams/reset_code_no_boot_type_check.png?raw=true
16440d553cfSPaul Beesley.. |Reset code flow with single CPU released out of reset| image:: ../diagrams/reset_code_no_cpu_check.png?raw=true
16540d553cfSPaul Beesley.. |Reset code flow with programmable reset address and single CPU released out of reset| image:: ../diagrams/reset_code_no_checks.png?raw=true
166