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