xref: /rk3399_ARM-atf/include/common/bl_common.h (revision 4112bfa0c223eda73af1cfe57ca7dc926f767dd8)
14ecca339SDan Handley /*
24ecca339SDan Handley  * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved.
34ecca339SDan Handley  *
44ecca339SDan Handley  * Redistribution and use in source and binary forms, with or without
54ecca339SDan Handley  * modification, are permitted provided that the following conditions are met:
64ecca339SDan Handley  *
74ecca339SDan Handley  * Redistributions of source code must retain the above copyright notice, this
84ecca339SDan Handley  * list of conditions and the following disclaimer.
94ecca339SDan Handley  *
104ecca339SDan Handley  * Redistributions in binary form must reproduce the above copyright notice,
114ecca339SDan Handley  * this list of conditions and the following disclaimer in the documentation
124ecca339SDan Handley  * and/or other materials provided with the distribution.
134ecca339SDan Handley  *
144ecca339SDan Handley  * Neither the name of ARM nor the names of its contributors may be used
154ecca339SDan Handley  * to endorse or promote products derived from this software without specific
164ecca339SDan Handley  * prior written permission.
174ecca339SDan Handley  *
184ecca339SDan Handley  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
194ecca339SDan Handley  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
204ecca339SDan Handley  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
214ecca339SDan Handley  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
224ecca339SDan Handley  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
234ecca339SDan Handley  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
244ecca339SDan Handley  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
254ecca339SDan Handley  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
264ecca339SDan Handley  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
274ecca339SDan Handley  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
284ecca339SDan Handley  * POSSIBILITY OF SUCH DAMAGE.
294ecca339SDan Handley  */
304ecca339SDan Handley 
314ecca339SDan Handley #ifndef __BL_COMMON_H__
324ecca339SDan Handley #define __BL_COMMON_H__
334ecca339SDan Handley 
34*4112bfa0SVikram Kanigiri #define SECURE		0x0
35*4112bfa0SVikram Kanigiri #define NON_SECURE	0x1
36*4112bfa0SVikram Kanigiri #define PARAM_EP_SECURITY_MASK    0x1
374ecca339SDan Handley 
384ecca339SDan Handley #define UP	1
394ecca339SDan Handley #define DOWN	0
404ecca339SDan Handley 
414ecca339SDan Handley /*******************************************************************************
424ecca339SDan Handley  * Constants for loading images. When BLx wants to load BLy, it looks at a
434ecca339SDan Handley  * meminfo structure to find the extents of free memory. Then depending upon
444ecca339SDan Handley  * how it has been configured, it can either load BLy at the top or bottom of
454ecca339SDan Handley  * the free memory. These constants indicate the choice.
464ecca339SDan Handley  * TODO: Make this configurable while building the trusted firmware.
474ecca339SDan Handley  ******************************************************************************/
484ecca339SDan Handley #define TOP_LOAD	0x1
494ecca339SDan Handley #define BOT_LOAD	!TOP_LOAD
504ecca339SDan Handley #define LOAD_MASK	(1 << 0)
514ecca339SDan Handley 
524ecca339SDan Handley /******************************************************************************
534ecca339SDan Handley  * Opcode passed in x0 to tell next EL that we want to run an image.
544ecca339SDan Handley  * Corresponds to the function ID of the only SMC that the BL1 exception
554ecca339SDan Handley  * handlers service. That's why the chosen value is the first function ID of
564ecca339SDan Handley  * the ARM SMC64 range.
574ecca339SDan Handley  *****************************************************************************/
584ecca339SDan Handley #define RUN_IMAGE	0xC0000000
594ecca339SDan Handley 
6029fb905dSVikram Kanigiri /*******************************************************************************
6129fb905dSVikram Kanigiri  * Constants that allow assembler code to access members of and the
62*4112bfa0SVikram Kanigiri  * 'entry_point_info' structure at their correct offsets.
6329fb905dSVikram Kanigiri  ******************************************************************************/
64*4112bfa0SVikram Kanigiri #define ENTRY_POINT_INFO_PC_OFFSET	0x08
65*4112bfa0SVikram Kanigiri #define ENTRY_POINT_INFO_ARGS_OFFSET	0x18
66*4112bfa0SVikram Kanigiri 
67*4112bfa0SVikram Kanigiri #define GET_SECURITY_STATE(x) (x & PARAM_EP_SECURITY_MASK)
68*4112bfa0SVikram Kanigiri #define SET_SECURITY_STATE(x, security) \
69*4112bfa0SVikram Kanigiri 			((x) = ((x) & ~PARAM_EP_SECURITY_MASK) | (security))
70*4112bfa0SVikram Kanigiri 
71*4112bfa0SVikram Kanigiri #define PARAM_EP     0x01
72*4112bfa0SVikram Kanigiri #define PARAM_IMAGE_BINARY  0x02
73*4112bfa0SVikram Kanigiri #define PARAM_BL31       0x03
74*4112bfa0SVikram Kanigiri 
75*4112bfa0SVikram Kanigiri #define VERSION_1		0x01
76*4112bfa0SVikram Kanigiri 
77*4112bfa0SVikram Kanigiri #define SET_PARAM_HEAD(_p, _type, _ver, _attr) do { \
78*4112bfa0SVikram Kanigiri 	(_p)->h.type = (uint8_t)(_type); \
79*4112bfa0SVikram Kanigiri 	(_p)->h.version = (uint8_t)(_ver); \
80*4112bfa0SVikram Kanigiri 	(_p)->h.size = (uint16_t)sizeof(*_p); \
81*4112bfa0SVikram Kanigiri 	(_p)->h.attr = (uint32_t)(_attr) ; \
82*4112bfa0SVikram Kanigiri 	} while (0)
834ecca339SDan Handley 
844ecca339SDan Handley #ifndef __ASSEMBLY__
8597043ac9SDan Handley #include <cdefs.h> /* For __dead2 */
8629fb905dSVikram Kanigiri #include <cassert.h>
87*4112bfa0SVikram Kanigiri #include <stdint.h>
884ecca339SDan Handley 
894ecca339SDan Handley /*******************************************************************************
904ecca339SDan Handley  * Structure used for telling the next BL how much of a particular type of
914ecca339SDan Handley  * memory is available for its use and how much is already used.
924ecca339SDan Handley  ******************************************************************************/
93fb037bfbSDan Handley typedef struct meminfo {
944ecca339SDan Handley 	unsigned long total_base;
954ecca339SDan Handley 	long total_size;
964ecca339SDan Handley 	unsigned long free_base;
974ecca339SDan Handley 	long free_size;
984ecca339SDan Handley 	unsigned long attr;
994ecca339SDan Handley 	unsigned long next;
100fb037bfbSDan Handley } meminfo_t;
1014ecca339SDan Handley 
102fb037bfbSDan Handley typedef struct aapcs64_params {
1034ecca339SDan Handley 	unsigned long arg0;
1044ecca339SDan Handley 	unsigned long arg1;
1054ecca339SDan Handley 	unsigned long arg2;
1064ecca339SDan Handley 	unsigned long arg3;
1074ecca339SDan Handley 	unsigned long arg4;
1084ecca339SDan Handley 	unsigned long arg5;
1094ecca339SDan Handley 	unsigned long arg6;
1104ecca339SDan Handley 	unsigned long arg7;
111fb037bfbSDan Handley } aapcs64_params_t;
1124ecca339SDan Handley 
113*4112bfa0SVikram Kanigiri /***************************************************************************
114*4112bfa0SVikram Kanigiri  * This structure provides version information and the size of the
115*4112bfa0SVikram Kanigiri  * structure, attributes for the structure it represents
116*4112bfa0SVikram Kanigiri  ***************************************************************************/
117*4112bfa0SVikram Kanigiri typedef struct param_header {
118*4112bfa0SVikram Kanigiri 	uint8_t type;		/* type of the structure */
119*4112bfa0SVikram Kanigiri 	uint8_t version;    /* version of this structure */
120*4112bfa0SVikram Kanigiri 	uint16_t size;      /* size of this structure in bytes */
121*4112bfa0SVikram Kanigiri 	uint32_t attr;      /* attributes: unused bits SBZ */
122*4112bfa0SVikram Kanigiri } param_header_t;
123*4112bfa0SVikram Kanigiri 
124*4112bfa0SVikram Kanigiri /*****************************************************************************
125*4112bfa0SVikram Kanigiri  * This structure represents the superset of information needed while
126*4112bfa0SVikram Kanigiri  * switching exception levels. The only two mechanisms to do so are
127*4112bfa0SVikram Kanigiri  * ERET & SMC. Security state is indicated using bit zero of header
128*4112bfa0SVikram Kanigiri  * attribute
129*4112bfa0SVikram Kanigiri  * NOTE: BL1 expects entrypoint followed by spsr while processing
130*4112bfa0SVikram Kanigiri  * SMC to jump to BL31 from the start of entry_point_info
131*4112bfa0SVikram Kanigiri  *****************************************************************************/
132*4112bfa0SVikram Kanigiri typedef struct entry_point_info {
133*4112bfa0SVikram Kanigiri 	param_header_t h;
134*4112bfa0SVikram Kanigiri 	uintptr_t pc;
135*4112bfa0SVikram Kanigiri 	uint32_t spsr;
136fb037bfbSDan Handley 	aapcs64_params_t args;
137*4112bfa0SVikram Kanigiri } entry_point_info_t;
138*4112bfa0SVikram Kanigiri 
139*4112bfa0SVikram Kanigiri /*****************************************************************************
140*4112bfa0SVikram Kanigiri  * Image info binary provides information from the image loader that
141*4112bfa0SVikram Kanigiri  * can be used by the firmware to manage available trusted RAM.
142*4112bfa0SVikram Kanigiri  * More advanced firmware image formats can provide additional
143*4112bfa0SVikram Kanigiri  * information that enables optimization or greater flexibility in the
144*4112bfa0SVikram Kanigiri  * common firmware code
145*4112bfa0SVikram Kanigiri  *****************************************************************************/
146*4112bfa0SVikram Kanigiri typedef struct image_info {
147*4112bfa0SVikram Kanigiri 	param_header_t h;
148*4112bfa0SVikram Kanigiri 	uintptr_t image_base;   /* physical address of base of image */
149*4112bfa0SVikram Kanigiri 	uint32_t image_size;    /* bytes read from image file */
150*4112bfa0SVikram Kanigiri } image_info_t;
1514ecca339SDan Handley 
1524ecca339SDan Handley /*******************************************************************************
1534ecca339SDan Handley  * This structure represents the superset of information that can be passed to
1544ecca339SDan Handley  * BL31 e.g. while passing control to it from BL2. The BL32 parameters will be
155*4112bfa0SVikram Kanigiri  * populated only if BL2 detects its presence. A pointer to a structure of this
156*4112bfa0SVikram Kanigiri  * type should be passed in X3 to BL31's cold boot entrypoint
157*4112bfa0SVikram Kanigiri  *
158*4112bfa0SVikram Kanigiri  * Use of this structure and the X3 parameter is not mandatory: the BL3-1
159*4112bfa0SVikram Kanigiri  * platform code can use other mechanisms to provide the necessary information
160*4112bfa0SVikram Kanigiri  * about BL3-2 and BL3-3 to the common and SPD code.
161*4112bfa0SVikram Kanigiri  *
162*4112bfa0SVikram Kanigiri  * BL3-1 image information is mandatory if this structure is used. If either of
163*4112bfa0SVikram Kanigiri  * the optional BL3-2 and BL3-3 image information is not provided, this is
164*4112bfa0SVikram Kanigiri  * indicated by the respective image_info pointers being zero.
1654ecca339SDan Handley  ******************************************************************************/
166*4112bfa0SVikram Kanigiri typedef struct bl31_params {
167*4112bfa0SVikram Kanigiri 	param_header_t h;
168*4112bfa0SVikram Kanigiri 	image_info_t *bl31_image_info;
169*4112bfa0SVikram Kanigiri 	entry_point_info_t *bl32_ep_info;
170*4112bfa0SVikram Kanigiri 	image_info_t *bl32_image_info;
171*4112bfa0SVikram Kanigiri 	entry_point_info_t *bl33_ep_info;
172*4112bfa0SVikram Kanigiri 	image_info_t *bl33_image_info;
173*4112bfa0SVikram Kanigiri } bl31_params_t;
174*4112bfa0SVikram Kanigiri 
175*4112bfa0SVikram Kanigiri 
176*4112bfa0SVikram Kanigiri /***************************************************************************
177*4112bfa0SVikram Kanigiri  * This structure provides platform specific data that needs to be known to
178*4112bfa0SVikram Kanigiri  * BL31. Currently, The loader updates the memory information available for
179*4112bfa0SVikram Kanigiri  * each binary
180*4112bfa0SVikram Kanigiri  ***************************************************************************/
181*4112bfa0SVikram Kanigiri typedef struct bl31_plat_params {
182fb037bfbSDan Handley 	meminfo_t bl31_meminfo;
183fb037bfbSDan Handley 	meminfo_t bl32_meminfo;
184fb037bfbSDan Handley 	meminfo_t bl33_meminfo;
185*4112bfa0SVikram Kanigiri } bl31_plat_params_t;
1864ecca339SDan Handley 
18729fb905dSVikram Kanigiri 
18829fb905dSVikram Kanigiri /*
189*4112bfa0SVikram Kanigiri  * Compile time assertions related to the 'entry_point_info' structure to
19029fb905dSVikram Kanigiri  * ensure that the assembler and the compiler view of the offsets of
19129fb905dSVikram Kanigiri  * the structure members is the same.
19229fb905dSVikram Kanigiri  */
193*4112bfa0SVikram Kanigiri CASSERT(ENTRY_POINT_INFO_PC_OFFSET ==
194*4112bfa0SVikram Kanigiri 		__builtin_offsetof(entry_point_info_t, pc), \
19529fb905dSVikram Kanigiri 		assert_BL31_pc_offset_mismatch);
19629fb905dSVikram Kanigiri 
197*4112bfa0SVikram Kanigiri CASSERT(ENTRY_POINT_INFO_ARGS_OFFSET == \
198*4112bfa0SVikram Kanigiri 		__builtin_offsetof(entry_point_info_t, args), \
19929fb905dSVikram Kanigiri 		assert_BL31_args_offset_mismatch);
20029fb905dSVikram Kanigiri 
201*4112bfa0SVikram Kanigiri CASSERT(sizeof(unsigned long) ==
202*4112bfa0SVikram Kanigiri 		__builtin_offsetof(entry_point_info_t, spsr) - \
203*4112bfa0SVikram Kanigiri 		__builtin_offsetof(entry_point_info_t, pc), \
20429fb905dSVikram Kanigiri 		assert_entrypoint_and_spsr_should_be_adjacent);
20529fb905dSVikram Kanigiri 
2064ecca339SDan Handley /*******************************************************************************
2074ecca339SDan Handley  * Function & variable prototypes
2084ecca339SDan Handley  ******************************************************************************/
2094ecca339SDan Handley extern unsigned long page_align(unsigned long, unsigned);
2104ecca339SDan Handley extern void change_security_state(unsigned int);
211fb037bfbSDan Handley extern void init_bl2_mem_layout(meminfo_t *,
212fb037bfbSDan Handley 				meminfo_t *,
2134ecca339SDan Handley 				unsigned int,
2144ecca339SDan Handley 				unsigned long) __attribute__((weak));
215fb037bfbSDan Handley extern void init_bl31_mem_layout(const meminfo_t *,
216fb037bfbSDan Handley 				meminfo_t *,
2174ecca339SDan Handley 				unsigned int) __attribute__((weak));
2184ecca339SDan Handley extern unsigned long image_size(const char *);
219*4112bfa0SVikram Kanigiri extern int load_image(meminfo_t *,
2204ecca339SDan Handley 				const char *,
2214ecca339SDan Handley 				unsigned int,
222*4112bfa0SVikram Kanigiri 				unsigned long,
223*4112bfa0SVikram Kanigiri 				image_info_t *,
224*4112bfa0SVikram Kanigiri 				entry_point_info_t *);
2254ecca339SDan Handley extern unsigned long *get_el_change_mem_ptr(void);
2264ecca339SDan Handley extern const char build_message[];
2274ecca339SDan Handley 
2284ecca339SDan Handley #endif /*__ASSEMBLY__*/
2294ecca339SDan Handley 
2304ecca339SDan Handley #endif /* __BL_COMMON_H__ */
231