blob: 1bc2626cad355419e41e90e768237ec4fe3dafaf [file] [log] [blame]
Edison Ai1c266ae2019-03-20 11:21:21 +08001/*
Summer Qind00e4db2019-05-09 18:03:52 +08002 * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
Edison Ai1c266ae2019-03-20 11:21:21 +08003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8#ifndef __TFM_SPM_HAL_H__
9#define __TFM_SPM_HAL_H__
10
11#include <stdint.h>
12#include "tfm_secure_api.h"
13#include "spm_api.h"
David Hu520dcd02019-11-18 16:04:36 +080014#ifdef TFM_MULTI_CORE_TOPOLOGY
15#include "tfm_multi_core.h"
16#endif
Mate Toth-Palb9c33552019-07-10 16:13:20 +020017#include "tfm_plat_defs.h"
Edison Ai1c266ae2019-03-20 11:21:21 +080018
19/**
20 * \brief Holds peripheral specific data fields required to manage the
21 * peripherals isolation
22 *
23 * This structure has to be defined in the platform directory, and may have
24 * different definition for each platform. The structure should contain fields
25 * that describe the peripheral for the functions that are prototyped in this
26 * file and are responsible for configuring the isolation of the peripherals.
27 *
28 * Pointers to structures of this type are managed by the SPM, and passed to the
29 * necessary function on isolation request. The pointers are also defined by the
30 * platform in the header file tfm_peripherals_def.h. For details on this, see
31 * the documentation of that file.
32 */
33struct tfm_spm_partition_platform_data_t;
34
Mate Toth-Pal4341de02018-10-02 12:55:47 +020035enum irq_target_state_t {
36 TFM_IRQ_TARGET_STATE_SECURE,
37 TFM_IRQ_TARGET_STATE_NON_SECURE,
38};
39
Edison Ai14dd1372019-07-11 18:02:18 +080040#ifdef TFM_PSA_API
Edison Ai1c266ae2019-03-20 11:21:21 +080041/**
42 * \brief Holds SPM db fields that define the memory regions used by a
43 * partition.
44 */
45struct tfm_spm_partition_memory_data_t
46{
47 uint32_t code_start; /*!< Start of the code memory of this partition. */
48 uint32_t code_limit; /*!< Address of the byte beyond the end of the code
49 * memory of this partition.
50 */
51 uint32_t ro_start; /*!< Start of the read only memory of this
52 * partition.
53 */
54 uint32_t ro_limit; /*!< Address of the byte beyond the end of the read
55 * only memory of this partition.
56 */
57 uint32_t rw_start; /*!< Start of the data region of this partition. */
58 uint32_t rw_limit; /*!< Address of the byte beyond the end of the data
59 * region of this partition.
60 */
61 uint32_t zi_start; /*!< Start of the zero initialised data region of
62 * this partition.
63 */
64 uint32_t zi_limit; /*!< Address of the byte beyond the end of the zero
65 * initialised region of this partition.
66 */
67 uint32_t stack_bottom; /*!< The bottom of the stack for the partition. */
68 uint32_t stack_top; /*!< The top of the stack for the partition. */
69};
Miklos Balintdd02bb32019-05-26 21:13:12 +020070#endif
Edison Ai1c266ae2019-03-20 11:21:21 +080071
72/**
Andrei Narkevitch5bba54c2019-09-23 14:09:13 -070073 * \brief This function initializes peripherals common to all platforms.
74 *
75 * Contrarily to SystemInit() intended for a high-priority hw initialization
76 * (for example clock and power subsystems), and called on a very early boot
77 * stage from startup code, this function is called from C code, hence variables
78 * and other drivers data are protected from being cleared up by the C library
79 * init.
80 * In addition to performing initialization common to all platforms, it also
81 * calls tfm_spm_hal_post_init_platform() function which implements
82 * initialization of platform-specific peripherals and other hw.
83 *
84 * \return Returns values as specified by the \ref tfm_plat_err_t
85 */
86enum tfm_plat_err_t tfm_spm_hal_post_init(void);
87
88/**
89 * \brief This function initializes platform-specific peripherals and hardware.
90 *
91 * Called from tfm_spm_hal_post_init(), this function is intended for
92 * platform-specific portion of hardware initialization.
93 *
94 * \return Returns values as specified by the \ref tfm_plat_err_t
95 */
96enum tfm_plat_err_t tfm_spm_hal_post_init_platform(void);
97
98/**
Edison Ai1c266ae2019-03-20 11:21:21 +080099 * \brief This function initialises the HW used for isolation, and sets the
100 * default configuration for them.
101 *
102 * This function is called during TF-M core early startup, before DB init
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200103 *
104 * \return Returns values as specified by the \ref tfm_plat_err_t
Edison Ai1c266ae2019-03-20 11:21:21 +0800105 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200106enum tfm_plat_err_t tfm_spm_hal_init_isolation_hw(void);
Edison Ai1c266ae2019-03-20 11:21:21 +0800107
Edison Aic1b10902019-08-26 10:34:19 +0800108#if TFM_LVL != 1
Edison Ai1c266ae2019-03-20 11:21:21 +0800109/**
110 * \brief This function initialises the HW used for isolation, and sets the
111 * default configuration for them.
112 * This function is called during TF-M core early startup, after DB init
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200113 *
114 * \return Returns values as specified by the \ref tfm_plat_err_t
Edison Ai1c266ae2019-03-20 11:21:21 +0800115 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200116enum tfm_plat_err_t tfm_spm_hal_setup_isolation_hw(void);
Edison Aic1b10902019-08-26 10:34:19 +0800117#endif
Edison Ai1c266ae2019-03-20 11:21:21 +0800118
119/**
120 * \brief Configure peripherals for a partition based on the platfotm data from
121 * the DB
122 *
123 * This function is called during partition initialisation (before calling the
124 * init function for the partition)
125 *
126 * \param[in] platform_data The platform fields of the partition DB record to
127 * be used for configuration. Can be NULL.
128 */
129void tfm_spm_hal_configure_default_isolation(
130 const struct tfm_spm_partition_platform_data_t *platform_data);
131/**
132 * \brief Configures the system debug properties.
133 * The default configuration of this function should disable secure debug
134 * when either DAUTH_NONE or DAUTH_NS_ONLY define is set. It is up to the
135 * platform owner to decide if secure debug can be turned on in their
136 * system, if DAUTH_FULL define is present.
137 * The DAUTH_CHIP_DEFAULT define should not be considered a safe default
138 * option unless explicitly noted by the chip vendor.
139 * The implementation has to expect that one of those defines is going to
140 * be set. Otherwise, a compile error needs to be triggered.
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200141 *
142 * \return Returns values as specified by the \ref tfm_plat_err_t
Edison Ai1c266ae2019-03-20 11:21:21 +0800143 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200144enum tfm_plat_err_t tfm_spm_hal_init_debug(void);
Edison Ai1c266ae2019-03-20 11:21:21 +0800145
146/**
Mate Toth-Pal3e2ebd02019-05-07 14:22:16 +0200147 * \brief Enables the fault handlers and sets priorities.
148 *
149 * Secure fault (if present) must have the highest possible priority
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200150 *
151 * \return Returns values as specified by the \ref tfm_plat_err_t
Edison Ai1c266ae2019-03-20 11:21:21 +0800152 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200153enum tfm_plat_err_t tfm_spm_hal_enable_fault_handlers(void);
Edison Ai1c266ae2019-03-20 11:21:21 +0800154
155/**
Marc Moreno Berengue8e0fa7a2018-10-04 18:25:13 +0100156 * \brief Configures the system reset request properties
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200157 *
158 * \return Returns values as specified by the \ref tfm_plat_err_t
Marc Moreno Berengue8e0fa7a2018-10-04 18:25:13 +0100159 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200160enum tfm_plat_err_t tfm_spm_hal_system_reset_cfg(void);
Edison Ai1c266ae2019-03-20 11:21:21 +0800161
Marc Moreno Berengue8e0fa7a2018-10-04 18:25:13 +0100162/**
Edison Ai5525ef32019-12-23 10:17:22 +0800163 * \brief System reset
164 */
165void tfm_spm_hal_system_reset(void);
166
167/**
Edison Ai1c266ae2019-03-20 11:21:21 +0800168 * \brief Configures all external interrupts to target the
169 * NS state, apart for the ones associated to secure
170 * peripherals (plus MPC and PPC)
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200171 *
172 * \return Returns values as specified by the \ref tfm_plat_err_t
Edison Ai1c266ae2019-03-20 11:21:21 +0800173 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200174enum tfm_plat_err_t tfm_spm_hal_nvic_interrupt_target_state_cfg(void);
Edison Ai1c266ae2019-03-20 11:21:21 +0800175
176/**
177 * \brief This function enable the interrupts associated
178 * to the secure peripherals (plus the isolation boundary violation
179 * interrupts)
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200180 *
181 * \return Returns values as specified by the \ref tfm_plat_err_t
Edison Ai1c266ae2019-03-20 11:21:21 +0800182 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200183enum tfm_plat_err_t tfm_spm_hal_nvic_interrupt_enable(void);
Edison Ai1c266ae2019-03-20 11:21:21 +0800184
185/**
186 * \brief Get the VTOR value of non-secure image
187 *
188 * \return Returns the address where the vector table of the non-secure image
189 * is located
190 */
191uint32_t tfm_spm_hal_get_ns_VTOR(void);
192
193/**
194 * \brief Get the initial address of non-secure image main stack
195 *
196 * \return Returns the initial non-secure MSP
197 */
198uint32_t tfm_spm_hal_get_ns_MSP(void);
199
200/**
201 * \brief Get the entry point of the non-secure image
202 *
203 * \return Returns the address of the non-secure image entry point
204 */
205uint32_t tfm_spm_hal_get_ns_entry_point(void);
206
Mate Toth-Pal94925722019-06-27 15:10:48 +0200207/**
208 * \brief Set the priority of a secure IRQ
209 *
210 * \param[in] irq_line The IRQ to set the priority for. Might be less than 0
211 * \param[in] priority The priority to set. [0..255]
212 *
213 * \details This function sets the priority for the IRQ passed in the parameter.
214 * The precision of the priority value might be adjusted to match the
215 * available priority bits in the underlying target platform.
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200216 *
217 * \return Returns values as specified by the \ref tfm_plat_err_t
Mate Toth-Pal94925722019-06-27 15:10:48 +0200218 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200219enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(int32_t irq_line,
220 uint32_t priority);
Edison Ai1c266ae2019-03-20 11:21:21 +0800221
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200222/**
223 * \brief Clears a pending IRQ
224 *
225 * \param[in] irq_line The IRQ to clear pending for.
226 */
227void tfm_spm_hal_clear_pending_irq(int32_t irq_line);
228
229/**
230 * \brief Enables an IRQ
231 *
232 * \param[in] irq_line The IRQ to be enabled.
233 */
234void tfm_spm_hal_enable_irq(int32_t irq_line);
235
236/**
237 * \brief Disables an IRQ
238 *
239 * \param[in] irq_line The IRQ to be disabled
240 */
241void tfm_spm_hal_disable_irq(int32_t irq_line);
242
243/**
244 * \brief Set the target state of an IRQ
245 *
246 * \param[in] irq_line The IRQ to set the priority for.
247 * \param[in] target_state Target state to ret for the IRQ.
248 *
249 * \return TFM_IRQ_TARGET_STATE_SECURE if interrupt is assigned
250 * to Secure
251 * TFM_IRQ_TARGET_STATE_NON_SECURE if interrupt is
252 * assigned to Non-Secure
253 */
254enum irq_target_state_t tfm_spm_hal_set_irq_target_state(
255 int32_t irq_line,
256 enum irq_target_state_t target_state);
257
David Hu520dcd02019-11-18 16:04:36 +0800258#ifdef TFM_MULTI_CORE_TOPOLOGY
259/**
260 * \brief Performs the necessary actions to start the non-secure CPU running
261 * the code at the specified address.
262 *
263 * \param[in] start_addr The entry point address of non-secure code.
264 */
265void tfm_spm_hal_boot_ns_cpu(uintptr_t start_addr);
266
267/**
268 * \brief Called on the secure CPU.
269 * Flags that the secure CPU has completed its initialization
270 * Waits, if necessary, for the non-secure CPU to flag that
271 * it has completed its initialisation
272 */
273void tfm_spm_hal_wait_for_ns_cpu_ready(void);
274
275/**
276 * \brief Retrieve the current active security configuration information and
277 * fills the \ref security_attr_info_t.
278 *
279 * \param[in] p Base address of target memory region
280 * \param[in] s Size of target memory region
281 * \param[out] p_attr Address of \ref security_attr_info_t to be filled
282 *
283 * \return void
284 */
285void tfm_spm_hal_get_mem_security_attr(const void *p, size_t s,
286 struct security_attr_info_t *p_attr);
287
288/**
289 * \brief Retrieve the secure memory protection configuration information and
290 * fills the \ref mem_attr_info_t.
291 *
292 * \param[in] p Base address of target memory region
293 * \param[in] s Size of target memory region
294 * \param[out] p_attr Address of \ref mem_attr_info_t to be filled
295 *
296 * \return void
297 */
298void tfm_spm_hal_get_secure_access_attr(const void *p, size_t s,
299 struct mem_attr_info_t *p_attr);
300
301/**
302 * \brief Retrieve the non-secure memory protection configuration information
303 * and fills the \ref mem_attr_info_t.
304 *
305 * \param[in] p Base address of target memory region
306 * \param[in] s Size of target memory region
307 * \param[out] p_attr Address of \ref mem_attr_info_t to be filled
308 *
309 * \return void
310 */
311void tfm_spm_hal_get_ns_access_attr(const void *p, size_t s,
312 struct mem_attr_info_t *p_attr);
313
314#endif /*TFM_MULTI_CORE_TOPOLOGY*/
315
Edison Ai1c266ae2019-03-20 11:21:21 +0800316#endif /* __TFM_SPM_HAL_H__ */