blob: 747cb005b6d4885d0c8d68513873e833b1eac7ad [file] [log] [blame] [view]
Achin Gupta4f6ad662013-10-25 09:08:21 +01001ARM Trusted Firmware Porting Guide
2==================================
3
4Contents
5--------
6
Joakim Bech14a5b342014-11-25 10:55:26 +010071. [Introduction](#1--introduction)
82. [Common Modifications](#2--common-modifications)
9 * [Common mandatory modifications](#21-common-mandatory-modifications)
10 * [Handling reset](#22-handling-reset)
11 * [Common optional modifications](#23-common-optional-modifications)
123. [Boot Loader stage specific modifications](#3--modifications-specific-to-a-boot-loader-stage)
13 * [Boot Loader stage 1 (BL1)](#31-boot-loader-stage-1-bl1)
14 * [Boot Loader stage 2 (BL2)](#32-boot-loader-stage-2-bl2)
15 * [Boot Loader stage 3-1 (BL3-1)](#32-boot-loader-stage-3-1-bl3-1)
16 * [PSCI implementation (in BL3-1)](#33-power-state-coordination-interface-in-bl3-1)
17 * [Interrupt Management framework (in BL3-1)](#34--interrupt-management-framework-in-bl3-1)
18 * [Crash Reporting mechanism (in BL3-1)](#35--crash-reporting-mechanism-in-bl3-1)
194. [Build flags](#4--build-flags)
205. [C Library](#5--c-library)
216. [Storage abstraction layer](#6--storage-abstraction-layer)
Achin Gupta4f6ad662013-10-25 09:08:21 +010022
23- - - - - - - - - - - - - - - - - -
24
251. Introduction
26----------------
27
28Porting the ARM Trusted Firmware to a new platform involves making some
29mandatory and optional modifications for both the cold and warm boot paths.
30Modifications consist of:
31
32* Implementing a platform-specific function or variable,
33* Setting up the execution context in a certain way, or
34* Defining certain constants (for example #defines).
35
Dan Handleyb68954c2014-05-29 12:30:24 +010036The platform-specific functions and variables are all declared in
37[include/plat/common/platform.h]. The firmware provides a default implementation
38of variables and functions to fulfill the optional requirements. These
39implementations are all weakly defined; they are provided to ease the porting
40effort. Each platform port can override them with its own implementation if the
41default implementation is inadequate.
Achin Gupta4f6ad662013-10-25 09:08:21 +010042
43Some modifications are common to all Boot Loader (BL) stages. Section 2
44discusses these in detail. The subsequent sections discuss the remaining
45modifications for each BL stage in detail.
46
47This document should be read in conjunction with the ARM Trusted Firmware
48[User Guide].
49
50
512. Common modifications
52------------------------
53
54This section covers the modifications that should be made by the platform for
55each BL stage to correctly port the firmware stack. They are categorized as
56either mandatory or optional.
57
58
592.1 Common mandatory modifications
60----------------------------------
61A platform port must enable the Memory Management Unit (MMU) with identity
62mapped page tables, and enable both the instruction and data caches for each BL
63stage. In the ARM FVP port, each BL stage configures the MMU in its platform-
64specific architecture setup function, for example `blX_plat_arch_setup()`.
65
Soby Mathewab8707e2015-01-08 18:02:44 +000066If the build option `USE_COHERENT_MEM` is enabled, each platform must allocate a
67block of identity mapped secure memory with Device-nGnRE attributes aligned to
68page boundary (4K) for each BL stage. This memory is identified by the section
69name `tzfw_coherent_mem` so that its possible for the firmware to place
70variables in it using the following C code directive:
Achin Gupta4f6ad662013-10-25 09:08:21 +010071
72 __attribute__ ((section("tzfw_coherent_mem")))
73
74Or alternatively the following assembler code directive:
75
76 .section tzfw_coherent_mem
77
78The `tzfw_coherent_mem` section is used to allocate any data structures that are
79accessed both when a CPU is executing with its MMU and caches enabled, and when
80it's running with its MMU and caches disabled. Examples are given below.
81
82The following variables, functions and constants must be defined by the platform
83for the firmware to work correctly.
84
85
Dan Handleyb68954c2014-05-29 12:30:24 +010086### File : platform_def.h [mandatory]
Achin Gupta4f6ad662013-10-25 09:08:21 +010087
Dan Handleyb68954c2014-05-29 12:30:24 +010088Each platform must ensure that a header file of this name is in the system
89include path with the following constants defined. This may require updating the
90list of `PLAT_INCLUDES` in the `platform.mk` file. In the ARM FVP port, this
91file is found in [plat/fvp/include/platform_def.h].
Achin Gupta4f6ad662013-10-25 09:08:21 +010092
James Morrisseyba3155b2013-10-29 10:56:46 +000093* **#define : PLATFORM_LINKER_FORMAT**
Achin Gupta4f6ad662013-10-25 09:08:21 +010094
95 Defines the linker format used by the platform, for example
96 `elf64-littleaarch64` used by the FVP.
97
James Morrisseyba3155b2013-10-29 10:56:46 +000098* **#define : PLATFORM_LINKER_ARCH**
Achin Gupta4f6ad662013-10-25 09:08:21 +010099
100 Defines the processor architecture for the linker by the platform, for
101 example `aarch64` used by the FVP.
102
James Morrisseyba3155b2013-10-29 10:56:46 +0000103* **#define : PLATFORM_STACK_SIZE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100104
105 Defines the normal stack memory available to each CPU. This constant is used
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000106 by [plat/common/aarch64/platform_mp_stack.S] and
107 [plat/common/aarch64/platform_up_stack.S].
108
James Morrisseyba3155b2013-10-29 10:56:46 +0000109* **#define : FIRMWARE_WELCOME_STR**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100110
111 Defines the character string printed by BL1 upon entry into the `bl1_main()`
112 function.
113
James Morrisseyba3155b2013-10-29 10:56:46 +0000114* **#define : BL2_IMAGE_NAME**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100115
116 Name of the BL2 binary image on the host file-system. This name is used by
Harry Liebeld265bd72014-01-31 19:04:10 +0000117 BL1 to load BL2 into secure memory from non-volatile storage.
118
119* **#define : BL31_IMAGE_NAME**
120
121 Name of the BL3-1 binary image on the host file-system. This name is used by
122 BL2 to load BL3-1 into secure memory from platform storage.
123
124* **#define : BL33_IMAGE_NAME**
125
126 Name of the BL3-3 binary image on the host file-system. This name is used by
127 BL2 to load BL3-3 into non-secure memory from platform storage.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100128
James Morrisseyba3155b2013-10-29 10:56:46 +0000129* **#define : PLATFORM_CACHE_LINE_SIZE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100130
131 Defines the size (in bytes) of the largest cache line across all the cache
132 levels in the platform.
133
James Morrisseyba3155b2013-10-29 10:56:46 +0000134* **#define : PLATFORM_CLUSTER_COUNT**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100135
136 Defines the total number of clusters implemented by the platform in the
137 system.
138
James Morrisseyba3155b2013-10-29 10:56:46 +0000139* **#define : PLATFORM_CORE_COUNT**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100140
141 Defines the total number of CPUs implemented by the platform across all
142 clusters in the system.
143
James Morrisseyba3155b2013-10-29 10:56:46 +0000144* **#define : PLATFORM_MAX_CPUS_PER_CLUSTER**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100145
146 Defines the maximum number of CPUs that can be implemented within a cluster
147 on the platform.
148
Andrew Thoelke6c0b45d2014-06-20 00:36:14 +0100149* **#define : PLATFORM_NUM_AFFS**
150
151 Defines the total number of nodes in the affinity heirarchy at all affinity
152 levels used by the platform.
153
Sandrine Bailleux638363e2014-05-21 17:08:26 +0100154* **#define : BL1_RO_BASE**
155
156 Defines the base address in secure ROM where BL1 originally lives. Must be
157 aligned on a page-size boundary.
158
159* **#define : BL1_RO_LIMIT**
160
161 Defines the maximum address in secure ROM that BL1's actual content (i.e.
162 excluding any data section allocated at runtime) can occupy.
163
164* **#define : BL1_RW_BASE**
165
166 Defines the base address in secure RAM where BL1's read-write data will live
167 at runtime. Must be aligned on a page-size boundary.
168
169* **#define : BL1_RW_LIMIT**
170
171 Defines the maximum address in secure RAM that BL1's read-write data can
172 occupy at runtime.
173
James Morrisseyba3155b2013-10-29 10:56:46 +0000174* **#define : BL2_BASE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100175
176 Defines the base address in secure RAM where BL1 loads the BL2 binary image.
Sandrine Bailleuxcd29b0a2013-11-27 10:32:17 +0000177 Must be aligned on a page-size boundary.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100178
Sandrine Bailleux638363e2014-05-21 17:08:26 +0100179* **#define : BL2_LIMIT**
180
181 Defines the maximum address in secure RAM that the BL2 image can occupy.
182
James Morrisseyba3155b2013-10-29 10:56:46 +0000183* **#define : BL31_BASE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100184
185 Defines the base address in secure RAM where BL2 loads the BL3-1 binary
Sandrine Bailleuxcd29b0a2013-11-27 10:32:17 +0000186 image. Must be aligned on a page-size boundary.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100187
Sandrine Bailleux638363e2014-05-21 17:08:26 +0100188* **#define : BL31_LIMIT**
189
190 Defines the maximum address in secure RAM that the BL3-1 image can occupy.
191
Harry Liebeld265bd72014-01-31 19:04:10 +0000192* **#define : NS_IMAGE_OFFSET**
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100193
Harry Liebeld265bd72014-01-31 19:04:10 +0000194 Defines the base address in non-secure DRAM where BL2 loads the BL3-3 binary
195 image. Must be aligned on a page-size boundary.
196
Dan Handley5a06bb72014-08-04 11:41:20 +0100197If a BL3-2 image is supported by the platform, the following constants must
198also be defined:
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100199
Dan Handley5a06bb72014-08-04 11:41:20 +0100200* **#define : BL32_IMAGE_NAME**
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100201
Dan Handley5a06bb72014-08-04 11:41:20 +0100202 Name of the BL3-2 binary image on the host file-system. This name is used by
203 BL2 to load BL3-2 into secure memory from platform storage.
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100204
205* **#define : BL32_BASE**
206
207 Defines the base address in secure memory where BL2 loads the BL3-2 binary
Dan Handley5a06bb72014-08-04 11:41:20 +0100208 image. Must be aligned on a page-size boundary.
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100209
210* **#define : BL32_LIMIT**
211
Dan Handley5a06bb72014-08-04 11:41:20 +0100212 Defines the maximum address that the BL3-2 image can occupy.
213
214If the Test Secure-EL1 Payload (TSP) instantiation of BL3-2 is supported by the
215platform, the following constants must also be defined:
216
217* **#define : TSP_SEC_MEM_BASE**
218
219 Defines the base address of the secure memory used by the TSP image on the
220 platform. This must be at the same address or below `BL32_BASE`.
221
222* **#define : TSP_SEC_MEM_SIZE**
223
224 Defines the size of the secure memory used by the BL3-2 image on the
225 platform. `TSP_SEC_MEM_BASE` and `TSP_SEC_MEM_SIZE` must fully accomodate
226 the memory required by the BL3-2 image, defined by `BL32_BASE` and
227 `BL32_LIMIT`.
228
229* **#define : TSP_IRQ_SEC_PHY_TIMER**
230
231 Defines the ID of the secure physical generic timer interrupt used by the
232 TSP's interrupt handling code.
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100233
Dan Handley6d16ce02014-08-04 18:31:43 +0100234If the platform port uses the IO storage framework, the following constants
235must also be defined:
236
237* **#define : MAX_IO_DEVICES**
238
239 Defines the maximum number of registered IO devices. Attempting to register
240 more devices than this value using `io_register_device()` will fail with
241 IO_RESOURCES_EXHAUSTED.
242
243* **#define : MAX_IO_HANDLES**
244
245 Defines the maximum number of open IO handles. Attempting to open more IO
246 entities than this value using `io_open()` will fail with
247 IO_RESOURCES_EXHAUSTED.
248
Soby Mathewab8707e2015-01-08 18:02:44 +0000249If the platform needs to allocate data within the per-cpu data framework in
250BL3-1, it should define the following macro. Currently this is only required if
251the platform decides not to use the coherent memory section by undefining the
252USE_COHERENT_MEM build flag. In this case, the framework allocates the required
253memory within the the per-cpu data to minimize wastage.
254
255* **#define : PLAT_PCPU_DATA_SIZE**
256
257 Defines the memory (in bytes) to be reserved within the per-cpu data
258 structure for use by the platform layer.
259
Sandrine Bailleux46d49f632014-06-23 17:00:23 +0100260The following constants are optional. They should be defined when the platform
261memory layout implies some image overlaying like on FVP.
262
263* **#define : BL31_PROGBITS_LIMIT**
264
265 Defines the maximum address in secure RAM that the BL3-1's progbits sections
266 can occupy.
267
Dan Handley5a06bb72014-08-04 11:41:20 +0100268* **#define : TSP_PROGBITS_LIMIT**
Sandrine Bailleux46d49f632014-06-23 17:00:23 +0100269
270 Defines the maximum address that the TSP's progbits sections can occupy.
Sandrine Bailleux2467f702014-05-20 17:22:24 +0100271
Dan Handleyb68954c2014-05-29 12:30:24 +0100272### File : plat_macros.S [mandatory]
Soby Mathewa43d4312014-04-07 15:28:55 +0100273
Dan Handleyb68954c2014-05-29 12:30:24 +0100274Each platform must ensure a file of this name is in the system include path with
275the following macro defined. In the ARM FVP port, this file is found in
276[plat/fvp/include/plat_macros.S].
Soby Mathewa43d4312014-04-07 15:28:55 +0100277
278* **Macro : plat_print_gic_regs**
279
280 This macro allows the crash reporting routine to print GIC registers
Soby Mathew8c106902014-07-16 09:23:52 +0100281 in case of an unhandled exception in BL3-1. This aids in debugging and
Soby Mathewa43d4312014-04-07 15:28:55 +0100282 this macro can be defined to be empty in case GIC register reporting is
283 not desired.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100284
Soby Mathew8c106902014-07-16 09:23:52 +0100285* **Macro : plat_print_interconnect_regs**
286
287 This macro allows the crash reporting routine to print interconnect registers
288 in case of an unhandled exception in BL3-1. This aids in debugging and
289 this macro can be defined to be empty in case interconnect register reporting
290 is not desired. In the ARM FVP port, the CCI snoop control registers are
291 reported.
292
Achin Gupta4f6ad662013-10-25 09:08:21 +0100293### Other mandatory modifications
294
James Morrisseyba3155b2013-10-29 10:56:46 +0000295The following mandatory modifications may be implemented in any file
Achin Gupta4f6ad662013-10-25 09:08:21 +0100296the implementer chooses. In the ARM FVP port, they are implemented in
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000297[plat/fvp/aarch64/plat_common.c].
Achin Gupta4f6ad662013-10-25 09:08:21 +0100298
Sandrine Bailleux9e864902014-03-31 11:25:18 +0100299* **Function : uint64_t plat_get_syscnt_freq(void)**
300
301 This function is used by the architecture setup code to retrieve the
302 counter frequency for the CPU's generic timer. This value will be
303 programmed into the `CNTFRQ_EL0` register.
304 In the ARM FVP port, it returns the base frequency of the system counter,
305 which is retrieved from the first entry in the frequency modes table.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100306
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000307
Vikram Kanigirie452cd82014-05-23 15:56:12 +01003082.2 Handling Reset
309------------------
310
311BL1 by default implements the reset vector where execution starts from a cold
312or warm boot. BL3-1 can be optionally set as a reset vector using the
313RESET_TO_BL31 make variable.
314
315For each CPU, the reset vector code is responsible for the following tasks:
316
3171. Distinguishing between a cold boot and a warm boot.
318
3192. In the case of a cold boot and the CPU being a secondary CPU, ensuring that
320 the CPU is placed in a platform-specific state until the primary CPU
321 performs the necessary steps to remove it from this state.
322
3233. In the case of a warm boot, ensuring that the CPU jumps to a platform-
324 specific address in the BL3-1 image in the same processor mode as it was
325 when released from reset.
326
327The following functions need to be implemented by the platform port to enable
328reset vector code to perform the above tasks.
329
330
331### Function : platform_get_entrypoint() [mandatory]
332
333 Argument : unsigned long
334 Return : unsigned int
335
336This function is called with the `SCTLR.M` and `SCTLR.C` bits disabled. The CPU
337is identified by its `MPIDR`, which is passed as the argument. The function is
338responsible for distinguishing between a warm and cold reset using platform-
339specific means. If it's a warm reset then it returns the entrypoint into the
340BL3-1 image that the CPU must jump to. If it's a cold reset then this function
341must return zero.
342
343This function is also responsible for implementing a platform-specific mechanism
344to handle the condition where the CPU has been warm reset but there is no
345entrypoint to jump to.
346
347This function does not follow the Procedure Call Standard used by the
348Application Binary Interface for the ARM 64-bit architecture. The caller should
349not assume that callee saved registers are preserved across a call to this
350function.
351
352This function fulfills requirement 1 and 3 listed above.
353
354
355### Function : plat_secondary_cold_boot_setup() [mandatory]
356
357 Argument : void
358 Return : void
359
360This function is called with the MMU and data caches disabled. It is responsible
361for placing the executing secondary CPU in a platform-specific state until the
362primary CPU performs the necessary actions to bring it out of that state and
363allow entry into the OS.
364
365In the ARM FVP port, each secondary CPU powers itself off. The primary CPU is
366responsible for powering up the secondary CPU when normal world software
367requires them.
368
369This function fulfills requirement 2 above.
370
371
Juan Castillo53fdceb2014-07-16 15:53:43 +0100372### Function : platform_is_primary_cpu() [mandatory]
373
374 Argument : unsigned long
375 Return : unsigned int
376
377This function identifies a CPU by its `MPIDR`, which is passed as the argument,
378to determine whether this CPU is the primary CPU or a secondary CPU. A return
379value of zero indicates that the CPU is not the primary CPU, while a non-zero
380return value indicates that the CPU is the primary CPU.
381
382
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100383### Function : platform_mem_init() [mandatory]
384
385 Argument : void
386 Return : void
387
388This function is called before any access to data is made by the firmware, in
389order to carry out any essential memory initialization.
390
391The ARM FVP port uses this function to initialize the mailbox memory used for
392providing the warm-boot entry-point addresses.
393
394
395
3962.3 Common optional modifications
Achin Gupta4f6ad662013-10-25 09:08:21 +0100397---------------------------------
398
399The following are helper functions implemented by the firmware that perform
400common platform-specific tasks. A platform may choose to override these
401definitions.
402
403
404### Function : platform_get_core_pos()
405
406 Argument : unsigned long
407 Return : int
408
409A platform may need to convert the `MPIDR` of a CPU to an absolute number, which
410can be used as a CPU-specific linear index into blocks of memory (for example
411while allocating per-CPU stacks). This routine contains a simple mechanism
412to perform this conversion, using the assumption that each cluster contains a
413maximum of 4 CPUs:
414
415 linear index = cpu_id + (cluster_id * 4)
416
417 cpu_id = 8-bit value in MPIDR at affinity level 0
418 cluster_id = 8-bit value in MPIDR at affinity level 1
419
420
Achin Gupta4f6ad662013-10-25 09:08:21 +0100421### Function : platform_set_stack()
422
423 Argument : unsigned long
424 Return : void
425
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000426This function sets the current stack pointer to the normal memory stack that
427has been allocated for the CPU specificed by MPIDR. For BL images that only
428require a stack for the primary CPU the parameter is ignored. The size of
429the stack allocated to each CPU is specified by the platform defined constant
430`PLATFORM_STACK_SIZE`.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100431
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000432Common implementations of this function for the UP and MP BL images are
433provided in [plat/common/aarch64/platform_up_stack.S] and
434[plat/common/aarch64/platform_mp_stack.S]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100435
436
Achin Guptac8afc782013-11-25 18:45:02 +0000437### Function : platform_get_stack()
438
439 Argument : unsigned long
440 Return : unsigned long
441
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000442This function returns the base address of the normal memory stack that
443has been allocated for the CPU specificed by MPIDR. For BL images that only
444require a stack for the primary CPU the parameter is ignored. The size of
445the stack allocated to each CPU is specified by the platform defined constant
446`PLATFORM_STACK_SIZE`.
Achin Guptac8afc782013-11-25 18:45:02 +0000447
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000448Common implementations of this function for the UP and MP BL images are
449provided in [plat/common/aarch64/platform_up_stack.S] and
450[plat/common/aarch64/platform_mp_stack.S]
Achin Guptac8afc782013-11-25 18:45:02 +0000451
452
Achin Gupta4f6ad662013-10-25 09:08:21 +0100453### Function : plat_report_exception()
454
455 Argument : unsigned int
456 Return : void
457
458A platform may need to report various information about its status when an
459exception is taken, for example the current exception level, the CPU security
460state (secure/non-secure), the exception type, and so on. This function is
461called in the following circumstances:
462
463* In BL1, whenever an exception is taken.
464* In BL2, whenever an exception is taken.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100465
466The default implementation doesn't do anything, to avoid making assumptions
467about the way the platform displays its status information.
468
469This function receives the exception type as its argument. Possible values for
Andrew Thoelke2bf28e62014-03-20 10:48:23 +0000470exceptions types are listed in the [include/runtime_svc.h] header file. Note
Achin Gupta4f6ad662013-10-25 09:08:21 +0100471that these constants are not related to any architectural exception code; they
472are just an ARM Trusted Firmware convention.
473
474
Soby Mathew24fb8382014-08-14 12:22:32 +0100475### Function : plat_reset_handler()
476
477 Argument : void
478 Return : void
479
480A platform may need to do additional initialization after reset. This function
481allows the platform to do the platform specific intializations. Platform
482specific errata workarounds could also be implemented here. The api should
483preserve the value in x10 register as it is used by the caller to store the
484return address.
485
Yatharth Kochar79a97b22014-11-20 18:09:41 +0000486The default implementation doesn't do anything. If a platform needs to override
487the default implementation, refer to the [Firmware Design Guide] for general
488guidelines regarding placement of code in a reset handler.
Soby Mathew24fb8382014-08-14 12:22:32 +0100489
Soby Mathewadd40352014-08-14 12:49:05 +0100490### Function : plat_disable_acp()
491
492 Argument : void
493 Return : void
494
495This api allows a platform to disable the Accelerator Coherency Port (if
496present) during a cluster power down sequence. The default weak implementation
497doesn't do anything. Since this api is called during the power down sequence,
498it has restrictions for stack usage and it can use the registers x0 - x17 as
499scratch registers. It should preserve the value in x18 register as it is used
500by the caller to store the return address.
501
Soby Mathew24fb8382014-08-14 12:22:32 +0100502
Achin Gupta4f6ad662013-10-25 09:08:21 +01005033. Modifications specific to a Boot Loader stage
504-------------------------------------------------
505
5063.1 Boot Loader Stage 1 (BL1)
507-----------------------------
508
509BL1 implements the reset vector where execution starts from after a cold or
510warm boot. For each CPU, BL1 is responsible for the following tasks:
511
Vikram Kanigirie452cd82014-05-23 15:56:12 +01005121. Handling the reset as described in section 2.2
Achin Gupta4f6ad662013-10-25 09:08:21 +0100513
5142. In the case of a cold boot and the CPU being the primary CPU, ensuring that
515 only this CPU executes the remaining BL1 code, including loading and passing
516 control to the BL2 stage.
517
Vikram Kanigirie452cd82014-05-23 15:56:12 +01005183. Loading the BL2 image from non-volatile storage into secure memory at the
Achin Gupta4f6ad662013-10-25 09:08:21 +0100519 address specified by the platform defined constant `BL2_BASE`.
520
Vikram Kanigirie452cd82014-05-23 15:56:12 +01005214. Populating a `meminfo` structure with the following information in memory,
Achin Gupta4f6ad662013-10-25 09:08:21 +0100522 accessible by BL2 immediately upon entry.
523
524 meminfo.total_base = Base address of secure RAM visible to BL2
525 meminfo.total_size = Size of secure RAM visible to BL2
526 meminfo.free_base = Base address of secure RAM available for
527 allocation to BL2
528 meminfo.free_size = Size of secure RAM available for allocation to BL2
529
530 BL1 places this `meminfo` structure at the beginning of the free memory
531 available for its use. Since BL1 cannot allocate memory dynamically at the
532 moment, its free memory will be available for BL2's use as-is. However, this
533 means that BL2 must read the `meminfo` structure before it starts using its
534 free memory (this is discussed in Section 3.2).
535
536 In future releases of the ARM Trusted Firmware it will be possible for
537 the platform to decide where it wants to place the `meminfo` structure for
538 BL2.
539
Sandrine Bailleux8f55dfb2014-06-24 14:02:34 +0100540 BL1 implements the `bl1_init_bl2_mem_layout()` function to populate the
Achin Gupta4f6ad662013-10-25 09:08:21 +0100541 BL2 `meminfo` structure. The platform may override this implementation, for
542 example if the platform wants to restrict the amount of memory visible to
543 BL2. Details of how to do this are given below.
544
545The following functions need to be implemented by the platform port to enable
546BL1 to perform the above tasks.
547
548
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100549### Function : bl1_plat_arch_setup() [mandatory]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100550
551 Argument : void
552 Return : void
553
Achin Gupta4f6ad662013-10-25 09:08:21 +0100554This function performs any platform-specific and architectural setup that the
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100555platform requires. Platform-specific setup might include configuration of
556memory controllers, configuration of the interconnect to allow the cluster
557to service cache snoop requests from another cluster, and so on.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100558
559In the ARM FVP port, this function enables CCI snoops into the cluster that the
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100560primary CPU is part of. It also enables the MMU.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100561
562This function helps fulfill requirement 2 above.
563
564
565### Function : bl1_platform_setup() [mandatory]
566
567 Argument : void
568 Return : void
569
570This function executes with the MMU and data caches enabled. It is responsible
571for performing any remaining platform-specific setup that can occur after the
572MMU and data cache have been enabled.
573
Harry Liebeld265bd72014-01-31 19:04:10 +0000574This function is also responsible for initializing the storage abstraction layer
575which is used to load further bootloader images.
576
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100577This function helps fulfill requirement 3 above.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100578
579
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000580### Function : bl1_plat_sec_mem_layout() [mandatory]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100581
582 Argument : void
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000583 Return : meminfo *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100584
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000585This function should only be called on the cold boot path. It executes with the
586MMU and data caches enabled. The pointer returned by this function must point to
587a `meminfo` structure containing the extents and availability of secure RAM for
588the BL1 stage.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100589
590 meminfo.total_base = Base address of secure RAM visible to BL1
591 meminfo.total_size = Size of secure RAM visible to BL1
592 meminfo.free_base = Base address of secure RAM available for allocation
593 to BL1
594 meminfo.free_size = Size of secure RAM available for allocation to BL1
595
596This information is used by BL1 to load the BL2 image in secure RAM. BL1 also
597populates a similar structure to tell BL2 the extents of memory available for
598its own use.
599
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100600This function helps fulfill requirement 3 above.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100601
602
Sandrine Bailleux8f55dfb2014-06-24 14:02:34 +0100603### Function : bl1_init_bl2_mem_layout() [optional]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100604
605 Argument : meminfo *, meminfo *, unsigned int, unsigned long
606 Return : void
607
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100608BL1 needs to tell the next stage the amount of secure RAM available
609for it to use. This information is populated in a `meminfo`
Achin Gupta4f6ad662013-10-25 09:08:21 +0100610structure.
611
612Depending upon where BL2 has been loaded in secure RAM (determined by
613`BL2_BASE`), BL1 calculates the amount of free memory available for BL2 to use.
614BL1 also ensures that its data sections resident in secure RAM are not visible
615to BL2. An illustration of how this is done in the ARM FVP port is given in the
616[User Guide], in the Section "Memory layout on Base FVP".
617
618
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100619### Function : bl1_plat_set_bl2_ep_info() [mandatory]
620
621 Argument : image_info *, entry_point_info *
622 Return : void
623
624This function is called after loading BL2 image and it can be used to overwrite
625the entry point set by loader and also set the security state and SPSR which
626represents the entry point system state for BL2.
627
628On FVP, we are setting the security state and the SPSR for the BL2 entrypoint
629
630
Achin Gupta4f6ad662013-10-25 09:08:21 +01006313.2 Boot Loader Stage 2 (BL2)
632-----------------------------
633
634The BL2 stage is executed only by the primary CPU, which is determined in BL1
635using the `platform_is_primary_cpu()` function. BL1 passed control to BL2 at
636`BL2_BASE`. BL2 executes in Secure EL1 and is responsible for:
637
Sandrine Bailleux93d81d62014-06-24 14:19:36 +01006381. (Optional) Loading the BL3-0 binary image (if present) from platform
639 provided non-volatile storage. To load the BL3-0 image, BL2 makes use of
640 the `meminfo` returned by the `bl2_plat_get_bl30_meminfo()` function.
641 The platform also defines the address in memory where BL3-0 is loaded
642 through the optional constant `BL30_BASE`. BL2 uses this information
643 to determine if there is enough memory to load the BL3-0 image.
644 Subsequent handling of the BL3-0 image is platform-specific and is
645 implemented in the `bl2_plat_handle_bl30()` function.
646 If `BL30_BASE` is not defined then this step is not performed.
647
6482. Loading the BL3-1 binary image into secure RAM from non-volatile storage. To
Harry Liebeld265bd72014-01-31 19:04:10 +0000649 load the BL3-1 image, BL2 makes use of the `meminfo` structure passed to it
650 by BL1. This structure allows BL2 to calculate how much secure RAM is
651 available for its use. The platform also defines the address in secure RAM
652 where BL3-1 is loaded through the constant `BL31_BASE`. BL2 uses this
653 information to determine if there is enough memory to load the BL3-1 image.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100654
Sandrine Bailleux93d81d62014-06-24 14:19:36 +01006553. (Optional) Loading the BL3-2 binary image (if present) from platform
Dan Handley1151c822014-04-15 11:38:38 +0100656 provided non-volatile storage. To load the BL3-2 image, BL2 makes use of
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100657 the `meminfo` returned by the `bl2_plat_get_bl32_meminfo()` function.
658 The platform also defines the address in memory where BL3-2 is loaded
659 through the optional constant `BL32_BASE`. BL2 uses this information
660 to determine if there is enough memory to load the BL3-2 image.
661 If `BL32_BASE` is not defined then this and the next step is not performed.
Achin Guptaa3050ed2014-02-19 17:52:35 +0000662
Sandrine Bailleux93d81d62014-06-24 14:19:36 +01006634. (Optional) Arranging to pass control to the BL3-2 image (if present) that
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100664 has been pre-loaded at `BL32_BASE`. BL2 populates an `entry_point_info`
Dan Handley1151c822014-04-15 11:38:38 +0100665 structure in memory provided by the platform with information about how
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100666 BL3-1 should pass control to the BL3-2 image.
Achin Guptaa3050ed2014-02-19 17:52:35 +0000667
Sandrine Bailleux93d81d62014-06-24 14:19:36 +01006685. Loading the normal world BL3-3 binary image into non-secure DRAM from
669 platform storage and arranging for BL3-1 to pass control to this image. This
670 address is determined using the `plat_get_ns_image_entrypoint()` function
671 described below.
672
6736. BL2 populates an `entry_point_info` structure in memory provided by the
674 platform with information about how BL3-1 should pass control to the
675 other BL images.
676
Achin Gupta4f6ad662013-10-25 09:08:21 +0100677The following functions must be implemented by the platform port to enable BL2
678to perform the above tasks.
679
680
681### Function : bl2_early_platform_setup() [mandatory]
682
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100683 Argument : meminfo *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100684 Return : void
685
686This function executes with the MMU and data caches disabled. It is only called
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100687by the primary CPU. The arguments to this function is the address of the
688`meminfo` structure populated by BL1.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100689
690The platform must copy the contents of the `meminfo` structure into a private
691variable as the original memory may be subsequently overwritten by BL2. The
692copied structure is made available to all BL2 code through the
Achin Guptae4d084e2014-02-19 17:18:23 +0000693`bl2_plat_sec_mem_layout()` function.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100694
695
696### Function : bl2_plat_arch_setup() [mandatory]
697
698 Argument : void
699 Return : void
700
701This function executes with the MMU and data caches disabled. It is only called
702by the primary CPU.
703
704The purpose of this function is to perform any architectural initialization
705that varies across platforms, for example enabling the MMU (since the memory
706map differs across platforms).
707
708
709### Function : bl2_platform_setup() [mandatory]
710
711 Argument : void
712 Return : void
713
714This function may execute with the MMU and data caches enabled if the platform
715port does the necessary initialization in `bl2_plat_arch_setup()`. It is only
716called by the primary CPU.
717
Achin Guptae4d084e2014-02-19 17:18:23 +0000718The purpose of this function is to perform any platform initialization
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100719specific to BL2. Platform security components are configured if required.
720For the Base FVP the TZC-400 TrustZone controller is configured to only
721grant non-secure access to DRAM. This avoids aliasing between secure and
722non-secure accesses in the TLB and cache - secure execution states can use
723the NS attributes in the MMU translation tables to access the DRAM.
Harry Liebelce19cf12014-04-01 19:28:07 +0100724
Harry Liebeld265bd72014-01-31 19:04:10 +0000725This function is also responsible for initializing the storage abstraction layer
726which is used to load further bootloader images.
727
Achin Gupta4f6ad662013-10-25 09:08:21 +0100728
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000729### Function : bl2_plat_sec_mem_layout() [mandatory]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100730
731 Argument : void
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000732 Return : meminfo *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100733
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000734This function should only be called on the cold boot path. It may execute with
735the MMU and data caches enabled if the platform port does the necessary
736initialization in `bl2_plat_arch_setup()`. It is only called by the primary CPU.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100737
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000738The purpose of this function is to return a pointer to a `meminfo` structure
739populated with the extents of secure RAM available for BL2 to use. See
Achin Gupta4f6ad662013-10-25 09:08:21 +0100740`bl2_early_platform_setup()` above.
741
742
Sandrine Bailleux93d81d62014-06-24 14:19:36 +0100743### Function : bl2_plat_get_bl30_meminfo() [mandatory]
744
745 Argument : meminfo *
746 Return : void
747
748This function is used to get the memory limits where BL2 can load the
749BL3-0 image. The meminfo provided by this is used by load_image() to
750validate whether the BL3-0 image can be loaded within the given
751memory from the given base.
752
753
754### Function : bl2_plat_handle_bl30() [mandatory]
755
756 Argument : image_info *
757 Return : int
758
759This function is called after loading BL3-0 image and it is used to perform any
760platform-specific actions required to handle the SCP firmware. Typically it
761transfers the image into SCP memory using a platform-specific protocol and waits
762until SCP executes it and signals to the Application Processor (AP) for BL2
763execution to continue.
764
765This function returns 0 on success, a negative error code otherwise.
766
767
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100768### Function : bl2_plat_get_bl31_params() [mandatory]
Harry Liebeld265bd72014-01-31 19:04:10 +0000769
770 Argument : void
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100771 Return : bl31_params *
Harry Liebeld265bd72014-01-31 19:04:10 +0000772
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100773BL2 platform code needs to return a pointer to a `bl31_params` structure it
774will use for passing information to BL3-1. The `bl31_params` structure carries
775the following information.
776 - Header describing the version information for interpreting the bl31_param
777 structure
778 - Information about executing the BL3-3 image in the `bl33_ep_info` field
779 - Information about executing the BL3-2 image in the `bl32_ep_info` field
780 - Information about the type and extents of BL3-1 image in the
781 `bl31_image_info` field
782 - Information about the type and extents of BL3-2 image in the
783 `bl32_image_info` field
784 - Information about the type and extents of BL3-3 image in the
785 `bl33_image_info` field
786
787The memory pointed by this structure and its sub-structures should be
788accessible from BL3-1 initialisation code. BL3-1 might choose to copy the
789necessary content, or maintain the structures until BL3-3 is initialised.
Harry Liebeld265bd72014-01-31 19:04:10 +0000790
791
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100792### Funtion : bl2_plat_get_bl31_ep_info() [mandatory]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100793
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100794 Argument : void
795 Return : entry_point_info *
796
797BL2 platform code returns a pointer which is used to populate the entry point
798information for BL3-1 entry point. The location pointed by it should be
799accessible from BL1 while processing the synchronous exception to run to BL3-1.
800
801On FVP this is allocated inside an bl2_to_bl31_params_mem structure which
802is allocated at an address pointed by PARAMS_BASE.
803
804
805### Function : bl2_plat_set_bl31_ep_info() [mandatory]
806
807 Argument : image_info *, entry_point_info *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100808 Return : void
809
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100810This function is called after loading BL3-1 image and it can be used to
811overwrite the entry point set by loader and also set the security state
812and SPSR which represents the entry point system state for BL3-1.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100813
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100814On FVP, we are setting the security state and the SPSR for the BL3-1
815entrypoint.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100816
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100817### Function : bl2_plat_set_bl32_ep_info() [mandatory]
818
819 Argument : image_info *, entry_point_info *
820 Return : void
821
822This function is called after loading BL3-2 image and it can be used to
823overwrite the entry point set by loader and also set the security state
824and SPSR which represents the entry point system state for BL3-2.
825
826On FVP, we are setting the security state and the SPSR for the BL3-2
827entrypoint
828
829### Function : bl2_plat_set_bl33_ep_info() [mandatory]
830
831 Argument : image_info *, entry_point_info *
832 Return : void
833
834This function is called after loading BL3-3 image and it can be used to
835overwrite the entry point set by loader and also set the security state
836and SPSR which represents the entry point system state for BL3-3.
837
838On FVP, we are setting the security state and the SPSR for the BL3-3
839entrypoint
840
841### Function : bl2_plat_get_bl32_meminfo() [mandatory]
842
843 Argument : meminfo *
844 Return : void
845
846This function is used to get the memory limits where BL2 can load the
847BL3-2 image. The meminfo provided by this is used by load_image() to
848validate whether the BL3-2 image can be loaded with in the given
849memory from the given base.
850
851### Function : bl2_plat_get_bl33_meminfo() [mandatory]
852
853 Argument : meminfo *
854 Return : void
855
856This function is used to get the memory limits where BL2 can load the
857BL3-3 image. The meminfo provided by this is used by load_image() to
858validate whether the BL3-3 image can be loaded with in the given
859memory from the given base.
860
861### Function : bl2_plat_flush_bl31_params() [mandatory]
862
863 Argument : void
864 Return : void
865
866Once BL2 has populated all the structures that needs to be read by BL1
867and BL3-1 including the bl31_params structures and its sub-structures,
868the bl31_ep_info structure and any platform specific data. It flushes
869all these data to the main memory so that it is available when we jump to
870later Bootloader stages with MMU off
Achin Gupta4f6ad662013-10-25 09:08:21 +0100871
872### Function : plat_get_ns_image_entrypoint() [mandatory]
873
874 Argument : void
875 Return : unsigned long
876
877As previously described, BL2 is responsible for arranging for control to be
878passed to a normal world BL image through BL3-1. This function returns the
879entrypoint of that image, which BL3-1 uses to jump to it.
880
Harry Liebeld265bd72014-01-31 19:04:10 +0000881BL2 is responsible for loading the normal world BL3-3 image (e.g. UEFI).
Achin Gupta4f6ad662013-10-25 09:08:21 +0100882
883
8843.2 Boot Loader Stage 3-1 (BL3-1)
885---------------------------------
886
887During cold boot, the BL3-1 stage is executed only by the primary CPU. This is
888determined in BL1 using the `platform_is_primary_cpu()` function. BL1 passes
889control to BL3-1 at `BL31_BASE`. During warm boot, BL3-1 is executed by all
890CPUs. BL3-1 executes at EL3 and is responsible for:
891
8921. Re-initializing all architectural and platform state. Although BL1 performs
893 some of this initialization, BL3-1 remains resident in EL3 and must ensure
894 that EL3 architectural and platform state is completely initialized. It
895 should make no assumptions about the system state when it receives control.
896
8972. Passing control to a normal world BL image, pre-loaded at a platform-
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100898 specific address by BL2. BL3-1 uses the `entry_point_info` structure that BL2
Achin Gupta4f6ad662013-10-25 09:08:21 +0100899 populated in memory to do this.
900
9013. Providing runtime firmware services. Currently, BL3-1 only implements a
902 subset of the Power State Coordination Interface (PSCI) API as a runtime
903 service. See Section 3.3 below for details of porting the PSCI
904 implementation.
905
Achin Gupta35ca3512014-02-19 17:58:33 +00009064. Optionally passing control to the BL3-2 image, pre-loaded at a platform-
907 specific address by BL2. BL3-1 exports a set of apis that allow runtime
908 services to specify the security state in which the next image should be
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100909 executed and run the corresponding image. BL3-1 uses the `entry_point_info`
910 structure populated by BL2 to do this.
911
912If BL3-1 is a reset vector, It also needs to handle the reset as specified in
913section 2.2 before the tasks described above.
Achin Gupta35ca3512014-02-19 17:58:33 +0000914
Achin Gupta4f6ad662013-10-25 09:08:21 +0100915The following functions must be implemented by the platform port to enable BL3-1
916to perform the above tasks.
917
918
919### Function : bl31_early_platform_setup() [mandatory]
920
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100921 Argument : bl31_params *, void *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100922 Return : void
923
924This function executes with the MMU and data caches disabled. It is only called
925by the primary CPU. The arguments to this function are:
926
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100927* The address of the `bl31_params` structure populated by BL2.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100928* An opaque pointer that the platform may use as needed.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100929
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100930The platform can copy the contents of the `bl31_params` structure and its
931sub-structures into private variables if the original memory may be
932subsequently overwritten by BL3-1 and similarly the `void *` pointing
933to the platform data also needs to be saved.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100934
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100935On the ARM FVP port, BL2 passes a pointer to a `bl31_params` structure populated
936in the secure DRAM at address `0x6000000` in the bl31_params * argument and it
937does not use opaque pointer mentioned earlier. BL3-1 does not copy this
938information to internal data structures as it guarantees that the secure
939DRAM memory will not be overwritten. It maintains an internal reference to this
940information in the `bl2_to_bl31_params` variable.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100941
942### Function : bl31_plat_arch_setup() [mandatory]
943
944 Argument : void
945 Return : void
946
947This function executes with the MMU and data caches disabled. It is only called
948by the primary CPU.
949
950The purpose of this function is to perform any architectural initialization
951that varies across platforms, for example enabling the MMU (since the memory
952map differs across platforms).
953
954
955### Function : bl31_platform_setup() [mandatory]
956
957 Argument : void
958 Return : void
959
960This function may execute with the MMU and data caches enabled if the platform
961port does the necessary initialization in `bl31_plat_arch_setup()`. It is only
962called by the primary CPU.
963
964The purpose of this function is to complete platform initialization so that both
965BL3-1 runtime services and normal world software can function correctly.
966
967The ARM FVP port does the following:
968* Initializes the generic interrupt controller.
969* Configures the CLCD controller.
Sandrine Bailleux9e864902014-03-31 11:25:18 +0100970* Enables system-level implementation of the generic timer counter.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100971* Grants access to the system counter timer module
972* Initializes the FVP power controller device
973* Detects the system topology.
974
975
976### Function : bl31_get_next_image_info() [mandatory]
977
Achin Gupta35ca3512014-02-19 17:58:33 +0000978 Argument : unsigned int
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100979 Return : entry_point_info *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100980
981This function may execute with the MMU and data caches enabled if the platform
982port does the necessary initializations in `bl31_plat_arch_setup()`.
983
984This function is called by `bl31_main()` to retrieve information provided by
Achin Gupta35ca3512014-02-19 17:58:33 +0000985BL2 for the next image in the security state specified by the argument. BL3-1
986uses this information to pass control to that image in the specified security
Vikram Kanigirie452cd82014-05-23 15:56:12 +0100987state. This function must return a pointer to the `entry_point_info` structure
Achin Gupta35ca3512014-02-19 17:58:33 +0000988(that was copied during `bl31_early_platform_setup()`) if the image exists. It
989should return NULL otherwise.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100990
991
Achin Gupta4f6ad662013-10-25 09:08:21 +01009923.3 Power State Coordination Interface (in BL3-1)
993------------------------------------------------
994
995The ARM Trusted Firmware's implementation of the PSCI API is based around the
996concept of an _affinity instance_. Each _affinity instance_ can be uniquely
997identified in a system by a CPU ID (the processor `MPIDR` is used in the PSCI
998interface) and an _affinity level_. A processing element (for example, a
999CPU) is at level 0. If the CPUs in the system are described in a tree where the
1000node above a CPU is a logical grouping of CPUs that share some state, then
1001affinity level 1 is that group of CPUs (for example, a cluster), and affinity
1002level 2 is a group of clusters (for example, the system). The implementation
1003assumes that the affinity level 1 ID can be computed from the affinity level 0
1004ID (for example, a unique cluster ID can be computed from the CPU ID). The
1005current implementation computes this on the basis of the recommended use of
1006`MPIDR` affinity fields in the ARM Architecture Reference Manual.
1007
1008BL3-1's platform initialization code exports a pointer to the platform-specific
1009power management operations required for the PSCI implementation to function
1010correctly. This information is populated in the `plat_pm_ops` structure. The
1011PSCI implementation calls members of the `plat_pm_ops` structure for performing
1012power management operations for each affinity instance. For example, the target
1013CPU is specified by its `MPIDR` in a PSCI `CPU_ON` call. The `affinst_on()`
1014handler (if present) is called for each affinity instance as the PSCI
1015implementation powers up each affinity level implemented in the `MPIDR` (for
1016example, CPU, cluster and system).
1017
1018The following functions must be implemented to initialize PSCI functionality in
1019the ARM Trusted Firmware.
1020
1021
1022### Function : plat_get_aff_count() [mandatory]
1023
1024 Argument : unsigned int, unsigned long
1025 Return : unsigned int
1026
1027This function may execute with the MMU and data caches enabled if the platform
1028port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
1029called by the primary CPU.
1030
1031This function is called by the PSCI initialization code to detect the system
1032topology. Its purpose is to return the number of affinity instances implemented
1033at a given `affinity level` (specified by the first argument) and a given
1034`MPIDR` (specified by the second argument). For example, on a dual-cluster
1035system where first cluster implements 2 CPUs and the second cluster implements 4
1036CPUs, a call to this function with an `MPIDR` corresponding to the first cluster
1037(`0x0`) and affinity level 0, would return 2. A call to this function with an
1038`MPIDR` corresponding to the second cluster (`0x100`) and affinity level 0,
1039would return 4.
1040
1041
1042### Function : plat_get_aff_state() [mandatory]
1043
1044 Argument : unsigned int, unsigned long
1045 Return : unsigned int
1046
1047This function may execute with the MMU and data caches enabled if the platform
1048port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
1049called by the primary CPU.
1050
1051This function is called by the PSCI initialization code. Its purpose is to
1052return the state of an affinity instance. The affinity instance is determined by
1053the affinity ID at a given `affinity level` (specified by the first argument)
1054and an `MPIDR` (specified by the second argument). The state can be one of
1055`PSCI_AFF_PRESENT` or `PSCI_AFF_ABSENT`. The latter state is used to cater for
1056system topologies where certain affinity instances are unimplemented. For
1057example, consider a platform that implements a single cluster with 4 CPUs and
1058another CPU implemented directly on the interconnect with the cluster. The
1059`MPIDR`s of the cluster would range from `0x0-0x3`. The `MPIDR` of the single
1060CPU would be 0x100 to indicate that it does not belong to cluster 0. Cluster 1
1061is missing but needs to be accounted for to reach this single CPU in the
1062topology tree. Hence it is marked as `PSCI_AFF_ABSENT`.
1063
1064
1065### Function : plat_get_max_afflvl() [mandatory]
1066
1067 Argument : void
1068 Return : int
1069
1070This function may execute with the MMU and data caches enabled if the platform
1071port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
1072called by the primary CPU.
1073
1074This function is called by the PSCI implementation both during cold and warm
1075boot, to determine the maximum affinity level that the power management
James Morrisseyba3155b2013-10-29 10:56:46 +00001076operations should apply to. ARMv8-A has support for 4 affinity levels. It is
Achin Gupta4f6ad662013-10-25 09:08:21 +01001077likely that hardware will implement fewer affinity levels. This function allows
1078the PSCI implementation to consider only those affinity levels in the system
1079that the platform implements. For example, the Base AEM FVP implements two
1080clusters with a configurable number of CPUs. It reports the maximum affinity
1081level as 1, resulting in PSCI power control up to the cluster level.
1082
1083
1084### Function : platform_setup_pm() [mandatory]
1085
Sandrine Bailleux44804252014-08-06 11:27:23 +01001086 Argument : const plat_pm_ops **
Achin Gupta4f6ad662013-10-25 09:08:21 +01001087 Return : int
1088
1089This function may execute with the MMU and data caches enabled if the platform
1090port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
1091called by the primary CPU.
1092
1093This function is called by PSCI initialization code. Its purpose is to export
1094handler routines for platform-specific power management actions by populating
1095the passed pointer with a pointer to BL3-1's private `plat_pm_ops` structure.
1096
1097A description of each member of this structure is given below. Please refer to
Sandrine Bailleux44804252014-08-06 11:27:23 +01001098the ARM FVP specific implementation of these handlers in [plat/fvp/fvp_pm.c]
Soby Mathew539dced2014-10-02 16:56:51 +01001099as an example. A platform port is expected to implement these handlers if the
1100corresponding PSCI operation is to be supported and these handlers are expected
1101to succeed if the return type is `void`.
Achin Gupta4f6ad662013-10-25 09:08:21 +01001102
1103#### plat_pm_ops.affinst_standby()
1104
1105Perform the platform-specific setup to enter the standby state indicated by the
Soby Mathew539dced2014-10-02 16:56:51 +01001106passed argument. The generic code expects the handler to succeed.
Achin Gupta4f6ad662013-10-25 09:08:21 +01001107
1108#### plat_pm_ops.affinst_on()
1109
1110Perform the platform specific setup to power on an affinity instance, specified
Soby Mathewe146f4c2014-09-26 15:08:52 +01001111by the `MPIDR` (first argument) and `affinity level` (third argument). The
1112`state` (fourth argument) contains the current state of that affinity instance
Achin Gupta4f6ad662013-10-25 09:08:21 +01001113(ON or OFF). This is useful to determine whether any action must be taken. For
1114example, while powering on a CPU, the cluster that contains this CPU might
1115already be in the ON state. The platform decides what actions must be taken to
1116transition from the current state to the target state (indicated by the power
Soby Mathew539dced2014-10-02 16:56:51 +01001117management operation). The generic code expects the platform to return
1118E_SUCCESS on success or E_INTERN_FAIL for any failure.
Achin Gupta4f6ad662013-10-25 09:08:21 +01001119
1120#### plat_pm_ops.affinst_off()
1121
Soby Mathewe146f4c2014-09-26 15:08:52 +01001122Perform the platform specific setup to power off an affinity instance of the
1123calling CPU. It is called by the PSCI `CPU_OFF` API implementation.
Achin Gupta4f6ad662013-10-25 09:08:21 +01001124
Soby Mathewe146f4c2014-09-26 15:08:52 +01001125The `affinity level` (first argument) and `state` (second argument) have
1126a similar meaning as described in the `affinst_on()` operation. They are
1127used to identify the affinity instance on which the call is made and its
1128current state. This gives the platform port an indication of the
Achin Gupta4f6ad662013-10-25 09:08:21 +01001129state transition it must make to perform the requested action. For example, if
1130the calling CPU is the last powered on CPU in the cluster, after powering down
1131affinity level 0 (CPU), the platform port should power down affinity level 1
Soby Mathew539dced2014-10-02 16:56:51 +01001132(the cluster) as well. The generic code expects the handler to succeed.
Achin Gupta4f6ad662013-10-25 09:08:21 +01001133
Achin Gupta4f6ad662013-10-25 09:08:21 +01001134#### plat_pm_ops.affinst_suspend()
1135
Soby Mathewe146f4c2014-09-26 15:08:52 +01001136Perform the platform specific setup to power off an affinity instance of the
1137calling CPU. It is called by the PSCI `CPU_SUSPEND` API
Achin Gupta4f6ad662013-10-25 09:08:21 +01001138implementation.
1139
Soby Mathewe146f4c2014-09-26 15:08:52 +01001140The `affinity level` (second argument) and `state` (third argument) have a
1141similar meaning as described in the `affinst_on()` operation. They are used to
1142identify the affinity instance on which the call is made and its current state.
1143This gives the platform port an indication of the state transition it must
1144make to perform the requested action. For example, if the calling CPU is the
1145last powered on CPU in the cluster, after powering down affinity level 0 (CPU),
1146the platform port should power down affinity level 1 (the cluster) as well.
Achin Gupta4f6ad662013-10-25 09:08:21 +01001147
1148The difference between turning an affinity instance off versus suspending it
1149is that in the former case, the affinity instance is expected to re-initialize
1150its state when its next powered on (see `affinst_on_finish()`). In the latter
1151case, the affinity instance is expected to save enough state so that it can
1152resume execution by restoring this state when its powered on (see
Soby Mathew539dced2014-10-02 16:56:51 +01001153`affinst_suspend_finish()`).The generic code expects the handler to succeed.
Achin Gupta4f6ad662013-10-25 09:08:21 +01001154
Achin Gupta4f6ad662013-10-25 09:08:21 +01001155#### plat_pm_ops.affinst_on_finish()
1156
1157This function is called by the PSCI implementation after the calling CPU is
1158powered on and released from reset in response to an earlier PSCI `CPU_ON` call.
1159It performs the platform-specific setup required to initialize enough state for
1160this CPU to enter the normal world and also provide secure runtime firmware
1161services.
1162
Soby Mathewe146f4c2014-09-26 15:08:52 +01001163The `affinity level` (first argument) and `state` (second argument) have a
Soby Mathew539dced2014-10-02 16:56:51 +01001164similar meaning as described in the previous operations. The generic code
1165expects the handler to succeed.
Achin Gupta4f6ad662013-10-25 09:08:21 +01001166
Achin Gupta4f6ad662013-10-25 09:08:21 +01001167#### plat_pm_ops.affinst_on_suspend()
1168
1169This function is called by the PSCI implementation after the calling CPU is
1170powered on and released from reset in response to an asynchronous wakeup
1171event, for example a timer interrupt that was programmed by the CPU during the
1172`CPU_SUSPEND` call. It performs the platform-specific setup required to
1173restore the saved state for this CPU to resume execution in the normal world
1174and also provide secure runtime firmware services.
1175
Soby Mathewe146f4c2014-09-26 15:08:52 +01001176The `affinity level` (first argument) and `state` (second argument) have a
Soby Mathew539dced2014-10-02 16:56:51 +01001177similar meaning as described in the previous operations. The generic code
1178expects the platform to succeed.
1179
1180#### plat_pm_ops.validate_power_state()
1181
1182This function is called by the PSCI implementation during the `CPU_SUSPEND`
1183call to validate the `power_state` parameter of the PSCI API. If the
1184`power_state` is known to be invalid, the platform must return
1185PSCI_E_INVALID_PARAMS as error, which is propagated back to the normal
1186world PSCI client.
1187
1188#### plat_pm_ops.validate_ns_entrypoint()
1189
1190This function is called by the PSCI implementation during the `CPU_SUSPEND`
1191and `CPU_ON` calls to validate the non-secure `entry_point` parameter passed
1192by the normal world. If the `entry_point` is known to be invalid, the platform
1193must return PSCI_E_INVALID_PARAMS as error, which is propagated back to the
1194normal world PSCI client.
Achin Gupta4f6ad662013-10-25 09:08:21 +01001195
Achin Gupta4f6ad662013-10-25 09:08:21 +01001196BL3-1 platform initialization code must also detect the system topology and
1197the state of each affinity instance in the topology. This information is
1198critical for the PSCI runtime service to function correctly. More details are
1199provided in the description of the `plat_get_aff_count()` and
1200`plat_get_aff_state()` functions above.
1201
Achin Guptaa4fa3cb2014-06-02 22:27:36 +010012023.4 Interrupt Management framework (in BL3-1)
1203----------------------------------------------
1204BL3-1 implements an Interrupt Management Framework (IMF) to manage interrupts
1205generated in either security state and targeted to EL1 or EL2 in the non-secure
1206state or EL3/S-EL1 in the secure state. The design of this framework is
1207described in the [IMF Design Guide]
1208
1209A platform should export the following APIs to support the IMF. The following
1210text briefly describes each api and its implementation on the FVP port. The API
1211implementation depends upon the type of interrupt controller present in the
1212platform. The FVP implements an ARM Generic Interrupt Controller (ARM GIC) as
1213per the version 2.0 of the [ARM GIC Architecture Specification]
1214
1215### Function : plat_interrupt_type_to_line() [mandatory]
1216
1217 Argument : uint32_t, uint32_t
1218 Return : uint32_t
1219
1220The ARM processor signals an interrupt exception either through the IRQ or FIQ
1221interrupt line. The specific line that is signaled depends on how the interrupt
1222controller (IC) reports different interrupt types from an execution context in
1223either security state. The IMF uses this API to determine which interrupt line
1224the platform IC uses to signal each type of interrupt supported by the framework
1225from a given security state.
1226
1227The first parameter will be one of the `INTR_TYPE_*` values (see [IMF Design
1228Guide]) indicating the target type of the interrupt, the second parameter is the
1229security state of the originating execution context. The return result is the
1230bit position in the `SCR_EL3` register of the respective interrupt trap: IRQ=1,
1231FIQ=2.
1232
1233The FVP port configures the ARM GIC to signal S-EL1 interrupts as FIQs and
1234Non-secure interrupts as IRQs from either security state.
1235
1236
1237### Function : plat_ic_get_pending_interrupt_type() [mandatory]
1238
1239 Argument : void
1240 Return : uint32_t
1241
1242This API returns the type of the highest priority pending interrupt at the
1243platform IC. The IMF uses the interrupt type to retrieve the corresponding
1244handler function. `INTR_TYPE_INVAL` is returned when there is no interrupt
1245pending. The valid interrupt types that can be returned are `INTR_TYPE_EL3`,
1246`INTR_TYPE_S_EL1` and `INTR_TYPE_NS`.
1247
1248The FVP port reads the _Highest Priority Pending Interrupt Register_
1249(`GICC_HPPIR`) to determine the id of the pending interrupt. The type of interrupt
1250depends upon the id value as follows.
1251
12521. id < 1022 is reported as a S-EL1 interrupt
12532. id = 1022 is reported as a Non-secure interrupt.
12543. id = 1023 is reported as an invalid interrupt type.
1255
1256
1257### Function : plat_ic_get_pending_interrupt_id() [mandatory]
1258
1259 Argument : void
1260 Return : uint32_t
1261
1262This API returns the id of the highest priority pending interrupt at the
1263platform IC. The IMF passes the id returned by this API to the registered
1264handler for the pending interrupt if the `IMF_READ_INTERRUPT_ID` build time flag
1265is set. INTR_ID_UNAVAILABLE is returned when there is no interrupt pending.
1266
1267The FVP port reads the _Highest Priority Pending Interrupt Register_
1268(`GICC_HPPIR`) to determine the id of the pending interrupt. The id that is
1269returned by API depends upon the value of the id read from the interrupt
1270controller as follows.
1271
12721. id < 1022. id is returned as is.
12732. id = 1022. The _Aliased Highest Priority Pending Interrupt Register_
1274 (`GICC_AHPPIR`) is read to determine the id of the non-secure interrupt. This
1275 id is returned by the API.
12763. id = 1023. `INTR_ID_UNAVAILABLE` is returned.
1277
1278
1279### Function : plat_ic_acknowledge_interrupt() [mandatory]
1280
1281 Argument : void
1282 Return : uint32_t
1283
1284This API is used by the CPU to indicate to the platform IC that processing of
1285the highest pending interrupt has begun. It should return the id of the
1286interrupt which is being processed.
1287
1288The FVP port reads the _Interrupt Acknowledge Register_ (`GICC_IAR`). This
1289changes the state of the highest priority pending interrupt from pending to
1290active in the interrupt controller. It returns the value read from the
1291`GICC_IAR`. This value is the id of the interrupt whose state has been changed.
1292
1293The TSP uses this API to start processing of the secure physical timer
1294interrupt.
1295
1296
1297### Function : plat_ic_end_of_interrupt() [mandatory]
1298
1299 Argument : uint32_t
1300 Return : void
1301
1302This API is used by the CPU to indicate to the platform IC that processing of
1303the interrupt corresponding to the id (passed as the parameter) has
1304finished. The id should be the same as the id returned by the
1305`plat_ic_acknowledge_interrupt()` API.
1306
1307The FVP port writes the id to the _End of Interrupt Register_
1308(`GICC_EOIR`). This deactivates the corresponding interrupt in the interrupt
1309controller.
1310
1311The TSP uses this API to finish processing of the secure physical timer
1312interrupt.
1313
1314
1315### Function : plat_ic_get_interrupt_type() [mandatory]
1316
1317 Argument : uint32_t
1318 Return : uint32_t
1319
1320This API returns the type of the interrupt id passed as the parameter.
1321`INTR_TYPE_INVAL` is returned if the id is invalid. If the id is valid, a valid
1322interrupt type (one of `INTR_TYPE_EL3`, `INTR_TYPE_S_EL1` and `INTR_TYPE_NS`) is
1323returned depending upon how the interrupt has been configured by the platform
1324IC.
1325
1326The FVP port configures S-EL1 interrupts as Group0 interrupts and Non-secure
1327interrupts as Group1 interrupts. It reads the group value corresponding to the
1328interrupt id from the relevant _Interrupt Group Register_ (`GICD_IGROUPRn`). It
1329uses the group value to determine the type of interrupt.
1330
Soby Mathewc67b09b2014-07-14 16:57:23 +010013313.5 Crash Reporting mechanism (in BL3-1)
1332----------------------------------------------
1333BL3-1 implements a crash reporting mechanism which prints the various registers
Sandrine Bailleux44804252014-08-06 11:27:23 +01001334of the CPU to enable quick crash analysis and debugging. It requires that a
1335console is designated as the crash console by the platform which will be used to
1336print the register dump.
Soby Mathewc67b09b2014-07-14 16:57:23 +01001337
Sandrine Bailleux44804252014-08-06 11:27:23 +01001338The following functions must be implemented by the platform if it wants crash
1339reporting mechanism in BL3-1. The functions are implemented in assembly so that
1340they can be invoked without a C Runtime stack.
Soby Mathewc67b09b2014-07-14 16:57:23 +01001341
1342### Function : plat_crash_console_init
1343
1344 Argument : void
1345 Return : int
1346
Sandrine Bailleux44804252014-08-06 11:27:23 +01001347This API is used by the crash reporting mechanism to initialize the crash
1348console. It should only use the general purpose registers x0 to x2 to do the
1349initialization and returns 1 on success.
Soby Mathewc67b09b2014-07-14 16:57:23 +01001350
Sandrine Bailleux44804252014-08-06 11:27:23 +01001351The FVP port designates the `PL011_UART0` as the crash console and calls the
Soby Mathewc67b09b2014-07-14 16:57:23 +01001352console_core_init() to initialize the console.
1353
1354### Function : plat_crash_console_putc
1355
1356 Argument : int
1357 Return : int
1358
1359This API is used by the crash reporting mechanism to print a character on the
1360designated crash console. It should only use general purpose registers x1 and
1361x2 to do its work. The parameter and the return value are in general purpose
1362register x0.
1363
Sandrine Bailleux44804252014-08-06 11:27:23 +01001364The FVP port designates the `PL011_UART0` as the crash console and calls the
Soby Mathewc67b09b2014-07-14 16:57:23 +01001365console_core_putc() to print the character on the console.
Achin Gupta4f6ad662013-10-25 09:08:21 +01001366
Soby Mathew27713fb2014-09-08 17:51:01 +010013674. Build flags
1368---------------
1369
1370There are some build flags which can be defined by the platform to control
1371inclusion or exclusion of certain BL stages from the FIP image. These flags
1372need to be defined in the platform makefile which will get included by the
1373build system.
1374
1375* **NEED_BL30**
1376 This flag if defined by the platform mandates that a BL3-0 binary should
1377 be included in the FIP image. The path to the BL3-0 binary can be specified
1378 by the `BL30` build option (see build options in the [User Guide]).
1379
1380* **NEED_BL33**
1381 By default, this flag is defined `yes` by the build system and `BL33`
1382 build option should be supplied as a build option. The platform has the option
1383 of excluding the BL3-3 image in the `fip` image by defining this flag to
1384 `no`.
1385
13865. C Library
Harry Liebela960f282013-12-12 16:03:44 +00001387-------------
1388
1389To avoid subtle toolchain behavioral dependencies, the header files provided
1390by the compiler are not used. The software is built with the `-nostdinc` flag
1391to ensure no headers are included from the toolchain inadvertently. Instead the
1392required headers are included in the ARM Trusted Firmware source tree. The
1393library only contains those C library definitions required by the local
1394implementation. If more functionality is required, the needed library functions
1395will need to be added to the local implementation.
1396
1397Versions of [FreeBSD] headers can be found in `include/stdlib`. Some of these
1398headers have been cut down in order to simplify the implementation. In order to
1399minimize changes to the header files, the [FreeBSD] layout has been maintained.
1400The generic C library definitions can be found in `include/stdlib` with more
1401system and machine specific declarations in `include/stdlib/sys` and
1402`include/stdlib/machine`.
1403
1404The local C library implementations can be found in `lib/stdlib`. In order to
1405extend the C library these files may need to be modified. It is recommended to
1406use a release version of [FreeBSD] as a starting point.
1407
1408The C library header files in the [FreeBSD] source tree are located in the
1409`include` and `sys/sys` directories. [FreeBSD] machine specific definitions
1410can be found in the `sys/<machine-type>` directories. These files define things
1411like 'the size of a pointer' and 'the range of an integer'. Since an AArch64
1412port for [FreeBSD] does not yet exist, the machine specific definitions are
1413based on existing machine types with similar properties (for example SPARC64).
1414
1415Where possible, C library function implementations were taken from [FreeBSD]
1416as found in the `lib/libc` directory.
1417
1418A copy of the [FreeBSD] sources can be downloaded with `git`.
1419
1420 git clone git://github.com/freebsd/freebsd.git -b origin/release/9.2.0
1421
1422
Soby Mathew27713fb2014-09-08 17:51:01 +010014236. Storage abstraction layer
Harry Liebeld265bd72014-01-31 19:04:10 +00001424-----------------------------
1425
1426In order to improve platform independence and portability an storage abstraction
1427layer is used to load data from non-volatile platform storage.
1428
1429Each platform should register devices and their drivers via the Storage layer.
1430These drivers then need to be initialized by bootloader phases as
1431required in their respective `blx_platform_setup()` functions. Currently
1432storage access is only required by BL1 and BL2 phases. The `load_image()`
1433function uses the storage layer to access non-volatile platform storage.
1434
1435It is mandatory to implement at least one storage driver. For the FVP the
1436Firmware Image Package(FIP) driver is provided as the default means to load data
1437from storage (see the "Firmware Image Package" section in the [User Guide]).
1438The storage layer is described in the header file `include/io_storage.h`. The
1439implementation of the common library is in `lib/io_storage.c` and the driver
1440files are located in `drivers/io/`.
1441
1442Each IO driver must provide `io_dev_*` structures, as described in
1443`drivers/io/io_driver.h`. These are returned via a mandatory registration
1444function that is called on platform initialization. The semi-hosting driver
1445implementation in `io_semihosting.c` can be used as an example.
1446
1447The Storage layer provides mechanisms to initialize storage devices before
1448IO operations are called. The basic operations supported by the layer
1449include `open()`, `close()`, `read()`, `write()`, `size()` and `seek()`.
1450Drivers do not have to implement all operations, but each platform must
1451provide at least one driver for a device capable of supporting generic
1452operations such as loading a bootloader image.
1453
1454The current implementation only allows for known images to be loaded by the
Dan Handleyb68954c2014-05-29 12:30:24 +01001455firmware. These images are specified by using their names, as defined in
1456[include/plat/common/platform.h]. The platform layer (`plat_get_image_source()`)
1457then returns a reference to a device and a driver-specific `spec` which will be
1458understood by the driver to allow access to the image data.
Harry Liebeld265bd72014-01-31 19:04:10 +00001459
1460The layer is designed in such a way that is it possible to chain drivers with
1461other drivers. For example, file-system drivers may be implemented on top of
1462physical block devices, both represented by IO devices with corresponding
1463drivers. In such a case, the file-system "binding" with the block device may
1464be deferred until the file-system device is initialised.
1465
1466The abstraction currently depends on structures being statically allocated
1467by the drivers and callers, as the system does not yet provide a means of
1468dynamically allocating memory. This may also have the affect of limiting the
1469amount of open resources per driver.
1470
1471
Achin Gupta4f6ad662013-10-25 09:08:21 +01001472- - - - - - - - - - - - - - - - - - - - - - - - - -
1473
Dan Handleye83b0ca2014-01-14 18:17:09 +00001474_Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved._
Achin Gupta4f6ad662013-10-25 09:08:21 +01001475
1476
Achin Guptaa4fa3cb2014-06-02 22:27:36 +01001477[ARM GIC Architecture Specification]: http://arminfo.emea.arm.com/help/topic/com.arm.doc.ihi0048b/IHI0048B_gic_architecture_specification.pdf
1478[IMF Design Guide]: interrupt-framework-design.md
1479[User Guide]: user-guide.md
1480[FreeBSD]: http://www.freebsd.org
Yatharth Kochar79a97b22014-11-20 18:09:41 +00001481[Firmware Design Guide]: firmware-design.md
Achin Gupta4f6ad662013-10-25 09:08:21 +01001482
Andrew Thoelke2bf28e62014-03-20 10:48:23 +00001483[plat/common/aarch64/platform_mp_stack.S]: ../plat/common/aarch64/platform_mp_stack.S
1484[plat/common/aarch64/platform_up_stack.S]: ../plat/common/aarch64/platform_up_stack.S
Dan Handleyb68954c2014-05-29 12:30:24 +01001485[plat/fvp/include/platform_def.h]: ../plat/fvp/include/platform_def.h
1486[plat/fvp/include/plat_macros.S]: ../plat/fvp/include/plat_macros.S
Andrew Thoelke2bf28e62014-03-20 10:48:23 +00001487[plat/fvp/aarch64/plat_common.c]: ../plat/fvp/aarch64/plat_common.c
1488[plat/fvp/plat_pm.c]: ../plat/fvp/plat_pm.c
1489[include/runtime_svc.h]: ../include/runtime_svc.h
Dan Handleyb68954c2014-05-29 12:30:24 +01001490[include/plat/common/platform.h]: ../include/plat/common/platform.h