blob: 62ea6a0c171227051c674fda37ea804457a649e7 [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
Sandrine Bailleux638363e2014-05-21 17:08:26 +0100153* **#define : BL1_RO_BASE**
154
155 Defines the base address in secure ROM where BL1 originally lives. Must be
156 aligned on a page-size boundary.
157
158* **#define : BL1_RO_LIMIT**
159
160 Defines the maximum address in secure ROM that BL1's actual content (i.e.
161 excluding any data section allocated at runtime) can occupy.
162
163* **#define : BL1_RW_BASE**
164
165 Defines the base address in secure RAM where BL1's read-write data will live
166 at runtime. Must be aligned on a page-size boundary.
167
168* **#define : BL1_RW_LIMIT**
169
170 Defines the maximum address in secure RAM that BL1's read-write data can
171 occupy at runtime.
172
James Morrisseyba3155b2013-10-29 10:56:46 +0000173* **#define : BL2_BASE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100174
175 Defines the base address in secure RAM where BL1 loads the BL2 binary image.
Sandrine Bailleuxcd29b0a2013-11-27 10:32:17 +0000176 Must be aligned on a page-size boundary.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100177
Sandrine Bailleux638363e2014-05-21 17:08:26 +0100178* **#define : BL2_LIMIT**
179
180 Defines the maximum address in secure RAM that the BL2 image can occupy.
181
James Morrisseyba3155b2013-10-29 10:56:46 +0000182* **#define : BL31_BASE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100183
184 Defines the base address in secure RAM where BL2 loads the BL3-1 binary
Sandrine Bailleuxcd29b0a2013-11-27 10:32:17 +0000185 image. Must be aligned on a page-size boundary.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100186
Sandrine Bailleux638363e2014-05-21 17:08:26 +0100187* **#define : BL31_LIMIT**
188
189 Defines the maximum address in secure RAM that the BL3-1 image can occupy.
190
Harry Liebeld265bd72014-01-31 19:04:10 +0000191* **#define : NS_IMAGE_OFFSET**
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100192
Harry Liebeld265bd72014-01-31 19:04:10 +0000193 Defines the base address in non-secure DRAM where BL2 loads the BL3-3 binary
194 image. Must be aligned on a page-size boundary.
195
Dan Handley5a06bb72014-08-04 11:41:20 +0100196If a BL3-2 image is supported by the platform, the following constants must
197also be defined:
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100198
Dan Handley5a06bb72014-08-04 11:41:20 +0100199* **#define : BL32_IMAGE_NAME**
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100200
Dan Handley5a06bb72014-08-04 11:41:20 +0100201 Name of the BL3-2 binary image on the host file-system. This name is used by
202 BL2 to load BL3-2 into secure memory from platform storage.
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100203
204* **#define : BL32_BASE**
205
206 Defines the base address in secure memory where BL2 loads the BL3-2 binary
Dan Handley5a06bb72014-08-04 11:41:20 +0100207 image. Must be aligned on a page-size boundary.
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100208
209* **#define : BL32_LIMIT**
210
Dan Handley5a06bb72014-08-04 11:41:20 +0100211 Defines the maximum address that the BL3-2 image can occupy.
212
213If the Test Secure-EL1 Payload (TSP) instantiation of BL3-2 is supported by the
214platform, the following constants must also be defined:
215
216* **#define : TSP_SEC_MEM_BASE**
217
218 Defines the base address of the secure memory used by the TSP image on the
219 platform. This must be at the same address or below `BL32_BASE`.
220
221* **#define : TSP_SEC_MEM_SIZE**
222
223 Defines the size of the secure memory used by the BL3-2 image on the
224 platform. `TSP_SEC_MEM_BASE` and `TSP_SEC_MEM_SIZE` must fully accomodate
225 the memory required by the BL3-2 image, defined by `BL32_BASE` and
226 `BL32_LIMIT`.
227
228* **#define : TSP_IRQ_SEC_PHY_TIMER**
229
230 Defines the ID of the secure physical generic timer interrupt used by the
231 TSP's interrupt handling code.
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100232
Dan Handley6d16ce02014-08-04 18:31:43 +0100233If the platform port uses the IO storage framework, the following constants
234must also be defined:
235
236* **#define : MAX_IO_DEVICES**
237
238 Defines the maximum number of registered IO devices. Attempting to register
239 more devices than this value using `io_register_device()` will fail with
240 IO_RESOURCES_EXHAUSTED.
241
242* **#define : MAX_IO_HANDLES**
243
244 Defines the maximum number of open IO handles. Attempting to open more IO
245 entities than this value using `io_open()` will fail with
246 IO_RESOURCES_EXHAUSTED.
247
Sandrine Bailleux46d49f632014-06-23 17:00:23 +0100248The following constants are optional. They should be defined when the platform
249memory layout implies some image overlaying like on FVP.
250
251* **#define : BL31_PROGBITS_LIMIT**
252
253 Defines the maximum address in secure RAM that the BL3-1's progbits sections
254 can occupy.
255
Dan Handley5a06bb72014-08-04 11:41:20 +0100256* **#define : TSP_PROGBITS_LIMIT**
Sandrine Bailleux46d49f632014-06-23 17:00:23 +0100257
258 Defines the maximum address that the TSP's progbits sections can occupy.
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100259
Dan Handleyb68954c2014-05-29 12:30:24 +0100260### File : plat_macros.S [mandatory]
Soby Mathewa43d4312014-04-07 15:28:55 +0100261
Dan Handleyb68954c2014-05-29 12:30:24 +0100262Each platform must ensure a file of this name is in the system include path with
263the following macro defined. In the ARM FVP port, this file is found in
264[plat/fvp/include/plat_macros.S].
Soby Mathewa43d4312014-04-07 15:28:55 +0100265
266* **Macro : plat_print_gic_regs**
267
268 This macro allows the crash reporting routine to print GIC registers
Soby Mathew8c106902014-07-16 09:23:52 +0100269 in case of an unhandled exception in BL3-1. This aids in debugging and
Soby Mathewa43d4312014-04-07 15:28:55 +0100270 this macro can be defined to be empty in case GIC register reporting is
271 not desired.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100272
Soby Mathew8c106902014-07-16 09:23:52 +0100273* **Macro : plat_print_interconnect_regs**
274
275 This macro allows the crash reporting routine to print interconnect registers
276 in case of an unhandled exception in BL3-1. This aids in debugging and
277 this macro can be defined to be empty in case interconnect register reporting
278 is not desired. In the ARM FVP port, the CCI snoop control registers are
279 reported.
280
Achin Gupta4f6ad662013-10-25 09:08:21 +0100281### Other mandatory modifications
282
James Morrisseyba3155b2013-10-29 10:56:46 +0000283The following mandatory modifications may be implemented in any file
Achin Gupta4f6ad662013-10-25 09:08:21 +0100284the implementer chooses. In the ARM FVP port, they are implemented in
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000285[plat/fvp/aarch64/plat_common.c].
Achin Gupta4f6ad662013-10-25 09:08:21 +0100286
Sandrine Bailleux9e864902014-03-31 11:25:18 +0100287* **Function : uint64_t plat_get_syscnt_freq(void)**
288
289 This function is used by the architecture setup code to retrieve the
290 counter frequency for the CPU's generic timer. This value will be
291 programmed into the `CNTFRQ_EL0` register.
292 In the ARM FVP port, it returns the base frequency of the system counter,
293 which is retrieved from the first entry in the frequency modes table.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100294
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000295
Vikram Kanigirie452cd82014-05-23 15:56:12 +01002962.2 Handling Reset
297------------------
298
299BL1 by default implements the reset vector where execution starts from a cold
300or warm boot. BL3-1 can be optionally set as a reset vector using the
301RESET_TO_BL31 make variable.
302
303For each CPU, the reset vector code is responsible for the following tasks:
304
3051. Distinguishing between a cold boot and a warm boot.
306
3072. In the case of a cold boot and the CPU being a secondary CPU, ensuring that
308 the CPU is placed in a platform-specific state until the primary CPU
309 performs the necessary steps to remove it from this state.
310
3113. In the case of a warm boot, ensuring that the CPU jumps to a platform-
312 specific address in the BL3-1 image in the same processor mode as it was
313 when released from reset.
314
315The following functions need to be implemented by the platform port to enable
316reset vector code to perform the above tasks.
317
318
319### Function : platform_get_entrypoint() [mandatory]
320
321 Argument : unsigned long
322 Return : unsigned int
323
324This function is called with the `SCTLR.M` and `SCTLR.C` bits disabled. The CPU
325is identified by its `MPIDR`, which is passed as the argument. The function is
326responsible for distinguishing between a warm and cold reset using platform-
327specific means. If it's a warm reset then it returns the entrypoint into the
328BL3-1 image that the CPU must jump to. If it's a cold reset then this function
329must return zero.
330
331This function is also responsible for implementing a platform-specific mechanism
332to handle the condition where the CPU has been warm reset but there is no
333entrypoint to jump to.
334
335This function does not follow the Procedure Call Standard used by the
336Application Binary Interface for the ARM 64-bit architecture. The caller should
337not assume that callee saved registers are preserved across a call to this
338function.
339
340This function fulfills requirement 1 and 3 listed above.
341
342
343### Function : plat_secondary_cold_boot_setup() [mandatory]
344
345 Argument : void
346 Return : void
347
348This function is called with the MMU and data caches disabled. It is responsible
349for placing the executing secondary CPU in a platform-specific state until the
350primary CPU performs the necessary actions to bring it out of that state and
351allow entry into the OS.
352
353In the ARM FVP port, each secondary CPU powers itself off. The primary CPU is
354responsible for powering up the secondary CPU when normal world software
355requires them.
356
357This function fulfills requirement 2 above.
358
359
Juan Castillo53fdceb2014-07-16 15:53:43 +0100360### Function : platform_is_primary_cpu() [mandatory]
361
362 Argument : unsigned long
363 Return : unsigned int
364
365This function identifies a CPU by its `MPIDR`, which is passed as the argument,
366to determine whether this CPU is the primary CPU or a secondary CPU. A return
367value of zero indicates that the CPU is not the primary CPU, while a non-zero
368return value indicates that the CPU is the primary CPU.
369
370
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100371### Function : platform_mem_init() [mandatory]
372
373 Argument : void
374 Return : void
375
376This function is called before any access to data is made by the firmware, in
377order to carry out any essential memory initialization.
378
379The ARM FVP port uses this function to initialize the mailbox memory used for
380providing the warm-boot entry-point addresses.
381
382
383
3842.3 Common optional modifications
Achin Gupta4f6ad662013-10-25 09:08:21 +0100385---------------------------------
386
387The following are helper functions implemented by the firmware that perform
388common platform-specific tasks. A platform may choose to override these
389definitions.
390
391
392### Function : platform_get_core_pos()
393
394 Argument : unsigned long
395 Return : int
396
397A platform may need to convert the `MPIDR` of a CPU to an absolute number, which
398can be used as a CPU-specific linear index into blocks of memory (for example
399while allocating per-CPU stacks). This routine contains a simple mechanism
400to perform this conversion, using the assumption that each cluster contains a
401maximum of 4 CPUs:
402
403 linear index = cpu_id + (cluster_id * 4)
404
405 cpu_id = 8-bit value in MPIDR at affinity level 0
406 cluster_id = 8-bit value in MPIDR at affinity level 1
407
408
Achin Gupta4f6ad662013-10-25 09:08:21 +0100409### Function : platform_set_stack()
410
411 Argument : unsigned long
412 Return : void
413
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000414This function sets the current stack pointer to the normal memory stack that
415has been allocated for the CPU specificed by MPIDR. For BL images that only
416require a stack for the primary CPU the parameter is ignored. The size of
417the stack allocated to each CPU is specified by the platform defined constant
418`PLATFORM_STACK_SIZE`.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100419
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000420Common implementations of this function for the UP and MP BL images are
421provided in [plat/common/aarch64/platform_up_stack.S] and
422[plat/common/aarch64/platform_mp_stack.S]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100423
424
Achin Guptac8afc782013-11-25 18:45:02 +0000425### Function : platform_get_stack()
426
427 Argument : unsigned long
428 Return : unsigned long
429
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000430This function returns the base address of the normal memory stack that
431has been allocated for the CPU specificed by MPIDR. For BL images that only
432require a stack for the primary CPU the parameter is ignored. The size of
433the stack allocated to each CPU is specified by the platform defined constant
434`PLATFORM_STACK_SIZE`.
Achin Guptac8afc782013-11-25 18:45:02 +0000435
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000436Common implementations of this function for the UP and MP BL images are
437provided in [plat/common/aarch64/platform_up_stack.S] and
438[plat/common/aarch64/platform_mp_stack.S]
Achin Guptac8afc782013-11-25 18:45:02 +0000439
440
Achin Gupta4f6ad662013-10-25 09:08:21 +0100441### Function : plat_report_exception()
442
443 Argument : unsigned int
444 Return : void
445
446A platform may need to report various information about its status when an
447exception is taken, for example the current exception level, the CPU security
448state (secure/non-secure), the exception type, and so on. This function is
449called in the following circumstances:
450
451* In BL1, whenever an exception is taken.
452* In BL2, whenever an exception is taken.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100453
454The default implementation doesn't do anything, to avoid making assumptions
455about the way the platform displays its status information.
456
457This function receives the exception type as its argument. Possible values for
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000458exceptions types are listed in the [include/runtime_svc.h] header file. Note
Achin Gupta4f6ad662013-10-25 09:08:21 +0100459that these constants are not related to any architectural exception code; they
460are just an ARM Trusted Firmware convention.
461
462
4633. Modifications specific to a Boot Loader stage
464-------------------------------------------------
465
4663.1 Boot Loader Stage 1 (BL1)
467-----------------------------
468
469BL1 implements the reset vector where execution starts from after a cold or
470warm boot. For each CPU, BL1 is responsible for the following tasks:
471
Vikram Kanigirie452cd82014-05-23 15:56:12 +01004721. Handling the reset as described in section 2.2
Achin Gupta4f6ad662013-10-25 09:08:21 +0100473
4742. In the case of a cold boot and the CPU being the primary CPU, ensuring that
475 only this CPU executes the remaining BL1 code, including loading and passing
476 control to the BL2 stage.
477
Vikram Kanigirie452cd82014-05-23 15:56:12 +01004783. Loading the BL2 image from non-volatile storage into secure memory at the
Achin Gupta4f6ad662013-10-25 09:08:21 +0100479 address specified by the platform defined constant `BL2_BASE`.
480
Vikram Kanigirie452cd82014-05-23 15:56:12 +01004814. Populating a `meminfo` structure with the following information in memory,
Achin Gupta4f6ad662013-10-25 09:08:21 +0100482 accessible by BL2 immediately upon entry.
483
484 meminfo.total_base = Base address of secure RAM visible to BL2
485 meminfo.total_size = Size of secure RAM visible to BL2
486 meminfo.free_base = Base address of secure RAM available for
487 allocation to BL2
488 meminfo.free_size = Size of secure RAM available for allocation to BL2
489
490 BL1 places this `meminfo` structure at the beginning of the free memory
491 available for its use. Since BL1 cannot allocate memory dynamically at the
492 moment, its free memory will be available for BL2's use as-is. However, this
493 means that BL2 must read the `meminfo` structure before it starts using its
494 free memory (this is discussed in Section 3.2).
495
496 In future releases of the ARM Trusted Firmware it will be possible for
497 the platform to decide where it wants to place the `meminfo` structure for
498 BL2.
499
Sandrine Bailleux8f55dfb2014-06-24 14:02:34 +0100500 BL1 implements the `bl1_init_bl2_mem_layout()` function to populate the
Achin Gupta4f6ad662013-10-25 09:08:21 +0100501 BL2 `meminfo` structure. The platform may override this implementation, for
502 example if the platform wants to restrict the amount of memory visible to
503 BL2. Details of how to do this are given below.
504
505The following functions need to be implemented by the platform port to enable
506BL1 to perform the above tasks.
507
508
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100509### Function : bl1_plat_arch_setup() [mandatory]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100510
511 Argument : void
512 Return : void
513
Achin Gupta4f6ad662013-10-25 09:08:21 +0100514This function performs any platform-specific and architectural setup that the
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100515platform requires. Platform-specific setup might include configuration of
516memory controllers, configuration of the interconnect to allow the cluster
517to service cache snoop requests from another cluster, and so on.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100518
519In the ARM FVP port, this function enables CCI snoops into the cluster that the
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100520primary CPU is part of. It also enables the MMU.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100521
522This function helps fulfill requirement 2 above.
523
524
525### Function : bl1_platform_setup() [mandatory]
526
527 Argument : void
528 Return : void
529
530This function executes with the MMU and data caches enabled. It is responsible
531for performing any remaining platform-specific setup that can occur after the
532MMU and data cache have been enabled.
533
Harry Liebeld265bd72014-01-31 19:04:10 +0000534This function is also responsible for initializing the storage abstraction layer
535which is used to load further bootloader images.
536
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100537This function helps fulfill requirement 3 above.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100538
539
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000540### Function : bl1_plat_sec_mem_layout() [mandatory]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100541
542 Argument : void
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000543 Return : meminfo *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100544
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000545This function should only be called on the cold boot path. It executes with the
546MMU and data caches enabled. The pointer returned by this function must point to
547a `meminfo` structure containing the extents and availability of secure RAM for
548the BL1 stage.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100549
550 meminfo.total_base = Base address of secure RAM visible to BL1
551 meminfo.total_size = Size of secure RAM visible to BL1
552 meminfo.free_base = Base address of secure RAM available for allocation
553 to BL1
554 meminfo.free_size = Size of secure RAM available for allocation to BL1
555
556This information is used by BL1 to load the BL2 image in secure RAM. BL1 also
557populates a similar structure to tell BL2 the extents of memory available for
558its own use.
559
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100560This function helps fulfill requirement 3 above.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100561
562
Sandrine Bailleux8f55dfb2014-06-24 14:02:34 +0100563### Function : bl1_init_bl2_mem_layout() [optional]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100564
565 Argument : meminfo *, meminfo *, unsigned int, unsigned long
566 Return : void
567
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100568BL1 needs to tell the next stage the amount of secure RAM available
569for it to use. This information is populated in a `meminfo`
Achin Gupta4f6ad662013-10-25 09:08:21 +0100570structure.
571
572Depending upon where BL2 has been loaded in secure RAM (determined by
573`BL2_BASE`), BL1 calculates the amount of free memory available for BL2 to use.
574BL1 also ensures that its data sections resident in secure RAM are not visible
575to BL2. An illustration of how this is done in the ARM FVP port is given in the
576[User Guide], in the Section "Memory layout on Base FVP".
577
578
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100579### Function : bl1_plat_set_bl2_ep_info() [mandatory]
580
581 Argument : image_info *, entry_point_info *
582 Return : void
583
584This function is called after loading BL2 image and it can be used to overwrite
585the entry point set by loader and also set the security state and SPSR which
586represents the entry point system state for BL2.
587
588On FVP, we are setting the security state and the SPSR for the BL2 entrypoint
589
590
Achin Gupta4f6ad662013-10-25 09:08:21 +01005913.2 Boot Loader Stage 2 (BL2)
592-----------------------------
593
594The BL2 stage is executed only by the primary CPU, which is determined in BL1
595using the `platform_is_primary_cpu()` function. BL1 passed control to BL2 at
596`BL2_BASE`. BL2 executes in Secure EL1 and is responsible for:
597
Sandrine Bailleux93d81d62014-06-24 14:19:36 +01005981. (Optional) Loading the BL3-0 binary image (if present) from platform
599 provided non-volatile storage. To load the BL3-0 image, BL2 makes use of
600 the `meminfo` returned by the `bl2_plat_get_bl30_meminfo()` function.
601 The platform also defines the address in memory where BL3-0 is loaded
602 through the optional constant `BL30_BASE`. BL2 uses this information
603 to determine if there is enough memory to load the BL3-0 image.
604 Subsequent handling of the BL3-0 image is platform-specific and is
605 implemented in the `bl2_plat_handle_bl30()` function.
606 If `BL30_BASE` is not defined then this step is not performed.
607
6082. Loading the BL3-1 binary image into secure RAM from non-volatile storage. To
Harry Liebeld265bd72014-01-31 19:04:10 +0000609 load the BL3-1 image, BL2 makes use of the `meminfo` structure passed to it
610 by BL1. This structure allows BL2 to calculate how much secure RAM is
611 available for its use. The platform also defines the address in secure RAM
612 where BL3-1 is loaded through the constant `BL31_BASE`. BL2 uses this
613 information to determine if there is enough memory to load the BL3-1 image.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100614
Sandrine Bailleux93d81d62014-06-24 14:19:36 +01006153. (Optional) Loading the BL3-2 binary image (if present) from platform
Dan Handley1151c822014-04-15 11:38:38 +0100616 provided non-volatile storage. To load the BL3-2 image, BL2 makes use of
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100617 the `meminfo` returned by the `bl2_plat_get_bl32_meminfo()` function.
618 The platform also defines the address in memory where BL3-2 is loaded
619 through the optional constant `BL32_BASE`. BL2 uses this information
620 to determine if there is enough memory to load the BL3-2 image.
621 If `BL32_BASE` is not defined then this and the next step is not performed.
Achin Guptaa3050ed2014-02-19 17:52:35 +0000622
Sandrine Bailleux93d81d62014-06-24 14:19:36 +01006234. (Optional) Arranging to pass control to the BL3-2 image (if present) that
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100624 has been pre-loaded at `BL32_BASE`. BL2 populates an `entry_point_info`
Dan Handley1151c822014-04-15 11:38:38 +0100625 structure in memory provided by the platform with information about how
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100626 BL3-1 should pass control to the BL3-2 image.
Achin Guptaa3050ed2014-02-19 17:52:35 +0000627
Sandrine Bailleux93d81d62014-06-24 14:19:36 +01006285. Loading the normal world BL3-3 binary image into non-secure DRAM from
629 platform storage and arranging for BL3-1 to pass control to this image. This
630 address is determined using the `plat_get_ns_image_entrypoint()` function
631 described below.
632
6336. BL2 populates an `entry_point_info` structure in memory provided by the
634 platform with information about how BL3-1 should pass control to the
635 other BL images.
636
Achin Gupta4f6ad662013-10-25 09:08:21 +0100637The following functions must be implemented by the platform port to enable BL2
638to perform the above tasks.
639
640
641### Function : bl2_early_platform_setup() [mandatory]
642
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100643 Argument : meminfo *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100644 Return : void
645
646This function executes with the MMU and data caches disabled. It is only called
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100647by the primary CPU. The arguments to this function is the address of the
648`meminfo` structure populated by BL1.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100649
650The platform must copy the contents of the `meminfo` structure into a private
651variable as the original memory may be subsequently overwritten by BL2. The
652copied structure is made available to all BL2 code through the
Achin Guptae4d084e2014-02-19 17:18:23 +0000653`bl2_plat_sec_mem_layout()` function.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100654
655
656### Function : bl2_plat_arch_setup() [mandatory]
657
658 Argument : void
659 Return : void
660
661This function executes with the MMU and data caches disabled. It is only called
662by the primary CPU.
663
664The purpose of this function is to perform any architectural initialization
665that varies across platforms, for example enabling the MMU (since the memory
666map differs across platforms).
667
668
669### Function : bl2_platform_setup() [mandatory]
670
671 Argument : void
672 Return : void
673
674This function may execute with the MMU and data caches enabled if the platform
675port does the necessary initialization in `bl2_plat_arch_setup()`. It is only
676called by the primary CPU.
677
Achin Guptae4d084e2014-02-19 17:18:23 +0000678The purpose of this function is to perform any platform initialization
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100679specific to BL2. Platform security components are configured if required.
680For the Base FVP the TZC-400 TrustZone controller is configured to only
681grant non-secure access to DRAM. This avoids aliasing between secure and
682non-secure accesses in the TLB and cache - secure execution states can use
683the NS attributes in the MMU translation tables to access the DRAM.
Harry Liebelce19cf12014-04-01 19:28:07 +0100684
Harry Liebeld265bd72014-01-31 19:04:10 +0000685This function is also responsible for initializing the storage abstraction layer
686which is used to load further bootloader images.
687
Achin Gupta4f6ad662013-10-25 09:08:21 +0100688
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000689### Function : bl2_plat_sec_mem_layout() [mandatory]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100690
691 Argument : void
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000692 Return : meminfo *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100693
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000694This function should only be called on the cold boot path. It may execute with
695the MMU and data caches enabled if the platform port does the necessary
696initialization in `bl2_plat_arch_setup()`. It is only called by the primary CPU.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100697
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000698The purpose of this function is to return a pointer to a `meminfo` structure
699populated with the extents of secure RAM available for BL2 to use. See
Achin Gupta4f6ad662013-10-25 09:08:21 +0100700`bl2_early_platform_setup()` above.
701
702
Sandrine Bailleux93d81d62014-06-24 14:19:36 +0100703### Function : bl2_plat_get_bl30_meminfo() [mandatory]
704
705 Argument : meminfo *
706 Return : void
707
708This function is used to get the memory limits where BL2 can load the
709BL3-0 image. The meminfo provided by this is used by load_image() to
710validate whether the BL3-0 image can be loaded within the given
711memory from the given base.
712
713
714### Function : bl2_plat_handle_bl30() [mandatory]
715
716 Argument : image_info *
717 Return : int
718
719This function is called after loading BL3-0 image and it is used to perform any
720platform-specific actions required to handle the SCP firmware. Typically it
721transfers the image into SCP memory using a platform-specific protocol and waits
722until SCP executes it and signals to the Application Processor (AP) for BL2
723execution to continue.
724
725This function returns 0 on success, a negative error code otherwise.
726
727
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100728### Function : bl2_plat_get_bl31_params() [mandatory]
Harry Liebeld265bd72014-01-31 19:04:10 +0000729
730 Argument : void
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100731 Return : bl31_params *
Harry Liebeld265bd72014-01-31 19:04:10 +0000732
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100733BL2 platform code needs to return a pointer to a `bl31_params` structure it
734will use for passing information to BL3-1. The `bl31_params` structure carries
735the following information.
736 - Header describing the version information for interpreting the bl31_param
737 structure
738 - Information about executing the BL3-3 image in the `bl33_ep_info` field
739 - Information about executing the BL3-2 image in the `bl32_ep_info` field
740 - Information about the type and extents of BL3-1 image in the
741 `bl31_image_info` field
742 - Information about the type and extents of BL3-2 image in the
743 `bl32_image_info` field
744 - Information about the type and extents of BL3-3 image in the
745 `bl33_image_info` field
746
747The memory pointed by this structure and its sub-structures should be
748accessible from BL3-1 initialisation code. BL3-1 might choose to copy the
749necessary content, or maintain the structures until BL3-3 is initialised.
Harry Liebeld265bd72014-01-31 19:04:10 +0000750
751
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100752### Funtion : bl2_plat_get_bl31_ep_info() [mandatory]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100753
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100754 Argument : void
755 Return : entry_point_info *
756
757BL2 platform code returns a pointer which is used to populate the entry point
758information for BL3-1 entry point. The location pointed by it should be
759accessible from BL1 while processing the synchronous exception to run to BL3-1.
760
761On FVP this is allocated inside an bl2_to_bl31_params_mem structure which
762is allocated at an address pointed by PARAMS_BASE.
763
764
765### Function : bl2_plat_set_bl31_ep_info() [mandatory]
766
767 Argument : image_info *, entry_point_info *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100768 Return : void
769
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100770This function is called after loading BL3-1 image and it can be used to
771overwrite the entry point set by loader and also set the security state
772and SPSR which represents the entry point system state for BL3-1.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100773
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100774On FVP, we are setting the security state and the SPSR for the BL3-1
775entrypoint.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100776
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100777### Function : bl2_plat_set_bl32_ep_info() [mandatory]
778
779 Argument : image_info *, entry_point_info *
780 Return : void
781
782This function is called after loading BL3-2 image and it can be used to
783overwrite the entry point set by loader and also set the security state
784and SPSR which represents the entry point system state for BL3-2.
785
786On FVP, we are setting the security state and the SPSR for the BL3-2
787entrypoint
788
789### Function : bl2_plat_set_bl33_ep_info() [mandatory]
790
791 Argument : image_info *, entry_point_info *
792 Return : void
793
794This function is called after loading BL3-3 image and it can be used to
795overwrite the entry point set by loader and also set the security state
796and SPSR which represents the entry point system state for BL3-3.
797
798On FVP, we are setting the security state and the SPSR for the BL3-3
799entrypoint
800
801### Function : bl2_plat_get_bl32_meminfo() [mandatory]
802
803 Argument : meminfo *
804 Return : void
805
806This function is used to get the memory limits where BL2 can load the
807BL3-2 image. The meminfo provided by this is used by load_image() to
808validate whether the BL3-2 image can be loaded with in the given
809memory from the given base.
810
811### Function : bl2_plat_get_bl33_meminfo() [mandatory]
812
813 Argument : meminfo *
814 Return : void
815
816This function is used to get the memory limits where BL2 can load the
817BL3-3 image. The meminfo provided by this is used by load_image() to
818validate whether the BL3-3 image can be loaded with in the given
819memory from the given base.
820
821### Function : bl2_plat_flush_bl31_params() [mandatory]
822
823 Argument : void
824 Return : void
825
826Once BL2 has populated all the structures that needs to be read by BL1
827and BL3-1 including the bl31_params structures and its sub-structures,
828the bl31_ep_info structure and any platform specific data. It flushes
829all these data to the main memory so that it is available when we jump to
830later Bootloader stages with MMU off
Achin Gupta4f6ad662013-10-25 09:08:21 +0100831
832### Function : plat_get_ns_image_entrypoint() [mandatory]
833
834 Argument : void
835 Return : unsigned long
836
837As previously described, BL2 is responsible for arranging for control to be
838passed to a normal world BL image through BL3-1. This function returns the
839entrypoint of that image, which BL3-1 uses to jump to it.
840
Harry Liebeld265bd72014-01-31 19:04:10 +0000841BL2 is responsible for loading the normal world BL3-3 image (e.g. UEFI).
Achin Gupta4f6ad662013-10-25 09:08:21 +0100842
843
8443.2 Boot Loader Stage 3-1 (BL3-1)
845---------------------------------
846
847During cold boot, the BL3-1 stage is executed only by the primary CPU. This is
848determined in BL1 using the `platform_is_primary_cpu()` function. BL1 passes
849control to BL3-1 at `BL31_BASE`. During warm boot, BL3-1 is executed by all
850CPUs. BL3-1 executes at EL3 and is responsible for:
851
8521. Re-initializing all architectural and platform state. Although BL1 performs
853 some of this initialization, BL3-1 remains resident in EL3 and must ensure
854 that EL3 architectural and platform state is completely initialized. It
855 should make no assumptions about the system state when it receives control.
856
8572. Passing control to a normal world BL image, pre-loaded at a platform-
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100858 specific address by BL2. BL3-1 uses the `entry_point_info` structure that BL2
Achin Gupta4f6ad662013-10-25 09:08:21 +0100859 populated in memory to do this.
860
8613. Providing runtime firmware services. Currently, BL3-1 only implements a
862 subset of the Power State Coordination Interface (PSCI) API as a runtime
863 service. See Section 3.3 below for details of porting the PSCI
864 implementation.
865
Achin Gupta35ca3512014-02-19 17:58:33 +00008664. Optionally passing control to the BL3-2 image, pre-loaded at a platform-
867 specific address by BL2. BL3-1 exports a set of apis that allow runtime
868 services to specify the security state in which the next image should be
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100869 executed and run the corresponding image. BL3-1 uses the `entry_point_info`
870 structure populated by BL2 to do this.
871
872If BL3-1 is a reset vector, It also needs to handle the reset as specified in
873section 2.2 before the tasks described above.
Achin Gupta35ca3512014-02-19 17:58:33 +0000874
Achin Gupta4f6ad662013-10-25 09:08:21 +0100875The following functions must be implemented by the platform port to enable BL3-1
876to perform the above tasks.
877
878
879### Function : bl31_early_platform_setup() [mandatory]
880
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100881 Argument : bl31_params *, void *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100882 Return : void
883
884This function executes with the MMU and data caches disabled. It is only called
885by the primary CPU. The arguments to this function are:
886
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100887* The address of the `bl31_params` structure populated by BL2.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100888* An opaque pointer that the platform may use as needed.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100889
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100890The platform can copy the contents of the `bl31_params` structure and its
891sub-structures into private variables if the original memory may be
892subsequently overwritten by BL3-1 and similarly the `void *` pointing
893to the platform data also needs to be saved.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100894
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100895On the ARM FVP port, BL2 passes a pointer to a `bl31_params` structure populated
896in the secure DRAM at address `0x6000000` in the bl31_params * argument and it
897does not use opaque pointer mentioned earlier. BL3-1 does not copy this
898information to internal data structures as it guarantees that the secure
899DRAM memory will not be overwritten. It maintains an internal reference to this
900information in the `bl2_to_bl31_params` variable.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100901
902### Function : bl31_plat_arch_setup() [mandatory]
903
904 Argument : void
905 Return : void
906
907This function executes with the MMU and data caches disabled. It is only called
908by the primary CPU.
909
910The purpose of this function is to perform any architectural initialization
911that varies across platforms, for example enabling the MMU (since the memory
912map differs across platforms).
913
914
915### Function : bl31_platform_setup() [mandatory]
916
917 Argument : void
918 Return : void
919
920This function may execute with the MMU and data caches enabled if the platform
921port does the necessary initialization in `bl31_plat_arch_setup()`. It is only
922called by the primary CPU.
923
924The purpose of this function is to complete platform initialization so that both
925BL3-1 runtime services and normal world software can function correctly.
926
927The ARM FVP port does the following:
928* Initializes the generic interrupt controller.
929* Configures the CLCD controller.
Sandrine Bailleux9e864902014-03-31 11:25:18 +0100930* Enables system-level implementation of the generic timer counter.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100931* Grants access to the system counter timer module
932* Initializes the FVP power controller device
933* Detects the system topology.
934
935
936### Function : bl31_get_next_image_info() [mandatory]
937
Achin Gupta35ca3512014-02-19 17:58:33 +0000938 Argument : unsigned int
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100939 Return : entry_point_info *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100940
941This function may execute with the MMU and data caches enabled if the platform
942port does the necessary initializations in `bl31_plat_arch_setup()`.
943
944This function is called by `bl31_main()` to retrieve information provided by
Achin Gupta35ca3512014-02-19 17:58:33 +0000945BL2 for the next image in the security state specified by the argument. BL3-1
946uses this information to pass control to that image in the specified security
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100947state. This function must return a pointer to the `entry_point_info` structure
Achin Gupta35ca3512014-02-19 17:58:33 +0000948(that was copied during `bl31_early_platform_setup()`) if the image exists. It
949should return NULL otherwise.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100950
951
Achin Gupta4f6ad662013-10-25 09:08:21 +01009523.3 Power State Coordination Interface (in BL3-1)
953------------------------------------------------
954
955The ARM Trusted Firmware's implementation of the PSCI API is based around the
956concept of an _affinity instance_. Each _affinity instance_ can be uniquely
957identified in a system by a CPU ID (the processor `MPIDR` is used in the PSCI
958interface) and an _affinity level_. A processing element (for example, a
959CPU) is at level 0. If the CPUs in the system are described in a tree where the
960node above a CPU is a logical grouping of CPUs that share some state, then
961affinity level 1 is that group of CPUs (for example, a cluster), and affinity
962level 2 is a group of clusters (for example, the system). The implementation
963assumes that the affinity level 1 ID can be computed from the affinity level 0
964ID (for example, a unique cluster ID can be computed from the CPU ID). The
965current implementation computes this on the basis of the recommended use of
966`MPIDR` affinity fields in the ARM Architecture Reference Manual.
967
968BL3-1's platform initialization code exports a pointer to the platform-specific
969power management operations required for the PSCI implementation to function
970correctly. This information is populated in the `plat_pm_ops` structure. The
971PSCI implementation calls members of the `plat_pm_ops` structure for performing
972power management operations for each affinity instance. For example, the target
973CPU is specified by its `MPIDR` in a PSCI `CPU_ON` call. The `affinst_on()`
974handler (if present) is called for each affinity instance as the PSCI
975implementation powers up each affinity level implemented in the `MPIDR` (for
976example, CPU, cluster and system).
977
978The following functions must be implemented to initialize PSCI functionality in
979the ARM Trusted Firmware.
980
981
982### Function : plat_get_aff_count() [mandatory]
983
984 Argument : unsigned int, unsigned long
985 Return : unsigned int
986
987This function may execute with the MMU and data caches enabled if the platform
988port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
989called by the primary CPU.
990
991This function is called by the PSCI initialization code to detect the system
992topology. Its purpose is to return the number of affinity instances implemented
993at a given `affinity level` (specified by the first argument) and a given
994`MPIDR` (specified by the second argument). For example, on a dual-cluster
995system where first cluster implements 2 CPUs and the second cluster implements 4
996CPUs, a call to this function with an `MPIDR` corresponding to the first cluster
997(`0x0`) and affinity level 0, would return 2. A call to this function with an
998`MPIDR` corresponding to the second cluster (`0x100`) and affinity level 0,
999would return 4.
1000
1001
1002### Function : plat_get_aff_state() [mandatory]
1003
1004 Argument : unsigned int, unsigned long
1005 Return : unsigned int
1006
1007This function may execute with the MMU and data caches enabled if the platform
1008port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
1009called by the primary CPU.
1010
1011This function is called by the PSCI initialization code. Its purpose is to
1012return the state of an affinity instance. The affinity instance is determined by
1013the affinity ID at a given `affinity level` (specified by the first argument)
1014and an `MPIDR` (specified by the second argument). The state can be one of
1015`PSCI_AFF_PRESENT` or `PSCI_AFF_ABSENT`. The latter state is used to cater for
1016system topologies where certain affinity instances are unimplemented. For
1017example, consider a platform that implements a single cluster with 4 CPUs and
1018another CPU implemented directly on the interconnect with the cluster. The
1019`MPIDR`s of the cluster would range from `0x0-0x3`. The `MPIDR` of the single
1020CPU would be 0x100 to indicate that it does not belong to cluster 0. Cluster 1
1021is missing but needs to be accounted for to reach this single CPU in the
1022topology tree. Hence it is marked as `PSCI_AFF_ABSENT`.
1023
1024
1025### Function : plat_get_max_afflvl() [mandatory]
1026
1027 Argument : void
1028 Return : int
1029
1030This function may execute with the MMU and data caches enabled if the platform
1031port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
1032called by the primary CPU.
1033
1034This function is called by the PSCI implementation both during cold and warm
1035boot, to determine the maximum affinity level that the power management
James Morrisseyba3155b2013-10-29 10:56:46 +00001036operations should apply to. ARMv8-A has support for 4 affinity levels. It is
Achin Gupta4f6ad662013-10-25 09:08:21 +01001037likely that hardware will implement fewer affinity levels. This function allows
1038the PSCI implementation to consider only those affinity levels in the system
1039that the platform implements. For example, the Base AEM FVP implements two
1040clusters with a configurable number of CPUs. It reports the maximum affinity
1041level as 1, resulting in PSCI power control up to the cluster level.
1042
1043
1044### Function : platform_setup_pm() [mandatory]
1045
1046 Argument : plat_pm_ops **
1047 Return : int
1048
1049This function may execute with the MMU and data caches enabled if the platform
1050port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
1051called by the primary CPU.
1052
1053This function is called by PSCI initialization code. Its purpose is to export
1054handler routines for platform-specific power management actions by populating
1055the passed pointer with a pointer to BL3-1's private `plat_pm_ops` structure.
1056
1057A description of each member of this structure is given below. Please refer to
Andrew Thoelke2bf28e62014-03-20 10:48:23 +00001058the ARM FVP specific implementation of these handlers in [plat/fvp/plat_pm.c]
Achin Gupta4f6ad662013-10-25 09:08:21 +01001059as an example. A platform port may choose not implement some of the power
1060management operations. For example, the ARM FVP port does not implement the
1061`affinst_standby()` function.
1062
1063#### plat_pm_ops.affinst_standby()
1064
1065Perform the platform-specific setup to enter the standby state indicated by the
1066passed argument.
1067
1068#### plat_pm_ops.affinst_on()
1069
1070Perform the platform specific setup to power on an affinity instance, specified
1071by the `MPIDR` (first argument) and `affinity level` (fourth argument). The
1072`state` (fifth argument) contains the current state of that affinity instance
1073(ON or OFF). This is useful to determine whether any action must be taken. For
1074example, while powering on a CPU, the cluster that contains this CPU might
1075already be in the ON state. The platform decides what actions must be taken to
1076transition from the current state to the target state (indicated by the power
1077management operation).
1078
1079#### plat_pm_ops.affinst_off()
1080
1081Perform the platform specific setup to power off an affinity instance in the
1082`MPIDR` of the calling CPU. It is called by the PSCI `CPU_OFF` API
1083implementation.
1084
1085The `MPIDR` (first argument), `affinity level` (second argument) and `state`
1086(third argument) have a similar meaning as described in the `affinst_on()`
1087operation. They are used to identify the affinity instance on which the call
1088is made and its current state. This gives the platform port an indication of the
1089state transition it must make to perform the requested action. For example, if
1090the calling CPU is the last powered on CPU in the cluster, after powering down
1091affinity level 0 (CPU), the platform port should power down affinity level 1
1092(the cluster) as well.
1093
Achin Gupta4f6ad662013-10-25 09:08:21 +01001094#### plat_pm_ops.affinst_suspend()
1095
1096Perform the platform specific setup to power off an affinity instance in the
1097`MPIDR` of the calling CPU. It is called by the PSCI `CPU_SUSPEND` API
1098implementation.
1099
1100The `MPIDR` (first argument), `affinity level` (third argument) and `state`
1101(fifth argument) have a similar meaning as described in the `affinst_on()`
1102operation. They are used to identify the affinity instance on which the call
1103is made and its current state. This gives the platform port an indication of the
1104state transition it must make to perform the requested action. For example, if
1105the calling CPU is the last powered on CPU in the cluster, after powering down
1106affinity level 0 (CPU), the platform port should power down affinity level 1
1107(the cluster) as well.
1108
1109The difference between turning an affinity instance off versus suspending it
1110is that in the former case, the affinity instance is expected to re-initialize
1111its state when its next powered on (see `affinst_on_finish()`). In the latter
1112case, the affinity instance is expected to save enough state so that it can
1113resume execution by restoring this state when its powered on (see
1114`affinst_suspend_finish()`).
1115
Achin Gupta4f6ad662013-10-25 09:08:21 +01001116#### plat_pm_ops.affinst_on_finish()
1117
1118This function is called by the PSCI implementation after the calling CPU is
1119powered on and released from reset in response to an earlier PSCI `CPU_ON` call.
1120It performs the platform-specific setup required to initialize enough state for
1121this CPU to enter the normal world and also provide secure runtime firmware
1122services.
1123
1124The `MPIDR` (first argument), `affinity level` (second argument) and `state`
1125(third argument) have a similar meaning as described in the previous operations.
1126
Achin Gupta4f6ad662013-10-25 09:08:21 +01001127#### plat_pm_ops.affinst_on_suspend()
1128
1129This function is called by the PSCI implementation after the calling CPU is
1130powered on and released from reset in response to an asynchronous wakeup
1131event, for example a timer interrupt that was programmed by the CPU during the
1132`CPU_SUSPEND` call. It performs the platform-specific setup required to
1133restore the saved state for this CPU to resume execution in the normal world
1134and also provide secure runtime firmware services.
1135
1136The `MPIDR` (first argument), `affinity level` (second argument) and `state`
1137(third argument) have a similar meaning as described in the previous operations.
1138
Achin Gupta4f6ad662013-10-25 09:08:21 +01001139BL3-1 platform initialization code must also detect the system topology and
1140the state of each affinity instance in the topology. This information is
1141critical for the PSCI runtime service to function correctly. More details are
1142provided in the description of the `plat_get_aff_count()` and
1143`plat_get_aff_state()` functions above.
1144
Achin Guptaa4fa3cb2014-06-02 22:27:36 +010011453.4 Interrupt Management framework (in BL3-1)
1146----------------------------------------------
1147BL3-1 implements an Interrupt Management Framework (IMF) to manage interrupts
1148generated in either security state and targeted to EL1 or EL2 in the non-secure
1149state or EL3/S-EL1 in the secure state. The design of this framework is
1150described in the [IMF Design Guide]
1151
1152A platform should export the following APIs to support the IMF. The following
1153text briefly describes each api and its implementation on the FVP port. The API
1154implementation depends upon the type of interrupt controller present in the
1155platform. The FVP implements an ARM Generic Interrupt Controller (ARM GIC) as
1156per the version 2.0 of the [ARM GIC Architecture Specification]
1157
1158### Function : plat_interrupt_type_to_line() [mandatory]
1159
1160 Argument : uint32_t, uint32_t
1161 Return : uint32_t
1162
1163The ARM processor signals an interrupt exception either through the IRQ or FIQ
1164interrupt line. The specific line that is signaled depends on how the interrupt
1165controller (IC) reports different interrupt types from an execution context in
1166either security state. The IMF uses this API to determine which interrupt line
1167the platform IC uses to signal each type of interrupt supported by the framework
1168from a given security state.
1169
1170The first parameter will be one of the `INTR_TYPE_*` values (see [IMF Design
1171Guide]) indicating the target type of the interrupt, the second parameter is the
1172security state of the originating execution context. The return result is the
1173bit position in the `SCR_EL3` register of the respective interrupt trap: IRQ=1,
1174FIQ=2.
1175
1176The FVP port configures the ARM GIC to signal S-EL1 interrupts as FIQs and
1177Non-secure interrupts as IRQs from either security state.
1178
1179
1180### Function : plat_ic_get_pending_interrupt_type() [mandatory]
1181
1182 Argument : void
1183 Return : uint32_t
1184
1185This API returns the type of the highest priority pending interrupt at the
1186platform IC. The IMF uses the interrupt type to retrieve the corresponding
1187handler function. `INTR_TYPE_INVAL` is returned when there is no interrupt
1188pending. The valid interrupt types that can be returned are `INTR_TYPE_EL3`,
1189`INTR_TYPE_S_EL1` and `INTR_TYPE_NS`.
1190
1191The FVP port reads the _Highest Priority Pending Interrupt Register_
1192(`GICC_HPPIR`) to determine the id of the pending interrupt. The type of interrupt
1193depends upon the id value as follows.
1194
11951. id < 1022 is reported as a S-EL1 interrupt
11962. id = 1022 is reported as a Non-secure interrupt.
11973. id = 1023 is reported as an invalid interrupt type.
1198
1199
1200### Function : plat_ic_get_pending_interrupt_id() [mandatory]
1201
1202 Argument : void
1203 Return : uint32_t
1204
1205This API returns the id of the highest priority pending interrupt at the
1206platform IC. The IMF passes the id returned by this API to the registered
1207handler for the pending interrupt if the `IMF_READ_INTERRUPT_ID` build time flag
1208is set. INTR_ID_UNAVAILABLE is returned when there is no interrupt pending.
1209
1210The FVP port reads the _Highest Priority Pending Interrupt Register_
1211(`GICC_HPPIR`) to determine the id of the pending interrupt. The id that is
1212returned by API depends upon the value of the id read from the interrupt
1213controller as follows.
1214
12151. id < 1022. id is returned as is.
12162. id = 1022. The _Aliased Highest Priority Pending Interrupt Register_
1217 (`GICC_AHPPIR`) is read to determine the id of the non-secure interrupt. This
1218 id is returned by the API.
12193. id = 1023. `INTR_ID_UNAVAILABLE` is returned.
1220
1221
1222### Function : plat_ic_acknowledge_interrupt() [mandatory]
1223
1224 Argument : void
1225 Return : uint32_t
1226
1227This API is used by the CPU to indicate to the platform IC that processing of
1228the highest pending interrupt has begun. It should return the id of the
1229interrupt which is being processed.
1230
1231The FVP port reads the _Interrupt Acknowledge Register_ (`GICC_IAR`). This
1232changes the state of the highest priority pending interrupt from pending to
1233active in the interrupt controller. It returns the value read from the
1234`GICC_IAR`. This value is the id of the interrupt whose state has been changed.
1235
1236The TSP uses this API to start processing of the secure physical timer
1237interrupt.
1238
1239
1240### Function : plat_ic_end_of_interrupt() [mandatory]
1241
1242 Argument : uint32_t
1243 Return : void
1244
1245This API is used by the CPU to indicate to the platform IC that processing of
1246the interrupt corresponding to the id (passed as the parameter) has
1247finished. The id should be the same as the id returned by the
1248`plat_ic_acknowledge_interrupt()` API.
1249
1250The FVP port writes the id to the _End of Interrupt Register_
1251(`GICC_EOIR`). This deactivates the corresponding interrupt in the interrupt
1252controller.
1253
1254The TSP uses this API to finish processing of the secure physical timer
1255interrupt.
1256
1257
1258### Function : plat_ic_get_interrupt_type() [mandatory]
1259
1260 Argument : uint32_t
1261 Return : uint32_t
1262
1263This API returns the type of the interrupt id passed as the parameter.
1264`INTR_TYPE_INVAL` is returned if the id is invalid. If the id is valid, a valid
1265interrupt type (one of `INTR_TYPE_EL3`, `INTR_TYPE_S_EL1` and `INTR_TYPE_NS`) is
1266returned depending upon how the interrupt has been configured by the platform
1267IC.
1268
1269The FVP port configures S-EL1 interrupts as Group0 interrupts and Non-secure
1270interrupts as Group1 interrupts. It reads the group value corresponding to the
1271interrupt id from the relevant _Interrupt Group Register_ (`GICD_IGROUPRn`). It
1272uses the group value to determine the type of interrupt.
1273
Soby Mathewc67b09b2014-07-14 16:57:23 +010012743.5 Crash Reporting mechanism (in BL3-1)
1275----------------------------------------------
1276BL3-1 implements a crash reporting mechanism which prints the various registers
1277of the CPU to enable quick crash analysis and debugging. It requires that a console
1278is designated as the crash console by the platform which will used to print the
1279register dump.
1280
1281The following functions must be implemented by the platform if it wants crash reporting
1282mechanism in BL3-1. The functions are implemented in assembly so that they can be
1283invoked without a C Runtime stack.
1284
1285### Function : plat_crash_console_init
1286
1287 Argument : void
1288 Return : int
1289
1290This API is used by the crash reporting mechanism to intialize the crash console.
1291It should only use the general purpose registers x0 to x2 to do the initiaization
1292and returns 1 on success.
1293
1294The FVP port designates the PL011_UART0 as the crash console and calls the
1295console_core_init() to initialize the console.
1296
1297### Function : plat_crash_console_putc
1298
1299 Argument : int
1300 Return : int
1301
1302This API is used by the crash reporting mechanism to print a character on the
1303designated crash console. It should only use general purpose registers x1 and
1304x2 to do its work. The parameter and the return value are in general purpose
1305register x0.
1306
1307The FVP port designates the PL011_UART0 as the crash console and calls the
1308console_core_putc() to print the character on the console.
Achin Gupta4f6ad662013-10-25 09:08:21 +01001309
Harry Liebela960f282013-12-12 16:03:44 +000013104. C Library
1311-------------
1312
1313To avoid subtle toolchain behavioral dependencies, the header files provided
1314by the compiler are not used. The software is built with the `-nostdinc` flag
1315to ensure no headers are included from the toolchain inadvertently. Instead the
1316required headers are included in the ARM Trusted Firmware source tree. The
1317library only contains those C library definitions required by the local
1318implementation. If more functionality is required, the needed library functions
1319will need to be added to the local implementation.
1320
1321Versions of [FreeBSD] headers can be found in `include/stdlib`. Some of these
1322headers have been cut down in order to simplify the implementation. In order to
1323minimize changes to the header files, the [FreeBSD] layout has been maintained.
1324The generic C library definitions can be found in `include/stdlib` with more
1325system and machine specific declarations in `include/stdlib/sys` and
1326`include/stdlib/machine`.
1327
1328The local C library implementations can be found in `lib/stdlib`. In order to
1329extend the C library these files may need to be modified. It is recommended to
1330use a release version of [FreeBSD] as a starting point.
1331
1332The C library header files in the [FreeBSD] source tree are located in the
1333`include` and `sys/sys` directories. [FreeBSD] machine specific definitions
1334can be found in the `sys/<machine-type>` directories. These files define things
1335like 'the size of a pointer' and 'the range of an integer'. Since an AArch64
1336port for [FreeBSD] does not yet exist, the machine specific definitions are
1337based on existing machine types with similar properties (for example SPARC64).
1338
1339Where possible, C library function implementations were taken from [FreeBSD]
1340as found in the `lib/libc` directory.
1341
1342A copy of the [FreeBSD] sources can be downloaded with `git`.
1343
1344 git clone git://github.com/freebsd/freebsd.git -b origin/release/9.2.0
1345
1346
Harry Liebeld265bd72014-01-31 19:04:10 +000013475. Storage abstraction layer
1348-----------------------------
1349
1350In order to improve platform independence and portability an storage abstraction
1351layer is used to load data from non-volatile platform storage.
1352
1353Each platform should register devices and their drivers via the Storage layer.
1354These drivers then need to be initialized by bootloader phases as
1355required in their respective `blx_platform_setup()` functions. Currently
1356storage access is only required by BL1 and BL2 phases. The `load_image()`
1357function uses the storage layer to access non-volatile platform storage.
1358
1359It is mandatory to implement at least one storage driver. For the FVP the
1360Firmware Image Package(FIP) driver is provided as the default means to load data
1361from storage (see the "Firmware Image Package" section in the [User Guide]).
1362The storage layer is described in the header file `include/io_storage.h`. The
1363implementation of the common library is in `lib/io_storage.c` and the driver
1364files are located in `drivers/io/`.
1365
1366Each IO driver must provide `io_dev_*` structures, as described in
1367`drivers/io/io_driver.h`. These are returned via a mandatory registration
1368function that is called on platform initialization. The semi-hosting driver
1369implementation in `io_semihosting.c` can be used as an example.
1370
1371The Storage layer provides mechanisms to initialize storage devices before
1372IO operations are called. The basic operations supported by the layer
1373include `open()`, `close()`, `read()`, `write()`, `size()` and `seek()`.
1374Drivers do not have to implement all operations, but each platform must
1375provide at least one driver for a device capable of supporting generic
1376operations such as loading a bootloader image.
1377
1378The current implementation only allows for known images to be loaded by the
Dan Handleyb68954c2014-05-29 12:30:24 +01001379firmware. These images are specified by using their names, as defined in
1380[include/plat/common/platform.h]. The platform layer (`plat_get_image_source()`)
1381then returns a reference to a device and a driver-specific `spec` which will be
1382understood by the driver to allow access to the image data.
Harry Liebeld265bd72014-01-31 19:04:10 +00001383
1384The layer is designed in such a way that is it possible to chain drivers with
1385other drivers. For example, file-system drivers may be implemented on top of
1386physical block devices, both represented by IO devices with corresponding
1387drivers. In such a case, the file-system "binding" with the block device may
1388be deferred until the file-system device is initialised.
1389
1390The abstraction currently depends on structures being statically allocated
1391by the drivers and callers, as the system does not yet provide a means of
1392dynamically allocating memory. This may also have the affect of limiting the
1393amount of open resources per driver.
1394
1395
Achin Gupta4f6ad662013-10-25 09:08:21 +01001396- - - - - - - - - - - - - - - - - - - - - - - - - -
1397
Dan Handleye83b0ca2014-01-14 18:17:09 +00001398_Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved._
Achin Gupta4f6ad662013-10-25 09:08:21 +01001399
1400
Achin Guptaa4fa3cb2014-06-02 22:27:36 +01001401[ARM GIC Architecture Specification]: http://arminfo.emea.arm.com/help/topic/com.arm.doc.ihi0048b/IHI0048B_gic_architecture_specification.pdf
1402[IMF Design Guide]: interrupt-framework-design.md
1403[User Guide]: user-guide.md
1404[FreeBSD]: http://www.freebsd.org
Achin Gupta4f6ad662013-10-25 09:08:21 +01001405
Andrew Thoelke2bf28e62014-03-20 10:48:23 +00001406[plat/common/aarch64/platform_mp_stack.S]: ../plat/common/aarch64/platform_mp_stack.S
1407[plat/common/aarch64/platform_up_stack.S]: ../plat/common/aarch64/platform_up_stack.S
Dan Handleyb68954c2014-05-29 12:30:24 +01001408[plat/fvp/include/platform_def.h]: ../plat/fvp/include/platform_def.h
1409[plat/fvp/include/plat_macros.S]: ../plat/fvp/include/plat_macros.S
Andrew Thoelke2bf28e62014-03-20 10:48:23 +00001410[plat/fvp/aarch64/plat_common.c]: ../plat/fvp/aarch64/plat_common.c
1411[plat/fvp/plat_pm.c]: ../plat/fvp/plat_pm.c
1412[include/runtime_svc.h]: ../include/runtime_svc.h
Dan Handleyb68954c2014-05-29 12:30:24 +01001413[include/plat/common/platform.h]: ../include/plat/common/platform.h