1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * This is from the ARM TF Project, 3*4882a593Smuzhiyun * Repository: https://github.com/ARM-software/arm-trusted-firmware.git 4*4882a593Smuzhiyun * File: include/common/bl_common.h 5*4882a593Smuzhiyun * Portions copyright (c) 2013-2016, ARM Limited and Contributors. All rights 6*4882a593Smuzhiyun * reserved. 7*4882a593Smuzhiyun * Copyright (C) 2016-2017 Rockchip Electronic Co.,Ltd 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * SPDX-License-Identifier: BSD-3-Clause 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #ifndef __BL_COMMON_H__ 13*4882a593Smuzhiyun #define __BL_COMMON_H__ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define ATF_PARAM_EP 0x01 16*4882a593Smuzhiyun #define ATF_PARAM_IMAGE_BINARY 0x02 17*4882a593Smuzhiyun #define ATF_PARAM_BL31 0x03 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define ATF_VERSION_1 0x01 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define ATF_EP_SECURE 0x0 22*4882a593Smuzhiyun #define ATF_EP_NON_SECURE 0x1 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define SET_PARAM_HEAD(_p, _type, _ver, _attr) do { \ 25*4882a593Smuzhiyun (_p)->h.type = (uint8_t)(_type); \ 26*4882a593Smuzhiyun (_p)->h.version = (uint8_t)(_ver); \ 27*4882a593Smuzhiyun (_p)->h.size = (uint16_t)sizeof(*_p); \ 28*4882a593Smuzhiyun (_p)->h.attr = (uint32_t)(_attr) ; \ 29*4882a593Smuzhiyun } while (0) 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* ARM64 */ 32*4882a593Smuzhiyun #define MODE_RW_SHIFT 0x4 33*4882a593Smuzhiyun #define MODE_RW_MASK 0x1 34*4882a593Smuzhiyun #define MODE_RW_64 0x0 35*4882a593Smuzhiyun #define MODE_RW_32 0x1 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define MODE_EL_SHIFT 0x2 38*4882a593Smuzhiyun #define MODE_EL_MASK 0x3 39*4882a593Smuzhiyun #define MODE_EL3 0x3 40*4882a593Smuzhiyun #define MODE_EL2 0x2 41*4882a593Smuzhiyun #define MODE_EL1 0x1 42*4882a593Smuzhiyun #define MODE_EL0 0x0 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define MODE_SP_SHIFT 0x0 45*4882a593Smuzhiyun #define MODE_SP_MASK 0x1 46*4882a593Smuzhiyun #define MODE_SP_EL0 0x0 47*4882a593Smuzhiyun #define MODE_SP_ELX 0x1 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun #define SPSR_DAIF_SHIFT 6 50*4882a593Smuzhiyun #define SPSR_DAIF_MASK 0x0f 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun #define SPSR_64(el, sp, daif) \ 53*4882a593Smuzhiyun (MODE_RW_64 << MODE_RW_SHIFT | \ 54*4882a593Smuzhiyun ((el) & MODE_EL_MASK) << MODE_EL_SHIFT | \ 55*4882a593Smuzhiyun ((sp) & MODE_SP_MASK) << MODE_SP_SHIFT | \ 56*4882a593Smuzhiyun ((daif) & SPSR_DAIF_MASK) << SPSR_DAIF_SHIFT) 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define SPSR_FIQ (1 << 6) 59*4882a593Smuzhiyun #define SPSR_IRQ (1 << 7) 60*4882a593Smuzhiyun #define SPSR_SERROR (1 << 8) 61*4882a593Smuzhiyun #define SPSR_DEBUG (1 << 9) 62*4882a593Smuzhiyun #define SPSR_EXCEPTION_MASK (SPSR_FIQ | SPSR_IRQ | SPSR_SERROR | SPSR_DEBUG) 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun #define DAIF_FIQ_BIT (1<<0) 65*4882a593Smuzhiyun #define DAIF_IRQ_BIT (1<<1) 66*4882a593Smuzhiyun #define DAIF_ABT_BIT (1<<2) 67*4882a593Smuzhiyun #define DAIF_DBG_BIT (1<<3) 68*4882a593Smuzhiyun #define DISABLE_ALL_EXECPTIONS \ 69*4882a593Smuzhiyun (DAIF_FIQ_BIT | DAIF_IRQ_BIT | DAIF_ABT_BIT | DAIF_DBG_BIT) 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /* ARM */ 72*4882a593Smuzhiyun #define MODE32_SHIFT 0 73*4882a593Smuzhiyun #define MODE32_MASK 0x1f 74*4882a593Smuzhiyun #define MODE32_svc 0x13 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #define SPSR_FIQ_BIT (1 << 0) 77*4882a593Smuzhiyun #define SPSR_IRQ_BIT (1 << 1) 78*4882a593Smuzhiyun #define SPSR_ABT_BIT (1 << 2) 79*4882a593Smuzhiyun #define SPSR_AIF_SHIFT 6 80*4882a593Smuzhiyun #define SPSR_AIF_MASK 0x7 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun #define EP_EE_LITTLE 0x0 83*4882a593Smuzhiyun #define SPSR_E_SHIFT 9 84*4882a593Smuzhiyun #define SPSR_E_MASK 0x1 85*4882a593Smuzhiyun #define SPSR_T_SHIFT 5 86*4882a593Smuzhiyun #define SPSR_T_MASK 0x1 87*4882a593Smuzhiyun #define SPSR_T_ARM 0 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun #define DISABLE_ALL_EXECPTIONS_32 \ 90*4882a593Smuzhiyun (SPSR_FIQ_BIT | SPSR_IRQ_BIT | SPSR_ABT_BIT) 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun #define SPSR_32(mode, isa, endian, aif) \ 93*4882a593Smuzhiyun (MODE_RW_32 << MODE_RW_SHIFT | \ 94*4882a593Smuzhiyun ((mode) & MODE32_MASK) << MODE32_SHIFT | \ 95*4882a593Smuzhiyun ((isa) & SPSR_T_MASK) << SPSR_T_SHIFT | \ 96*4882a593Smuzhiyun ((endian) & SPSR_E_MASK) << SPSR_E_SHIFT | \ 97*4882a593Smuzhiyun ((aif) & SPSR_AIF_MASK) << SPSR_AIF_SHIFT) 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun /******************************************************************************* 102*4882a593Smuzhiyun * Structure used for telling the next BL how much of a particular type of 103*4882a593Smuzhiyun * memory is available for its use and how much is already used. 104*4882a593Smuzhiyun ******************************************************************************/ 105*4882a593Smuzhiyun struct aapcs64_params { 106*4882a593Smuzhiyun unsigned long arg0; 107*4882a593Smuzhiyun unsigned long arg1; 108*4882a593Smuzhiyun unsigned long arg2; 109*4882a593Smuzhiyun unsigned long arg3; 110*4882a593Smuzhiyun unsigned long arg4; 111*4882a593Smuzhiyun unsigned long arg5; 112*4882a593Smuzhiyun unsigned long arg6; 113*4882a593Smuzhiyun unsigned long arg7; 114*4882a593Smuzhiyun }; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun /*************************************************************************** 117*4882a593Smuzhiyun * This structure provides version information and the size of the 118*4882a593Smuzhiyun * structure, attributes for the structure it represents 119*4882a593Smuzhiyun ***************************************************************************/ 120*4882a593Smuzhiyun struct param_header { 121*4882a593Smuzhiyun uint8_t type; /* type of the structure */ 122*4882a593Smuzhiyun uint8_t version; /* version of this structure */ 123*4882a593Smuzhiyun uint16_t size; /* size of this structure in bytes */ 124*4882a593Smuzhiyun uint32_t attr; /* attributes: unused bits SBZ */ 125*4882a593Smuzhiyun }; 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun /***************************************************************************** 128*4882a593Smuzhiyun * This structure represents the superset of information needed while 129*4882a593Smuzhiyun * switching exception levels. The only two mechanisms to do so are 130*4882a593Smuzhiyun * ERET & SMC. Security state is indicated using bit zero of header 131*4882a593Smuzhiyun * attribute 132*4882a593Smuzhiyun * NOTE: BL1 expects entrypoint followed by spsr at an offset from the start 133*4882a593Smuzhiyun * of this structure defined by the macro `ENTRY_POINT_INFO_PC_OFFSET` while 134*4882a593Smuzhiyun * processing SMC to jump to BL31. 135*4882a593Smuzhiyun *****************************************************************************/ 136*4882a593Smuzhiyun struct entry_point_info { 137*4882a593Smuzhiyun struct param_header h; 138*4882a593Smuzhiyun uintptr_t pc; 139*4882a593Smuzhiyun uint32_t spsr; 140*4882a593Smuzhiyun struct aapcs64_params args; 141*4882a593Smuzhiyun }; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun /***************************************************************************** 144*4882a593Smuzhiyun * Image info binary provides information from the image loader that 145*4882a593Smuzhiyun * can be used by the firmware to manage available trusted RAM. 146*4882a593Smuzhiyun * More advanced firmware image formats can provide additional 147*4882a593Smuzhiyun * information that enables optimization or greater flexibility in the 148*4882a593Smuzhiyun * common firmware code 149*4882a593Smuzhiyun *****************************************************************************/ 150*4882a593Smuzhiyun struct atf_image_info { 151*4882a593Smuzhiyun struct param_header h; 152*4882a593Smuzhiyun uintptr_t image_base; /* physical address of base of image */ 153*4882a593Smuzhiyun uint32_t image_size; /* bytes read from image file */ 154*4882a593Smuzhiyun }; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /***************************************************************************** 157*4882a593Smuzhiyun * The image descriptor struct definition. 158*4882a593Smuzhiyun *****************************************************************************/ 159*4882a593Smuzhiyun struct image_desc { 160*4882a593Smuzhiyun /* Contains unique image id for the image. */ 161*4882a593Smuzhiyun unsigned int image_id; 162*4882a593Smuzhiyun /* 163*4882a593Smuzhiyun * This member contains Image state information. 164*4882a593Smuzhiyun * Refer IMAGE_STATE_XXX defined above. 165*4882a593Smuzhiyun */ 166*4882a593Smuzhiyun unsigned int state; 167*4882a593Smuzhiyun uint32_t copied_size; /* image size copied in blocks */ 168*4882a593Smuzhiyun struct atf_image_info atf_image_info; 169*4882a593Smuzhiyun struct entry_point_info ep_info; 170*4882a593Smuzhiyun }; 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun /******************************************************************************* 173*4882a593Smuzhiyun * This structure represents the superset of information that can be passed to 174*4882a593Smuzhiyun * BL31 e.g. while passing control to it from BL2. The BL32 parameters will be 175*4882a593Smuzhiyun * populated only if BL2 detects its presence. A pointer to a structure of this 176*4882a593Smuzhiyun * type should be passed in X0 to BL31's cold boot entrypoint. 177*4882a593Smuzhiyun * 178*4882a593Smuzhiyun * Use of this structure and the X0 parameter is not mandatory: the BL31 179*4882a593Smuzhiyun * platform code can use other mechanisms to provide the necessary information 180*4882a593Smuzhiyun * about BL32 and BL33 to the common and SPD code. 181*4882a593Smuzhiyun * 182*4882a593Smuzhiyun * BL31 image information is mandatory if this structure is used. If either of 183*4882a593Smuzhiyun * the optional BL32 and BL33 image information is not provided, this is 184*4882a593Smuzhiyun * indicated by the respective image_info pointers being zero. 185*4882a593Smuzhiyun ******************************************************************************/ 186*4882a593Smuzhiyun struct bl31_params { 187*4882a593Smuzhiyun struct param_header h; 188*4882a593Smuzhiyun struct atf_image_info *bl31_image_info; 189*4882a593Smuzhiyun struct entry_point_info *bl32_ep_info; 190*4882a593Smuzhiyun struct atf_image_info *bl32_image_info; 191*4882a593Smuzhiyun struct entry_point_info *bl33_ep_info; 192*4882a593Smuzhiyun struct atf_image_info *bl33_image_info; 193*4882a593Smuzhiyun }; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun /******************************************************************************* 196*4882a593Smuzhiyun * This structure represents the superset of information that is passed to 197*4882a593Smuzhiyun * BL31, e.g. while passing control to it from BL2, bl31_params 198*4882a593Smuzhiyun * and other platform specific params 199*4882a593Smuzhiyun ******************************************************************************/ 200*4882a593Smuzhiyun struct bl2_to_bl31_params_mem { 201*4882a593Smuzhiyun struct bl31_params bl31_params; 202*4882a593Smuzhiyun struct atf_image_info bl31_image_info; 203*4882a593Smuzhiyun struct atf_image_info bl32_image_info; 204*4882a593Smuzhiyun struct atf_image_info bl33_image_info; 205*4882a593Smuzhiyun struct entry_point_info bl33_ep_info; 206*4882a593Smuzhiyun struct entry_point_info bl32_ep_info; 207*4882a593Smuzhiyun struct entry_point_info bl31_ep_info; 208*4882a593Smuzhiyun }; 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun #endif /*__ASSEMBLY__*/ 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun #endif /* __BL_COMMON_H__ */ 213