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