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