xref: /optee_os/core/include/kernel/boot.h (revision 70eacc455e0cd55b42f2e5e2558a19d1ec332929)
1*70eacc45SMarouene Boubakri /* SPDX-License-Identifier: BSD-2-Clause */
2*70eacc45SMarouene Boubakri /*
3*70eacc45SMarouene Boubakri  * Copyright (c) 2015-2020, Linaro Limited
4*70eacc45SMarouene Boubakri  * Copyright (c) 2021, Arm Limited
5*70eacc45SMarouene Boubakri  */
6*70eacc45SMarouene Boubakri #ifndef __KERNEL_BOOT_H
7*70eacc45SMarouene Boubakri #define __KERNEL_BOOT_H
8*70eacc45SMarouene Boubakri 
9*70eacc45SMarouene Boubakri #include <initcall.h>
10*70eacc45SMarouene Boubakri #include <types_ext.h>
11*70eacc45SMarouene Boubakri 
12*70eacc45SMarouene Boubakri /*
13*70eacc45SMarouene Boubakri  * struct boot_embdata - Embedded boot data
14*70eacc45SMarouene Boubakri  * @total_len: Total length of the embedded boot data
15*70eacc45SMarouene Boubakri  * @num_blobs: Number of blobs in the embedded boot data, always 2 even if
16*70eacc45SMarouene Boubakri  *	       one blob is empty
17*70eacc45SMarouene Boubakri  * @hashes_offset: Offset of hashes from start of this struct
18*70eacc45SMarouene Boubakri  * @hashes_len: Length of hashes
19*70eacc45SMarouene Boubakri  * @reloc_offset: Offset of reloc from start of this struct
20*70eacc45SMarouene Boubakri  * @reloc_len: Length of reloc
21*70eacc45SMarouene Boubakri  *
22*70eacc45SMarouene Boubakri  * This struct is initialized by scripts/gen_tee_bin.py and must be kept
23*70eacc45SMarouene Boubakri  * in sync with that script. The struct and the following data is loaded
24*70eacc45SMarouene Boubakri  * at different addresses at boot depending on CFG_WITH_PAGER.
25*70eacc45SMarouene Boubakri  *
26*70eacc45SMarouene Boubakri  * If configured with CFG_WITH_PAGER=y the struct with data is following
27*70eacc45SMarouene Boubakri  * init part, this is together with the init part moved by the primary CPU
28*70eacc45SMarouene Boubakri  * so it ends up at __init_end. Whatever need to be saved for later need to
29*70eacc45SMarouene Boubakri  * be copied to a safe location in init_runtime().
30*70eacc45SMarouene Boubakri  *
31*70eacc45SMarouene Boubakri  * If configured with CFG_WITH_PAGER=n following the struct with data is
32*70eacc45SMarouene Boubakri  * __data_end, this is moved by the primary CPU so it ends up at __end.
33*70eacc45SMarouene Boubakri  */
34*70eacc45SMarouene Boubakri struct boot_embdata {
35*70eacc45SMarouene Boubakri 	uint32_t total_len;
36*70eacc45SMarouene Boubakri 	uint32_t num_blobs;
37*70eacc45SMarouene Boubakri 	uint32_t hashes_offset;
38*70eacc45SMarouene Boubakri 	uint32_t hashes_len;
39*70eacc45SMarouene Boubakri 	uint32_t reloc_offset;
40*70eacc45SMarouene Boubakri 	uint32_t reloc_len;
41*70eacc45SMarouene Boubakri };
42*70eacc45SMarouene Boubakri 
43*70eacc45SMarouene Boubakri extern uint8_t embedded_secure_dtb[];
44*70eacc45SMarouene Boubakri extern const struct core_mmu_config boot_mmu_config;
45*70eacc45SMarouene Boubakri 
46*70eacc45SMarouene Boubakri /* @nsec_entry is unused if using CFG_WITH_ARM_TRUSTED_FW */
47*70eacc45SMarouene Boubakri void boot_init_primary_early(unsigned long pageable_part,
48*70eacc45SMarouene Boubakri 			     unsigned long nsec_entry);
49*70eacc45SMarouene Boubakri void boot_init_primary_late(unsigned long fdt);
50*70eacc45SMarouene Boubakri 
51*70eacc45SMarouene Boubakri void __panic_at_smc_return(void) __noreturn;
52*70eacc45SMarouene Boubakri 
53*70eacc45SMarouene Boubakri #if defined(CFG_WITH_ARM_TRUSTED_FW)
54*70eacc45SMarouene Boubakri unsigned long cpu_on_handler(unsigned long a0, unsigned long a1);
55*70eacc45SMarouene Boubakri unsigned long boot_cpu_on_handler(unsigned long a0, unsigned long a1);
56*70eacc45SMarouene Boubakri #else
57*70eacc45SMarouene Boubakri void boot_init_secondary(unsigned long nsec_entry);
58*70eacc45SMarouene Boubakri #endif
59*70eacc45SMarouene Boubakri 
60*70eacc45SMarouene Boubakri void main_init_gic(void);
61*70eacc45SMarouene Boubakri void main_secondary_init_gic(void);
62*70eacc45SMarouene Boubakri 
63*70eacc45SMarouene Boubakri void init_sec_mon(unsigned long nsec_entry);
64*70eacc45SMarouene Boubakri void init_tee_runtime(void);
65*70eacc45SMarouene Boubakri 
66*70eacc45SMarouene Boubakri /* weak routines eventually overridden by platform */
67*70eacc45SMarouene Boubakri void plat_cpu_reset_early(void);
68*70eacc45SMarouene Boubakri void plat_primary_init_early(void);
69*70eacc45SMarouene Boubakri unsigned long plat_get_aslr_seed(void);
70*70eacc45SMarouene Boubakri unsigned long plat_get_freq(void);
71*70eacc45SMarouene Boubakri void arm_cl2_config(vaddr_t pl310);
72*70eacc45SMarouene Boubakri void arm_cl2_enable(vaddr_t pl310);
73*70eacc45SMarouene Boubakri 
74*70eacc45SMarouene Boubakri #if defined(CFG_BOOT_SECONDARY_REQUEST)
75*70eacc45SMarouene Boubakri void boot_set_core_ns_entry(size_t core_idx, uintptr_t entry,
76*70eacc45SMarouene Boubakri 			    uintptr_t context_id);
77*70eacc45SMarouene Boubakri 
78*70eacc45SMarouene Boubakri int boot_core_release(size_t core_idx, paddr_t entry);
79*70eacc45SMarouene Boubakri struct ns_entry_context *boot_core_hpen(void);
80*70eacc45SMarouene Boubakri #endif
81*70eacc45SMarouene Boubakri 
82*70eacc45SMarouene Boubakri /* Returns embedded DTB if present, then external DTB if found, then NULL */
83*70eacc45SMarouene Boubakri void *get_dt(void);
84*70eacc45SMarouene Boubakri 
85*70eacc45SMarouene Boubakri /* Returns embedded DTB location if present, otherwise NULL */
86*70eacc45SMarouene Boubakri void *get_embedded_dt(void);
87*70eacc45SMarouene Boubakri 
88*70eacc45SMarouene Boubakri /* Returns external DTB if present, otherwise NULL */
89*70eacc45SMarouene Boubakri void *get_external_dt(void);
90*70eacc45SMarouene Boubakri 
91*70eacc45SMarouene Boubakri unsigned long get_aslr_seed(void *fdt);
92*70eacc45SMarouene Boubakri 
93*70eacc45SMarouene Boubakri /* Returns true if passed DTB is same as Embedded DTB, otherwise false */
94*70eacc45SMarouene Boubakri static inline bool is_embedded_dt(void *fdt)
95*70eacc45SMarouene Boubakri {
96*70eacc45SMarouene Boubakri 	return fdt && fdt == get_embedded_dt();
97*70eacc45SMarouene Boubakri }
98*70eacc45SMarouene Boubakri 
99*70eacc45SMarouene Boubakri #endif /* __KERNEL_BOOT_H */
100