170eacc45SMarouene Boubakri /* SPDX-License-Identifier: BSD-2-Clause */ 270eacc45SMarouene Boubakri /* 370eacc45SMarouene Boubakri * Copyright (c) 2015-2020, Linaro Limited 470eacc45SMarouene Boubakri * Copyright (c) 2021, Arm Limited 570eacc45SMarouene Boubakri */ 670eacc45SMarouene Boubakri #ifndef __KERNEL_BOOT_H 770eacc45SMarouene Boubakri #define __KERNEL_BOOT_H 870eacc45SMarouene Boubakri 970eacc45SMarouene Boubakri #include <initcall.h> 1070eacc45SMarouene Boubakri #include <types_ext.h> 1170eacc45SMarouene Boubakri 1270eacc45SMarouene Boubakri /* 1370eacc45SMarouene Boubakri * struct boot_embdata - Embedded boot data 1470eacc45SMarouene Boubakri * @total_len: Total length of the embedded boot data 1570eacc45SMarouene Boubakri * @num_blobs: Number of blobs in the embedded boot data, always 2 even if 1670eacc45SMarouene Boubakri * one blob is empty 1770eacc45SMarouene Boubakri * @hashes_offset: Offset of hashes from start of this struct 1870eacc45SMarouene Boubakri * @hashes_len: Length of hashes 1970eacc45SMarouene Boubakri * @reloc_offset: Offset of reloc from start of this struct 2070eacc45SMarouene Boubakri * @reloc_len: Length of reloc 2170eacc45SMarouene Boubakri * 2270eacc45SMarouene Boubakri * This struct is initialized by scripts/gen_tee_bin.py and must be kept 2370eacc45SMarouene Boubakri * in sync with that script. The struct and the following data is loaded 2470eacc45SMarouene Boubakri * at different addresses at boot depending on CFG_WITH_PAGER. 2570eacc45SMarouene Boubakri * 2670eacc45SMarouene Boubakri * If configured with CFG_WITH_PAGER=y the struct with data is following 2770eacc45SMarouene Boubakri * init part, this is together with the init part moved by the primary CPU 2870eacc45SMarouene Boubakri * so it ends up at __init_end. Whatever need to be saved for later need to 2970eacc45SMarouene Boubakri * be copied to a safe location in init_runtime(). 3070eacc45SMarouene Boubakri * 3170eacc45SMarouene Boubakri * If configured with CFG_WITH_PAGER=n following the struct with data is 3270eacc45SMarouene Boubakri * __data_end, this is moved by the primary CPU so it ends up at __end. 3370eacc45SMarouene Boubakri */ 3470eacc45SMarouene Boubakri struct boot_embdata { 3570eacc45SMarouene Boubakri uint32_t total_len; 3670eacc45SMarouene Boubakri uint32_t num_blobs; 3770eacc45SMarouene Boubakri uint32_t hashes_offset; 3870eacc45SMarouene Boubakri uint32_t hashes_len; 3970eacc45SMarouene Boubakri uint32_t reloc_offset; 4070eacc45SMarouene Boubakri uint32_t reloc_len; 4170eacc45SMarouene Boubakri }; 4270eacc45SMarouene Boubakri 4370eacc45SMarouene Boubakri extern uint8_t embedded_secure_dtb[]; 4470eacc45SMarouene Boubakri extern const struct core_mmu_config boot_mmu_config; 4570eacc45SMarouene Boubakri 4670eacc45SMarouene Boubakri /* @nsec_entry is unused if using CFG_WITH_ARM_TRUSTED_FW */ 4770eacc45SMarouene Boubakri void boot_init_primary_early(unsigned long pageable_part, 4870eacc45SMarouene Boubakri unsigned long nsec_entry); 4970eacc45SMarouene Boubakri void boot_init_primary_late(unsigned long fdt); 50a0e8ffe9SJens Wiklander void boot_init_memtag(void); 5170eacc45SMarouene Boubakri 5270eacc45SMarouene Boubakri void __panic_at_smc_return(void) __noreturn; 5370eacc45SMarouene Boubakri 5470eacc45SMarouene Boubakri #if defined(CFG_WITH_ARM_TRUSTED_FW) 5570eacc45SMarouene Boubakri unsigned long cpu_on_handler(unsigned long a0, unsigned long a1); 5670eacc45SMarouene Boubakri unsigned long boot_cpu_on_handler(unsigned long a0, unsigned long a1); 5770eacc45SMarouene Boubakri #else 5870eacc45SMarouene Boubakri void boot_init_secondary(unsigned long nsec_entry); 5970eacc45SMarouene Boubakri #endif 6070eacc45SMarouene Boubakri 6170eacc45SMarouene Boubakri void main_init_gic(void); 6270eacc45SMarouene Boubakri void main_secondary_init_gic(void); 6370eacc45SMarouene Boubakri 6470eacc45SMarouene Boubakri void init_sec_mon(unsigned long nsec_entry); 6570eacc45SMarouene Boubakri void init_tee_runtime(void); 6670eacc45SMarouene Boubakri 6770eacc45SMarouene Boubakri /* weak routines eventually overridden by platform */ 6870eacc45SMarouene Boubakri void plat_cpu_reset_early(void); 6970eacc45SMarouene Boubakri void plat_primary_init_early(void); 7070eacc45SMarouene Boubakri unsigned long plat_get_aslr_seed(void); 7170eacc45SMarouene Boubakri unsigned long plat_get_freq(void); 72*45507d10SKhoa Hoang #if defined(_CFG_CORE_STACK_PROTECTOR) 73*45507d10SKhoa Hoang uintptr_t plat_get_random_stack_canary(void); 74*45507d10SKhoa Hoang #endif 7570eacc45SMarouene Boubakri void arm_cl2_config(vaddr_t pl310); 7670eacc45SMarouene Boubakri void arm_cl2_enable(vaddr_t pl310); 7770eacc45SMarouene Boubakri 7870eacc45SMarouene Boubakri #if defined(CFG_BOOT_SECONDARY_REQUEST) 7970eacc45SMarouene Boubakri void boot_set_core_ns_entry(size_t core_idx, uintptr_t entry, 8070eacc45SMarouene Boubakri uintptr_t context_id); 8170eacc45SMarouene Boubakri 8270eacc45SMarouene Boubakri int boot_core_release(size_t core_idx, paddr_t entry); 8370eacc45SMarouene Boubakri struct ns_entry_context *boot_core_hpen(void); 8470eacc45SMarouene Boubakri #endif 8570eacc45SMarouene Boubakri 8670eacc45SMarouene Boubakri /* Returns embedded DTB if present, then external DTB if found, then NULL */ 8770eacc45SMarouene Boubakri void *get_dt(void); 8870eacc45SMarouene Boubakri 895a5586ecSVesa Jääskeläinen /* 905a5586ecSVesa Jääskeläinen * get_secure_dt() - returns secure DTB for drivers 915a5586ecSVesa Jääskeläinen * 925a5586ecSVesa Jääskeläinen * Returns device tree that is considered secure for drivers to use. 935a5586ecSVesa Jääskeläinen * 945a5586ecSVesa Jääskeläinen * 1. Returns embedded DTB if available, 955a5586ecSVesa Jääskeläinen * 2. Secure external DTB if available, 965a5586ecSVesa Jääskeläinen * 3. If neither then NULL 975a5586ecSVesa Jääskeläinen */ 985a5586ecSVesa Jääskeläinen void *get_secure_dt(void); 995a5586ecSVesa Jääskeläinen 10070eacc45SMarouene Boubakri /* Returns embedded DTB location if present, otherwise NULL */ 10170eacc45SMarouene Boubakri void *get_embedded_dt(void); 10270eacc45SMarouene Boubakri 10370eacc45SMarouene Boubakri /* Returns external DTB if present, otherwise NULL */ 10470eacc45SMarouene Boubakri void *get_external_dt(void); 10570eacc45SMarouene Boubakri 106839dadc2SJens Wiklander /* 107839dadc2SJens Wiklander * get_aslr_seed() - return a random seed for core ASLR 108839dadc2SJens Wiklander * @fdt: Pointer to a device tree if CFG_DT_ADDR=y 109839dadc2SJens Wiklander * 110839dadc2SJens Wiklander * This function has a __weak default implementation. 111839dadc2SJens Wiklander */ 11270eacc45SMarouene Boubakri unsigned long get_aslr_seed(void *fdt); 11370eacc45SMarouene Boubakri 11470eacc45SMarouene Boubakri /* Returns true if passed DTB is same as Embedded DTB, otherwise false */ 11570eacc45SMarouene Boubakri static inline bool is_embedded_dt(void *fdt) 11670eacc45SMarouene Boubakri { 11770eacc45SMarouene Boubakri return fdt && fdt == get_embedded_dt(); 11870eacc45SMarouene Boubakri } 11970eacc45SMarouene Boubakri 12070eacc45SMarouene Boubakri #endif /* __KERNEL_BOOT_H */ 121