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