xref: /rk3399_ARM-atf/include/common/bl_common.h (revision 47fe640c97603b313994bb0d37a48d01e53213eb)
1 /*
2  * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  * Redistributions of source code must retain the above copyright notice, this
8  * list of conditions and the following disclaimer.
9  *
10  * Redistributions in binary form must reproduce the above copyright notice,
11  * this list of conditions and the following disclaimer in the documentation
12  * and/or other materials provided with the distribution.
13  *
14  * Neither the name of ARM nor the names of its contributors may be used
15  * to endorse or promote products derived from this software without specific
16  * prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #ifndef __BL_COMMON_H__
32 #define __BL_COMMON_H__
33 
34 #define SECURE		0x0
35 #define NON_SECURE	0x1
36 
37 #define UP	1
38 #define DOWN	0
39 
40 /*******************************************************************************
41  * Constants for loading images. When BLx wants to load BLy, it looks at a
42  * meminfo structure to find the extents of free memory. Then depending upon
43  * how it has been configured, it can either load BLy at the top or bottom of
44  * the free memory. These constants indicate the choice.
45  * TODO: Make this configurable while building the trusted firmware.
46  ******************************************************************************/
47 #define TOP_LOAD	0x1
48 #define BOT_LOAD	!TOP_LOAD
49 #define LOAD_MASK	(1 << 0)
50 
51 /******************************************************************************
52  * Opcode passed in x0 to tell next EL that we want to run an image.
53  * Corresponds to the function ID of the only SMC that the BL1 exception
54  * handlers service. That's why the chosen value is the first function ID of
55  * the ARM SMC64 range.
56  *****************************************************************************/
57 #define RUN_IMAGE	0xC0000000
58 
59 /*******************************************************************************
60  * Constants that allow assembler code to access members of and the
61  * 'entry_point_info' structure at their correct offsets.
62  ******************************************************************************/
63 #define ENTRY_POINT_INFO_PC_OFFSET	0x08
64 #define ENTRY_POINT_INFO_ARGS_OFFSET	0x18
65 
66 #define PARAM_EP_SECURITY_MASK    0x1
67 #define GET_SECURITY_STATE(x) (x & PARAM_EP_SECURITY_MASK)
68 #define SET_SECURITY_STATE(x, security) \
69 			((x) = ((x) & ~PARAM_EP_SECURITY_MASK) | (security))
70 
71 #define EP_EE_MASK	0x2
72 #define EP_EE_LITTLE	0x0
73 #define EP_EE_BIG	0x2
74 #define EP_GET_EE(x) (x & EP_EE_MASK)
75 #define EP_SET_EE(x, ee) ((x) = ((x) & ~EP_EE_MASK) | (ee))
76 
77 #define EP_ST_MASK	0x4
78 #define EP_ST_DISABLE	0x0
79 #define EP_ST_ENABLE	0x4
80 #define EP_GET_ST(x) (x & EP_ST_MASK)
81 #define EP_SET_ST(x, ee) ((x) = ((x) & ~EP_ST_MASK) | (ee))
82 
83 #define PARAM_EP     0x01
84 #define PARAM_IMAGE_BINARY  0x02
85 #define PARAM_BL31       0x03
86 
87 #define VERSION_1		0x01
88 
89 #define SET_PARAM_HEAD(_p, _type, _ver, _attr) do { \
90 	(_p)->h.type = (uint8_t)(_type); \
91 	(_p)->h.version = (uint8_t)(_ver); \
92 	(_p)->h.size = (uint16_t)sizeof(*_p); \
93 	(_p)->h.attr = (uint32_t)(_attr) ; \
94 	} while (0)
95 
96 #ifndef __ASSEMBLY__
97 #include <cdefs.h> /* For __dead2 */
98 #include <cassert.h>
99 #include <stdint.h>
100 
101 /*******************************************************************************
102  * Structure used for telling the next BL how much of a particular type of
103  * memory is available for its use and how much is already used.
104  ******************************************************************************/
105 typedef struct meminfo {
106 	unsigned long total_base;
107 	long total_size;
108 	unsigned long free_base;
109 	long free_size;
110 	unsigned long attr;
111 	unsigned long next;
112 } meminfo_t;
113 
114 typedef struct aapcs64_params {
115 	unsigned long arg0;
116 	unsigned long arg1;
117 	unsigned long arg2;
118 	unsigned long arg3;
119 	unsigned long arg4;
120 	unsigned long arg5;
121 	unsigned long arg6;
122 	unsigned long arg7;
123 } aapcs64_params_t;
124 
125 /***************************************************************************
126  * This structure provides version information and the size of the
127  * structure, attributes for the structure it represents
128  ***************************************************************************/
129 typedef struct param_header {
130 	uint8_t type;		/* type of the structure */
131 	uint8_t version;    /* version of this structure */
132 	uint16_t size;      /* size of this structure in bytes */
133 	uint32_t attr;      /* attributes: unused bits SBZ */
134 } param_header_t;
135 
136 /*****************************************************************************
137  * This structure represents the superset of information needed while
138  * switching exception levels. The only two mechanisms to do so are
139  * ERET & SMC. Security state is indicated using bit zero of header
140  * attribute
141  * NOTE: BL1 expects entrypoint followed by spsr while processing
142  * SMC to jump to BL31 from the start of entry_point_info
143  *****************************************************************************/
144 typedef struct entry_point_info {
145 	param_header_t h;
146 	uintptr_t pc;
147 	uint32_t spsr;
148 	aapcs64_params_t args;
149 } entry_point_info_t;
150 
151 /*****************************************************************************
152  * Image info binary provides information from the image loader that
153  * can be used by the firmware to manage available trusted RAM.
154  * More advanced firmware image formats can provide additional
155  * information that enables optimization or greater flexibility in the
156  * common firmware code
157  *****************************************************************************/
158 typedef struct image_info {
159 	param_header_t h;
160 	uintptr_t image_base;   /* physical address of base of image */
161 	uint32_t image_size;    /* bytes read from image file */
162 } image_info_t;
163 
164 /*******************************************************************************
165  * This structure represents the superset of information that can be passed to
166  * BL31 e.g. while passing control to it from BL2. The BL32 parameters will be
167  * populated only if BL2 detects its presence. A pointer to a structure of this
168  * type should be passed in X3 to BL31's cold boot entrypoint
169  *
170  * Use of this structure and the X3 parameter is not mandatory: the BL3-1
171  * platform code can use other mechanisms to provide the necessary information
172  * about BL3-2 and BL3-3 to the common and SPD code.
173  *
174  * BL3-1 image information is mandatory if this structure is used. If either of
175  * the optional BL3-2 and BL3-3 image information is not provided, this is
176  * indicated by the respective image_info pointers being zero.
177  ******************************************************************************/
178 typedef struct bl31_params {
179 	param_header_t h;
180 	image_info_t *bl31_image_info;
181 	entry_point_info_t *bl32_ep_info;
182 	image_info_t *bl32_image_info;
183 	entry_point_info_t *bl33_ep_info;
184 	image_info_t *bl33_image_info;
185 } bl31_params_t;
186 
187 
188 /*
189  * Compile time assertions related to the 'entry_point_info' structure to
190  * ensure that the assembler and the compiler view of the offsets of
191  * the structure members is the same.
192  */
193 CASSERT(ENTRY_POINT_INFO_PC_OFFSET ==
194 		__builtin_offsetof(entry_point_info_t, pc), \
195 		assert_BL31_pc_offset_mismatch);
196 
197 CASSERT(ENTRY_POINT_INFO_ARGS_OFFSET == \
198 		__builtin_offsetof(entry_point_info_t, args), \
199 		assert_BL31_args_offset_mismatch);
200 
201 CASSERT(sizeof(unsigned long) ==
202 		__builtin_offsetof(entry_point_info_t, spsr) - \
203 		__builtin_offsetof(entry_point_info_t, pc), \
204 		assert_entrypoint_and_spsr_should_be_adjacent);
205 
206 /*******************************************************************************
207  * Function & variable prototypes
208  ******************************************************************************/
209 unsigned long page_align(unsigned long, unsigned);
210 void change_security_state(unsigned int);
211 unsigned long image_size(const char *);
212 int load_image(meminfo_t *,
213 		const char *,
214 		unsigned int,
215 		unsigned long,
216 		image_info_t *,
217 		entry_point_info_t *);
218 extern const char build_message[];
219 
220 #endif /*__ASSEMBLY__*/
221 
222 #endif /* __BL_COMMON_H__ */
223