diff --git a/docs/porting-guide.rst b/docs/porting-guide.rst index 655c720..6be1830 100644 --- a/docs/porting-guide.rst +++ b/docs/porting-guide.rst @@ -28,7 +28,7 @@ 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 +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 @@ -99,56 +99,56 @@ The following variables, functions and constants must be defined by the platform for the firmware to work correctly. -File : platform\_def.h [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +File : platform_def.h [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Each platform must ensure that a header file of this name is in the system include path with the following constants defined. This will require updating the list of ``PLAT_INCLUDES`` in the ``platform.mk`` file. -Platform ports may optionally use the file `include/plat/common/common\_def.h`_, +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. -- **#define : PLATFORM\_LINKER\_FORMAT** +- **#define : PLATFORM_LINKER_FORMAT** Defines the linker format used by the platform, for example ``elf64-littleaarch64``. -- **#define : PLATFORM\_LINKER\_ARCH** +- **#define : PLATFORM_LINKER_ARCH** Defines the processor architecture for the linker by the platform, for example ``aarch64``. -- **#define : PLATFORM\_STACK\_SIZE** +- **#define : PLATFORM_STACK_SIZE** Defines the normal stack memory available to each CPU. This constant is used - by `plat/common/aarch64/platform\_mp\_stack.S`_ and - `plat/common/aarch64/platform\_up\_stack.S`_. + by `plat/common/aarch64/platform_mp_stack.S`_ and + `plat/common/aarch64/platform_up_stack.S`_. -- **define : CACHE\_WRITEBACK\_GRANULE** +- **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()`` function. -- **#define : PLATFORM\_CORE\_COUNT** +- **#define : PLATFORM_CORE_COUNT** Defines the total number of CPUs implemented by the platform across all clusters in the system. -- **#define : PLAT\_NUM\_PWR\_DOMAINS** +- **#define : PLAT_NUM_PWR_DOMAINS** Defines the total number of nodes in the power domain topology tree at all the power domain levels used by the platform. This macro is used by the PSCI implementation to allocate data structures to represent power domain topology. -- **#define : PLAT\_MAX\_PWR\_LVL** +- **#define : PLAT_MAX_PWR_LVL** Defines the maximum power domain level that the power management operations should apply to. More often, but not always, the power domain level @@ -158,24 +158,24 @@ example, the Base AEM FVP implements two clusters with a configurable number of CPUs and it reports the maximum power domain level as 1. -- **#define : PLAT\_MAX\_OFF\_STATE** +- **#define : PLAT_MAX_OFF_STATE** Defines the local power state corresponding to the deepest power down possible at every power domain level in the platform. The local power states for each level may be sparsely allocated between 0 and this value with 0 being reserved for the RUN state. The PSCI implementation uses this value to initialize the local power states of the power domain nodes and - to specify the requested power state for a PSCI\_CPU\_OFF call. + to specify the requested power state for a PSCI_CPU_OFF call. -- **#define : PLAT\_MAX\_RET\_STATE** +- **#define : PLAT_MAX_RET_STATE** Defines the local power state corresponding to the deepest retention state possible at every power domain level in the platform. This macro should be - a value less than PLAT\_MAX\_OFF\_STATE and greater than 0. It is used by the + a value less than PLAT_MAX_OFF_STATE and greater than 0. It is used by the PSCI implementation to distinguish between retention and power down local - power states within PSCI\_CPU\_SUSPEND call. + power states within PSCI_CPU_SUSPEND call. -- **#define : PLAT\_MAX\_PWR\_LVL\_STATES** +- **#define : PLAT_MAX_PWR_LVL_STATES** Defines the maximum number of local power states per power domain level that the platform supports. The default value of this macro is 2 since @@ -184,69 +184,69 @@ account for more local power states, then it must redefine this macro. Currently, this macro is used by the Generic PSCI implementation to size - the array used for PSCI\_STAT\_COUNT/RESIDENCY accounting. + the array used for PSCI_STAT_COUNT/RESIDENCY accounting. -- **#define : BL1\_RO\_BASE** +- **#define : BL1_RO_BASE** Defines the base address in secure ROM where BL1 originally lives. Must be aligned on a page-size boundary. -- **#define : BL1\_RO\_LIMIT** +- **#define : BL1_RO_LIMIT** Defines the maximum address in secure ROM that BL1's actual content (i.e. excluding any data section allocated at runtime) can occupy. -- **#define : BL1\_RW\_BASE** +- **#define : BL1_RW_BASE** Defines the base address in secure RAM where BL1's read-write data will live at runtime. Must be aligned on a page-size boundary. -- **#define : BL1\_RW\_LIMIT** +- **#define : BL1_RW_LIMIT** Defines the maximum address in secure RAM that BL1's read-write data can occupy at runtime. -- **#define : BL2\_BASE** +- **#define : BL2_BASE** Defines the base address in secure RAM where BL1 loads the BL2 binary image. Must be aligned on a page-size boundary. This constant is not applicable when BL2_IN_XIP_MEM is set to '1'. -- **#define : BL2\_LIMIT** +- **#define : BL2_LIMIT** Defines the maximum address in secure RAM that the BL2 image can occupy. This constant is not applicable when BL2_IN_XIP_MEM is set to '1'. -- **#define : BL2\_RO\_BASE** +- **#define : BL2_RO_BASE** Defines the base address in secure XIP memory where BL2 RO section originally lives. Must be aligned on a page-size boundary. This constant is only needed when BL2_IN_XIP_MEM is set to '1'. -- **#define : BL2\_RO\_LIMIT** +- **#define : BL2_RO_LIMIT** Defines the maximum address in secure XIP memory that BL2's actual content (i.e. excluding any data section allocated at runtime) can occupy. This constant is only needed when BL2_IN_XIP_MEM is set to '1'. -- **#define : BL2\_RW\_BASE** +- **#define : BL2_RW_BASE** Defines the base address in secure RAM where BL2's read-write data will live at runtime. Must be aligned on a page-size boundary. This constant is only needed when BL2_IN_XIP_MEM is set to '1'. -- **#define : BL2\_RW\_LIMIT** +- **#define : BL2_RW_LIMIT** Defines the maximum address in secure RAM that BL2's read-write data can occupy at runtime. This constant is only needed when BL2_IN_XIP_MEM is set to '1'. -- **#define : BL31\_BASE** +- **#define : BL31_BASE** Defines the base address in secure RAM where BL2 loads the BL31 binary image. Must be aligned on a page-size boundary. -- **#define : BL31\_LIMIT** +- **#define : BL31_LIMIT** Defines the maximum address in secure RAM that the BL31 image can occupy. @@ -258,57 +258,57 @@ authentication information, etc.). The following image identifiers are mandatory: -- **#define : BL2\_IMAGE\_ID** +- **#define : BL2_IMAGE_ID** BL2 image identifier, used by BL1 to load BL2. -- **#define : BL31\_IMAGE\_ID** +- **#define : BL31_IMAGE_ID** BL31 image identifier, used by BL2 to load BL31. -- **#define : BL33\_IMAGE\_ID** +- **#define : BL33_IMAGE_ID** BL33 image identifier, used by BL2 to load BL33. If Trusted Board Boot is enabled, the following certificate identifiers must also be defined: -- **#define : TRUSTED\_BOOT\_FW\_CERT\_ID** +- **#define : TRUSTED_BOOT_FW_CERT_ID** BL2 content certificate identifier, used by BL1 to load the BL2 content certificate. -- **#define : TRUSTED\_KEY\_CERT\_ID** +- **#define : TRUSTED_KEY_CERT_ID** Trusted key certificate identifier, used by BL2 to load the trusted key certificate. -- **#define : SOC\_FW\_KEY\_CERT\_ID** +- **#define : SOC_FW_KEY_CERT_ID** BL31 key certificate identifier, used by BL2 to load the BL31 key certificate. -- **#define : SOC\_FW\_CONTENT\_CERT\_ID** +- **#define : SOC_FW_CONTENT_CERT_ID** BL31 content certificate identifier, used by BL2 to load the BL31 content certificate. -- **#define : NON\_TRUSTED\_FW\_KEY\_CERT\_ID** +- **#define : NON_TRUSTED_FW_KEY_CERT_ID** BL33 key certificate identifier, used by BL2 to load the BL33 key certificate. -- **#define : NON\_TRUSTED\_FW\_CONTENT\_CERT\_ID** +- **#define : NON_TRUSTED_FW_CONTENT_CERT_ID** BL33 content certificate identifier, used by BL2 to load the BL33 content certificate. -- **#define : FWU\_CERT\_ID** +- **#define : FWU_CERT_ID** - Firmware Update (FWU) certificate identifier, used by NS\_BL1U to load the + Firmware Update (FWU) certificate identifier, used by NS_BL1U to load the FWU content certificate. -- **#define : PLAT\_CRYPTOCELL\_BASE** +- **#define : PLAT_CRYPTOCELL_BASE** This defines the base address of ArmĀ® TrustZoneĀ® CryptoCell and must be defined if CryptoCell crypto driver is used for Trusted Board Boot. For @@ -318,125 +318,125 @@ If the AP Firmware Updater Configuration image, BL2U is used, the following must also be defined: -- **#define : BL2U\_BASE** +- **#define : BL2U_BASE** Defines the base address in secure memory where BL1 copies the BL2U binary image. Must be aligned on a page-size boundary. -- **#define : BL2U\_LIMIT** +- **#define : BL2U_LIMIT** Defines the maximum address in secure memory that the BL2U image can occupy. -- **#define : BL2U\_IMAGE\_ID** +- **#define : BL2U_IMAGE_ID** BL2U image identifier, used by BL1 to fetch an image descriptor corresponding to BL2U. -If the SCP Firmware Update Configuration Image, SCP\_BL2U is used, the following +If the SCP Firmware Update Configuration Image, SCP_BL2U is used, the following must also be defined: -- **#define : SCP\_BL2U\_IMAGE\_ID** +- **#define : SCP_BL2U_IMAGE_ID** - SCP\_BL2U image identifier, used by BL1 to fetch an image descriptor - corresponding to SCP\_BL2U. + SCP_BL2U image identifier, used by BL1 to fetch an image descriptor + corresponding to SCP_BL2U. NOTE: TF-A does not provide source code for this image. -If the Non-Secure Firmware Updater ROM, NS\_BL1U is used, the following must +If the Non-Secure Firmware Updater ROM, NS_BL1U is used, the following must also be defined: -- **#define : NS\_BL1U\_BASE** +- **#define : NS_BL1U_BASE** - Defines the base address in non-secure ROM where NS\_BL1U executes. + Defines the base address in non-secure ROM where NS_BL1U executes. Must be aligned on a page-size boundary. NOTE: TF-A does not provide source code for this image. -- **#define : NS\_BL1U\_IMAGE\_ID** +- **#define : NS_BL1U_IMAGE_ID** - NS\_BL1U image identifier, used by BL1 to fetch an image descriptor - corresponding to NS\_BL1U. + NS_BL1U image identifier, used by BL1 to fetch an image descriptor + corresponding to NS_BL1U. -If the Non-Secure Firmware Updater, NS\_BL2U is used, the following must also +If the Non-Secure Firmware Updater, NS_BL2U is used, the following must also be defined: -- **#define : NS\_BL2U\_BASE** +- **#define : NS_BL2U_BASE** - Defines the base address in non-secure memory where NS\_BL2U executes. + Defines the base address in non-secure memory where NS_BL2U executes. Must be aligned on a page-size boundary. NOTE: TF-A does not provide source code for this image. -- **#define : NS\_BL2U\_IMAGE\_ID** +- **#define : NS_BL2U_IMAGE_ID** - NS\_BL2U image identifier, used by BL1 to fetch an image descriptor - corresponding to NS\_BL2U. + NS_BL2U image identifier, used by BL1 to fetch an image descriptor + corresponding to NS_BL2U. For the the Firmware update capability of TRUSTED BOARD BOOT, the following macros may also be defined: -- **#define : PLAT\_FWU\_MAX\_SIMULTANEOUS\_IMAGES** +- **#define : PLAT_FWU_MAX_SIMULTANEOUS_IMAGES** Total number of images that can be loaded simultaneously. If the platform doesn't specify any value, it defaults to 10. -If a SCP\_BL2 image is supported by the platform, the following constants must +If a SCP_BL2 image is supported by the platform, the following constants must also be defined: -- **#define : SCP\_BL2\_IMAGE\_ID** +- **#define : SCP_BL2_IMAGE_ID** - SCP\_BL2 image identifier, used by BL2 to load SCP\_BL2 into secure memory + SCP_BL2 image identifier, used by BL2 to load SCP_BL2 into secure memory from platform storage before being transferred to the SCP. -- **#define : SCP\_FW\_KEY\_CERT\_ID** +- **#define : SCP_FW_KEY_CERT_ID** - SCP\_BL2 key certificate identifier, used by BL2 to load the SCP\_BL2 key + SCP_BL2 key certificate identifier, used by BL2 to load the SCP_BL2 key certificate (mandatory when Trusted Board Boot is enabled). -- **#define : SCP\_FW\_CONTENT\_CERT\_ID** +- **#define : SCP_FW_CONTENT_CERT_ID** - SCP\_BL2 content certificate identifier, used by BL2 to load the SCP\_BL2 + SCP_BL2 content certificate identifier, used by BL2 to load the SCP_BL2 content certificate (mandatory when Trusted Board Boot is enabled). If a BL32 image is supported by the platform, the following constants must also be defined: -- **#define : BL32\_IMAGE\_ID** +- **#define : BL32_IMAGE_ID** BL32 image identifier, used by BL2 to load BL32. -- **#define : TRUSTED\_OS\_FW\_KEY\_CERT\_ID** +- **#define : TRUSTED_OS_FW_KEY_CERT_ID** BL32 key certificate identifier, used by BL2 to load the BL32 key certificate (mandatory when Trusted Board Boot is enabled). -- **#define : TRUSTED\_OS\_FW\_CONTENT\_CERT\_ID** +- **#define : TRUSTED_OS_FW_CONTENT_CERT_ID** BL32 content certificate identifier, used by BL2 to load the BL32 content certificate (mandatory when Trusted Board Boot is enabled). -- **#define : BL32\_BASE** +- **#define : BL32_BASE** Defines the base address in secure memory where BL2 loads the BL32 binary image. Must be aligned on a page-size boundary. -- **#define : BL32\_LIMIT** +- **#define : BL32_LIMIT** Defines the maximum address that the BL32 image can occupy. If the Test Secure-EL1 Payload (TSP) instantiation of BL32 is supported by the platform, the following constants must also be defined: -- **#define : TSP\_SEC\_MEM\_BASE** +- **#define : TSP_SEC_MEM_BASE** Defines the base address of the secure memory used by the TSP image on the platform. This must be at the same address or below ``BL32_BASE``. -- **#define : TSP\_SEC\_MEM\_SIZE** +- **#define : TSP_SEC_MEM_SIZE** Defines the size of the secure memory used by the BL32 image on the platform. ``TSP_SEC_MEM_BASE`` and ``TSP_SEC_MEM_SIZE`` must fully accommodate the memory required by the BL32 image, defined by ``BL32_BASE`` and ``BL32_LIMIT``. -- **#define : TSP\_IRQ\_SEC\_PHY\_TIMER** +- **#define : TSP_IRQ_SEC_PHY_TIMER** Defines the ID of the secure physical generic timer interrupt used by the TSP's interrupt handling code. @@ -444,14 +444,14 @@ If the platform port uses the translation table library code, the following constants must also be defined: -- **#define : PLAT\_XLAT\_TABLES\_DYNAMIC** +- **#define : PLAT_XLAT_TABLES_DYNAMIC** Optional flag that can be set per-image to enable the dynamic allocation of regions even when the MMU is enabled. If not defined, only static functionality will be available, if defined and set to 1 it will also include the dynamic functionality. -- **#define : MAX\_XLAT\_TABLES** +- **#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 @@ -460,7 +460,7 @@ image, ``MAX_XLAT_TABLES`` must be defined to accommodate the dynamic regions as well. -- **#define : MAX\_MMAP\_REGIONS** +- **#define : MAX_MMAP_REGIONS** Defines the maximum number of regions that are allocated by the translation table library code. A region consists of physical base address, virtual base @@ -473,12 +473,12 @@ enabled for a BL image, ``MAX_MMAP_REGIONS`` must be defined to accommodate the dynamic regions as well. -- **#define : PLAT\_VIRT\_ADDR\_SPACE\_SIZE** +- **#define : PLAT_VIRT_ADDR_SPACE_SIZE** Defines the total size of the virtual address space in bytes. For example, for a 32 bit virtual address space, this value should be ``(1ULL << 32)``. -- **#define : PLAT\_PHY\_ADDR\_SPACE\_SIZE** +- **#define : PLAT_PHY_ADDR_SPACE_SIZE** Defines the total size of the physical address space in bytes. For example, for a 32 bit physical address space, this value should be ``(1ULL << 32)``. @@ -486,22 +486,22 @@ If the platform port uses the IO storage framework, the following constants must also be defined: -- **#define : MAX\_IO\_DEVICES** +- **#define : MAX_IO_DEVICES** Defines the maximum number of registered IO devices. Attempting to register more devices than this value using ``io_register_device()`` will fail with -ENOMEM. -- **#define : MAX\_IO\_HANDLES** +- **#define : MAX_IO_HANDLES** Defines the maximum number of open IO handles. Attempting to open more IO entities than this value using ``io_open()`` will fail with -ENOMEM. -- **#define : MAX\_IO\_BLOCK\_DEVICES** +- **#define : MAX_IO_BLOCK_DEVICES** Defines the maximum number of registered IO block devices. Attempting to register more devices this value using ``io_dev_open()`` will fail - with -ENOMEM. MAX\_IO\_BLOCK\_DEVICES should be less than MAX\_IO\_DEVICES. + with -ENOMEM. MAX_IO_BLOCK_DEVICES should be less than MAX_IO_DEVICES. With this macro, multiple block devices could be supported at the same time. @@ -511,7 +511,7 @@ ``USE_COHERENT_MEM`` build flag. In this case, the framework allocates the required memory within the the per-cpu data to minimize wastage. -- **#define : PLAT\_PCPU\_DATA\_SIZE** +- **#define : PLAT_PCPU_DATA_SIZE** Defines the memory (in bytes) to be reserved within the per-cpu data structure for use by the platform layer. @@ -519,39 +519,39 @@ The following constants are optional. They should be defined when the platform memory layout implies some image overlaying like in Arm standard platforms. -- **#define : BL31\_PROGBITS\_LIMIT** +- **#define : BL31_PROGBITS_LIMIT** Defines the maximum address in secure RAM that the BL31's progbits sections can occupy. -- **#define : TSP\_PROGBITS\_LIMIT** +- **#define : TSP_PROGBITS_LIMIT** Defines the maximum address that the TSP's progbits sections can occupy. If the platform port uses the PL061 GPIO driver, the following constant may optionally be defined: -- **PLAT\_PL061\_MAX\_GPIOS** +- **PLAT_PL061_MAX_GPIOS** Maximum number of GPIOs required by the platform. This allows control how much memory is allocated for PL061 GPIO controllers. The default value is - #. $(eval $(call add\_define,PLAT\_PL061\_MAX\_GPIOS)) + #. $(eval $(call add_define,PLAT_PL061_MAX_GPIOS)) If the platform port uses the partition driver, the following constant may optionally be defined: -- **PLAT\_PARTITION\_MAX\_ENTRIES** +- **PLAT_PARTITION_MAX_ENTRIES** Maximum number of partition entries required by the platform. This allows control how much memory is allocated for partition entries. The default value is 128. `For example, define the build flag in platform.mk`_: - PLAT\_PARTITION\_MAX\_ENTRIES := 12 - $(eval $(call add\_define,PLAT\_PARTITION\_MAX\_ENTRIES)) + PLAT_PARTITION_MAX_ENTRIES := 12 + $(eval $(call add_define,PLAT_PARTITION_MAX_ENTRIES)) The following constant is optional. It should be defined to override the default behaviour of the ``assert()`` function (for example, to save memory). -- **PLAT\_LOG\_LEVEL\_ASSERT** +- **PLAT_LOG_LEVEL_ASSERT** If ``PLAT_LOG_LEVEL_ASSERT`` is higher or equal than ``LOG_LEVEL_VERBOSE``, ``assert()`` prints the name of the file, the line number and the asserted expression. Else if it is higher than ``LOG_LEVEL_INFO``, it prints the file @@ -562,27 +562,27 @@ If the platform port uses the Activity Monitor Unit, the following constants may be defined: -- **PLAT\_AMU\_GROUP1\_COUNTERS\_MASK** +- **PLAT_AMU_GROUP1_COUNTERS_MASK** This mask reflects the set of group counters that should be enabled. The maximum number of group 1 counters supported by AMUv1 is 16 so the mask can be at most 0xffff. If the platform does not define this mask, no group 1 counters are enabled. If the platform defines this mask, the following constant needs to also be defined. -- **PLAT\_AMU\_GROUP1\_NR\_COUNTERS** +- **PLAT_AMU_GROUP1_NR_COUNTERS** This value is used to allocate an array to save and restore the counters specified by ``PLAT_AMU_GROUP1_COUNTERS_MASK`` on CPU suspend. This value should be equal to the highest bit position set in the mask, plus 1. The maximum number of group 1 counters in AMUv1 is 16. -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 the following macro defined. In the Arm development platforms, this file is found in ``plat/arm/board//include/plat_macros.S``. -- **Macro : plat\_crash\_print\_regs** +- **Macro : plat_crash_print_regs** This macro allows the crash reporting routine to print relevant platform registers in case of an unhandled exception in BL31. This aids in debugging @@ -614,8 +614,8 @@ The following functions need to be implemented by the platform port to enable reset vector code to perform the above tasks. -Function : plat\_get\_my\_entrypoint() [mandatory when PROGRAMMABLE\_RESET\_ADDRESS == 0] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_get_my_entrypoint() [mandatory when PROGRAMMABLE_RESET_ADDRESS == 0] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -642,8 +642,8 @@ type of reset nor to query the warm reset entrypoint. Therefore, implementing this function is not required on such platforms. -Function : plat\_secondary\_cold\_boot\_setup() [mandatory when COLD\_BOOT\_SINGLE\_CPU == 0] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_secondary_cold_boot_setup() [mandatory when COLD_BOOT_SINGLE_CPU == 0] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -666,8 +666,8 @@ primary CPU will execute the cold boot code. Therefore, implementing this function is not required on such platforms. -Function : plat\_is\_my\_cpu\_primary() [mandatory when COLD\_BOOT\_SINGLE\_CPU == 0] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_is_my_cpu_primary() [mandatory when COLD_BOOT_SINGLE_CPU == 0] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -684,8 +684,8 @@ distinguish between primary and secondary CPUs and implementing this function is not required. -Function : platform\_mem\_init() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : platform_mem_init() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -695,8 +695,8 @@ This function is called before any access to data is made by the firmware, in order to carry out any essential memory initialization. -Function: plat\_get\_rotpk\_info() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function: plat_get_rotpk_info() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -745,8 +745,8 @@ verifying it against the platform value. This flag must not be used in a deployed production environment. -Function: plat\_get\_nv\_ctr() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function: plat_get_nv_ctr() +~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -758,13 +758,13 @@ cookie in the first argument may be used to select the counter in case the platform provides more than one (for example, on platforms that use the default TBBR CoT, the cookie will correspond to the OID values defined in -TRUSTED\_FW\_NVCOUNTER\_OID or NON\_TRUSTED\_FW\_NVCOUNTER\_OID). +TRUSTED_FW_NVCOUNTER_OID or NON_TRUSTED_FW_NVCOUNTER_OID). The function returns 0 on success. Any other value means the counter value could not be retrieved from the platform. -Function: plat\_set\_nv\_ctr() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function: plat_set_nv_ctr() +~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -773,14 +773,14 @@ This function is mandatory when Trusted Board Boot is enabled. It sets a new counter value in the platform. The cookie in the first argument may be used to -select the counter (as explained in plat\_get\_nv\_ctr()). The second argument is +select the counter (as explained in plat_get_nv_ctr()). The second argument is the updated counter value to be written to the NV counter. The function returns 0 on success. Any other value means the counter value could not be updated. -Function: plat\_set\_nv\_ctr2() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function: plat_set_nv_ctr2() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -806,8 +806,8 @@ The following functions are mandatory functions which need to be implemented by the platform port. -Function : plat\_my\_core\_pos() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_my_core_pos() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -825,8 +825,8 @@ This function plays a crucial role in the power domain topology framework in PSCI and details of this can be found in `Power Domain Topology Design`_. -Function : plat\_core\_pos\_by\_mpidr() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_core_pos_by_mpidr() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -848,8 +848,8 @@ common platform-specific tasks. A platform may choose to override these definitions. -Function : plat\_set\_my\_stack() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_set_my_stack() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -863,11 +863,11 @@ constant ``PLATFORM_STACK_SIZE``. Common implementations of this function for the UP and MP BL images are -provided in `plat/common/aarch64/platform\_up\_stack.S`_ and -`plat/common/aarch64/platform\_mp\_stack.S`_ +provided in `plat/common/aarch64/platform_up_stack.S`_ and +`plat/common/aarch64/platform_mp_stack.S`_ -Function : plat\_get\_my\_stack() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_get_my_stack() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -881,11 +881,11 @@ constant ``PLATFORM_STACK_SIZE``. Common implementations of this function for the UP and MP BL images are -provided in `plat/common/aarch64/platform\_up\_stack.S`_ and -`plat/common/aarch64/platform\_mp\_stack.S`_ +provided in `plat/common/aarch64/platform_up_stack.S`_ and +`plat/common/aarch64/platform_mp_stack.S`_ -Function : plat\_report\_exception() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_report_exception() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -905,15 +905,15 @@ For AArch64, this function receives the exception type as its argument. Possible values for exceptions types are listed in the -`include/common/bl\_common.h`_ header file. Note that these constants are not +`include/common/bl_common.h`_ header file. Note that these constants are not related to any architectural exception code; they are just a TF-A convention. For AArch32, this function receives the exception mode as its argument. Possible values for exception modes are listed in the `include/lib/aarch32/arch.h`_ header file. -Function : plat\_reset\_handler() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_reset_handler() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -929,8 +929,8 @@ the default implementation, refer to the `Firmware Design`_ for general guidelines. -Function : plat\_disable\_acp() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_disable_acp() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -944,8 +944,8 @@ scratch registers. It should preserve the value in x18 register as it is used by the caller to store the return address. -Function : plat\_error\_handler() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_error_handler() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -968,8 +968,8 @@ The default implementation simply spins. -Function : plat\_panic\_handler() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_panic_handler() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -984,8 +984,8 @@ Note: The address from where it was called is stored in x30 (Link Register). The default implementation simply spins. -Function : plat\_get\_bl\_image\_load\_info() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_get_bl_image_load_info() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -996,8 +996,8 @@ populated to load. This function is invoked in BL2 to load the BL3xx images. -Function : plat\_get\_next\_bl\_params() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_get_next_bl_params() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1009,8 +1009,8 @@ function is invoked in BL2 to pass this information to the next BL image. -Function : plat\_get\_stack\_protector\_canary() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_get_stack_protector_canary() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1018,7 +1018,7 @@ Return : u_register_t This function returns a random value that is used to initialize the canary used -when the stack protector is enabled with ENABLE\_STACK\_PROTECTOR. A predictable +when the stack protector is enabled with ENABLE_STACK_PROTECTOR. A predictable value will weaken the protection as the attacker could easily write the right value as part of the attack most of the time. Therefore, it should return a true random number. @@ -1027,8 +1027,8 @@ a lower address than the stack bases. Failure to do so would allow an attacker to overwrite the canary as part of the stack buffer overflow attack. -Function : plat\_flush\_next\_bl\_params() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_flush_next_bl_params() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1039,8 +1039,8 @@ next image. This function is invoked in BL2 to flush this information to the next BL image. -Function : plat\_log\_get\_prefix() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_log_get_prefix() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1054,8 +1054,8 @@ the log output. The implementation should be robust to future changes that increase the number of log levels. -Function : plat\_get\_mbedtls\_heap() -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_get_mbedtls_heap() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1116,8 +1116,8 @@ The following functions need to be implemented by the platform port to enable BL1 to perform the above tasks. -Function : bl1\_early\_platform\_setup() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl1_early_platform_setup() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1138,8 +1138,8 @@ the CCI slave interface corresponding to the cluster that includes the primary CPU. -Function : bl1\_plat\_arch\_setup() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl1_plat_arch_setup() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1154,8 +1154,8 @@ This function helps fulfill requirement 2 above. -Function : bl1\_platform\_setup() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl1_platform_setup() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1167,15 +1167,15 @@ MMU and data cache have been enabled. if support for multiple boot sources is required, it initializes the boot -sequence used by plat\_try\_next\_boot\_source(). +sequence used by plat_try_next_boot_source(). In Arm standard platforms, this function initializes the storage abstraction layer used to load the next bootloader image. This function helps fulfill requirement 4 above. -Function : bl1\_plat\_sec\_mem\_layout() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl1_plat_sec_mem_layout() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1198,8 +1198,8 @@ This function helps fulfill requirements 4 and 5 above. -Function : bl1\_plat\_prepare\_exit() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl1_plat_prepare_exit() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1212,8 +1212,8 @@ control to the next image. It receives the address of the ``entry_point_info_t`` structure passed from BL2. This function runs with MMU disabled. -Function : bl1\_plat\_set\_ep\_info() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl1_plat_set_ep_info() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1224,8 +1224,8 @@ The default implementation just returns. -Function : bl1\_plat\_get\_next\_image\_id() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl1_plat_get_next_image_id() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1243,8 +1243,8 @@ platforms override this function to detect if firmware update is required, and if so, return the first image in the firmware update process. -Function : bl1\_plat\_get\_image\_desc() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl1_plat_get_image_desc() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1259,8 +1259,8 @@ the firmware update images defined in the Trusted Board Boot Requirements specification. -Function : bl1\_plat\_handle\_pre\_image\_load() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl1_plat_handle_pre_image_load() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1271,8 +1271,8 @@ corresponding to ``image_id``. This function is invoked in BL1, both in cold boot and FWU code path, before loading the image. -Function : bl1\_plat\_handle\_post\_image\_load() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl1_plat_handle_post_image_load() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1289,8 +1289,8 @@ of ``meminfo_t`` structure is updated in ``arg1`` of the entrypoint information to BL2. -Function : bl1\_plat\_fwu\_done() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl1_plat_fwu_done() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1304,8 +1304,8 @@ The default implementation spins forever. -Function : bl1\_plat\_mem\_check() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl1_plat_mem_check() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1342,8 +1342,8 @@ The following functions must be implemented by the platform port to enable BL2 to perform the above tasks. -Function : bl2\_early\_platform\_setup2() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl2_early_platform_setup2() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1367,11 +1367,11 @@ family of functions in BL2. - Initializes the storage abstraction layer used to load further bootloader - images. It is necessary to do this early on platforms with a SCP\_BL2 image, - since the later ``bl2_platform_setup`` must be done after SCP\_BL2 is loaded. + images. It is necessary to do this early on platforms with a SCP_BL2 image, + since the later ``bl2_platform_setup`` must be done after SCP_BL2 is loaded. -Function : bl2\_plat\_arch\_setup() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl2_plat_arch_setup() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1386,8 +1386,8 @@ On Arm standard platforms, this function enables the MMU. -Function : bl2\_platform\_setup() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl2_platform_setup() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1405,8 +1405,8 @@ 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\_handle\_pre\_image\_load() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl2_plat_handle_pre_image_load() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1417,8 +1417,8 @@ for given ``image_id``. This function is currently invoked in BL2 before loading each image. -Function : bl2\_plat\_handle\_post\_image\_load() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl2_plat_handle_post_image_load() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1429,8 +1429,8 @@ for given ``image_id``. This function is currently invoked in BL2 after loading each image. -Function : bl2\_plat\_preload\_setup [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl2_plat_preload_setup [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1439,12 +1439,12 @@ This optional function performs any BL2 platform initialization required before image loading, that is not done later in -bl2\_platform\_setup(). Specifically, if support for multiple +bl2_platform_setup(). Specifically, if support for multiple boot sources is required, it initializes the boot sequence used by -plat\_try\_next\_boot\_source(). +plat_try_next_boot_source(). -Function : plat\_try\_next\_boot\_source() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_try_next_boot_source() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1468,14 +1468,14 @@ Design`_ for more information. All mandatory functions of BL2 must be implemented, except the functions -bl2\_early\_platform\_setup and bl2\_el3\_plat\_arch\_setup, because -their work is done now by bl2\_el3\_early\_platform\_setup and -bl2\_el3\_plat\_arch\_setup. These functions should generally implement -the bl1\_plat\_xxx() and bl2\_plat\_xxx() functionality combined. +bl2_early_platform_setup and bl2_el3_plat_arch_setup, because +their work is done now by bl2_el3_early_platform_setup and +bl2_el3_plat_arch_setup. These functions should generally implement +the bl1_plat_xxx() and bl2_plat_xxx() functionality combined. -Function : bl2\_el3\_early\_platform\_setup() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl2_el3_early_platform_setup() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1492,13 +1492,13 @@ family of functions in BL2. - Initializes the storage abstraction layer used to load further bootloader - images. It is necessary to do this early on platforms with a SCP\_BL2 image, - since the later ``bl2_platform_setup`` must be done after SCP\_BL2 is loaded. + images. It is necessary to do this early on platforms with a SCP_BL2 image, + since the later ``bl2_platform_setup`` must be done after SCP_BL2 is loaded. - Initializes the private variables that define the memory layout used. -Function : bl2\_el3\_plat\_arch\_setup() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl2_el3_plat_arch_setup() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1513,8 +1513,8 @@ On Arm standard platforms, this function enables the MMU. -Function : bl2\_el3\_plat\_prepare\_exit() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl2_el3_plat_prepare_exit() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1533,10 +1533,10 @@ process and is executed only by the primary CPU. BL1 passes control to BL2U at ``BL2U_BASE``. BL2U executes in Secure-EL1 and is responsible for: -#. (Optional) Transferring the optional SCP\_BL2U binary image from AP secure - memory to SCP RAM. BL2U uses the SCP\_BL2U ``image_info`` passed by BL1. - ``SCP_BL2U_BASE`` defines the address in AP secure memory where SCP\_BL2U - should be copied from. Subsequent handling of the SCP\_BL2U image is +#. (Optional) Transferring the optional SCP_BL2U binary image from AP secure + memory to SCP RAM. BL2U uses the SCP_BL2U ``image_info`` passed by BL1. + ``SCP_BL2U_BASE`` defines the address in AP secure memory where SCP_BL2U + should be copied from. Subsequent handling of the SCP_BL2U image is implemented by the platform specific ``bl2u_plat_handle_scp_bl2u()`` function. If ``SCP_BL2U_BASE`` is not defined then this step is not performed. @@ -1547,8 +1547,8 @@ The following functions must be implemented by the platform port to enable BL2U to perform the tasks mentioned above. -Function : bl2u\_early\_platform\_setup() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl2u_early_platform_setup() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1563,11 +1563,11 @@ private storage as the original memory may be subsequently overwritten by BL2U. On Arm CSS platforms ``plat_info`` is interpreted as an ``image_info_t`` structure, -to extract SCP\_BL2U image information, which is then copied into a private +to extract SCP_BL2U image information, which is then copied into a private variable. -Function : bl2u\_plat\_arch\_setup() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl2u_plat_arch_setup() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1581,8 +1581,8 @@ that varies across platforms, for example enabling the MMU (since the memory map differs across platforms). -Function : bl2u\_platform\_setup() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl2u_platform_setup() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1600,8 +1600,8 @@ 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 : bl2u\_plat\_handle\_scp\_bl2u() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl2u_plat_handle_scp_bl2u() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1614,7 +1614,7 @@ Application Processor (AP) for BL2U execution to continue. This function returns 0 on success, a negative error code otherwise. -This function is included if SCP\_BL2U\_BASE is defined. +This function is included if SCP_BL2U_BASE is defined. Boot Loader Stage 3-1 (BL31) ---------------------------- @@ -1650,8 +1650,8 @@ The following functions must be implemented by the platform port to enable BL31 to perform the above tasks. -Function : bl31\_early\_platform\_setup2() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl31_early_platform_setup2() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1684,8 +1684,8 @@ CCI slave interface corresponding to the cluster that includes the primary CPU. -Function : bl31\_plat\_arch\_setup() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl31_plat_arch_setup() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1700,7 +1700,7 @@ On Arm standard platforms, this function enables the MMU. -Function : bl31\_platform\_setup() [mandatory] +Function : bl31_platform_setup() [mandatory] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1742,8 +1742,8 @@ In particular, initialise the locks that prevent concurrent accesses to the power controller device. -Function : bl31\_plat\_runtime\_setup() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl31_plat_runtime_setup() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1755,8 +1755,8 @@ implementation of this function will invoke ``console_switch_state()`` to switch console output to consoles marked for use in the ``runtime`` state. -Function : bl31\_plat\_get\_next\_image\_ep\_info() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : bl31_plat_get_next_image_ep_info() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1792,8 +1792,8 @@ On DynamIQ systems, this function must not use stack while enabling MMU, which is how the function in xlat table library version 2 is implemented. -Function : plat\_get\_syscnt\_freq2() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_get_syscnt_freq2() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1806,8 +1806,8 @@ of the system counter, which is retrieved from the first entry in the frequency modes table. -#define : PLAT\_PERCPU\_BAKERY\_LOCK\_SIZE [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#define : PLAT_PERCPU_BAKERY_LOCK_SIZE [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When ``USE_COHERENT_MEM = 0``, this constant defines the total memory (in bytes) aligned to the cache line boundary that should be allocated per-cpu to @@ -1929,8 +1929,8 @@ The following functions form part of platform port of PSCI functionality. -Function : plat\_psci\_stat\_accounting\_start() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_psci_stat_accounting_start() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1947,8 +1947,8 @@ statistics could be tracked in software using PMF. If ``ENABLE_PMF`` is set, the default implementation will use PMF to capture timestamps. -Function : plat\_psci\_stat\_accounting\_stop() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_psci_stat_accounting_stop() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1965,8 +1965,8 @@ statistics could be tracked in software using PMF. If ``ENABLE_PMF`` is set, the default implementation will use PMF to capture timestamps. -Function : plat\_psci\_stat\_get\_residency() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_psci_stat_get_residency() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -1985,8 +1985,8 @@ CPU in the power domain to suspend and may be needed to calculate the residency for that power domain. -Function : plat\_get\_target\_pwr\_state() [optional] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_get_target_pwr_state() [optional] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -2010,8 +2010,8 @@ coordinated target local power state for a power domain will be the minimum of the requested local power state values. -Function : plat\_get\_power\_domain\_tree\_desc() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_get_power_domain_tree_desc() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -2023,13 +2023,13 @@ described in `Power Domain Topology Design`_. The BL31 PSCI initialization code requires this array to be described by the platform, either statically or dynamically, to initialize the power domain topology tree. In case the array -is populated dynamically, then plat\_core\_pos\_by\_mpidr() and -plat\_my\_core\_pos() should also be implemented suitably so that the topology +is populated dynamically, then plat_core_pos_by_mpidr() and +plat_my_core_pos() should also be implemented suitably so that the topology tree description matches the CPU indices returned by these APIs. These APIs together form the platform interface for the PSCI topology framework. -Function : plat\_setup\_psci\_ops() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_setup_psci_ops() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -2048,15 +2048,15 @@ A description of each member of this structure is given below. Please refer to the Arm FVP specific implementation of these handlers in -`plat/arm/board/fvp/fvp\_pm.c`_ as an example. For each PSCI function that the +`plat/arm/board/fvp/fvp_pm.c`_ as an example. For each PSCI function that the platform wants to support, the associated operation or operations in this structure must be provided and implemented (Refer section 4 of `Firmware Design`_ for the PSCI API supported in TF-A). To disable a PSCI function in a platform port, the operation should be removed from this structure instead of providing an empty implementation. -plat\_psci\_ops.cpu\_standby() -.............................. +plat_psci_ops.cpu_standby() +........................... Perform the platform-specific actions to enter the standby state for a cpu indicated by the passed argument. This provides a fast path for CPU standby @@ -2068,15 +2068,15 @@ issuing a wfi instruction) and ensure that it can be woken up from that state by a normal interrupt. The generic code expects the handler to succeed. -plat\_psci\_ops.pwr\_domain\_on() -................................. +plat_psci_ops.pwr_domain_on() +............................. Perform the platform specific actions to power on a CPU, specified by the ``MPIDR`` (first argument). The generic code expects the platform to -return PSCI\_E\_SUCCESS on success or PSCI\_E\_INTERN\_FAIL for any failure. +return PSCI_E_SUCCESS on success or PSCI_E_INTERN_FAIL for any failure. -plat\_psci\_ops.pwr\_domain\_off() -.................................. +plat_psci_ops.pwr_domain_off() +.............................. Perform the platform specific actions to prepare to power off the calling CPU and its higher parent power domain levels as indicated by the ``target_state`` @@ -2092,8 +2092,8 @@ for the higher power domain levels depending on the result of state coordination. The generic code expects the handler to succeed. -plat\_psci\_ops.pwr\_domain\_suspend\_pwrdown\_early() [optional] -................................................................. +plat_psci_ops.pwr_domain_suspend_pwrdown_early() [optional] +........................................................... This optional function may be used as a performance optimization to replace or complement pwr_domain_suspend() on some platforms. Its calling semantics @@ -2109,8 +2109,8 @@ = 1, data caches remain enabled throughout, and so there is no advantage to moving platform specific actions to this function. -plat\_psci\_ops.pwr\_domain\_suspend() -...................................... +plat_psci_ops.pwr_domain_suspend() +.................................. Perform the platform specific actions to prepare to suspend the calling CPU and its higher parent power domain levels as indicated by the @@ -2150,8 +2150,8 @@ data, for example in DRAM. The Distributor can then be powered down using an implementation-defined sequence. -plat\_psci\_ops.pwr\_domain\_pwr\_down\_wfi() -............................................. +plat_psci_ops.pwr_domain_pwr_down_wfi() +....................................... This is an optional function and, if implemented, is expected to perform platform specific actions including the ``wfi`` invocation which allows the @@ -2167,8 +2167,8 @@ If this function is not implemented by the platform, PSCI generic implementation invokes ``psci_power_down_wfi()`` for power down. -plat\_psci\_ops.pwr\_domain\_on\_finish() -......................................... +plat_psci_ops.pwr_domain_on_finish() +.................................... This function is called by the PSCI implementation after the calling CPU is powered on and released from reset in response to an earlier PSCI ``CPU_ON`` call. @@ -2181,8 +2181,8 @@ above the CPU might require initialization due to having previously been in low power states. The generic code expects the handler to succeed. -plat\_psci\_ops.pwr\_domain\_suspend\_finish() -.............................................. +plat_psci_ops.pwr_domain_suspend_finish() +......................................... This function is called by the PSCI implementation after the calling CPU is powered on and released from reset in response to an asynchronous wakeup @@ -2199,41 +2199,41 @@ suspend, their context must be restored in this function in the reverse order to how they were saved during suspend sequence. -plat\_psci\_ops.system\_off() -............................. +plat_psci_ops.system_off() +.......................... This function is called by PSCI implementation in response to a ``SYSTEM_OFF`` call. It performs the platform-specific system poweroff sequence after notifying the Secure Payload Dispatcher. -plat\_psci\_ops.system\_reset() -............................... +plat_psci_ops.system_reset() +............................ This function is called by PSCI implementation in response to a ``SYSTEM_RESET`` call. It performs the platform-specific system reset sequence after notifying the Secure Payload Dispatcher. -plat\_psci\_ops.validate\_power\_state() -........................................ +plat_psci_ops.validate_power_state() +.................................... This function is called by the PSCI implementation during the ``CPU_SUSPEND`` call to validate the ``power_state`` parameter of the PSCI API and if valid, populate it in ``req_state`` (second argument) array as power domain level specific local states. If the ``power_state`` is invalid, the platform must -return PSCI\_E\_INVALID\_PARAMS as error, which is propagated back to the +return PSCI_E_INVALID_PARAMS as error, which is propagated back to the normal world PSCI client. -plat\_psci\_ops.validate\_ns\_entrypoint() -.......................................... +plat_psci_ops.validate_ns_entrypoint() +...................................... This function is called by the PSCI implementation during the ``CPU_SUSPEND``, ``SYSTEM_SUSPEND`` and ``CPU_ON`` calls to validate the non-secure ``entry_point`` parameter passed by the normal world. If the ``entry_point`` is invalid, -the platform must return PSCI\_E\_INVALID\_ADDRESS as error, which is +the platform must return PSCI_E_INVALID_ADDRESS as error, which is propagated back to the normal world PSCI client. -plat\_psci\_ops.get\_sys\_suspend\_power\_state() -................................................. +plat_psci_ops.get_sys_suspend_power_state() +........................................... This function is called by the PSCI implementation during the ``SYSTEM_SUSPEND`` call to get the ``req_state`` parameter from platform which encodes the power @@ -2242,8 +2242,8 @@ ``pwr_domain_suspend()`` will be invoked with the coordinated target state to enter system suspend. -plat\_psci\_ops.get\_pwr\_lvl\_state\_idx() -........................................... +plat_psci_ops.get_pwr_lvl_state_idx() +..................................... This is an optional function and, if implemented, is invoked by the PSCI implementation to convert the ``local_state`` (first argument) at a specified @@ -2253,8 +2253,8 @@ ``PLAT_MAX_PWR_LVL_STATES`` is greater than 2, and needs to account for these local power states. -plat\_psci\_ops.translate\_power\_state\_by\_mpidr() -.................................................... +plat_psci_ops.translate_power_state_by_mpidr() +.............................................. This is an optional function and, if implemented, verifies the ``power_state`` (second argument) parameter of the PSCI API corresponding to a target power @@ -2265,16 +2265,16 @@ is similar to the ``validate_power_state`` function described above and is envisaged to be used in case the validity of ``power_state`` depend on the targeted power domain. If the ``power_state`` is invalid for the targeted power -domain, the platform must return PSCI\_E\_INVALID\_PARAMS as error. If this +domain, the platform must return PSCI_E_INVALID_PARAMS as error. If this function is not implemented, then the generic implementation relies on ``validate_power_state`` function to translate the ``power_state``. This function can also be used in case the platform wants to support local -power state encoding for ``power_state`` parameter of PSCI\_STAT\_COUNT/RESIDENCY +power state encoding for ``power_state`` parameter of PSCI_STAT_COUNT/RESIDENCY APIs as described in Section 5.18 of `PSCI`_. -plat\_psci\_ops.get\_node\_hw\_state() -...................................... +plat_psci_ops.get_node_hw_state() +................................. This is an optional function. If implemented this function is intended to return the power state of a node (identified by the first parameter, the ``MPIDR``) in @@ -2288,8 +2288,8 @@ Implementations are not expected to handle ``power_levels`` greater than ``PLAT_MAX_PWR_LVL``. -plat\_psci\_ops.system\_reset2() -................................ +plat_psci_ops.system_reset2() +............................. This is an optional function. If implemented this function is called during the ``SYSTEM_RESET2`` call to perform a reset @@ -2301,8 +2301,8 @@ and vendor reset can return other PSCI error codes as defined in `PSCI`_. On success this function will not return. -plat\_psci\_ops.write\_mem\_protect() -.................................... +plat_psci_ops.write_mem_protect() +................................. This is an optional function. If implemented it enables or disables the ``MEM_PROTECT`` functionality based on the value of ``val``. @@ -2310,16 +2310,16 @@ disables it. Upon encountering failures it must return a negative value and on success it must return 0. -plat\_psci\_ops.read\_mem\_protect() -..................................... +plat_psci_ops.read_mem_protect() +................................ This is an optional function. If implemented it returns the current state of ``MEM_PROTECT`` via the ``val`` parameter. Upon encountering failures it must return a negative value and on success it must return 0. -plat\_psci\_ops.mem\_protect\_chk() -................................... +plat_psci_ops.mem_protect_chk() +............................... This is an optional function. If implemented it checks if a memory region defined by a base address ``base`` and with a size of ``length`` @@ -2348,8 +2348,8 @@ .. __: platform-interrupt-controller-API.rst -Function : plat\_interrupt\_type\_to\_line() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_interrupt_type_to_line() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -2384,8 +2384,8 @@ - The EL3 interrupts are signaled as FIQ in both S-EL0/1 and NS-EL0/1/2 context. -Function : plat\_ic\_get\_pending\_interrupt\_type() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_ic_get_pending_interrupt_type() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -2417,8 +2417,8 @@ #. id = ``GIC_SPURIOUS_INTERRUPT`` (1023) is reported as an invalid interrupt type. #. All other interrupt id's are reported as EL3 interrupt. -Function : plat\_ic\_get\_pending\_interrupt\_id() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_ic_get_pending_interrupt_id() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -2456,11 +2456,11 @@ When the API invoked from S-EL1 for GICv3 systems, the id read from system register ``ICC_HPPIR1_EL1``, *Highest Priority Pending group 1 Interrupt -Register*, is returned if is not equal to GIC\_SPURIOUS\_INTERRUPT (1023) else +Register*, is returned if is not equal to GIC_SPURIOUS_INTERRUPT (1023) else ``INTR_ID_UNAVAILABLE`` is returned. -Function : plat\_ic\_acknowledge\_interrupt() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_ic_acknowledge_interrupt() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -2491,8 +2491,8 @@ The TSP uses this API to start processing of the secure physical timer interrupt. -Function : plat\_ic\_end\_of\_interrupt() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_ic_end_of_interrupt() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -2513,8 +2513,8 @@ The TSP uses this API to finish processing of the secure physical timer interrupt. -Function : plat\_ic\_get\_interrupt\_type() [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_ic_get_interrupt_type() [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -2564,8 +2564,8 @@ that are designed to be used by these functions. See Arm platforms (like juno) for an example of this. -Function : plat\_crash\_console\_init [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_crash_console_init [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -2576,8 +2576,8 @@ console. It must only use the general purpose registers x0 through x7 to do the initialization and returns 1 on success. -Function : plat\_crash\_console\_putc [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_crash_console_putc [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -2589,8 +2589,8 @@ x2 to do its work. The parameter and the return value are in general purpose register x0. -Function : plat\_crash\_console\_flush [mandatory] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat_crash_console_flush [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -2710,7 +2710,7 @@ need to be defined in the platform makefile which will get included by the build system. -- **NEED\_BL33** +- **NEED_BL33** By default, this flag is defined ``yes`` by the build system and ``BL33`` build option should be supplied as a build option. The platform has the option of excluding the BL33 image in the ``fip`` image by defining this flag @@ -2770,7 +2770,7 @@ The current implementation only allows for known images to be loaded by the firmware. These images are specified by using their identifiers, as defined in -[include/plat/common/platform\_def.h] (or a separate header file included from +[include/plat/common/platform_def.h] (or a separate header file included from there). The platform layer (``plat_get_image_source()``) then returns a reference to a device and a driver-specific ``spec`` which will be understood by the driver to allow access to the image data. @@ -2791,19 +2791,19 @@ *Copyright (c) 2013-2018, Arm Limited and Contributors. All rights reserved.* .. _include/plat/common/platform.h: ../include/plat/common/platform.h -.. _include/plat/arm/common/plat\_arm.h: ../include/plat/arm/common/plat_arm.h%5D +.. _include/plat/arm/common/plat_arm.h: ../include/plat/arm/common/plat_arm.h%5D .. _User Guide: user-guide.rst -.. _include/plat/common/common\_def.h: ../include/plat/common/common_def.h -.. _include/plat/arm/common/arm\_def.h: ../include/plat/arm/common/arm_def.h -.. _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 +.. _include/plat/common/common_def.h: ../include/plat/common/common_def.h +.. _include/plat/arm/common/arm_def.h: ../include/plat/arm/common/arm_def.h +.. _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 .. _For example, define the build flag in platform.mk: PLAT_PL061_MAX_GPIOS%20:=%20160 .. _Power Domain Topology Design: psci-pd-tree.rst -.. _include/common/bl\_common.h: ../include/common/bl_common.h +.. _include/common/bl_common.h: ../include/common/bl_common.h .. _include/lib/aarch32/arch.h: ../include/lib/aarch32/arch.h .. _Firmware Design: firmware-design.rst .. _PSCI: http://infocenter.arm.com/help/topic/com.arm.doc.den0022c/DEN0022C_Power_State_Coordination_Interface.pdf -.. _plat/arm/board/fvp/fvp\_pm.c: ../plat/arm/board/fvp/fvp_pm.c +.. _plat/arm/board/fvp/fvp_pm.c: ../plat/arm/board/fvp/fvp_pm.c .. _Platform compatibility policy: ./platform-compatibility-policy.rst .. _IMF Design Guide: interrupt-framework-design.rst .. _Arm Generic Interrupt Controller version 2.0 (GICv2): http://infocenter.arm.com/help/topic/com.arm.doc.ihi0048b/index.html