1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2015-2020, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #ifndef BL1_H 8*91f16700Schasinglulu #define BL1_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <common/bl_common.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu /* 13*91f16700Schasinglulu * Defines for BL1 SMC function ids. 14*91f16700Schasinglulu */ 15*91f16700Schasinglulu #define BL1_SMC_CALL_COUNT 0x0 16*91f16700Schasinglulu #define BL1_SMC_UID 0x1 17*91f16700Schasinglulu /* SMC #0x2 reserved */ 18*91f16700Schasinglulu #define BL1_SMC_VERSION 0x3 19*91f16700Schasinglulu 20*91f16700Schasinglulu /* 21*91f16700Schasinglulu * Corresponds to the function ID of the SMC that 22*91f16700Schasinglulu * the BL1 exception handler service to execute BL31. 23*91f16700Schasinglulu */ 24*91f16700Schasinglulu #define BL1_SMC_RUN_IMAGE 0x4 25*91f16700Schasinglulu 26*91f16700Schasinglulu /* 27*91f16700Schasinglulu * BL1 SMC version 28*91f16700Schasinglulu */ 29*91f16700Schasinglulu #define BL1_SMC_MAJOR_VER UL(0x0) 30*91f16700Schasinglulu #define BL1_SMC_MINOR_VER UL(0x1) 31*91f16700Schasinglulu 32*91f16700Schasinglulu /* 33*91f16700Schasinglulu * Defines for FWU SMC function ids. 34*91f16700Schasinglulu */ 35*91f16700Schasinglulu 36*91f16700Schasinglulu #define FWU_SMC_IMAGE_COPY 0x10 37*91f16700Schasinglulu #define FWU_SMC_IMAGE_AUTH 0x11 38*91f16700Schasinglulu #define FWU_SMC_IMAGE_EXECUTE 0x12 39*91f16700Schasinglulu #define FWU_SMC_IMAGE_RESUME 0x13 40*91f16700Schasinglulu #define FWU_SMC_SEC_IMAGE_DONE 0x14 41*91f16700Schasinglulu #define FWU_SMC_UPDATE_DONE 0x15 42*91f16700Schasinglulu #define FWU_SMC_IMAGE_RESET 0x16 43*91f16700Schasinglulu 44*91f16700Schasinglulu /* 45*91f16700Schasinglulu * Number of FWU calls (above) implemented 46*91f16700Schasinglulu */ 47*91f16700Schasinglulu #define FWU_NUM_SMC_CALLS 7 48*91f16700Schasinglulu 49*91f16700Schasinglulu #if TRUSTED_BOARD_BOOT 50*91f16700Schasinglulu # define BL1_NUM_SMC_CALLS (FWU_NUM_SMC_CALLS + 4) 51*91f16700Schasinglulu #else 52*91f16700Schasinglulu # define BL1_NUM_SMC_CALLS 4 53*91f16700Schasinglulu #endif 54*91f16700Schasinglulu 55*91f16700Schasinglulu /* 56*91f16700Schasinglulu * The macros below are used to identify FWU 57*91f16700Schasinglulu * calls from the SMC function ID 58*91f16700Schasinglulu */ 59*91f16700Schasinglulu #define FWU_SMC_FID_START FWU_SMC_IMAGE_COPY 60*91f16700Schasinglulu #define FWU_SMC_FID_END FWU_SMC_IMAGE_RESET 61*91f16700Schasinglulu #define is_fwu_fid(_fid) \ 62*91f16700Schasinglulu ((_fid >= FWU_SMC_FID_START) && (_fid <= FWU_SMC_FID_END)) 63*91f16700Schasinglulu 64*91f16700Schasinglulu #ifndef __ASSEMBLER__ 65*91f16700Schasinglulu 66*91f16700Schasinglulu #include <lib/cassert.h> 67*91f16700Schasinglulu 68*91f16700Schasinglulu struct entry_point_info; 69*91f16700Schasinglulu 70*91f16700Schasinglulu u_register_t bl1_smc_wrapper(uint32_t smc_fid, 71*91f16700Schasinglulu void *cookie, 72*91f16700Schasinglulu void *handle, 73*91f16700Schasinglulu unsigned int flags); 74*91f16700Schasinglulu 75*91f16700Schasinglulu u_register_t bl1_smc_handler(unsigned int smc_fid, 76*91f16700Schasinglulu u_register_t x1, 77*91f16700Schasinglulu u_register_t x2, 78*91f16700Schasinglulu u_register_t x3, 79*91f16700Schasinglulu u_register_t x4, 80*91f16700Schasinglulu void *cookie, 81*91f16700Schasinglulu void *handle, 82*91f16700Schasinglulu unsigned int flags); 83*91f16700Schasinglulu 84*91f16700Schasinglulu void bl1_print_next_bl_ep_info(const struct entry_point_info *bl_ep_info); 85*91f16700Schasinglulu 86*91f16700Schasinglulu void bl1_setup(void); 87*91f16700Schasinglulu void bl1_main(void); 88*91f16700Schasinglulu void bl1_plat_prepare_exit(entry_point_info_t *ep_info); 89*91f16700Schasinglulu 90*91f16700Schasinglulu /* 91*91f16700Schasinglulu * Check if the total number of FWU SMC calls are as expected. 92*91f16700Schasinglulu */ 93*91f16700Schasinglulu CASSERT(FWU_NUM_SMC_CALLS == 94*91f16700Schasinglulu (FWU_SMC_FID_END - FWU_SMC_FID_START + 1), 95*91f16700Schasinglulu assert_FWU_NUM_SMC_CALLS_mismatch); 96*91f16700Schasinglulu 97*91f16700Schasinglulu /* Utility functions */ 98*91f16700Schasinglulu void bl1_calc_bl2_mem_layout(const meminfo_t *bl1_mem_layout, 99*91f16700Schasinglulu meminfo_t *bl2_mem_layout); 100*91f16700Schasinglulu 101*91f16700Schasinglulu #endif /* __ASSEMBLER__ */ 102*91f16700Schasinglulu #endif /* BL1_H */ 103