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