blob: aa1451fd92a1977353191d83091206d22cb78157 [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
10 * Common optional modifications
113. Boot Loader stage specific modifications
12 * Boot Loader stage 1 (BL1)
13 * Boot Loader stage 2 (BL2)
14 * Boot Loader stage 3-1 (BL3-1)
15 * PSCI implementation (in BL3-1)
16
17- - - - - - - - - - - - - - - - - -
18
191. Introduction
20----------------
21
22Porting the ARM Trusted Firmware to a new platform involves making some
23mandatory and optional modifications for both the cold and warm boot paths.
24Modifications consist of:
25
26* Implementing a platform-specific function or variable,
27* Setting up the execution context in a certain way, or
28* Defining certain constants (for example #defines).
29
30The firmware provides a default implementation of variables and functions to
31fulfill the optional requirements. These implementations are all weakly defined;
32they are provided to ease the porting effort. Each platform port can override
33them with its own implementation if the default implementation is inadequate.
34
35Some modifications are common to all Boot Loader (BL) stages. Section 2
36discusses these in detail. The subsequent sections discuss the remaining
37modifications for each BL stage in detail.
38
39This document should be read in conjunction with the ARM Trusted Firmware
40[User Guide].
41
42
432. Common modifications
44------------------------
45
46This section covers the modifications that should be made by the platform for
47each BL stage to correctly port the firmware stack. They are categorized as
48either mandatory or optional.
49
50
512.1 Common mandatory modifications
52----------------------------------
53A platform port must enable the Memory Management Unit (MMU) with identity
54mapped page tables, and enable both the instruction and data caches for each BL
55stage. In the ARM FVP port, each BL stage configures the MMU in its platform-
56specific architecture setup function, for example `blX_plat_arch_setup()`.
57
58Each platform must allocate a block of identity mapped secure memory with
59Device-nGnRE attributes aligned to page boundary (4K) for each BL stage. This
60memory is identified by the section name `tzfw_coherent_mem` so that its
61possible for the firmware to place variables in it using the following C code
62directive:
63
64 __attribute__ ((section("tzfw_coherent_mem")))
65
66Or alternatively the following assembler code directive:
67
68 .section tzfw_coherent_mem
69
70The `tzfw_coherent_mem` section is used to allocate any data structures that are
71accessed both when a CPU is executing with its MMU and caches enabled, and when
72it's running with its MMU and caches disabled. Examples are given below.
73
74The following variables, functions and constants must be defined by the platform
75for the firmware to work correctly.
76
77
78### File : platform.h [mandatory]
79
80Each platform must export a header file of this name with the following
81constants defined. In the ARM FVP port, this file is found in
82[../plat/fvp/platform.h].
83
James Morrisseyba3155b2013-10-29 10:56:46 +000084* **#define : PLATFORM_LINKER_FORMAT**
Achin Gupta4f6ad662013-10-25 09:08:21 +010085
86 Defines the linker format used by the platform, for example
87 `elf64-littleaarch64` used by the FVP.
88
James Morrisseyba3155b2013-10-29 10:56:46 +000089* **#define : PLATFORM_LINKER_ARCH**
Achin Gupta4f6ad662013-10-25 09:08:21 +010090
91 Defines the processor architecture for the linker by the platform, for
92 example `aarch64` used by the FVP.
93
James Morrisseyba3155b2013-10-29 10:56:46 +000094* **#define : PLATFORM_STACK_SIZE**
Achin Gupta4f6ad662013-10-25 09:08:21 +010095
96 Defines the normal stack memory available to each CPU. This constant is used
97 by `platform_set_stack()`.
98
James Morrisseyba3155b2013-10-29 10:56:46 +000099* **#define : FIRMWARE_WELCOME_STR**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100100
101 Defines the character string printed by BL1 upon entry into the `bl1_main()`
102 function.
103
James Morrisseyba3155b2013-10-29 10:56:46 +0000104* **#define : BL2_IMAGE_NAME**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100105
106 Name of the BL2 binary image on the host file-system. This name is used by
107 BL1 to load BL2 into secure memory using semi-hosting.
108
James Morrisseyba3155b2013-10-29 10:56:46 +0000109* **#define : PLATFORM_CACHE_LINE_SIZE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100110
111 Defines the size (in bytes) of the largest cache line across all the cache
112 levels in the platform.
113
James Morrisseyba3155b2013-10-29 10:56:46 +0000114* **#define : PLATFORM_CLUSTER_COUNT**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100115
116 Defines the total number of clusters implemented by the platform in the
117 system.
118
James Morrisseyba3155b2013-10-29 10:56:46 +0000119* **#define : PLATFORM_CORE_COUNT**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100120
121 Defines the total number of CPUs implemented by the platform across all
122 clusters in the system.
123
James Morrisseyba3155b2013-10-29 10:56:46 +0000124* **#define : PLATFORM_MAX_CPUS_PER_CLUSTER**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100125
126 Defines the maximum number of CPUs that can be implemented within a cluster
127 on the platform.
128
James Morrisseyba3155b2013-10-29 10:56:46 +0000129* **#define : PRIMARY_CPU**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100130
131 Defines the `MPIDR` of the primary CPU on the platform. This value is used
132 after a cold boot to distinguish between primary and secondary CPUs.
133
James Morrisseyba3155b2013-10-29 10:56:46 +0000134* **#define : TZROM_BASE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100135
136 Defines the base address of secure ROM on the platform, where the BL1 binary
137 is loaded. This constant is used by the linker scripts to ensure that the
138 BL1 image fits into the available memory.
139
James Morrisseyba3155b2013-10-29 10:56:46 +0000140* **#define : TZROM_SIZE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100141
142 Defines the size of secure ROM on the platform. This constant is used by the
143 linker scripts to ensure that the BL1 image fits into the available memory.
144
James Morrisseyba3155b2013-10-29 10:56:46 +0000145* **#define : TZRAM_BASE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100146
147 Defines the base address of the secure RAM on platform, where the data
148 section of the BL1 binary is loaded. The BL2 and BL3-1 images are also
149 loaded in this secure RAM region. This constant is used by the linker
150 scripts to ensure that the BL1 data section and BL2/BL3-1 binary images fit
151 into the available memory.
152
James Morrisseyba3155b2013-10-29 10:56:46 +0000153* **#define : TZRAM_SIZE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100154
155 Defines the size of the secure RAM on the platform. This constant is used by
156 the linker scripts to ensure that the BL1 data section and BL2/BL3-1 binary
157 images fit into the available memory.
158
James Morrisseyba3155b2013-10-29 10:56:46 +0000159* **#define : SYS_CNTCTL_BASE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100160
161 Defines the base address of the `CNTCTLBase` frame of the memory mapped
162 counter and timer in the system level implementation of the generic timer.
163
James Morrisseyba3155b2013-10-29 10:56:46 +0000164* **#define : BL2_BASE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100165
166 Defines the base address in secure RAM where BL1 loads the BL2 binary image.
Sandrine Bailleuxcd29b0a2013-11-27 10:32:17 +0000167 Must be aligned on a page-size boundary.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100168
James Morrisseyba3155b2013-10-29 10:56:46 +0000169* **#define : BL31_BASE**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100170
171 Defines the base address in secure RAM where BL2 loads the BL3-1 binary
Sandrine Bailleuxcd29b0a2013-11-27 10:32:17 +0000172 image. Must be aligned on a page-size boundary.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100173
174
175### Other mandatory modifications
176
James Morrisseyba3155b2013-10-29 10:56:46 +0000177The following mandatory modifications may be implemented in any file
Achin Gupta4f6ad662013-10-25 09:08:21 +0100178the implementer chooses. In the ARM FVP port, they are implemented in
179[../plat/fvp/aarch64/fvp_common.c].
180
James Morrisseyba3155b2013-10-29 10:56:46 +0000181* **Variable : unsigned char platform_normal_stacks[X][Y]**
Achin Gupta4f6ad662013-10-25 09:08:21 +0100182
183 where X = PLATFORM_STACK_SIZE
184 and Y = PLATFORM_CORE_COUNT
185
186 Each platform must allocate a block of memory with Normal Cacheable, Write
187 back, Write allocate and Inner Shareable attributes aligned to the size (in
188 bytes) of the largest cache line amongst all caches implemented in the
189 system. A pointer to this memory should be exported with the name
190 `platform_normal_stacks`. This pointer is used by the common platform helper
Achin Guptac8afc782013-11-25 18:45:02 +0000191 functions `platform_set_stack()` (to allocate a stack for each CPU in the
192 platform) & `platform_get_stack()` (to return the base address of that
193 stack) (see [../plat/common/aarch64/platform_helpers.S]).
Achin Gupta4f6ad662013-10-25 09:08:21 +0100194
195
1962.2 Common optional modifications
197---------------------------------
198
199The following are helper functions implemented by the firmware that perform
200common platform-specific tasks. A platform may choose to override these
201definitions.
202
203
204### Function : platform_get_core_pos()
205
206 Argument : unsigned long
207 Return : int
208
209A platform may need to convert the `MPIDR` of a CPU to an absolute number, which
210can be used as a CPU-specific linear index into blocks of memory (for example
211while allocating per-CPU stacks). This routine contains a simple mechanism
212to perform this conversion, using the assumption that each cluster contains a
213maximum of 4 CPUs:
214
215 linear index = cpu_id + (cluster_id * 4)
216
217 cpu_id = 8-bit value in MPIDR at affinity level 0
218 cluster_id = 8-bit value in MPIDR at affinity level 1
219
220
221### Function : platform_set_coherent_stack()
222
223 Argument : unsigned long
224 Return : void
225
226A platform may need stack memory that is coherent with main memory to perform
227certain operations like:
228
229* Turning the MMU on, or
230* Flushing caches prior to powering down a CPU or cluster.
231
232Each BL stage allocates this coherent stack memory for each CPU in the
233`tzfw_coherent_mem` section. A pointer to this memory (`pcpu_dv_mem_stack`) is
234used by this function to allocate a coherent stack for each CPU. A CPU is
235identified by its `MPIDR`, which is passed as an argument to this function.
236
237The size of the stack allocated to each CPU is specified by the constant
238`PCPU_DV_MEM_STACK_SIZE`.
239
240
241### Function : platform_is_primary_cpu()
242
243 Argument : unsigned long
244 Return : unsigned int
245
246This function identifies a CPU by its `MPIDR`, which is passed as the argument,
247to determine whether this CPU is the primary CPU or a secondary CPU. A return
248value of zero indicates that the CPU is not the primary CPU, while a non-zero
249return value indicates that the CPU is the primary CPU.
250
251
252### Function : platform_set_stack()
253
254 Argument : unsigned long
255 Return : void
256
257This function uses the `platform_normal_stacks` pointer variable to allocate
258stacks to each CPU. Further details are given in the description of the
259`platform_normal_stacks` variable below. A CPU is identified by its `MPIDR`,
260which is passed as the argument.
261
262The size of the stack allocated to each CPU is specified by the platform defined
263constant `PLATFORM_STACK_SIZE`.
264
265
Achin Guptac8afc782013-11-25 18:45:02 +0000266### Function : platform_get_stack()
267
268 Argument : unsigned long
269 Return : unsigned long
270
271This function uses the `platform_normal_stacks` pointer variable to return the
272base address of the stack memory reserved for a CPU. Further details are given
273in the description of the `platform_normal_stacks` variable below. A CPU is
274identified by its `MPIDR`, which is passed as the argument.
275
276The size of the stack allocated to each CPU is specified by the platform defined
277constant `PLATFORM_STACK_SIZE`.
278
279
Achin Gupta4f6ad662013-10-25 09:08:21 +0100280### Function : plat_report_exception()
281
282 Argument : unsigned int
283 Return : void
284
285A platform may need to report various information about its status when an
286exception is taken, for example the current exception level, the CPU security
287state (secure/non-secure), the exception type, and so on. This function is
288called in the following circumstances:
289
290* In BL1, whenever an exception is taken.
291* In BL2, whenever an exception is taken.
292* In BL3-1, whenever an asynchronous exception or a synchronous exception
293 other than an SMC32/SMC64 exception is taken.
294
295The default implementation doesn't do anything, to avoid making assumptions
296about the way the platform displays its status information.
297
298This function receives the exception type as its argument. Possible values for
299exceptions types are listed in the [../include/runtime_svc.h] header file. Note
300that these constants are not related to any architectural exception code; they
301are just an ARM Trusted Firmware convention.
302
303
3043. Modifications specific to a Boot Loader stage
305-------------------------------------------------
306
3073.1 Boot Loader Stage 1 (BL1)
308-----------------------------
309
310BL1 implements the reset vector where execution starts from after a cold or
311warm boot. For each CPU, BL1 is responsible for the following tasks:
312
3131. Distinguishing between a cold boot and a warm boot.
314
3152. In the case of a cold boot and the CPU being the primary CPU, ensuring that
316 only this CPU executes the remaining BL1 code, including loading and passing
317 control to the BL2 stage.
318
3193. 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
3234. 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
3275. Loading the BL2 image in secure memory using semi-hosting at the
328 address specified by the platform defined constant `BL2_BASE`.
329
3306. Populating a `meminfo` structure with the following information in memory,
331 accessible by BL2 immediately upon entry.
332
333 meminfo.total_base = Base address of secure RAM visible to BL2
334 meminfo.total_size = Size of secure RAM visible to BL2
335 meminfo.free_base = Base address of secure RAM available for
336 allocation to BL2
337 meminfo.free_size = Size of secure RAM available for allocation to BL2
338
339 BL1 places this `meminfo` structure at the beginning of the free memory
340 available for its use. Since BL1 cannot allocate memory dynamically at the
341 moment, its free memory will be available for BL2's use as-is. However, this
342 means that BL2 must read the `meminfo` structure before it starts using its
343 free memory (this is discussed in Section 3.2).
344
345 In future releases of the ARM Trusted Firmware it will be possible for
346 the platform to decide where it wants to place the `meminfo` structure for
347 BL2.
348
349 BL1 implements the `init_bl2_mem_layout()` function to populate the
350 BL2 `meminfo` structure. The platform may override this implementation, for
351 example if the platform wants to restrict the amount of memory visible to
352 BL2. Details of how to do this are given below.
353
354The following functions need to be implemented by the platform port to enable
355BL1 to perform the above tasks.
356
357
358### Function : platform_get_entrypoint() [mandatory]
359
360 Argument : unsigned long
361 Return : unsigned int
362
363This function is called with the `SCTLR.M` and `SCTLR.C` bits disabled. The CPU
364is identified by its `MPIDR`, which is passed as the argument. The function is
365responsible for distinguishing between a warm and cold reset using platform-
366specific means. If it's a warm reset then it returns the entrypoint into the
367BL3-1 image that the CPU must jump to. If it's a cold reset then this function
368must return zero.
369
370This function is also responsible for implementing a platform-specific mechanism
371to handle the condition where the CPU has been warm reset but there is no
372entrypoint to jump to.
373
374This function does not follow the Procedure Call Standard used by the
375Application Binary Interface for the ARM 64-bit architecture. The caller should
376not assume that callee saved registers are preserved across a call to this
377function.
378
379This function fulfills requirement 1 listed above.
380
381
382### Function : plat_secondary_cold_boot_setup() [mandatory]
383
384 Argument : void
385 Return : void
386
387This function is called with the MMU and data caches disabled. It is responsible
388for placing the executing secondary CPU in a platform-specific state until the
389primary CPU performs the necessary actions to bring it out of that state and
390allow entry into the OS.
391
392In the ARM FVP port, each secondary CPU powers itself off. The primary CPU is
393responsible for powering up the secondary CPU when normal world software
394requires them.
395
396This function fulfills requirement 3 above.
397
398
399### Function : platform_cold_boot_init() [mandatory]
400
401 Argument : unsigned long
402 Return : unsigned int
403
404This function executes with the MMU and data caches disabled. It is only called
405by the primary CPU. The argument to this function is the address of the
406`bl1_main()` routine where the generic BL1-specific actions are performed.
407This function performs any platform-specific and architectural setup that the
408platform requires to make execution of `bl1_main()` possible.
409
410The platform must enable the MMU with identity mapped page tables and enable
411caches by setting the `SCTLR.I` and `SCTLR.C` bits.
412
413Platform-specific setup might include configuration of memory controllers,
414configuration of the interconnect to allow the cluster to service cache snoop
415requests from another cluster, zeroing of the ZI section, and so on.
416
417In the ARM FVP port, this function enables CCI snoops into the cluster that the
418primary CPU is part of. It also enables the MMU and initializes the ZI section
419in the BL1 image through the use of linker defined symbols.
420
421This function helps fulfill requirement 2 above.
422
423
424### Function : bl1_platform_setup() [mandatory]
425
426 Argument : void
427 Return : void
428
429This function executes with the MMU and data caches enabled. It is responsible
430for performing any remaining platform-specific setup that can occur after the
431MMU and data cache have been enabled.
432
433In the ARM FVP port, it zeros out the ZI section, enables the system level
434implementation of the generic timer counter and initializes the console.
435
436This function helps fulfill requirement 5 above.
437
438
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000439### Function : bl1_plat_sec_mem_layout() [mandatory]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100440
441 Argument : void
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000442 Return : meminfo *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100443
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000444This function should only be called on the cold boot path. It executes with the
445MMU and data caches enabled. The pointer returned by this function must point to
446a `meminfo` structure containing the extents and availability of secure RAM for
447the BL1 stage.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100448
449 meminfo.total_base = Base address of secure RAM visible to BL1
450 meminfo.total_size = Size of secure RAM visible to BL1
451 meminfo.free_base = Base address of secure RAM available for allocation
452 to BL1
453 meminfo.free_size = Size of secure RAM available for allocation to BL1
454
455This information is used by BL1 to load the BL2 image in secure RAM. BL1 also
456populates a similar structure to tell BL2 the extents of memory available for
457its own use.
458
459This function helps fulfill requirement 5 above.
460
461
462### Function : init_bl2_mem_layout() [optional]
463
464 Argument : meminfo *, meminfo *, unsigned int, unsigned long
465 Return : void
466
467Each BL stage needs to tell the next stage the amount of secure RAM available
468for it to use. For example, as part of handing control to BL2, BL1 informs BL2
469of the extents of secure RAM available for BL2 to use. BL2 must do the same when
470passing control to BL3-1. This information is populated in a `meminfo`
471structure.
472
473Depending upon where BL2 has been loaded in secure RAM (determined by
474`BL2_BASE`), BL1 calculates the amount of free memory available for BL2 to use.
475BL1 also ensures that its data sections resident in secure RAM are not visible
476to BL2. An illustration of how this is done in the ARM FVP port is given in the
477[User Guide], in the Section "Memory layout on Base FVP".
478
479
4803.2 Boot Loader Stage 2 (BL2)
481-----------------------------
482
483The BL2 stage is executed only by the primary CPU, which is determined in BL1
484using the `platform_is_primary_cpu()` function. BL1 passed control to BL2 at
485`BL2_BASE`. BL2 executes in Secure EL1 and is responsible for:
486
4871. Loading the BL3-1 binary image in secure RAM using semi-hosting. To load the
488 BL3-1 image, BL2 makes use of the `meminfo` structure passed to it by BL1.
489 This structure allows BL2 to calculate how much secure RAM is available for
490 its use. The platform also defines the address in secure RAM where BL3-1 is
491 loaded through the constant `BL31_BASE`. BL2 uses this information to
492 determine if there is enough memory to load the BL3-1 image.
493
4942. Arranging to pass control to a normal world BL image that has been
495 pre-loaded at a platform-specific address. This address is determined using
496 the `plat_get_ns_image_entrypoint()` function described below.
497
498 BL2 populates an `el_change_info` structure in memory provided by the
499 platform with information about how BL3-1 should pass control to the normal
500 world BL image.
501
5023. Populating a `meminfo` structure with the following information in
503 memory that is accessible by BL3-1 immediately upon entry.
504
505 meminfo.total_base = Base address of secure RAM visible to BL3-1
506 meminfo.total_size = Size of secure RAM visible to BL3-1
507 meminfo.free_base = Base address of secure RAM available for allocation
508 to BL3-1
509 meminfo.free_size = Size of secure RAM available for allocation to
510 BL3-1
511
512 BL2 places this `meminfo` structure in memory provided by the
513 platform (`bl2_el_change_mem_ptr`). BL2 implements the
514 `init_bl31_mem_layout()` function to populate the BL3-1 meminfo structure
515 described above. The platform may override this implementation, for example
516 if the platform wants to restrict the amount of memory visible to BL3-1.
517 Details of this function are given below.
518
519The following functions must be implemented by the platform port to enable BL2
520to perform the above tasks.
521
522
523### Function : bl2_early_platform_setup() [mandatory]
524
525 Argument : meminfo *, void *
526 Return : void
527
528This function executes with the MMU and data caches disabled. It is only called
529by the primary CPU. The arguments to this function are:
530
531* The address of the `meminfo` structure populated by BL1
532* An opaque pointer that the platform may use as needed.
533
534The platform must copy the contents of the `meminfo` structure into a private
535variable as the original memory may be subsequently overwritten by BL2. The
536copied structure is made available to all BL2 code through the
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000537`bl2_plat_sec_mem_layout()` function.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100538
539
540### Function : bl2_plat_arch_setup() [mandatory]
541
542 Argument : void
543 Return : void
544
545This function executes with the MMU and data caches disabled. It is only called
546by the primary CPU.
547
548The purpose of this function is to perform any architectural initialization
549that varies across platforms, for example enabling the MMU (since the memory
550map differs across platforms).
551
552
553### Function : bl2_platform_setup() [mandatory]
554
555 Argument : void
556 Return : void
557
558This function may execute with the MMU and data caches enabled if the platform
559port does the necessary initialization in `bl2_plat_arch_setup()`. It is only
560called by the primary CPU.
561
562The purpose of this function is to perform any platform initialization specific
563to BL2. This function must initialize a pointer to memory
564(`bl2_el_change_mem_ptr`), which can then be used to populate an
565`el_change_info` structure. The underlying requirement is that the platform must
566initialize this pointer before the `get_el_change_mem_ptr()` function
567accesses it in `bl2_main()`.
568
569The ARM FVP port initializes this pointer to the base address of Secure DRAM
570(`0x06000000`).
571
572
573### Variable : unsigned char bl2_el_change_mem_ptr[EL_CHANGE_MEM_SIZE] [mandatory]
574
575As mentioned in the description of `bl2_platform_setup()`, this pointer is
576initialized by the platform to point to memory where an `el_change_info`
577structure can be populated.
578
579
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000580### Function : bl2_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 may execute with
586the MMU and data caches enabled if the platform port does the necessary
587initialization in `bl2_plat_arch_setup()`. It is only called by the primary CPU.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100588
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000589The purpose of this function is to return a pointer to a `meminfo` structure
590populated with the extents of secure RAM available for BL2 to use. See
Achin Gupta4f6ad662013-10-25 09:08:21 +0100591`bl2_early_platform_setup()` above.
592
593
594### Function : init_bl31_mem_layout() [optional]
595
596 Argument : meminfo *, meminfo *, unsigned int
597 Return : void
598
599Each BL stage needs to tell the next stage the amount of secure RAM that is
600available for it to use. For example, as part of handing control to BL2, BL1
601must inform BL2 about the extents of secure RAM that is available for BL2 to
602use. BL2 must do the same when passing control to BL3-1. This information is
603populated in a `meminfo` structure.
604
605Depending upon where BL3-1 has been loaded in secure RAM (determined by
606`BL31_BASE`), BL2 calculates the amount of free memory available for BL3-1 to
607use. BL2 also ensures that BL3-1 is able reclaim memory occupied by BL2. This
608is done because BL2 never executes again after passing control to BL3-1.
609An illustration of how this is done in the ARM FVP port is given in the
610[User Guide], in the section "Memory layout on Base FVP".
611
612
613### Function : plat_get_ns_image_entrypoint() [mandatory]
614
615 Argument : void
616 Return : unsigned long
617
618As previously described, BL2 is responsible for arranging for control to be
619passed to a normal world BL image through BL3-1. This function returns the
620entrypoint of that image, which BL3-1 uses to jump to it.
621
622The ARM FVP port assumes that flash memory has been pre-loaded with the UEFI
623image, and so returns the base address of flash memory.
624
625
6263.2 Boot Loader Stage 3-1 (BL3-1)
627---------------------------------
628
629During cold boot, the BL3-1 stage is executed only by the primary CPU. This is
630determined in BL1 using the `platform_is_primary_cpu()` function. BL1 passes
631control to BL3-1 at `BL31_BASE`. During warm boot, BL3-1 is executed by all
632CPUs. BL3-1 executes at EL3 and is responsible for:
633
6341. Re-initializing all architectural and platform state. Although BL1 performs
635 some of this initialization, BL3-1 remains resident in EL3 and must ensure
636 that EL3 architectural and platform state is completely initialized. It
637 should make no assumptions about the system state when it receives control.
638
6392. Passing control to a normal world BL image, pre-loaded at a platform-
640 specific address by BL2. BL3-1 uses the `el_change_info` structure that BL2
641 populated in memory to do this.
642
6433. Providing runtime firmware services. Currently, BL3-1 only implements a
644 subset of the Power State Coordination Interface (PSCI) API as a runtime
645 service. See Section 3.3 below for details of porting the PSCI
646 implementation.
647
648The following functions must be implemented by the platform port to enable BL3-1
649to perform the above tasks.
650
651
652### Function : bl31_early_platform_setup() [mandatory]
653
654 Argument : meminfo *, void *, unsigned long
655 Return : void
656
657This function executes with the MMU and data caches disabled. It is only called
658by the primary CPU. The arguments to this function are:
659
660* The address of the `meminfo` structure populated by BL2.
661* An opaque pointer that the platform may use as needed.
662* The `MPIDR` of the primary CPU.
663
664The platform must copy the contents of the `meminfo` structure into a private
665variable as the original memory may be subsequently overwritten by BL3-1. The
666copied structure is made available to all BL3-1 code through the
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000667`bl31_plat_sec_mem_layout()` function.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100668
669
670### Function : bl31_plat_arch_setup() [mandatory]
671
672 Argument : void
673 Return : void
674
675This function executes with the MMU and data caches disabled. It is only called
676by the primary CPU.
677
678The purpose of this function is to perform any architectural initialization
679that varies across platforms, for example enabling the MMU (since the memory
680map differs across platforms).
681
682
683### Function : bl31_platform_setup() [mandatory]
684
685 Argument : void
686 Return : void
687
688This function may execute with the MMU and data caches enabled if the platform
689port does the necessary initialization in `bl31_plat_arch_setup()`. It is only
690called by the primary CPU.
691
692The purpose of this function is to complete platform initialization so that both
693BL3-1 runtime services and normal world software can function correctly.
694
695The ARM FVP port does the following:
696* Initializes the generic interrupt controller.
697* Configures the CLCD controller.
698* Grants access to the system counter timer module
699* Initializes the FVP power controller device
700* Detects the system topology.
701
702
703### Function : bl31_get_next_image_info() [mandatory]
704
705 Argument : unsigned long
706 Return : el_change_info *
707
708This function may execute with the MMU and data caches enabled if the platform
709port does the necessary initializations in `bl31_plat_arch_setup()`.
710
711This function is called by `bl31_main()` to retrieve information provided by
712BL2, so that BL3-1 can pass control to the normal world software image. This
713function must return a pointer to the `el_change_info` structure (that was
714copied during `bl31_early_platform_setup()`).
715
716
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000717### Function : bl31_plat_sec_mem_layout() [mandatory]
Achin Gupta4f6ad662013-10-25 09:08:21 +0100718
719 Argument : void
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000720 Return : meminfo *
Achin Gupta4f6ad662013-10-25 09:08:21 +0100721
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000722This function should only be called on the cold boot path. This function may
723execute with the MMU and data caches enabled if the platform port does the
724necessary initializations in `bl31_plat_arch_setup()`. It is only called by the
725primary CPU.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100726
Sandrine Bailleuxee12f6f2013-11-28 14:55:58 +0000727The purpose of this function is to return a pointer to a `meminfo` structure
728populated with the extents of secure RAM available for BL3-1 to use. See
Achin Gupta4f6ad662013-10-25 09:08:21 +0100729`bl31_early_platform_setup()` above.
730
731
7323.3 Power State Coordination Interface (in BL3-1)
733------------------------------------------------
734
735The ARM Trusted Firmware's implementation of the PSCI API is based around the
736concept of an _affinity instance_. Each _affinity instance_ can be uniquely
737identified in a system by a CPU ID (the processor `MPIDR` is used in the PSCI
738interface) and an _affinity level_. A processing element (for example, a
739CPU) is at level 0. If the CPUs in the system are described in a tree where the
740node above a CPU is a logical grouping of CPUs that share some state, then
741affinity level 1 is that group of CPUs (for example, a cluster), and affinity
742level 2 is a group of clusters (for example, the system). The implementation
743assumes that the affinity level 1 ID can be computed from the affinity level 0
744ID (for example, a unique cluster ID can be computed from the CPU ID). The
745current implementation computes this on the basis of the recommended use of
746`MPIDR` affinity fields in the ARM Architecture Reference Manual.
747
748BL3-1's platform initialization code exports a pointer to the platform-specific
749power management operations required for the PSCI implementation to function
750correctly. This information is populated in the `plat_pm_ops` structure. The
751PSCI implementation calls members of the `plat_pm_ops` structure for performing
752power management operations for each affinity instance. For example, the target
753CPU is specified by its `MPIDR` in a PSCI `CPU_ON` call. The `affinst_on()`
754handler (if present) is called for each affinity instance as the PSCI
755implementation powers up each affinity level implemented in the `MPIDR` (for
756example, CPU, cluster and system).
757
758The following functions must be implemented to initialize PSCI functionality in
759the ARM Trusted Firmware.
760
761
762### Function : plat_get_aff_count() [mandatory]
763
764 Argument : unsigned int, unsigned long
765 Return : unsigned int
766
767This function may execute with the MMU and data caches enabled if the platform
768port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
769called by the primary CPU.
770
771This function is called by the PSCI initialization code to detect the system
772topology. Its purpose is to return the number of affinity instances implemented
773at a given `affinity level` (specified by the first argument) and a given
774`MPIDR` (specified by the second argument). For example, on a dual-cluster
775system where first cluster implements 2 CPUs and the second cluster implements 4
776CPUs, a call to this function with an `MPIDR` corresponding to the first cluster
777(`0x0`) and affinity level 0, would return 2. A call to this function with an
778`MPIDR` corresponding to the second cluster (`0x100`) and affinity level 0,
779would return 4.
780
781
782### Function : plat_get_aff_state() [mandatory]
783
784 Argument : unsigned int, unsigned long
785 Return : unsigned int
786
787This function may execute with the MMU and data caches enabled if the platform
788port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
789called by the primary CPU.
790
791This function is called by the PSCI initialization code. Its purpose is to
792return the state of an affinity instance. The affinity instance is determined by
793the affinity ID at a given `affinity level` (specified by the first argument)
794and an `MPIDR` (specified by the second argument). The state can be one of
795`PSCI_AFF_PRESENT` or `PSCI_AFF_ABSENT`. The latter state is used to cater for
796system topologies where certain affinity instances are unimplemented. For
797example, consider a platform that implements a single cluster with 4 CPUs and
798another CPU implemented directly on the interconnect with the cluster. The
799`MPIDR`s of the cluster would range from `0x0-0x3`. The `MPIDR` of the single
800CPU would be 0x100 to indicate that it does not belong to cluster 0. Cluster 1
801is missing but needs to be accounted for to reach this single CPU in the
802topology tree. Hence it is marked as `PSCI_AFF_ABSENT`.
803
804
805### Function : plat_get_max_afflvl() [mandatory]
806
807 Argument : void
808 Return : int
809
810This function may execute with the MMU and data caches enabled if the platform
811port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
812called by the primary CPU.
813
814This function is called by the PSCI implementation both during cold and warm
815boot, to determine the maximum affinity level that the power management
James Morrisseyba3155b2013-10-29 10:56:46 +0000816operations should apply to. ARMv8-A has support for 4 affinity levels. It is
Achin Gupta4f6ad662013-10-25 09:08:21 +0100817likely that hardware will implement fewer affinity levels. This function allows
818the PSCI implementation to consider only those affinity levels in the system
819that the platform implements. For example, the Base AEM FVP implements two
820clusters with a configurable number of CPUs. It reports the maximum affinity
821level as 1, resulting in PSCI power control up to the cluster level.
822
823
824### Function : platform_setup_pm() [mandatory]
825
826 Argument : plat_pm_ops **
827 Return : int
828
829This function may execute with the MMU and data caches enabled if the platform
830port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
831called by the primary CPU.
832
833This function is called by PSCI initialization code. Its purpose is to export
834handler routines for platform-specific power management actions by populating
835the passed pointer with a pointer to BL3-1's private `plat_pm_ops` structure.
836
837A description of each member of this structure is given below. Please refer to
838the ARM FVP specific implementation of these handlers in [../plat/fvp/fvp_pm.c]
839as an example. A platform port may choose not implement some of the power
840management operations. For example, the ARM FVP port does not implement the
841`affinst_standby()` function.
842
843#### plat_pm_ops.affinst_standby()
844
845Perform the platform-specific setup to enter the standby state indicated by the
846passed argument.
847
848#### plat_pm_ops.affinst_on()
849
850Perform the platform specific setup to power on an affinity instance, specified
851by the `MPIDR` (first argument) and `affinity level` (fourth argument). The
852`state` (fifth argument) contains the current state of that affinity instance
853(ON or OFF). This is useful to determine whether any action must be taken. For
854example, while powering on a CPU, the cluster that contains this CPU might
855already be in the ON state. The platform decides what actions must be taken to
856transition from the current state to the target state (indicated by the power
857management operation).
858
859#### plat_pm_ops.affinst_off()
860
861Perform the platform specific setup to power off an affinity instance in the
862`MPIDR` of the calling CPU. It is called by the PSCI `CPU_OFF` API
863implementation.
864
865The `MPIDR` (first argument), `affinity level` (second argument) and `state`
866(third argument) have a similar meaning as described in the `affinst_on()`
867operation. They are used to identify the affinity instance on which the call
868is made and its current state. This gives the platform port an indication of the
869state transition it must make to perform the requested action. For example, if
870the calling CPU is the last powered on CPU in the cluster, after powering down
871affinity level 0 (CPU), the platform port should power down affinity level 1
872(the cluster) as well.
873
874This function is called with coherent stacks. This allows the PSCI
875implementation to flush caches at a given affinity level without running into
James Morrisseyba3155b2013-10-29 10:56:46 +0000876stale stack state after turning off the caches. On ARMv8-A cache hits do not
877occur after the cache has been turned off.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100878
879#### plat_pm_ops.affinst_suspend()
880
881Perform the platform specific setup to power off an affinity instance in the
882`MPIDR` of the calling CPU. It is called by the PSCI `CPU_SUSPEND` API
883implementation.
884
885The `MPIDR` (first argument), `affinity level` (third argument) and `state`
886(fifth argument) have a similar meaning as described in the `affinst_on()`
887operation. They are used to identify the affinity instance on which the call
888is made and its current state. This gives the platform port an indication of the
889state transition it must make to perform the requested action. For example, if
890the calling CPU is the last powered on CPU in the cluster, after powering down
891affinity level 0 (CPU), the platform port should power down affinity level 1
892(the cluster) as well.
893
894The difference between turning an affinity instance off versus suspending it
895is that in the former case, the affinity instance is expected to re-initialize
896its state when its next powered on (see `affinst_on_finish()`). In the latter
897case, the affinity instance is expected to save enough state so that it can
898resume execution by restoring this state when its powered on (see
899`affinst_suspend_finish()`).
900
901This function is called with coherent stacks. This allows the PSCI
902implementation to flush caches at a given affinity level without running into
James Morrisseyba3155b2013-10-29 10:56:46 +0000903stale stack state after turning off the caches. On ARMv8-A cache hits do not
904occur after the cache has been turned off.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100905
906#### plat_pm_ops.affinst_on_finish()
907
908This function is called by the PSCI implementation after the calling CPU is
909powered on and released from reset in response to an earlier PSCI `CPU_ON` call.
910It performs the platform-specific setup required to initialize enough state for
911this CPU to enter the normal world and also provide secure runtime firmware
912services.
913
914The `MPIDR` (first argument), `affinity level` (second argument) and `state`
915(third argument) have a similar meaning as described in the previous operations.
916
917This function is called with coherent stacks. This allows the PSCI
918implementation to flush caches at a given affinity level without running into
James Morrisseyba3155b2013-10-29 10:56:46 +0000919stale stack state after turning off the caches. On ARMv8-A cache hits do not
920occur after the cache has been turned off.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100921
922#### plat_pm_ops.affinst_on_suspend()
923
924This function is called by the PSCI implementation after the calling CPU is
925powered on and released from reset in response to an asynchronous wakeup
926event, for example a timer interrupt that was programmed by the CPU during the
927`CPU_SUSPEND` call. It performs the platform-specific setup required to
928restore the saved state for this CPU to resume execution in the normal world
929and also provide secure runtime firmware services.
930
931The `MPIDR` (first argument), `affinity level` (second argument) and `state`
932(third argument) have a similar meaning as described in the previous operations.
933
934This function is called with coherent stacks. This allows the PSCI
935implementation to flush caches at a given affinity level without running into
James Morrisseyba3155b2013-10-29 10:56:46 +0000936stale stack state after turning off the caches. On ARMv8-A cache hits do not
937occur after the cache has been turned off.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100938
939BL3-1 platform initialization code must also detect the system topology and
940the state of each affinity instance in the topology. This information is
941critical for the PSCI runtime service to function correctly. More details are
942provided in the description of the `plat_get_aff_count()` and
943`plat_get_aff_state()` functions above.
944
945
946- - - - - - - - - - - - - - - - - - - - - - - - - -
947
Dan Handleyab2d31e2013-12-02 19:25:12 +0000948_Copyright (c) 2013, ARM Limited and Contributors. All rights reserved._
Achin Gupta4f6ad662013-10-25 09:08:21 +0100949
950
951[User Guide]: user-guide.md
952
953[../plat/common/aarch64/platform_helpers.S]: ../plat/common/aarch64/platform_helpers.S
954[../plat/fvp/platform.h]: ../plat/fvp/platform.h
955[../plat/fvp/aarch64/fvp_common.c]: ../plat/fvp/aarch64/fvp_common.c
956[../plat/fvp/fvp_pm.c]: ../plat/fvp/fvp_pm.c
957[../include/runtime_svc.h]: ../include/runtime_svc.h