blob: b12df11571037d6dbbed347219fdecb666f10659 [file] [log] [blame]
Edison Ai1c266ae2019-03-20 11:21:21 +08001/*
Mate Toth-Pal5e6d0342019-11-22 11:43:20 +01002 * Copyright (c) 2018-2020, 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/**
Mate Toth-Pal5e6d0342019-11-22 11:43:20 +0100120 * \brief Configure peripherals for a partition based on the platform data and
121 * partition index from the DB
Edison Ai1c266ae2019-03-20 11:21:21 +0800122 *
123 * This function is called during partition initialisation (before calling the
124 * init function for the partition)
125 *
Mate Toth-Pal5e6d0342019-11-22 11:43:20 +0100126 * \param[in] partition_idx The index of the partition that this peripheral
127 * is assigned to.
Edison Ai1c266ae2019-03-20 11:21:21 +0800128 * \param[in] platform_data The platform fields of the partition DB record to
129 * be used for configuration. Can be NULL.
130 */
131void tfm_spm_hal_configure_default_isolation(
Mate Toth-Pal5e6d0342019-11-22 11:43:20 +0100132 uint32_t partition_idx,
Edison Ai1c266ae2019-03-20 11:21:21 +0800133 const struct tfm_spm_partition_platform_data_t *platform_data);
134/**
135 * \brief Configures the system debug properties.
136 * The default configuration of this function should disable secure debug
137 * when either DAUTH_NONE or DAUTH_NS_ONLY define is set. It is up to the
138 * platform owner to decide if secure debug can be turned on in their
139 * system, if DAUTH_FULL define is present.
140 * The DAUTH_CHIP_DEFAULT define should not be considered a safe default
141 * option unless explicitly noted by the chip vendor.
142 * The implementation has to expect that one of those defines is going to
143 * be set. Otherwise, a compile error needs to be triggered.
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200144 *
145 * \return Returns values as specified by the \ref tfm_plat_err_t
Edison Ai1c266ae2019-03-20 11:21:21 +0800146 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200147enum tfm_plat_err_t tfm_spm_hal_init_debug(void);
Edison Ai1c266ae2019-03-20 11:21:21 +0800148
149/**
Mate Toth-Pal3e2ebd02019-05-07 14:22:16 +0200150 * \brief Enables the fault handlers and sets priorities.
151 *
152 * Secure fault (if present) must have the highest possible priority
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200153 *
154 * \return Returns values as specified by the \ref tfm_plat_err_t
Edison Ai1c266ae2019-03-20 11:21:21 +0800155 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200156enum tfm_plat_err_t tfm_spm_hal_enable_fault_handlers(void);
Edison Ai1c266ae2019-03-20 11:21:21 +0800157
158/**
Marc Moreno Berengue8e0fa7a2018-10-04 18:25:13 +0100159 * \brief Configures the system reset request properties
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200160 *
161 * \return Returns values as specified by the \ref tfm_plat_err_t
Marc Moreno Berengue8e0fa7a2018-10-04 18:25:13 +0100162 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200163enum tfm_plat_err_t tfm_spm_hal_system_reset_cfg(void);
Edison Ai1c266ae2019-03-20 11:21:21 +0800164
Marc Moreno Berengue8e0fa7a2018-10-04 18:25:13 +0100165/**
Edison Ai5525ef32019-12-23 10:17:22 +0800166 * \brief System reset
167 */
168void tfm_spm_hal_system_reset(void);
169
170/**
Edison Ai1c266ae2019-03-20 11:21:21 +0800171 * \brief Configures all external interrupts to target the
172 * NS state, apart for the ones associated to secure
173 * peripherals (plus MPC and PPC)
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200174 *
175 * \return Returns values as specified by the \ref tfm_plat_err_t
Edison Ai1c266ae2019-03-20 11:21:21 +0800176 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200177enum tfm_plat_err_t tfm_spm_hal_nvic_interrupt_target_state_cfg(void);
Edison Ai1c266ae2019-03-20 11:21:21 +0800178
179/**
180 * \brief This function enable the interrupts associated
181 * to the secure peripherals (plus the isolation boundary violation
182 * interrupts)
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200183 *
184 * \return Returns values as specified by the \ref tfm_plat_err_t
Edison Ai1c266ae2019-03-20 11:21:21 +0800185 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200186enum tfm_plat_err_t tfm_spm_hal_nvic_interrupt_enable(void);
Edison Ai1c266ae2019-03-20 11:21:21 +0800187
188/**
189 * \brief Get the VTOR value of non-secure image
190 *
191 * \return Returns the address where the vector table of the non-secure image
192 * is located
193 */
194uint32_t tfm_spm_hal_get_ns_VTOR(void);
195
196/**
197 * \brief Get the initial address of non-secure image main stack
198 *
199 * \return Returns the initial non-secure MSP
200 */
201uint32_t tfm_spm_hal_get_ns_MSP(void);
202
203/**
204 * \brief Get the entry point of the non-secure image
205 *
206 * \return Returns the address of the non-secure image entry point
207 */
208uint32_t tfm_spm_hal_get_ns_entry_point(void);
209
Mate Toth-Pal94925722019-06-27 15:10:48 +0200210/**
211 * \brief Set the priority of a secure IRQ
212 *
213 * \param[in] irq_line The IRQ to set the priority for. Might be less than 0
214 * \param[in] priority The priority to set. [0..255]
215 *
216 * \details This function sets the priority for the IRQ passed in the parameter.
217 * The precision of the priority value might be adjusted to match the
218 * available priority bits in the underlying target platform.
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200219 *
220 * \return Returns values as specified by the \ref tfm_plat_err_t
Mate Toth-Pal94925722019-06-27 15:10:48 +0200221 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200222enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(int32_t irq_line,
223 uint32_t priority);
Edison Ai1c266ae2019-03-20 11:21:21 +0800224
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200225/**
226 * \brief Clears a pending IRQ
227 *
228 * \param[in] irq_line The IRQ to clear pending for.
229 */
230void tfm_spm_hal_clear_pending_irq(int32_t irq_line);
231
232/**
233 * \brief Enables an IRQ
234 *
235 * \param[in] irq_line The IRQ to be enabled.
236 */
237void tfm_spm_hal_enable_irq(int32_t irq_line);
238
239/**
240 * \brief Disables an IRQ
241 *
242 * \param[in] irq_line The IRQ to be disabled
243 */
244void tfm_spm_hal_disable_irq(int32_t irq_line);
245
246/**
247 * \brief Set the target state of an IRQ
248 *
249 * \param[in] irq_line The IRQ to set the priority for.
250 * \param[in] target_state Target state to ret for the IRQ.
251 *
252 * \return TFM_IRQ_TARGET_STATE_SECURE if interrupt is assigned
253 * to Secure
254 * TFM_IRQ_TARGET_STATE_NON_SECURE if interrupt is
255 * assigned to Non-Secure
256 */
257enum irq_target_state_t tfm_spm_hal_set_irq_target_state(
258 int32_t irq_line,
259 enum irq_target_state_t target_state);
260
David Hu520dcd02019-11-18 16:04:36 +0800261#ifdef TFM_MULTI_CORE_TOPOLOGY
262/**
263 * \brief Performs the necessary actions to start the non-secure CPU running
264 * the code at the specified address.
265 *
266 * \param[in] start_addr The entry point address of non-secure code.
267 */
268void tfm_spm_hal_boot_ns_cpu(uintptr_t start_addr);
269
270/**
271 * \brief Called on the secure CPU.
272 * Flags that the secure CPU has completed its initialization
273 * Waits, if necessary, for the non-secure CPU to flag that
274 * it has completed its initialisation
275 */
276void tfm_spm_hal_wait_for_ns_cpu_ready(void);
277
278/**
279 * \brief Retrieve the current active security configuration information and
280 * fills the \ref security_attr_info_t.
281 *
282 * \param[in] p Base address of target memory region
283 * \param[in] s Size of target memory region
284 * \param[out] p_attr Address of \ref security_attr_info_t to be filled
285 *
286 * \return void
287 */
288void tfm_spm_hal_get_mem_security_attr(const void *p, size_t s,
289 struct security_attr_info_t *p_attr);
290
291/**
292 * \brief Retrieve the secure memory protection configuration information and
293 * fills the \ref mem_attr_info_t.
294 *
295 * \param[in] p Base address of target memory region
296 * \param[in] s Size of target memory region
297 * \param[out] p_attr Address of \ref mem_attr_info_t to be filled
298 *
299 * \return void
300 */
301void tfm_spm_hal_get_secure_access_attr(const void *p, size_t s,
302 struct mem_attr_info_t *p_attr);
303
304/**
305 * \brief Retrieve the non-secure memory protection configuration information
306 * and fills the \ref mem_attr_info_t.
307 *
308 * \param[in] p Base address of target memory region
309 * \param[in] s Size of target memory region
310 * \param[out] p_attr Address of \ref mem_attr_info_t to be filled
311 *
312 * \return void
313 */
314void tfm_spm_hal_get_ns_access_attr(const void *p, size_t s,
315 struct mem_attr_info_t *p_attr);
316
317#endif /*TFM_MULTI_CORE_TOPOLOGY*/
318
Edison Ai1c266ae2019-03-20 11:21:21 +0800319#endif /* __TFM_SPM_HAL_H__ */