reset-design.rst 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. CPU Reset
  2. =========
  3. This document describes the high-level design of the framework to handle CPU
  4. resets in Trusted Firmware-A (TF-A). It also describes how the platform
  5. integrator can tailor this code to the system configuration to some extent,
  6. resulting in a simplified and more optimised boot flow.
  7. This document should be used in conjunction with the :ref:`Firmware Design`
  8. document which provides greater implementation details around the reset code,
  9. specifically for the cold boot path.
  10. General reset code flow
  11. -----------------------
  12. The TF-A reset code is implemented in BL1 by default. The following high-level
  13. diagram illustrates this:
  14. |Default reset code flow|
  15. This diagram shows the default, unoptimised reset flow. Depending on the system
  16. configuration, some of these steps might be unnecessary. The following sections
  17. guide the platform integrator by indicating which build options exclude which
  18. steps, depending on the capability of the platform.
  19. .. note::
  20. If BL31 is used as the TF-A entry point instead of BL1, the diagram
  21. above is still relevant, as all these operations will occur in BL31 in
  22. this case. Please refer to section 6 "Using BL31 entrypoint as the reset
  23. address" for more information.
  24. Programmable CPU reset address
  25. ------------------------------
  26. By default, TF-A assumes that the CPU reset address is not programmable.
  27. Therefore, all CPUs start at the same address (typically address 0) whenever
  28. they reset. Further logic is then required to identify whether it is a cold or
  29. warm boot to direct CPUs to the right execution path.
  30. If the reset vector address (reflected in the reset vector base address register
  31. ``RVBAR_EL3``) is programmable then it is possible to make each CPU start directly
  32. at the right address, both on a cold and warm reset. Therefore, the boot type
  33. detection can be skipped, resulting in the following boot flow:
  34. |Reset code flow with programmable reset address|
  35. To enable this boot flow, compile TF-A with ``PROGRAMMABLE_RESET_ADDRESS=1``.
  36. This option only affects the TF-A reset image, which is BL1 by default or BL31 if
  37. ``RESET_TO_BL31=1``.
  38. On both the FVP and Juno platforms, the reset vector address is not programmable
  39. so both ports use ``PROGRAMMABLE_RESET_ADDRESS=0``.
  40. Cold boot on a single CPU
  41. -------------------------
  42. By default, TF-A assumes that several CPUs may be released out of reset.
  43. Therefore, the cold boot code has to arbitrate access to hardware resources
  44. shared amongst CPUs. This is done by nominating one of the CPUs as the primary,
  45. which is responsible for initialising shared hardware and coordinating the boot
  46. flow with the other CPUs.
  47. If the platform guarantees that only a single CPU will ever be brought up then
  48. no arbitration is required. The notion of primary/secondary CPU itself no longer
  49. applies. This results in the following boot flow:
  50. |Reset code flow with single CPU released out of reset|
  51. To enable this boot flow, compile TF-A with ``COLD_BOOT_SINGLE_CPU=1``. This
  52. option only affects the TF-A reset image, which is BL1 by default or BL31 if
  53. ``RESET_TO_BL31=1``.
  54. On both the FVP and Juno platforms, although only one core is powered up by
  55. default, there are platform-specific ways to release any number of cores out of
  56. reset. Therefore, both platform ports use ``COLD_BOOT_SINGLE_CPU=0``.
  57. Programmable CPU reset address, Cold boot on a single CPU
  58. ---------------------------------------------------------
  59. It is obviously possible to combine both optimisations on platforms that have
  60. a programmable CPU reset address and which release a single CPU out of reset.
  61. This results in the following boot flow:
  62. |Reset code flow with programmable reset address and single CPU released out of reset|
  63. To enable this boot flow, compile TF-A with both ``COLD_BOOT_SINGLE_CPU=1``
  64. and ``PROGRAMMABLE_RESET_ADDRESS=1``. These options only affect the TF-A reset
  65. image, which is BL1 by default or BL31 if ``RESET_TO_BL31=1``.
  66. Using BL31 entrypoint as the reset address
  67. ------------------------------------------
  68. On some platforms the runtime firmware (BL3x images) for the application
  69. processors are loaded by some firmware running on a secure system processor
  70. on the SoC, rather than by BL1 and BL2 running on the primary application
  71. processor. For this type of SoC it is desirable for the application processor
  72. to always reset to BL31 which eliminates the need for BL1 and BL2.
  73. TF-A provides a build-time option ``RESET_TO_BL31`` that includes some additional
  74. logic in the BL31 entry point to support this use case.
  75. In this configuration, the platform's Trusted Boot Firmware must ensure that
  76. BL31 is loaded to its runtime address, which must match the CPU's ``RVBAR_EL3``
  77. reset vector base address, before the application processor is powered on.
  78. Additionally, platform software is responsible for loading the other BL3x images
  79. required and providing entry point information for them to BL31. Loading these
  80. images might be done by the Trusted Boot Firmware or by platform code in BL31.
  81. Although the Arm FVP platform does not support programming the reset base
  82. address dynamically at run-time, it is possible to set the initial value of the
  83. ``RVBAR_EL3`` register at start-up. This feature is provided on the Base FVP
  84. only.
  85. It allows the Arm FVP port to support the ``RESET_TO_BL31`` configuration, in
  86. which case the ``bl31.bin`` image must be loaded to its run address in Trusted
  87. SRAM and all CPU reset vectors be changed from the default ``0x0`` to this run
  88. address. See the :ref:`Arm Fixed Virtual Platforms (FVP)` for details of running
  89. the FVP models in this way.
  90. Although technically it would be possible to program the reset base address with
  91. the right support in the SCP firmware, this is currently not implemented so the
  92. Juno port doesn't support the ``RESET_TO_BL31`` configuration.
  93. The ``RESET_TO_BL31`` configuration requires some additions and changes in the
  94. BL31 functionality:
  95. Determination of boot path
  96. ~~~~~~~~~~~~~~~~~~~~~~~~~~
  97. In this configuration, BL31 uses the same reset framework and code as the one
  98. described for BL1 above. Therefore, it is affected by the
  99. ``PROGRAMMABLE_RESET_ADDRESS`` and ``COLD_BOOT_SINGLE_CPU`` build options in the
  100. same way.
  101. In the default, unoptimised BL31 reset flow, on a warm boot a CPU is directed
  102. to the PSCI implementation via a platform defined mechanism. On a cold boot,
  103. the platform must place any secondary CPUs into a safe state while the primary
  104. CPU executes a modified BL31 initialization, as described below.
  105. Platform initialization
  106. ~~~~~~~~~~~~~~~~~~~~~~~
  107. In this configuration, since the CPU resets to BL31, no parameters are expected
  108. to be passed to BL31 (see notes below for clarification).
  109. Instead, the platform code in BL31 needs to know, or be able to determine, the
  110. location of the BL32 (if required) and BL33 images and provide this information
  111. in response to the ``bl31_plat_get_next_image_ep_info()`` function.
  112. Additionally, platform software is responsible for carrying out any security
  113. initialisation, for example programming a TrustZone address space controller.
  114. This might be done by the Trusted Boot Firmware or by platform code in BL31.
  115. .. note::
  116. Even though RESET_TO_BL31 is designed such that BL31 is the reset BL image,
  117. some platforms may wish to pass some arguments to BL31 as per the defined
  118. contract between BL31 and previous bootloaders. Previous bootloaders can
  119. pass arguments through registers x0 through x3. BL31 will preserve them and
  120. propagate them to platform code, which will handle these arguments in an
  121. IMPDEF manner.
  122. --------------
  123. *Copyright (c) 2015-2023, Arm Limited and Contributors. All rights reserved.*
  124. .. |Default reset code flow| image:: ../resources/diagrams/default_reset_code.png
  125. .. |Reset code flow with programmable reset address| image:: ../resources/diagrams/reset_code_no_boot_type_check.png
  126. .. |Reset code flow with single CPU released out of reset| image:: ../resources/diagrams/reset_code_no_cpu_check.png
  127. .. |Reset code flow with programmable reset address and single CPU released out of reset| image:: ../resources/diagrams/reset_code_no_checks.png