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