blob: 6a79dc33fe54e6d520e06688a97d55a3980bb8c3 [file] [log] [blame]
Achin Gupta4f6ad662013-10-25 09:08:21 +01001/*
Roberto Vargas9fb8af32018-02-12 12:36:17 +00002 * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
Achin Gupta4f6ad662013-10-25 09:08:21 +01003 *
dp-arm82cb2c12017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Achin Gupta4f6ad662013-10-25 09:08:21 +01005 */
6
7#ifndef __BL_COMMON_H__
8#define __BL_COMMON_H__
9
Soby Mathew5dffb462017-02-13 12:46:28 +000010#include <ep_info.h>
11#include <param_header.h>
Soby Mathewda5f2742018-02-21 01:16:39 +000012#include <utils_def.h>
Achin Gupta4f6ad662013-10-25 09:08:21 +010013
Antonio Nino Diaz81542c02018-10-04 09:55:23 +010014#define UP U(1)
15#define DOWN U(0)
Achin Gupta4f6ad662013-10-25 09:08:21 +010016
17/*******************************************************************************
Sandrine Bailleux8f55dfb2014-06-24 14:02:34 +010018 * Constants to identify the location of a memory region in a given memory
19 * layout.
20******************************************************************************/
Antonio Nino Diaz81542c02018-10-04 09:55:23 +010021#define TOP U(0x1)
22#define BOTTOM U(0x0)
Achin Gupta4f6ad662013-10-25 09:08:21 +010023
Yatharth Kochar7baff112015-10-09 18:06:13 +010024/*
25 * The following are used for image state attributes.
26 * Image can only be in one of the following state.
27 */
Antonio Nino Diaz81542c02018-10-04 09:55:23 +010028#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)
Yatharth Kochar7baff112015-10-09 18:06:13 +010034
Soby Mathewda5f2742018-02-21 01:16:39 +000035#define IMAGE_ATTRIB_SKIP_LOADING U(0x02)
36#define IMAGE_ATTRIB_PLAT_SETUP U(0x04)
Yatharth Kochar843ddee2016-02-01 11:04:46 +000037
Soby Mathewda5f2742018-02-21 01:16:39 +000038#define INVALID_IMAGE_ID U(0xFFFFFFFF)
Yatharth Kochar7baff112015-10-09 18:06:13 +010039
Yatharth Kocharbbf8f6f2015-10-02 17:56:48 +010040/*******************************************************************************
41 * Constants to indicate type of exception to the common exception handler.
42 ******************************************************************************/
Antonio Nino Diaz81542c02018-10-04 09:55:23 +010043#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)
Yatharth Kocharbbf8f6f2015-10-02 17:56:48 +010059
Achin Gupta4f6ad662013-10-25 09:08:21 +010060#ifndef __ASSEMBLY__
Vikram Kanigiri29fb9052014-05-15 18:27:15 +010061#include <cassert.h>
Sandrine Bailleux8f55dfb2014-06-24 14:02:34 +010062#include <stddef.h>
Soby Mathew5dffb462017-02-13 12:46:28 +000063#include <stdint.h>
Scott Branden53d9c9c2017-04-10 11:45:52 -070064#include <utils_def.h> /* To retain compatibility */
Vikram Kanigiria7e98ad2015-03-04 10:34:27 +000065
Joel Hutton9f85f9e2018-03-21 11:40:57 +000066
Dan Handley90b3a6a2015-04-27 11:49:22 +010067/*
68 * Declarations of linker defined symbols to help determine memory layout of
69 * BL images
70 */
Sandrine Bailleux5d1c1042016-07-08 14:37:40 +010071#if SEPARATE_CODE_AND_RODATA
Joel Hutton9f85f9e2018-03-21 11:40:57 +000072IMPORT_SYM(unsigned long, __TEXT_START__, BL_CODE_BASE);
73IMPORT_SYM(unsigned long, __TEXT_END__, BL_CODE_END);
74IMPORT_SYM(unsigned long, __RODATA_START__, BL_RO_DATA_BASE);
75IMPORT_SYM(unsigned long, __RODATA_END__, BL_RO_DATA_END);
Sandrine Bailleux5d1c1042016-07-08 14:37:40 +010076#else
Joel Hutton9f85f9e2018-03-21 11:40:57 +000077IMPORT_SYM(unsigned long, __RO_START__, BL_CODE_BASE);
78IMPORT_SYM(unsigned long, __RO_END__, BL_CODE_END);
Sandrine Bailleux5d1c1042016-07-08 14:37:40 +010079#endif
80
Masahiro Yamada3d8256b2016-12-25 23:36:24 +090081#if defined(IMAGE_BL2)
Joel Hutton9f85f9e2018-03-21 11:40:57 +000082IMPORT_SYM(unsigned long, __BL2_END__, BL2_END);
Masahiro Yamada3d8256b2016-12-25 23:36:24 +090083#elif defined(IMAGE_BL2U)
Joel Hutton9f85f9e2018-03-21 11:40:57 +000084IMPORT_SYM(unsigned long, __BL2U_END__, BL2U_END);
Masahiro Yamada3d8256b2016-12-25 23:36:24 +090085#elif defined(IMAGE_BL31)
Soby Mathew931f7c62018-10-14 08:09:22 +010086IMPORT_SYM(unsigned long, __BL31_START__, BL31_START);
Joel Hutton9f85f9e2018-03-21 11:40:57 +000087IMPORT_SYM(unsigned long, __BL31_END__, BL31_END);
Masahiro Yamada3d8256b2016-12-25 23:36:24 +090088#elif defined(IMAGE_BL32)
Joel Hutton9f85f9e2018-03-21 11:40:57 +000089IMPORT_SYM(unsigned long, __BL32_END__, BL32_END);
Dan Handley90b3a6a2015-04-27 11:49:22 +010090#endif /* IMAGE_BLX */
91
Joel Hutton9f85f9e2018-03-21 11:40:57 +000092/*
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 */
Dan Handley90b3a6a2015-04-27 11:49:22 +010099#if USE_COHERENT_MEM
Joel Hutton9f85f9e2018-03-21 11:40:57 +0000100IMPORT_SYM(unsigned long, __COHERENT_RAM_START__, BL_COHERENT_RAM_BASE);
101IMPORT_SYM(unsigned long, __COHERENT_RAM_END__, BL_COHERENT_RAM_END);
Dan Handley90b3a6a2015-04-27 11:49:22 +0100102#endif
103
Achin Gupta4f6ad662013-10-25 09:08:21 +0100104/*******************************************************************************
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 ******************************************************************************/
Dan Handleyfb037bf2014-04-10 15:37:22 +0100108typedef struct meminfo {
Soby Mathew4c0d0392016-06-16 14:52:04 +0100109 uintptr_t total_base;
Sandrine Bailleux8f55dfb2014-06-24 14:02:34 +0100110 size_t total_size;
Dan Handleyfb037bf2014-04-10 15:37:22 +0100111} meminfo_t;
Achin Gupta4f6ad662013-10-25 09:08:21 +0100112
Vikram Kanigiri4112bfa2014-04-15 18:08:08 +0100113/*****************************************************************************
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 *****************************************************************************/
120typedef 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 */
Yatharth Kochar72600222016-09-12 16:08:41 +0100124 uint32_t image_max_size;
Vikram Kanigiri4112bfa2014-04-15 18:08:08 +0100125} image_info_t;
Achin Gupta4f6ad662013-10-25 09:08:21 +0100126
Yatharth Kochar7baff112015-10-09 18:06:13 +0100127/*****************************************************************************
128 * The image descriptor struct definition.
129 *****************************************************************************/
130typedef struct image_desc {
131 /* Contains unique image id for the image. */
132 unsigned int image_id;
Yatharth Kochar7baff112015-10-09 18:06:13 +0100133 /*
134 * This member contains Image state information.
135 * Refer IMAGE_STATE_XXX defined above.
136 */
137 unsigned int state;
Yatharth Kochar843ddee2016-02-01 11:04:46 +0000138 uint32_t copied_size; /* image size copied in blocks */
Soby Mathewb313d752016-01-12 10:30:59 +0000139 image_info_t image_info;
140 entry_point_info_t ep_info;
Yatharth Kochar7baff112015-10-09 18:06:13 +0100141} image_desc_t;
142
Yatharth Kochar72600222016-09-12 16:08:41 +0100143/* BL image node in the BL image loading sequence */
144typedef 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 */
151typedef 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 */
157typedef 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 */
168typedef struct bl_params {
169 param_header_t h;
170 bl_params_node_t *head;
171} bl_params_t;
172
Achin Guptae4d084e2014-02-19 17:18:23 +0000173/*******************************************************************************
Achin Gupta4f6ad662013-10-25 09:08:21 +0100174 * Function & variable prototypes
175 ******************************************************************************/
Daniel Boulbyd3775d42018-05-04 11:18:26 +0100176size_t get_image_size(unsigned int image_id);
Yatharth Kochar72600222016-09-12 16:08:41 +0100177
Sandrine Bailleux99c5eba2016-11-08 14:27:10 +0000178int is_mem_free(uintptr_t free_base, size_t free_size,
179 uintptr_t addr, size_t size);
180
Yatharth Kochar72600222016-09-12 16:08:41 +0100181int load_auth_image(unsigned int image_id, image_info_t *image_data);
182
Soby Mathew209a60c2018-03-26 12:43:37 +0100183#if TRUSTED_BOARD_BOOT && defined(DYN_DISABLE_AUTH)
184/*
185 * API to dynamically disable authentication. Only meant for development
186 * systems.
187 */
188void dyn_disable_auth(void);
189#endif
190
Yatharth Kochar72600222016-09-12 16:08:41 +0100191extern const char build_message[];
192extern const char version_string[];
193
Sandrine Bailleux68a68c92015-09-28 17:03:06 +0100194void print_entry_point_info(const entry_point_info_t *ep_info);
Roberto Vargas1af540e2018-02-12 12:36:17 +0000195uintptr_t page_align(uintptr_t value, unsigned dir);
Sandrine Bailleux68a68c92015-09-28 17:03:06 +0100196
Roberto Vargas0916c382018-10-19 16:44:18 +0100197struct mmap_region;
198
199void setup_page_tables(const struct mmap_region *bl_regions,
200 const struct mmap_region *plat_regions);
201
Achin Gupta4f6ad662013-10-25 09:08:21 +0100202#endif /*__ASSEMBLY__*/
203
204#endif /* __BL_COMMON_H__ */