56c89fcc4adbfafa87871b8ca204cc5844d74909
[project/bcm63xx/atf.git] / include / common / bl_common.h
1 /*
2 * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #ifndef BL_COMMON_H
8 #define BL_COMMON_H
9
10 #include <ep_info.h>
11 #include <param_header.h>
12 #include <utils_def.h>
13
14 #define UP U(1)
15 #define DOWN U(0)
16
17 /*******************************************************************************
18 * Constants to identify the location of a memory region in a given memory
19 * layout.
20 ******************************************************************************/
21 #define TOP U(0x1)
22 #define BOTTOM U(0x0)
23
24 /*
25 * The following are used for image state attributes.
26 * Image can only be in one of the following state.
27 */
28 #define IMAGE_STATE_RESET U(0)
29 #define IMAGE_STATE_COPIED U(1)
30 #define IMAGE_STATE_COPYING U(2)
31 #define IMAGE_STATE_AUTHENTICATED U(3)
32 #define IMAGE_STATE_EXECUTED U(4)
33 #define IMAGE_STATE_INTERRUPTED U(5)
34
35 #define IMAGE_ATTRIB_SKIP_LOADING U(0x02)
36 #define IMAGE_ATTRIB_PLAT_SETUP U(0x04)
37
38 #define INVALID_IMAGE_ID U(0xFFFFFFFF)
39
40 /*******************************************************************************
41 * Constants to indicate type of exception to the common exception handler.
42 ******************************************************************************/
43 #define SYNC_EXCEPTION_SP_EL0 U(0x0)
44 #define IRQ_SP_EL0 U(0x1)
45 #define FIQ_SP_EL0 U(0x2)
46 #define SERROR_SP_EL0 U(0x3)
47 #define SYNC_EXCEPTION_SP_ELX U(0x4)
48 #define IRQ_SP_ELX U(0x5)
49 #define FIQ_SP_ELX U(0x6)
50 #define SERROR_SP_ELX U(0x7)
51 #define SYNC_EXCEPTION_AARCH64 U(0x8)
52 #define IRQ_AARCH64 U(0x9)
53 #define FIQ_AARCH64 U(0xa)
54 #define SERROR_AARCH64 U(0xb)
55 #define SYNC_EXCEPTION_AARCH32 U(0xc)
56 #define IRQ_AARCH32 U(0xd)
57 #define FIQ_AARCH32 U(0xe)
58 #define SERROR_AARCH32 U(0xf)
59
60 #ifndef __ASSEMBLY__
61 #include <cassert.h>
62 #include <stddef.h>
63 #include <stdint.h>
64 #include <utils_def.h> /* To retain compatibility */
65
66
67 /*
68 * Declarations of linker defined symbols to help determine memory layout of
69 * BL images
70 */
71 #if SEPARATE_CODE_AND_RODATA
72 IMPORT_SYM(unsigned long, __TEXT_START__, BL_CODE_BASE);
73 IMPORT_SYM(unsigned long, __TEXT_END__, BL_CODE_END);
74 IMPORT_SYM(unsigned long, __RODATA_START__, BL_RO_DATA_BASE);
75 IMPORT_SYM(unsigned long, __RODATA_END__, BL_RO_DATA_END);
76 #else
77 IMPORT_SYM(unsigned long, __RO_START__, BL_CODE_BASE);
78 IMPORT_SYM(unsigned long, __RO_END__, BL_CODE_END);
79 #endif
80
81 #if defined(IMAGE_BL2)
82 IMPORT_SYM(unsigned long, __BL2_END__, BL2_END);
83 #elif defined(IMAGE_BL2U)
84 IMPORT_SYM(unsigned long, __BL2U_END__, BL2U_END);
85 #elif defined(IMAGE_BL31)
86 IMPORT_SYM(unsigned long, __BL31_START__, BL31_START);
87 IMPORT_SYM(unsigned long, __BL31_END__, BL31_END);
88 #elif defined(IMAGE_BL32)
89 IMPORT_SYM(unsigned long, __BL32_END__, BL32_END);
90 #endif /* IMAGE_BLX */
91
92 /*
93 * The next 2 constants identify the extents of the coherent memory region.
94 * These addresses are used by the MMU setup code and therefore they must be
95 * page-aligned. It is the responsibility of the linker script to ensure that
96 * __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols refer to
97 * page-aligned addresses.
98 */
99 #if USE_COHERENT_MEM
100 IMPORT_SYM(unsigned long, __COHERENT_RAM_START__, BL_COHERENT_RAM_BASE);
101 IMPORT_SYM(unsigned long, __COHERENT_RAM_END__, BL_COHERENT_RAM_END);
102 #endif
103
104 /*******************************************************************************
105 * Structure used for telling the next BL how much of a particular type of
106 * memory is available for its use and how much is already used.
107 ******************************************************************************/
108 typedef struct meminfo {
109 uintptr_t total_base;
110 size_t total_size;
111 } meminfo_t;
112
113 /*****************************************************************************
114 * Image info binary provides information from the image loader that
115 * can be used by the firmware to manage available trusted RAM.
116 * More advanced firmware image formats can provide additional
117 * information that enables optimization or greater flexibility in the
118 * common firmware code
119 *****************************************************************************/
120 typedef struct image_info {
121 param_header_t h;
122 uintptr_t image_base; /* physical address of base of image */
123 uint32_t image_size; /* bytes read from image file */
124 uint32_t image_max_size;
125 } image_info_t;
126
127 /*****************************************************************************
128 * The image descriptor struct definition.
129 *****************************************************************************/
130 typedef struct image_desc {
131 /* Contains unique image id for the image. */
132 unsigned int image_id;
133 /*
134 * This member contains Image state information.
135 * Refer IMAGE_STATE_XXX defined above.
136 */
137 unsigned int state;
138 uint32_t copied_size; /* image size copied in blocks */
139 image_info_t image_info;
140 entry_point_info_t ep_info;
141 } image_desc_t;
142
143 /* BL image node in the BL image loading sequence */
144 typedef struct bl_load_info_node {
145 unsigned int image_id;
146 image_info_t *image_info;
147 struct bl_load_info_node *next_load_info;
148 } bl_load_info_node_t;
149
150 /* BL image head node in the BL image loading sequence */
151 typedef struct bl_load_info {
152 param_header_t h;
153 bl_load_info_node_t *head;
154 } bl_load_info_t;
155
156 /* BL image node in the BL image execution sequence */
157 typedef struct bl_params_node {
158 unsigned int image_id;
159 image_info_t *image_info;
160 entry_point_info_t *ep_info;
161 struct bl_params_node *next_params_info;
162 } bl_params_node_t;
163
164 /*
165 * BL image head node in the BL image execution sequence
166 * It is also used to pass information to next BL image.
167 */
168 typedef struct bl_params {
169 param_header_t h;
170 bl_params_node_t *head;
171 } bl_params_t;
172
173 /*******************************************************************************
174 * Function & variable prototypes
175 ******************************************************************************/
176 size_t get_image_size(unsigned int image_id);
177
178 int is_mem_free(uintptr_t free_base, size_t free_size,
179 uintptr_t addr, size_t size);
180
181 int load_auth_image(unsigned int image_id, image_info_t *image_data);
182
183 #if TRUSTED_BOARD_BOOT && defined(DYN_DISABLE_AUTH)
184 /*
185 * API to dynamically disable authentication. Only meant for development
186 * systems.
187 */
188 void dyn_disable_auth(void);
189 #endif
190
191 extern const char build_message[];
192 extern const char version_string[];
193
194 void print_entry_point_info(const entry_point_info_t *ep_info);
195 uintptr_t page_align(uintptr_t value, unsigned dir);
196
197 struct mmap_region;
198
199 void setup_page_tables(const struct mmap_region *bl_regions,
200 const struct mmap_region *plat_regions);
201
202 #endif /*__ASSEMBLY__*/
203
204 #endif /* BL_COMMON_H */