blob: c7115903a190a7b68f27d1412a8cca35f72450f2 [file] [log] [blame] [view]
Achin Gupta4f6ad662013-10-25 09:08:21 +01001ARM Trusted Firmware Porting Guide
2==================================
3
4Contents
5--------
6
71. Introduction
82. Common Modifications
9 * Common mandatory modifications
Vikram Kanigirie452cd82014-05-23 15:56:12 +010010 * Handling reset
Achin Gupta4f6ad662013-10-25 09:08:21 +010011 * Common optional modifications
123. Boot Loader stage specific modifications
13 * Boot Loader stage 1 (BL1)
14 * Boot Loader stage 2 (BL2)
15 * Boot Loader stage 3-1 (BL3-1)
16 * PSCI implementation (in BL3-1)
Achin Guptaa4fa3cb2014-06-02 22:27:36 +010017 * Interrupt Management framework (in BL3-1)
Soby Mathewc67b09b2014-07-14 16:57:23 +010018 * Crash Reporting mechanism (in BL3-1)
Harry Liebeld265bd72014-01-31 19:04:10 +0000194. C Library
205. Storage abstraction layer
Achin Gupta4f6ad662013-10-25 09:08:21 +010021
22- - - - - - - - - - - - - - - - - -
23
241. Introduction
25----------------
26
27Porting the ARM Trusted Firmware to a new platform involves making some
28mandatory and optional modifications for both the cold and warm boot paths.
29Modifications consist of:
30
31* Implementing a platform-specific function or variable,
32* Setting up the execution context in a certain way, or
33* Defining certain constants (for example #defines).
34
Dan Handleyb68954c2014-05-29 12:30:24 +010035The platform-specific functions and variables are all declared in
36[include/plat/common/platform.h]. The firmware provides a default implementation
37of variables and functions to fulfill the optional requirements. These
38implementations are all weakly defined; they are provided to ease the porting
39effort. Each platform port can override them with its own implementation if the
40default implementation is inadequate.
Achin Gupta4f6ad662013-10-25 09:08:21 +010041
42Some modifications are common to all Boot Loader (BL) stages. Section 2
43discusses these in detail. The subsequent sections discuss the remaining
44modifications for each BL stage in detail.
45
46This document should be read in conjunction with the ARM Trusted Firmware
47[User Guide].
48
49
502. Common modifications
51------------------------
52
53This section covers the modifications that should be made by the platform for
54each BL stage to correctly port the firmware stack. They are categorized as
55either mandatory or optional.
56
57
582.1 Common mandatory modifications
59----------------------------------
60A platform port must enable the Memory Management Unit (MMU) with identity
61mapped page tables, and enable both the instruction and data caches for each BL
62stage. In the ARM FVP port, each BL stage configures the MMU in its platform-
63specific architecture setup function, for example `blX_plat_arch_setup()`.
64
65Each platform must allocate a block of identity mapped secure memory with
66Device-nGnRE attributes aligned to page boundary (4K) for each BL stage. This
67memory is identified by the section name `tzfw_coherent_mem` so that its
68possible for the firmware to place variables in it using the following C code
69directive:
70
71 __attribute__ ((section("tzfw_coherent_mem")))
72
73Or alternatively the following assembler code directive:
74
75 .section tzfw_coherent_mem
76
77The `tzfw_coherent_mem` section is used to allocate any data structures that are
78accessed both when a CPU is executing with its MMU and caches enabled, and when
79it's running with its MMU and caches disabled. Examples are given below.
80
81The following variables, functions and constants must be defined by the platform
82for the firmware to work correctly.
83
84
Dan Handleyb68954c2014-05-29 12:30:24 +010085### File : platform_def.h [mandatory]
Achin Gupta4f6ad662013-10-25 09:08:21 +010086
Dan Handleyb68954c2014-05-29 12:30:24 +010087Each platform must ensure that a header file of this name is in the system
88include path with the following constants defined. This may require updating the
89list of `PLAT_INCLUDES` in the `platform.mk` file. In the ARM FVP port, this
90file is found in [plat/fvp/include/platform_def.h].
Achin Gupta4f6ad662013-10-25 09:08:21 +010091
James Morrisseyba3155b2013-10-29 10:56:46 +000092* **#define : PLATFORM_LINKER_FORMAT**
Achin Gupta4f6ad662013-10-25 09:08:21 +010093
94 Defines the linker format used by the platform, for example
95 `elf64-littleaarch64` used by the FVP.
96
James Morrisseyba3155b2013-10-29 10:56:46 +000097* **#define : PLATFORM_LINKER_ARCH**
Achin Gupta4f6ad662013-10-25 09:08:21 +010098
99 Defines the processor architecture for the linker by the platform, for
100 example `aarch64` used by the FVP.
101
James Morrisseyba3155b2013-10-29 10:56:46 +0000102* **#define : PLATFORM_STACK_SIZE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100103
104 Defines the normal stack memory available to each CPU. This constant is used
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000105 by [plat/common/aarch64/platform_mp_stack.S] and
106 [plat/common/aarch64/platform_up_stack.S].
107
James Morrisseyba3155b2013-10-29 10:56:46 +0000108* **#define : FIRMWARE_WELCOME_STR**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100109
110 Defines the character string printed by BL1 upon entry into the `bl1_main()`
111 function.
112
James Morrisseyba3155b2013-10-29 10:56:46 +0000113* **#define : BL2_IMAGE_NAME**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100114
115 Name of the BL2 binary image on the host file-system. This name is used by
Harry Liebeld265bd72014-01-31 19:04:10 +0000116 BL1 to load BL2 into secure memory from non-volatile storage.
117
118* **#define : BL31_IMAGE_NAME**
119
120 Name of the BL3-1 binary image on the host file-system. This name is used by
121 BL2 to load BL3-1 into secure memory from platform storage.
122
123* **#define : BL33_IMAGE_NAME**
124
125 Name of the BL3-3 binary image on the host file-system. This name is used by
126 BL2 to load BL3-3 into non-secure memory from platform storage.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100127
James Morrisseyba3155b2013-10-29 10:56:46 +0000128* **#define : PLATFORM_CACHE_LINE_SIZE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100129
130 Defines the size (in bytes) of the largest cache line across all the cache
131 levels in the platform.
132
James Morrisseyba3155b2013-10-29 10:56:46 +0000133* **#define : PLATFORM_CLUSTER_COUNT**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100134
135 Defines the total number of clusters implemented by the platform in the
136 system.
137
James Morrisseyba3155b2013-10-29 10:56:46 +0000138* **#define : PLATFORM_CORE_COUNT**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100139
140 Defines the total number of CPUs implemented by the platform across all
141 clusters in the system.
142
James Morrisseyba3155b2013-10-29 10:56:46 +0000143* **#define : PLATFORM_MAX_CPUS_PER_CLUSTER**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100144
145 Defines the maximum number of CPUs that can be implemented within a cluster
146 on the platform.
147
Andrew Thoelke6c0b45d2014-06-20 00:36:14 +0100148* **#define : PLATFORM_NUM_AFFS**
149
150 Defines the total number of nodes in the affinity heirarchy at all affinity
151 levels used by the platform.
152
James Morrisseyba3155b2013-10-29 10:56:46 +0000153* **#define : PRIMARY_CPU**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100154
155 Defines the `MPIDR` of the primary CPU on the platform. This value is used
156 after a cold boot to distinguish between primary and secondary CPUs.
157
James Morrisseyba3155b2013-10-29 10:56:46 +0000158* **#define : TZROM_BASE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100159
160 Defines the base address of secure ROM on the platform, where the BL1 binary
161 is loaded. This constant is used by the linker scripts to ensure that the
162 BL1 image fits into the available memory.
163
James Morrisseyba3155b2013-10-29 10:56:46 +0000164* **#define : TZROM_SIZE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100165
166 Defines the size of secure ROM on the platform. This constant is used by the
167 linker scripts to ensure that the BL1 image fits into the available memory.
168
James Morrisseyba3155b2013-10-29 10:56:46 +0000169* **#define : TZRAM_BASE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100170
171 Defines the base address of the secure RAM on platform, where the data
172 section of the BL1 binary is loaded. The BL2 and BL3-1 images are also
173 loaded in this secure RAM region. This constant is used by the linker
174 scripts to ensure that the BL1 data section and BL2/BL3-1 binary images fit
175 into the available memory.
176
James Morrisseyba3155b2013-10-29 10:56:46 +0000177* **#define : TZRAM_SIZE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100178
179 Defines the size of the secure RAM on the platform. This constant is used by
180 the linker scripts to ensure that the BL1 data section and BL2/BL3-1 binary
181 images fit into the available memory.
182
Sandrine Bailleux638363e2014-05-21 17:08:26 +0100183* **#define : BL1_RO_BASE**
184
185 Defines the base address in secure ROM where BL1 originally lives. Must be
186 aligned on a page-size boundary.
187
188* **#define : BL1_RO_LIMIT**
189
190 Defines the maximum address in secure ROM that BL1's actual content (i.e.
191 excluding any data section allocated at runtime) can occupy.
192
193* **#define : BL1_RW_BASE**
194
195 Defines the base address in secure RAM where BL1's read-write data will live
196 at runtime. Must be aligned on a page-size boundary.
197
198* **#define : BL1_RW_LIMIT**
199
200 Defines the maximum address in secure RAM that BL1's read-write data can
201 occupy at runtime.
202
James Morrisseyba3155b2013-10-29 10:56:46 +0000203* **#define : BL2_BASE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100204
205 Defines the base address in secure RAM where BL1 loads the BL2 binary image.
Sandrine Bailleuxcd29b0a2013-11-27 10:32:17 +0000206 Must be aligned on a page-size boundary.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100207
Sandrine Bailleux638363e2014-05-21 17:08:26 +0100208* **#define : BL2_LIMIT**
209
210 Defines the maximum address in secure RAM that the BL2 image can occupy.
211
James Morrisseyba3155b2013-10-29 10:56:46 +0000212* **#define : BL31_BASE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100213
214 Defines the base address in secure RAM where BL2 loads the BL3-1 binary
Sandrine Bailleuxcd29b0a2013-11-27 10:32:17 +0000215 image. Must be aligned on a page-size boundary.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100216
Sandrine Bailleux638363e2014-05-21 17:08:26 +0100217* **#define : BL31_LIMIT**
218
219 Defines the maximum address in secure RAM that the BL3-1 image can occupy.
220
Harry Liebeld265bd72014-01-31 19:04:10 +0000221* **#define : NS_IMAGE_OFFSET**
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100222
Harry Liebeld265bd72014-01-31 19:04:10 +0000223 Defines the base address in non-secure DRAM where BL2 loads the BL3-3 binary
224 image. Must be aligned on a page-size boundary.
225
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100226If the BL3-2 image is supported by the platform, the following constants must
227be defined as well:
228
229* **#define : TSP_SEC_MEM_BASE**
230
231 Defines the base address of the secure memory used by the BL3-2 image on the
232 platform.
233
234* **#define : TSP_SEC_MEM_SIZE**
235
236 Defines the size of the secure memory used by the BL3-2 image on the
237 platform.
238
239* **#define : BL32_BASE**
240
241 Defines the base address in secure memory where BL2 loads the BL3-2 binary
242 image. Must be inside the secure memory identified by `TSP_SEC_MEM_BASE` and
243 `TSP_SEC_MEM_SIZE` constants. Must also be aligned on a page-size boundary.
244
245* **#define : BL32_LIMIT**
246
247 Defines the maximum address that the BL3-2 image can occupy. Must be inside
248 the secure memory identified by `TSP_SEC_MEM_BASE` and `TSP_SEC_MEM_SIZE`
249 constants.
250
Sandrine Bailleux46d49f632014-06-23 17:00:23 +0100251The following constants are optional. They should be defined when the platform
252memory layout implies some image overlaying like on FVP.
253
254* **#define : BL31_PROGBITS_LIMIT**
255
256 Defines the maximum address in secure RAM that the BL3-1's progbits sections
257 can occupy.
258
259* **#define : BL32_PROGBITS_LIMIT**
260
261 Defines the maximum address that the TSP's progbits sections can occupy.
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100262
Dan Handleyb68954c2014-05-29 12:30:24 +0100263### File : plat_macros.S [mandatory]
Soby Mathewa43d4312014-04-07 15:28:55 +0100264
Dan Handleyb68954c2014-05-29 12:30:24 +0100265Each platform must ensure a file of this name is in the system include path with
266the following macro defined. In the ARM FVP port, this file is found in
267[plat/fvp/include/plat_macros.S].
Soby Mathewa43d4312014-04-07 15:28:55 +0100268
269* **Macro : plat_print_gic_regs**
270
271 This macro allows the crash reporting routine to print GIC registers
Soby Mathew8c106902014-07-16 09:23:52 +0100272 in case of an unhandled exception in BL3-1. This aids in debugging and
Soby Mathewa43d4312014-04-07 15:28:55 +0100273 this macro can be defined to be empty in case GIC register reporting is
274 not desired.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100275
Soby Mathew8c106902014-07-16 09:23:52 +0100276* **Macro : plat_print_interconnect_regs**
277
278 This macro allows the crash reporting routine to print interconnect registers
279 in case of an unhandled exception in BL3-1. This aids in debugging and
280 this macro can be defined to be empty in case interconnect register reporting
281 is not desired. In the ARM FVP port, the CCI snoop control registers are
282 reported.
283
Achin Gupta4f6ad662013-10-25 09:08:21 +0100284### Other mandatory modifications
285
James Morrisseyba3155b2013-10-29 10:56:46 +0000286The following mandatory modifications may be implemented in any file
Achin Gupta4f6ad662013-10-25 09:08:21 +0100287the implementer chooses. In the ARM FVP port, they are implemented in
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000288[plat/fvp/aarch64/plat_common.c].
Achin Gupta4f6ad662013-10-25 09:08:21 +0100289
Sandrine Bailleux9e864902014-03-31 11:25:18 +0100290* **Function : uint64_t plat_get_syscnt_freq(void)**
291
292 This function is used by the architecture setup code to retrieve the
293 counter frequency for the CPU's generic timer. This value will be
294 programmed into the `CNTFRQ_EL0` register.
295 In the ARM FVP port, it returns the base frequency of the system counter,
296 which is retrieved from the first entry in the frequency modes table.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100297
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000298
Vikram Kanigirie452cd82014-05-23 15:56:12 +01002992.2 Handling Reset
300------------------
301
302BL1 by default implements the reset vector where execution starts from a cold
303or warm boot. BL3-1 can be optionally set as a reset vector using the
304RESET_TO_BL31 make variable.
305
306For each CPU, the reset vector code is responsible for the following tasks:
307
3081. Distinguishing between a cold boot and a warm boot.
309
3102. In the case of a cold boot and the CPU being a secondary CPU, ensuring that
311 the CPU is placed in a platform-specific state until the primary CPU
312 performs the necessary steps to remove it from this state.
313
3143. In the case of a warm boot, ensuring that the CPU jumps to a platform-
315 specific address in the BL3-1 image in the same processor mode as it was
316 when released from reset.
317
318The following functions need to be implemented by the platform port to enable
319reset vector code to perform the above tasks.
320
321
322### Function : platform_get_entrypoint() [mandatory]
323
324 Argument : unsigned long
325 Return : unsigned int
326
327This function is called with the `SCTLR.M` and `SCTLR.C` bits disabled. The CPU
328is identified by its `MPIDR`, which is passed as the argument. The function is
329responsible for distinguishing between a warm and cold reset using platform-
330specific means. If it's a warm reset then it returns the entrypoint into the
331BL3-1 image that the CPU must jump to. If it's a cold reset then this function
332must return zero.
333
334This function is also responsible for implementing a platform-specific mechanism
335to handle the condition where the CPU has been warm reset but there is no
336entrypoint to jump to.
337
338This function does not follow the Procedure Call Standard used by the
339Application Binary Interface for the ARM 64-bit architecture. The caller should
340not assume that callee saved registers are preserved across a call to this
341function.
342
343This function fulfills requirement 1 and 3 listed above.
344
345
346### Function : plat_secondary_cold_boot_setup() [mandatory]
347
348 Argument : void
349 Return : void
350
351This function is called with the MMU and data caches disabled. It is responsible
352for placing the executing secondary CPU in a platform-specific state until the
353primary CPU performs the necessary actions to bring it out of that state and
354allow entry into the OS.
355
356In the ARM FVP port, each secondary CPU powers itself off. The primary CPU is
357responsible for powering up the secondary CPU when normal world software
358requires them.
359
360This function fulfills requirement 2 above.
361
362
363### Function : platform_mem_init() [mandatory]
364
365 Argument : void
366 Return : void
367
368This function is called before any access to data is made by the firmware, in
369order to carry out any essential memory initialization.
370
371The ARM FVP port uses this function to initialize the mailbox memory used for
372providing the warm-boot entry-point addresses.
373
374
375
3762.3 Common optional modifications
Achin Gupta4f6ad662013-10-25 09:08:21 +0100377---------------------------------
378
379The following are helper functions implemented by the firmware that perform
380common platform-specific tasks. A platform may choose to override these
381definitions.
382
383
384### Function : platform_get_core_pos()
385
386 Argument : unsigned long
387 Return : int
388
389A platform may need to convert the `MPIDR` of a CPU to an absolute number, which
390can be used as a CPU-specific linear index into blocks of memory (for example
391while allocating per-CPU stacks). This routine contains a simple mechanism
392to perform this conversion, using the assumption that each cluster contains a
393maximum of 4 CPUs:
394
395 linear index = cpu_id + (cluster_id * 4)
396
397 cpu_id = 8-bit value in MPIDR at affinity level 0
398 cluster_id = 8-bit value in MPIDR at affinity level 1
399
400
Achin Gupta4f6ad662013-10-25 09:08:21 +0100401### Function : platform_is_primary_cpu()
402
403 Argument : unsigned long
404 Return : unsigned int
405
406This function identifies a CPU by its `MPIDR`, which is passed as the argument,
407to determine whether this CPU is the primary CPU or a secondary CPU. A return
408value of zero indicates that the CPU is not the primary CPU, while a non-zero
409return value indicates that the CPU is the primary CPU.
410
411
412### Function : platform_set_stack()
413
414 Argument : unsigned long
415 Return : void
416
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000417This function sets the current stack pointer to the normal memory stack that
418has been allocated for the CPU specificed by MPIDR. For BL images that only
419require a stack for the primary CPU the parameter is ignored. The size of
420the stack allocated to each CPU is specified by the platform defined constant
421`PLATFORM_STACK_SIZE`.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100422
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000423Common implementations of this function for the UP and MP BL images are
424provided in [plat/common/aarch64/platform_up_stack.S] and
425[plat/common/aarch64/platform_mp_stack.S]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100426
427
Achin Guptac8afc782013-11-25 18:45:02 +0000428### Function : platform_get_stack()
429
430 Argument : unsigned long
431 Return : unsigned long
432
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000433This function returns the base address of the normal memory stack that
434has been allocated for the CPU specificed by MPIDR. For BL images that only
435require a stack for the primary CPU the parameter is ignored. The size of
436the stack allocated to each CPU is specified by the platform defined constant
437`PLATFORM_STACK_SIZE`.
Achin Guptac8afc782013-11-25 18:45:02 +0000438
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000439Common implementations of this function for the UP and MP BL images are
440provided in [plat/common/aarch64/platform_up_stack.S] and
441[plat/common/aarch64/platform_mp_stack.S]
Achin Guptac8afc782013-11-25 18:45:02 +0000442
443
Achin Gupta4f6ad662013-10-25 09:08:21 +0100444### Function : plat_report_exception()
445
446 Argument : unsigned int
447 Return : void
448
449A platform may need to report various information about its status when an
450exception is taken, for example the current exception level, the CPU security
451state (secure/non-secure), the exception type, and so on. This function is
452called in the following circumstances:
453
454* In BL1, whenever an exception is taken.
455* In BL2, whenever an exception is taken.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100456
457The default implementation doesn't do anything, to avoid making assumptions
458about the way the platform displays its status information.
459
460This function receives the exception type as its argument. Possible values for
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000461exceptions types are listed in the [include/runtime_svc.h] header file. Note
Achin Gupta4f6ad662013-10-25 09:08:21 +0100462that these constants are not related to any architectural exception code; they
463are just an ARM Trusted Firmware convention.
464
465
4663. Modifications specific to a Boot Loader stage
467-------------------------------------------------
468
4693.1 Boot Loader Stage 1 (BL1)
470-----------------------------
471
472BL1 implements the reset vector where execution starts from after a cold or
473warm boot. For each CPU, BL1 is responsible for the following tasks:
474
Vikram Kanigirie452cd82014-05-23 15:56:12 +01004751. Handling the reset as described in section 2.2
Achin Gupta4f6ad662013-10-25 09:08:21 +0100476
4772. In the case of a cold boot and the CPU being the primary CPU, ensuring that
478 only this CPU executes the remaining BL1 code, including loading and passing
479 control to the BL2 stage.
480
Vikram Kanigirie452cd82014-05-23 15:56:12 +01004813. Loading the BL2 image from non-volatile storage into secure memory at the
Achin Gupta4f6ad662013-10-25 09:08:21 +0100482 address specified by the platform defined constant `BL2_BASE`.
483
Vikram Kanigirie452cd82014-05-23 15:56:12 +01004844. Populating a `meminfo` structure with the following information in memory,
Achin Gupta4f6ad662013-10-25 09:08:21 +0100485 accessible by BL2 immediately upon entry.
486
487 meminfo.total_base = Base address of secure RAM visible to BL2
488 meminfo.total_size = Size of secure RAM visible to BL2
489 meminfo.free_base = Base address of secure RAM available for
490 allocation to BL2
491 meminfo.free_size = Size of secure RAM available for allocation to BL2
492
493 BL1 places this `meminfo` structure at the beginning of the free memory
494 available for its use. Since BL1 cannot allocate memory dynamically at the
495 moment, its free memory will be available for BL2's use as-is. However, this
496 means that BL2 must read the `meminfo` structure before it starts using its
497 free memory (this is discussed in Section 3.2).
498
499 In future releases of the ARM Trusted Firmware it will be possible for
500 the platform to decide where it wants to place the `meminfo` structure for
501 BL2.
502
Sandrine Bailleux8f55dfb2014-06-24 14:02:34 +0100503 BL1 implements the `bl1_init_bl2_mem_layout()` function to populate the
Achin Gupta4f6ad662013-10-25 09:08:21 +0100504 BL2 `meminfo` structure. The platform may override this implementation, for
505 example if the platform wants to restrict the amount of memory visible to
506 BL2. Details of how to do this are given below.
507
508The following functions need to be implemented by the platform port to enable
509BL1 to perform the above tasks.
510
511
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100512### Function : bl1_plat_arch_setup() [mandatory]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100513
514 Argument : void
515 Return : void
516
Achin Gupta4f6ad662013-10-25 09:08:21 +0100517This function performs any platform-specific and architectural setup that the
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100518platform requires. Platform-specific setup might include configuration of
519memory controllers, configuration of the interconnect to allow the cluster
520to service cache snoop requests from another cluster, and so on.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100521
522In the ARM FVP port, this function enables CCI snoops into the cluster that the
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100523primary CPU is part of. It also enables the MMU.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100524
525This function helps fulfill requirement 2 above.
526
527
528### Function : bl1_platform_setup() [mandatory]
529
530 Argument : void
531 Return : void
532
533This function executes with the MMU and data caches enabled. It is responsible
534for performing any remaining platform-specific setup that can occur after the
535MMU and data cache have been enabled.
536
Harry Liebeld265bd72014-01-31 19:04:10 +0000537This function is also responsible for initializing the storage abstraction layer
538which is used to load further bootloader images.
539
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100540This function helps fulfill requirement 3 above.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100541
542
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000543### Function : bl1_plat_sec_mem_layout() [mandatory]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100544
545 Argument : void
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000546 Return : meminfo *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100547
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000548This function should only be called on the cold boot path. It executes with the
549MMU and data caches enabled. The pointer returned by this function must point to
550a `meminfo` structure containing the extents and availability of secure RAM for
551the BL1 stage.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100552
553 meminfo.total_base = Base address of secure RAM visible to BL1
554 meminfo.total_size = Size of secure RAM visible to BL1
555 meminfo.free_base = Base address of secure RAM available for allocation
556 to BL1
557 meminfo.free_size = Size of secure RAM available for allocation to BL1
558
559This information is used by BL1 to load the BL2 image in secure RAM. BL1 also
560populates a similar structure to tell BL2 the extents of memory available for
561its own use.
562
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100563This function helps fulfill requirement 3 above.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100564
565
Sandrine Bailleux8f55dfb2014-06-24 14:02:34 +0100566### Function : bl1_init_bl2_mem_layout() [optional]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100567
568 Argument : meminfo *, meminfo *, unsigned int, unsigned long
569 Return : void
570
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100571BL1 needs to tell the next stage the amount of secure RAM available
572for it to use. This information is populated in a `meminfo`
Achin Gupta4f6ad662013-10-25 09:08:21 +0100573structure.
574
575Depending upon where BL2 has been loaded in secure RAM (determined by
576`BL2_BASE`), BL1 calculates the amount of free memory available for BL2 to use.
577BL1 also ensures that its data sections resident in secure RAM are not visible
578to BL2. An illustration of how this is done in the ARM FVP port is given in the
579[User Guide], in the Section "Memory layout on Base FVP".
580
581
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100582### Function : bl1_plat_set_bl2_ep_info() [mandatory]
583
584 Argument : image_info *, entry_point_info *
585 Return : void
586
587This function is called after loading BL2 image and it can be used to overwrite
588the entry point set by loader and also set the security state and SPSR which
589represents the entry point system state for BL2.
590
591On FVP, we are setting the security state and the SPSR for the BL2 entrypoint
592
593
Achin Gupta4f6ad662013-10-25 09:08:21 +01005943.2 Boot Loader Stage 2 (BL2)
595-----------------------------
596
597The BL2 stage is executed only by the primary CPU, which is determined in BL1
598using the `platform_is_primary_cpu()` function. BL1 passed control to BL2 at
599`BL2_BASE`. BL2 executes in Secure EL1 and is responsible for:
600
Sandrine Bailleux93d81d62014-06-24 14:19:36 +01006011. (Optional) Loading the BL3-0 binary image (if present) from platform
602 provided non-volatile storage. To load the BL3-0 image, BL2 makes use of
603 the `meminfo` returned by the `bl2_plat_get_bl30_meminfo()` function.
604 The platform also defines the address in memory where BL3-0 is loaded
605 through the optional constant `BL30_BASE`. BL2 uses this information
606 to determine if there is enough memory to load the BL3-0 image.
607 Subsequent handling of the BL3-0 image is platform-specific and is
608 implemented in the `bl2_plat_handle_bl30()` function.
609 If `BL30_BASE` is not defined then this step is not performed.
610
6112. Loading the BL3-1 binary image into secure RAM from non-volatile storage. To
Harry Liebeld265bd72014-01-31 19:04:10 +0000612 load the BL3-1 image, BL2 makes use of the `meminfo` structure passed to it
613 by BL1. This structure allows BL2 to calculate how much secure RAM is
614 available for its use. The platform also defines the address in secure RAM
615 where BL3-1 is loaded through the constant `BL31_BASE`. BL2 uses this
616 information to determine if there is enough memory to load the BL3-1 image.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100617
Sandrine Bailleux93d81d62014-06-24 14:19:36 +01006183. (Optional) Loading the BL3-2 binary image (if present) from platform
Dan Handley1151c822014-04-15 11:38:38 +0100619 provided non-volatile storage. To load the BL3-2 image, BL2 makes use of
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100620 the `meminfo` returned by the `bl2_plat_get_bl32_meminfo()` function.
621 The platform also defines the address in memory where BL3-2 is loaded
622 through the optional constant `BL32_BASE`. BL2 uses this information
623 to determine if there is enough memory to load the BL3-2 image.
624 If `BL32_BASE` is not defined then this and the next step is not performed.
Achin Guptaa3050ed2014-02-19 17:52:35 +0000625
Sandrine Bailleux93d81d62014-06-24 14:19:36 +01006264. (Optional) Arranging to pass control to the BL3-2 image (if present) that
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100627 has been pre-loaded at `BL32_BASE`. BL2 populates an `entry_point_info`
Dan Handley1151c822014-04-15 11:38:38 +0100628 structure in memory provided by the platform with information about how
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100629 BL3-1 should pass control to the BL3-2 image.
Achin Guptaa3050ed2014-02-19 17:52:35 +0000630
Sandrine Bailleux93d81d62014-06-24 14:19:36 +01006315. Loading the normal world BL3-3 binary image into non-secure DRAM from
632 platform storage and arranging for BL3-1 to pass control to this image. This
633 address is determined using the `plat_get_ns_image_entrypoint()` function
634 described below.
635
6366. BL2 populates an `entry_point_info` structure in memory provided by the
637 platform with information about how BL3-1 should pass control to the
638 other BL images.
639
Achin Gupta4f6ad662013-10-25 09:08:21 +0100640The following functions must be implemented by the platform port to enable BL2
641to perform the above tasks.
642
643
644### Function : bl2_early_platform_setup() [mandatory]
645
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100646 Argument : meminfo *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100647 Return : void
648
649This function executes with the MMU and data caches disabled. It is only called
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100650by the primary CPU. The arguments to this function is the address of the
651`meminfo` structure populated by BL1.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100652
653The platform must copy the contents of the `meminfo` structure into a private
654variable as the original memory may be subsequently overwritten by BL2. The
655copied structure is made available to all BL2 code through the
Achin Guptae4d084e2014-02-19 17:18:23 +0000656`bl2_plat_sec_mem_layout()` function.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100657
658
659### Function : bl2_plat_arch_setup() [mandatory]
660
661 Argument : void
662 Return : void
663
664This function executes with the MMU and data caches disabled. It is only called
665by the primary CPU.
666
667The purpose of this function is to perform any architectural initialization
668that varies across platforms, for example enabling the MMU (since the memory
669map differs across platforms).
670
671
672### Function : bl2_platform_setup() [mandatory]
673
674 Argument : void
675 Return : void
676
677This function may execute with the MMU and data caches enabled if the platform
678port does the necessary initialization in `bl2_plat_arch_setup()`. It is only
679called by the primary CPU.
680
Achin Guptae4d084e2014-02-19 17:18:23 +0000681The purpose of this function is to perform any platform initialization
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100682specific to BL2. Platform security components are configured if required.
683For the Base FVP the TZC-400 TrustZone controller is configured to only
684grant non-secure access to DRAM. This avoids aliasing between secure and
685non-secure accesses in the TLB and cache - secure execution states can use
686the NS attributes in the MMU translation tables to access the DRAM.
Harry Liebelce19cf12014-04-01 19:28:07 +0100687
Harry Liebeld265bd72014-01-31 19:04:10 +0000688This function is also responsible for initializing the storage abstraction layer
689which is used to load further bootloader images.
690
Achin Gupta4f6ad662013-10-25 09:08:21 +0100691
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000692### Function : bl2_plat_sec_mem_layout() [mandatory]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100693
694 Argument : void
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000695 Return : meminfo *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100696
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000697This function should only be called on the cold boot path. It may execute with
698the MMU and data caches enabled if the platform port does the necessary
699initialization in `bl2_plat_arch_setup()`. It is only called by the primary CPU.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100700
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000701The purpose of this function is to return a pointer to a `meminfo` structure
702populated with the extents of secure RAM available for BL2 to use. See
Achin Gupta4f6ad662013-10-25 09:08:21 +0100703`bl2_early_platform_setup()` above.
704
705
Sandrine Bailleux93d81d62014-06-24 14:19:36 +0100706### Function : bl2_plat_get_bl30_meminfo() [mandatory]
707
708 Argument : meminfo *
709 Return : void
710
711This function is used to get the memory limits where BL2 can load the
712BL3-0 image. The meminfo provided by this is used by load_image() to
713validate whether the BL3-0 image can be loaded within the given
714memory from the given base.
715
716
717### Function : bl2_plat_handle_bl30() [mandatory]
718
719 Argument : image_info *
720 Return : int
721
722This function is called after loading BL3-0 image and it is used to perform any
723platform-specific actions required to handle the SCP firmware. Typically it
724transfers the image into SCP memory using a platform-specific protocol and waits
725until SCP executes it and signals to the Application Processor (AP) for BL2
726execution to continue.
727
728This function returns 0 on success, a negative error code otherwise.
729
730
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100731### Function : bl2_plat_get_bl31_params() [mandatory]
Harry Liebeld265bd72014-01-31 19:04:10 +0000732
733 Argument : void
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100734 Return : bl31_params *
Harry Liebeld265bd72014-01-31 19:04:10 +0000735
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100736BL2 platform code needs to return a pointer to a `bl31_params` structure it
737will use for passing information to BL3-1. The `bl31_params` structure carries
738the following information.
739 - Header describing the version information for interpreting the bl31_param
740 structure
741 - Information about executing the BL3-3 image in the `bl33_ep_info` field
742 - Information about executing the BL3-2 image in the `bl32_ep_info` field
743 - Information about the type and extents of BL3-1 image in the
744 `bl31_image_info` field
745 - Information about the type and extents of BL3-2 image in the
746 `bl32_image_info` field
747 - Information about the type and extents of BL3-3 image in the
748 `bl33_image_info` field
749
750The memory pointed by this structure and its sub-structures should be
751accessible from BL3-1 initialisation code. BL3-1 might choose to copy the
752necessary content, or maintain the structures until BL3-3 is initialised.
Harry Liebeld265bd72014-01-31 19:04:10 +0000753
754
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100755### Funtion : bl2_plat_get_bl31_ep_info() [mandatory]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100756
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100757 Argument : void
758 Return : entry_point_info *
759
760BL2 platform code returns a pointer which is used to populate the entry point
761information for BL3-1 entry point. The location pointed by it should be
762accessible from BL1 while processing the synchronous exception to run to BL3-1.
763
764On FVP this is allocated inside an bl2_to_bl31_params_mem structure which
765is allocated at an address pointed by PARAMS_BASE.
766
767
768### Function : bl2_plat_set_bl31_ep_info() [mandatory]
769
770 Argument : image_info *, entry_point_info *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100771 Return : void
772
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100773This function is called after loading BL3-1 image and it can be used to
774overwrite the entry point set by loader and also set the security state
775and SPSR which represents the entry point system state for BL3-1.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100776
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100777On FVP, we are setting the security state and the SPSR for the BL3-1
778entrypoint.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100779
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100780### Function : bl2_plat_set_bl32_ep_info() [mandatory]
781
782 Argument : image_info *, entry_point_info *
783 Return : void
784
785This function is called after loading BL3-2 image and it can be used to
786overwrite the entry point set by loader and also set the security state
787and SPSR which represents the entry point system state for BL3-2.
788
789On FVP, we are setting the security state and the SPSR for the BL3-2
790entrypoint
791
792### Function : bl2_plat_set_bl33_ep_info() [mandatory]
793
794 Argument : image_info *, entry_point_info *
795 Return : void
796
797This function is called after loading BL3-3 image and it can be used to
798overwrite the entry point set by loader and also set the security state
799and SPSR which represents the entry point system state for BL3-3.
800
801On FVP, we are setting the security state and the SPSR for the BL3-3
802entrypoint
803
804### Function : bl2_plat_get_bl32_meminfo() [mandatory]
805
806 Argument : meminfo *
807 Return : void
808
809This function is used to get the memory limits where BL2 can load the
810BL3-2 image. The meminfo provided by this is used by load_image() to
811validate whether the BL3-2 image can be loaded with in the given
812memory from the given base.
813
814### Function : bl2_plat_get_bl33_meminfo() [mandatory]
815
816 Argument : meminfo *
817 Return : void
818
819This function is used to get the memory limits where BL2 can load the
820BL3-3 image. The meminfo provided by this is used by load_image() to
821validate whether the BL3-3 image can be loaded with in the given
822memory from the given base.
823
824### Function : bl2_plat_flush_bl31_params() [mandatory]
825
826 Argument : void
827 Return : void
828
829Once BL2 has populated all the structures that needs to be read by BL1
830and BL3-1 including the bl31_params structures and its sub-structures,
831the bl31_ep_info structure and any platform specific data. It flushes
832all these data to the main memory so that it is available when we jump to
833later Bootloader stages with MMU off
Achin Gupta4f6ad662013-10-25 09:08:21 +0100834
835### Function : plat_get_ns_image_entrypoint() [mandatory]
836
837 Argument : void
838 Return : unsigned long
839
840As previously described, BL2 is responsible for arranging for control to be
841passed to a normal world BL image through BL3-1. This function returns the
842entrypoint of that image, which BL3-1 uses to jump to it.
843
Harry Liebeld265bd72014-01-31 19:04:10 +0000844BL2 is responsible for loading the normal world BL3-3 image (e.g. UEFI).
Achin Gupta4f6ad662013-10-25 09:08:21 +0100845
846
8473.2 Boot Loader Stage 3-1 (BL3-1)
848---------------------------------
849
850During cold boot, the BL3-1 stage is executed only by the primary CPU. This is
851determined in BL1 using the `platform_is_primary_cpu()` function. BL1 passes
852control to BL3-1 at `BL31_BASE`. During warm boot, BL3-1 is executed by all
853CPUs. BL3-1 executes at EL3 and is responsible for:
854
8551. Re-initializing all architectural and platform state. Although BL1 performs
856 some of this initialization, BL3-1 remains resident in EL3 and must ensure
857 that EL3 architectural and platform state is completely initialized. It
858 should make no assumptions about the system state when it receives control.
859
8602. Passing control to a normal world BL image, pre-loaded at a platform-
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100861 specific address by BL2. BL3-1 uses the `entry_point_info` structure that BL2
Achin Gupta4f6ad662013-10-25 09:08:21 +0100862 populated in memory to do this.
863
8643. Providing runtime firmware services. Currently, BL3-1 only implements a
865 subset of the Power State Coordination Interface (PSCI) API as a runtime
866 service. See Section 3.3 below for details of porting the PSCI
867 implementation.
868
Achin Gupta35ca3512014-02-19 17:58:33 +00008694. Optionally passing control to the BL3-2 image, pre-loaded at a platform-
870 specific address by BL2. BL3-1 exports a set of apis that allow runtime
871 services to specify the security state in which the next image should be
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100872 executed and run the corresponding image. BL3-1 uses the `entry_point_info`
873 structure populated by BL2 to do this.
874
875If BL3-1 is a reset vector, It also needs to handle the reset as specified in
876section 2.2 before the tasks described above.
Achin Gupta35ca3512014-02-19 17:58:33 +0000877
Achin Gupta4f6ad662013-10-25 09:08:21 +0100878The following functions must be implemented by the platform port to enable BL3-1
879to perform the above tasks.
880
881
882### Function : bl31_early_platform_setup() [mandatory]
883
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100884 Argument : bl31_params *, void *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100885 Return : void
886
887This function executes with the MMU and data caches disabled. It is only called
888by the primary CPU. The arguments to this function are:
889
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100890* The address of the `bl31_params` structure populated by BL2.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100891* An opaque pointer that the platform may use as needed.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100892
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100893The platform can copy the contents of the `bl31_params` structure and its
894sub-structures into private variables if the original memory may be
895subsequently overwritten by BL3-1 and similarly the `void *` pointing
896to the platform data also needs to be saved.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100897
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100898On the ARM FVP port, BL2 passes a pointer to a `bl31_params` structure populated
899in the secure DRAM at address `0x6000000` in the bl31_params * argument and it
900does not use opaque pointer mentioned earlier. BL3-1 does not copy this
901information to internal data structures as it guarantees that the secure
902DRAM memory will not be overwritten. It maintains an internal reference to this
903information in the `bl2_to_bl31_params` variable.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100904
905### Function : bl31_plat_arch_setup() [mandatory]
906
907 Argument : void
908 Return : void
909
910This function executes with the MMU and data caches disabled. It is only called
911by the primary CPU.
912
913The purpose of this function is to perform any architectural initialization
914that varies across platforms, for example enabling the MMU (since the memory
915map differs across platforms).
916
917
918### Function : bl31_platform_setup() [mandatory]
919
920 Argument : void
921 Return : void
922
923This function may execute with the MMU and data caches enabled if the platform
924port does the necessary initialization in `bl31_plat_arch_setup()`. It is only
925called by the primary CPU.
926
927The purpose of this function is to complete platform initialization so that both
928BL3-1 runtime services and normal world software can function correctly.
929
930The ARM FVP port does the following:
931* Initializes the generic interrupt controller.
932* Configures the CLCD controller.
Sandrine Bailleux9e864902014-03-31 11:25:18 +0100933* Enables system-level implementation of the generic timer counter.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100934* Grants access to the system counter timer module
935* Initializes the FVP power controller device
936* Detects the system topology.
937
938
939### Function : bl31_get_next_image_info() [mandatory]
940
Achin Gupta35ca3512014-02-19 17:58:33 +0000941 Argument : unsigned int
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100942 Return : entry_point_info *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100943
944This function may execute with the MMU and data caches enabled if the platform
945port does the necessary initializations in `bl31_plat_arch_setup()`.
946
947This function is called by `bl31_main()` to retrieve information provided by
Achin Gupta35ca3512014-02-19 17:58:33 +0000948BL2 for the next image in the security state specified by the argument. BL3-1
949uses this information to pass control to that image in the specified security
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100950state. This function must return a pointer to the `entry_point_info` structure
Achin Gupta35ca3512014-02-19 17:58:33 +0000951(that was copied during `bl31_early_platform_setup()`) if the image exists. It
952should return NULL otherwise.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100953
954
Achin Gupta4f6ad662013-10-25 09:08:21 +01009553.3 Power State Coordination Interface (in BL3-1)
956------------------------------------------------
957
958The ARM Trusted Firmware's implementation of the PSCI API is based around the
959concept of an _affinity instance_. Each _affinity instance_ can be uniquely
960identified in a system by a CPU ID (the processor `MPIDR` is used in the PSCI
961interface) and an _affinity level_. A processing element (for example, a
962CPU) is at level 0. If the CPUs in the system are described in a tree where the
963node above a CPU is a logical grouping of CPUs that share some state, then
964affinity level 1 is that group of CPUs (for example, a cluster), and affinity
965level 2 is a group of clusters (for example, the system). The implementation
966assumes that the affinity level 1 ID can be computed from the affinity level 0
967ID (for example, a unique cluster ID can be computed from the CPU ID). The
968current implementation computes this on the basis of the recommended use of
969`MPIDR` affinity fields in the ARM Architecture Reference Manual.
970
971BL3-1's platform initialization code exports a pointer to the platform-specific
972power management operations required for the PSCI implementation to function
973correctly. This information is populated in the `plat_pm_ops` structure. The
974PSCI implementation calls members of the `plat_pm_ops` structure for performing
975power management operations for each affinity instance. For example, the target
976CPU is specified by its `MPIDR` in a PSCI `CPU_ON` call. The `affinst_on()`
977handler (if present) is called for each affinity instance as the PSCI
978implementation powers up each affinity level implemented in the `MPIDR` (for
979example, CPU, cluster and system).
980
981The following functions must be implemented to initialize PSCI functionality in
982the ARM Trusted Firmware.
983
984
985### Function : plat_get_aff_count() [mandatory]
986
987 Argument : unsigned int, unsigned long
988 Return : unsigned int
989
990This function may execute with the MMU and data caches enabled if the platform
991port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
992called by the primary CPU.
993
994This function is called by the PSCI initialization code to detect the system
995topology. Its purpose is to return the number of affinity instances implemented
996at a given `affinity level` (specified by the first argument) and a given
997`MPIDR` (specified by the second argument). For example, on a dual-cluster
998system where first cluster implements 2 CPUs and the second cluster implements 4
999CPUs, a call to this function with an `MPIDR` corresponding to the first cluster
1000(`0x0`) and affinity level 0, would return 2. A call to this function with an
1001`MPIDR` corresponding to the second cluster (`0x100`) and affinity level 0,
1002would return 4.
1003
1004
1005### Function : plat_get_aff_state() [mandatory]
1006
1007 Argument : unsigned int, unsigned long
1008 Return : unsigned int
1009
1010This function may execute with the MMU and data caches enabled if the platform
1011port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
1012called by the primary CPU.
1013
1014This function is called by the PSCI initialization code. Its purpose is to
1015return the state of an affinity instance. The affinity instance is determined by
1016the affinity ID at a given `affinity level` (specified by the first argument)
1017and an `MPIDR` (specified by the second argument). The state can be one of
1018`PSCI_AFF_PRESENT` or `PSCI_AFF_ABSENT`. The latter state is used to cater for
1019system topologies where certain affinity instances are unimplemented. For
1020example, consider a platform that implements a single cluster with 4 CPUs and
1021another CPU implemented directly on the interconnect with the cluster. The
1022`MPIDR`s of the cluster would range from `0x0-0x3`. The `MPIDR` of the single
1023CPU would be 0x100 to indicate that it does not belong to cluster 0. Cluster 1
1024is missing but needs to be accounted for to reach this single CPU in the
1025topology tree. Hence it is marked as `PSCI_AFF_ABSENT`.
1026
1027
1028### Function : plat_get_max_afflvl() [mandatory]
1029
1030 Argument : void
1031 Return : int
1032
1033This function may execute with the MMU and data caches enabled if the platform
1034port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
1035called by the primary CPU.
1036
1037This function is called by the PSCI implementation both during cold and warm
1038boot, to determine the maximum affinity level that the power management
James Morrisseyba3155b2013-10-29 10:56:46 +00001039operations should apply to. ARMv8-A has support for 4 affinity levels. It is
Achin Gupta4f6ad662013-10-25 09:08:21 +01001040likely that hardware will implement fewer affinity levels. This function allows
1041the PSCI implementation to consider only those affinity levels in the system
1042that the platform implements. For example, the Base AEM FVP implements two
1043clusters with a configurable number of CPUs. It reports the maximum affinity
1044level as 1, resulting in PSCI power control up to the cluster level.
1045
1046
1047### Function : platform_setup_pm() [mandatory]
1048
1049 Argument : plat_pm_ops **
1050 Return : int
1051
1052This function may execute with the MMU and data caches enabled if the platform
1053port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
1054called by the primary CPU.
1055
1056This function is called by PSCI initialization code. Its purpose is to export
1057handler routines for platform-specific power management actions by populating
1058the passed pointer with a pointer to BL3-1's private `plat_pm_ops` structure.
1059
1060A description of each member of this structure is given below. Please refer to
Andrew Thoelke2bf28e62014-03-20 10:48:23 +00001061the ARM FVP specific implementation of these handlers in [plat/fvp/plat_pm.c]
Achin Gupta4f6ad662013-10-25 09:08:21 +01001062as an example. A platform port may choose not implement some of the power
1063management operations. For example, the ARM FVP port does not implement the
1064`affinst_standby()` function.
1065
1066#### plat_pm_ops.affinst_standby()
1067
1068Perform the platform-specific setup to enter the standby state indicated by the
1069passed argument.
1070
1071#### plat_pm_ops.affinst_on()
1072
1073Perform the platform specific setup to power on an affinity instance, specified
1074by the `MPIDR` (first argument) and `affinity level` (fourth argument). The
1075`state` (fifth argument) contains the current state of that affinity instance
1076(ON or OFF). This is useful to determine whether any action must be taken. For
1077example, while powering on a CPU, the cluster that contains this CPU might
1078already be in the ON state. The platform decides what actions must be taken to
1079transition from the current state to the target state (indicated by the power
1080management operation).
1081
1082#### plat_pm_ops.affinst_off()
1083
1084Perform the platform specific setup to power off an affinity instance in the
1085`MPIDR` of the calling CPU. It is called by the PSCI `CPU_OFF` API
1086implementation.
1087
1088The `MPIDR` (first argument), `affinity level` (second argument) and `state`
1089(third argument) have a similar meaning as described in the `affinst_on()`
1090operation. They are used to identify the affinity instance on which the call
1091is made and its current state. This gives the platform port an indication of the
1092state transition it must make to perform the requested action. For example, if
1093the calling CPU is the last powered on CPU in the cluster, after powering down
1094affinity level 0 (CPU), the platform port should power down affinity level 1
1095(the cluster) as well.
1096
Achin Gupta4f6ad662013-10-25 09:08:21 +01001097#### plat_pm_ops.affinst_suspend()
1098
1099Perform the platform specific setup to power off an affinity instance in the
1100`MPIDR` of the calling CPU. It is called by the PSCI `CPU_SUSPEND` API
1101implementation.
1102
1103The `MPIDR` (first argument), `affinity level` (third argument) and `state`
1104(fifth argument) have a similar meaning as described in the `affinst_on()`
1105operation. They are used to identify the affinity instance on which the call
1106is made and its current state. This gives the platform port an indication of the
1107state transition it must make to perform the requested action. For example, if
1108the calling CPU is the last powered on CPU in the cluster, after powering down
1109affinity level 0 (CPU), the platform port should power down affinity level 1
1110(the cluster) as well.
1111
1112The difference between turning an affinity instance off versus suspending it
1113is that in the former case, the affinity instance is expected to re-initialize
1114its state when its next powered on (see `affinst_on_finish()`). In the latter
1115case, the affinity instance is expected to save enough state so that it can
1116resume execution by restoring this state when its powered on (see
1117`affinst_suspend_finish()`).
1118
Achin Gupta4f6ad662013-10-25 09:08:21 +01001119#### plat_pm_ops.affinst_on_finish()
1120
1121This function is called by the PSCI implementation after the calling CPU is
1122powered on and released from reset in response to an earlier PSCI `CPU_ON` call.
1123It performs the platform-specific setup required to initialize enough state for
1124this CPU to enter the normal world and also provide secure runtime firmware
1125services.
1126
1127The `MPIDR` (first argument), `affinity level` (second argument) and `state`
1128(third argument) have a similar meaning as described in the previous operations.
1129
Achin Gupta4f6ad662013-10-25 09:08:21 +01001130#### plat_pm_ops.affinst_on_suspend()
1131
1132This function is called by the PSCI implementation after the calling CPU is
1133powered on and released from reset in response to an asynchronous wakeup
1134event, for example a timer interrupt that was programmed by the CPU during the
1135`CPU_SUSPEND` call. It performs the platform-specific setup required to
1136restore the saved state for this CPU to resume execution in the normal world
1137and also provide secure runtime firmware services.
1138
1139The `MPIDR` (first argument), `affinity level` (second argument) and `state`
1140(third argument) have a similar meaning as described in the previous operations.
1141
Achin Gupta4f6ad662013-10-25 09:08:21 +01001142BL3-1 platform initialization code must also detect the system topology and
1143the state of each affinity instance in the topology. This information is
1144critical for the PSCI runtime service to function correctly. More details are
1145provided in the description of the `plat_get_aff_count()` and
1146`plat_get_aff_state()` functions above.
1147
Achin Guptaa4fa3cb2014-06-02 22:27:36 +010011483.4 Interrupt Management framework (in BL3-1)
1149----------------------------------------------
1150BL3-1 implements an Interrupt Management Framework (IMF) to manage interrupts
1151generated in either security state and targeted to EL1 or EL2 in the non-secure
1152state or EL3/S-EL1 in the secure state. The design of this framework is
1153described in the [IMF Design Guide]
1154
1155A platform should export the following APIs to support the IMF. The following
1156text briefly describes each api and its implementation on the FVP port. The API
1157implementation depends upon the type of interrupt controller present in the
1158platform. The FVP implements an ARM Generic Interrupt Controller (ARM GIC) as
1159per the version 2.0 of the [ARM GIC Architecture Specification]
1160
1161### Function : plat_interrupt_type_to_line() [mandatory]
1162
1163 Argument : uint32_t, uint32_t
1164 Return : uint32_t
1165
1166The ARM processor signals an interrupt exception either through the IRQ or FIQ
1167interrupt line. The specific line that is signaled depends on how the interrupt
1168controller (IC) reports different interrupt types from an execution context in
1169either security state. The IMF uses this API to determine which interrupt line
1170the platform IC uses to signal each type of interrupt supported by the framework
1171from a given security state.
1172
1173The first parameter will be one of the `INTR_TYPE_*` values (see [IMF Design
1174Guide]) indicating the target type of the interrupt, the second parameter is the
1175security state of the originating execution context. The return result is the
1176bit position in the `SCR_EL3` register of the respective interrupt trap: IRQ=1,
1177FIQ=2.
1178
1179The FVP port configures the ARM GIC to signal S-EL1 interrupts as FIQs and
1180Non-secure interrupts as IRQs from either security state.
1181
1182
1183### Function : plat_ic_get_pending_interrupt_type() [mandatory]
1184
1185 Argument : void
1186 Return : uint32_t
1187
1188This API returns the type of the highest priority pending interrupt at the
1189platform IC. The IMF uses the interrupt type to retrieve the corresponding
1190handler function. `INTR_TYPE_INVAL` is returned when there is no interrupt
1191pending. The valid interrupt types that can be returned are `INTR_TYPE_EL3`,
1192`INTR_TYPE_S_EL1` and `INTR_TYPE_NS`.
1193
1194The FVP port reads the _Highest Priority Pending Interrupt Register_
1195(`GICC_HPPIR`) to determine the id of the pending interrupt. The type of interrupt
1196depends upon the id value as follows.
1197
11981. id < 1022 is reported as a S-EL1 interrupt
11992. id = 1022 is reported as a Non-secure interrupt.
12003. id = 1023 is reported as an invalid interrupt type.
1201
1202
1203### Function : plat_ic_get_pending_interrupt_id() [mandatory]
1204
1205 Argument : void
1206 Return : uint32_t
1207
1208This API returns the id of the highest priority pending interrupt at the
1209platform IC. The IMF passes the id returned by this API to the registered
1210handler for the pending interrupt if the `IMF_READ_INTERRUPT_ID` build time flag
1211is set. INTR_ID_UNAVAILABLE is returned when there is no interrupt pending.
1212
1213The FVP port reads the _Highest Priority Pending Interrupt Register_
1214(`GICC_HPPIR`) to determine the id of the pending interrupt. The id that is
1215returned by API depends upon the value of the id read from the interrupt
1216controller as follows.
1217
12181. id < 1022. id is returned as is.
12192. id = 1022. The _Aliased Highest Priority Pending Interrupt Register_
1220 (`GICC_AHPPIR`) is read to determine the id of the non-secure interrupt. This
1221 id is returned by the API.
12223. id = 1023. `INTR_ID_UNAVAILABLE` is returned.
1223
1224
1225### Function : plat_ic_acknowledge_interrupt() [mandatory]
1226
1227 Argument : void
1228 Return : uint32_t
1229
1230This API is used by the CPU to indicate to the platform IC that processing of
1231the highest pending interrupt has begun. It should return the id of the
1232interrupt which is being processed.
1233
1234The FVP port reads the _Interrupt Acknowledge Register_ (`GICC_IAR`). This
1235changes the state of the highest priority pending interrupt from pending to
1236active in the interrupt controller. It returns the value read from the
1237`GICC_IAR`. This value is the id of the interrupt whose state has been changed.
1238
1239The TSP uses this API to start processing of the secure physical timer
1240interrupt.
1241
1242
1243### Function : plat_ic_end_of_interrupt() [mandatory]
1244
1245 Argument : uint32_t
1246 Return : void
1247
1248This API is used by the CPU to indicate to the platform IC that processing of
1249the interrupt corresponding to the id (passed as the parameter) has
1250finished. The id should be the same as the id returned by the
1251`plat_ic_acknowledge_interrupt()` API.
1252
1253The FVP port writes the id to the _End of Interrupt Register_
1254(`GICC_EOIR`). This deactivates the corresponding interrupt in the interrupt
1255controller.
1256
1257The TSP uses this API to finish processing of the secure physical timer
1258interrupt.
1259
1260
1261### Function : plat_ic_get_interrupt_type() [mandatory]
1262
1263 Argument : uint32_t
1264 Return : uint32_t
1265
1266This API returns the type of the interrupt id passed as the parameter.
1267`INTR_TYPE_INVAL` is returned if the id is invalid. If the id is valid, a valid
1268interrupt type (one of `INTR_TYPE_EL3`, `INTR_TYPE_S_EL1` and `INTR_TYPE_NS`) is
1269returned depending upon how the interrupt has been configured by the platform
1270IC.
1271
1272The FVP port configures S-EL1 interrupts as Group0 interrupts and Non-secure
1273interrupts as Group1 interrupts. It reads the group value corresponding to the
1274interrupt id from the relevant _Interrupt Group Register_ (`GICD_IGROUPRn`). It
1275uses the group value to determine the type of interrupt.
1276
Soby Mathewc67b09b2014-07-14 16:57:23 +010012773.5 Crash Reporting mechanism (in BL3-1)
1278----------------------------------------------
1279BL3-1 implements a crash reporting mechanism which prints the various registers
1280of the CPU to enable quick crash analysis and debugging. It requires that a console
1281is designated as the crash console by the platform which will used to print the
1282register dump.
1283
1284The following functions must be implemented by the platform if it wants crash reporting
1285mechanism in BL3-1. The functions are implemented in assembly so that they can be
1286invoked without a C Runtime stack.
1287
1288### Function : plat_crash_console_init
1289
1290 Argument : void
1291 Return : int
1292
1293This API is used by the crash reporting mechanism to intialize the crash console.
1294It should only use the general purpose registers x0 to x2 to do the initiaization
1295and returns 1 on success.
1296
1297The FVP port designates the PL011_UART0 as the crash console and calls the
1298console_core_init() to initialize the console.
1299
1300### Function : plat_crash_console_putc
1301
1302 Argument : int
1303 Return : int
1304
1305This API is used by the crash reporting mechanism to print a character on the
1306designated crash console. It should only use general purpose registers x1 and
1307x2 to do its work. The parameter and the return value are in general purpose
1308register x0.
1309
1310The FVP port designates the PL011_UART0 as the crash console and calls the
1311console_core_putc() to print the character on the console.
Achin Gupta4f6ad662013-10-25 09:08:21 +01001312
Harry Liebela960f282013-12-12 16:03:44 +000013134. C Library
1314-------------
1315
1316To avoid subtle toolchain behavioral dependencies, the header files provided
1317by the compiler are not used. The software is built with the `-nostdinc` flag
1318to ensure no headers are included from the toolchain inadvertently. Instead the
1319required headers are included in the ARM Trusted Firmware source tree. The
1320library only contains those C library definitions required by the local
1321implementation. If more functionality is required, the needed library functions
1322will need to be added to the local implementation.
1323
1324Versions of [FreeBSD] headers can be found in `include/stdlib`. Some of these
1325headers have been cut down in order to simplify the implementation. In order to
1326minimize changes to the header files, the [FreeBSD] layout has been maintained.
1327The generic C library definitions can be found in `include/stdlib` with more
1328system and machine specific declarations in `include/stdlib/sys` and
1329`include/stdlib/machine`.
1330
1331The local C library implementations can be found in `lib/stdlib`. In order to
1332extend the C library these files may need to be modified. It is recommended to
1333use a release version of [FreeBSD] as a starting point.
1334
1335The C library header files in the [FreeBSD] source tree are located in the
1336`include` and `sys/sys` directories. [FreeBSD] machine specific definitions
1337can be found in the `sys/<machine-type>` directories. These files define things
1338like 'the size of a pointer' and 'the range of an integer'. Since an AArch64
1339port for [FreeBSD] does not yet exist, the machine specific definitions are
1340based on existing machine types with similar properties (for example SPARC64).
1341
1342Where possible, C library function implementations were taken from [FreeBSD]
1343as found in the `lib/libc` directory.
1344
1345A copy of the [FreeBSD] sources can be downloaded with `git`.
1346
1347 git clone git://github.com/freebsd/freebsd.git -b origin/release/9.2.0
1348
1349
Harry Liebeld265bd72014-01-31 19:04:10 +000013505. Storage abstraction layer
1351-----------------------------
1352
1353In order to improve platform independence and portability an storage abstraction
1354layer is used to load data from non-volatile platform storage.
1355
1356Each platform should register devices and their drivers via the Storage layer.
1357These drivers then need to be initialized by bootloader phases as
1358required in their respective `blx_platform_setup()` functions. Currently
1359storage access is only required by BL1 and BL2 phases. The `load_image()`
1360function uses the storage layer to access non-volatile platform storage.
1361
1362It is mandatory to implement at least one storage driver. For the FVP the
1363Firmware Image Package(FIP) driver is provided as the default means to load data
1364from storage (see the "Firmware Image Package" section in the [User Guide]).
1365The storage layer is described in the header file `include/io_storage.h`. The
1366implementation of the common library is in `lib/io_storage.c` and the driver
1367files are located in `drivers/io/`.
1368
1369Each IO driver must provide `io_dev_*` structures, as described in
1370`drivers/io/io_driver.h`. These are returned via a mandatory registration
1371function that is called on platform initialization. The semi-hosting driver
1372implementation in `io_semihosting.c` can be used as an example.
1373
1374The Storage layer provides mechanisms to initialize storage devices before
1375IO operations are called. The basic operations supported by the layer
1376include `open()`, `close()`, `read()`, `write()`, `size()` and `seek()`.
1377Drivers do not have to implement all operations, but each platform must
1378provide at least one driver for a device capable of supporting generic
1379operations such as loading a bootloader image.
1380
1381The current implementation only allows for known images to be loaded by the
Dan Handleyb68954c2014-05-29 12:30:24 +01001382firmware. These images are specified by using their names, as defined in
1383[include/plat/common/platform.h]. The platform layer (`plat_get_image_source()`)
1384then returns a reference to a device and a driver-specific `spec` which will be
1385understood by the driver to allow access to the image data.
Harry Liebeld265bd72014-01-31 19:04:10 +00001386
1387The layer is designed in such a way that is it possible to chain drivers with
1388other drivers. For example, file-system drivers may be implemented on top of
1389physical block devices, both represented by IO devices with corresponding
1390drivers. In such a case, the file-system "binding" with the block device may
1391be deferred until the file-system device is initialised.
1392
1393The abstraction currently depends on structures being statically allocated
1394by the drivers and callers, as the system does not yet provide a means of
1395dynamically allocating memory. This may also have the affect of limiting the
1396amount of open resources per driver.
1397
1398
Achin Gupta4f6ad662013-10-25 09:08:21 +01001399- - - - - - - - - - - - - - - - - - - - - - - - - -
1400
Dan Handleye83b0ca2014-01-14 18:17:09 +00001401_Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved._
Achin Gupta4f6ad662013-10-25 09:08:21 +01001402
1403
Achin Guptaa4fa3cb2014-06-02 22:27:36 +01001404[ARM GIC Architecture Specification]: http://arminfo.emea.arm.com/help/topic/com.arm.doc.ihi0048b/IHI0048B_gic_architecture_specification.pdf
1405[IMF Design Guide]: interrupt-framework-design.md
1406[User Guide]: user-guide.md
1407[FreeBSD]: http://www.freebsd.org
Achin Gupta4f6ad662013-10-25 09:08:21 +01001408
Andrew Thoelke2bf28e62014-03-20 10:48:23 +00001409[plat/common/aarch64/platform_mp_stack.S]: ../plat/common/aarch64/platform_mp_stack.S
1410[plat/common/aarch64/platform_up_stack.S]: ../plat/common/aarch64/platform_up_stack.S
Dan Handleyb68954c2014-05-29 12:30:24 +01001411[plat/fvp/include/platform_def.h]: ../plat/fvp/include/platform_def.h
1412[plat/fvp/include/plat_macros.S]: ../plat/fvp/include/plat_macros.S
Andrew Thoelke2bf28e62014-03-20 10:48:23 +00001413[plat/fvp/aarch64/plat_common.c]: ../plat/fvp/aarch64/plat_common.c
1414[plat/fvp/plat_pm.c]: ../plat/fvp/plat_pm.c
1415[include/runtime_svc.h]: ../include/runtime_svc.h
Dan Handleyb68954c2014-05-29 12:30:24 +01001416[include/plat/common/platform.h]: ../include/plat/common/platform.h