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