blob: caed24914837df29b24a5f4e1be942e8d5525983 [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 Ai1dfd7b12020-02-23 14:16:08 +0800108#ifdef CONFIG_TFM_ENABLE_MEMORY_PROTECT
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 Ai1dfd7b12020-02-23 14:16:08 +0800117#endif /* CONFIG_TFM_ENABLE_MEMORY_PROTECT */
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
Edison Ai6be3df12020-02-14 22:14:33 +0800129 * be used for configuration.
130 *
131 * \return Returns values as specified by the \ref tfm_plat_err_t
Edison Ai1c266ae2019-03-20 11:21:21 +0800132 */
Edison Ai6be3df12020-02-14 22:14:33 +0800133enum tfm_plat_err_t tfm_spm_hal_configure_default_isolation(
Mate Toth-Pal5e6d0342019-11-22 11:43:20 +0100134 uint32_t partition_idx,
Edison Ai1c266ae2019-03-20 11:21:21 +0800135 const struct tfm_spm_partition_platform_data_t *platform_data);
136/**
137 * \brief Configures the system debug properties.
138 * The default configuration of this function should disable secure debug
139 * when either DAUTH_NONE or DAUTH_NS_ONLY define is set. It is up to the
140 * platform owner to decide if secure debug can be turned on in their
141 * system, if DAUTH_FULL define is present.
142 * The DAUTH_CHIP_DEFAULT define should not be considered a safe default
143 * option unless explicitly noted by the chip vendor.
144 * The implementation has to expect that one of those defines is going to
145 * be set. Otherwise, a compile error needs to be triggered.
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200146 *
147 * \return Returns values as specified by the \ref tfm_plat_err_t
Edison Ai1c266ae2019-03-20 11:21:21 +0800148 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200149enum tfm_plat_err_t tfm_spm_hal_init_debug(void);
Edison Ai1c266ae2019-03-20 11:21:21 +0800150
151/**
Mate Toth-Pal3e2ebd02019-05-07 14:22:16 +0200152 * \brief Enables the fault handlers and sets priorities.
153 *
154 * Secure fault (if present) must have the highest possible priority
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200155 *
156 * \return Returns values as specified by the \ref tfm_plat_err_t
Edison Ai1c266ae2019-03-20 11:21:21 +0800157 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200158enum tfm_plat_err_t tfm_spm_hal_enable_fault_handlers(void);
Edison Ai1c266ae2019-03-20 11:21:21 +0800159
160/**
Marc Moreno Berengue8e0fa7a2018-10-04 18:25:13 +0100161 * \brief Configures the system reset request properties
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200162 *
163 * \return Returns values as specified by the \ref tfm_plat_err_t
Marc Moreno Berengue8e0fa7a2018-10-04 18:25:13 +0100164 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200165enum tfm_plat_err_t tfm_spm_hal_system_reset_cfg(void);
Edison Ai1c266ae2019-03-20 11:21:21 +0800166
Marc Moreno Berengue8e0fa7a2018-10-04 18:25:13 +0100167/**
Edison Ai5525ef32019-12-23 10:17:22 +0800168 * \brief System reset
169 */
170void tfm_spm_hal_system_reset(void);
171
172/**
Edison Ai1c266ae2019-03-20 11:21:21 +0800173 * \brief Configures all external interrupts to target the
174 * NS state, apart for the ones associated to secure
175 * peripherals (plus MPC and PPC)
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200176 *
177 * \return Returns values as specified by the \ref tfm_plat_err_t
Edison Ai1c266ae2019-03-20 11:21:21 +0800178 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200179enum tfm_plat_err_t tfm_spm_hal_nvic_interrupt_target_state_cfg(void);
Edison Ai1c266ae2019-03-20 11:21:21 +0800180
181/**
182 * \brief This function enable the interrupts associated
183 * to the secure peripherals (plus the isolation boundary violation
184 * interrupts)
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200185 *
186 * \return Returns values as specified by the \ref tfm_plat_err_t
Edison Ai1c266ae2019-03-20 11:21:21 +0800187 */
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200188enum tfm_plat_err_t tfm_spm_hal_nvic_interrupt_enable(void);
Edison Ai1c266ae2019-03-20 11:21:21 +0800189
190/**
191 * \brief Get the VTOR value of non-secure image
192 *
193 * \return Returns the address where the vector table of the non-secure image
194 * is located
195 */
196uint32_t tfm_spm_hal_get_ns_VTOR(void);
197
198/**
199 * \brief Get the initial address of non-secure image main stack
200 *
201 * \return Returns the initial non-secure MSP
202 */
203uint32_t tfm_spm_hal_get_ns_MSP(void);
204
205/**
206 * \brief Get the entry point of the non-secure image
207 *
208 * \return Returns the address of the non-secure image entry point
209 */
210uint32_t tfm_spm_hal_get_ns_entry_point(void);
211
Mate Toth-Pal94925722019-06-27 15:10:48 +0200212/**
213 * \brief Set the priority of a secure IRQ
214 *
215 * \param[in] irq_line The IRQ to set the priority for. Might be less than 0
216 * \param[in] priority The priority to set. [0..255]
217 *
218 * \details This function sets the priority for the IRQ passed in the parameter.
219 * The precision of the priority value might be adjusted to match the
220 * available priority bits in the underlying target platform.
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200221 *
222 * \return Returns values as specified by the \ref tfm_plat_err_t
Mate Toth-Pal94925722019-06-27 15:10:48 +0200223 */
TTornblomfaf74f52020-03-04 17:56:27 +0100224enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line,
Mate Toth-Palb9c33552019-07-10 16:13:20 +0200225 uint32_t priority);
Edison Ai1c266ae2019-03-20 11:21:21 +0800226
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200227/**
228 * \brief Clears a pending IRQ
229 *
230 * \param[in] irq_line The IRQ to clear pending for.
231 */
TTornblomfaf74f52020-03-04 17:56:27 +0100232void tfm_spm_hal_clear_pending_irq(IRQn_Type irq_line);
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200233
234/**
235 * \brief Enables an IRQ
236 *
237 * \param[in] irq_line The IRQ to be enabled.
238 */
TTornblomfaf74f52020-03-04 17:56:27 +0100239void tfm_spm_hal_enable_irq(IRQn_Type irq_line);
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200240
241/**
242 * \brief Disables an IRQ
243 *
244 * \param[in] irq_line The IRQ to be disabled
245 */
TTornblomfaf74f52020-03-04 17:56:27 +0100246void tfm_spm_hal_disable_irq(IRQn_Type irq_line);
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200247
248/**
249 * \brief Set the target state of an IRQ
250 *
251 * \param[in] irq_line The IRQ to set the priority for.
252 * \param[in] target_state Target state to ret for the IRQ.
253 *
254 * \return TFM_IRQ_TARGET_STATE_SECURE if interrupt is assigned
255 * to Secure
256 * TFM_IRQ_TARGET_STATE_NON_SECURE if interrupt is
257 * assigned to Non-Secure
258 */
259enum irq_target_state_t tfm_spm_hal_set_irq_target_state(
TTornblomfaf74f52020-03-04 17:56:27 +0100260 IRQn_Type irq_line,
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200261 enum irq_target_state_t target_state);
262
David Hu520dcd02019-11-18 16:04:36 +0800263#ifdef TFM_MULTI_CORE_TOPOLOGY
264/**
265 * \brief Performs the necessary actions to start the non-secure CPU running
266 * the code at the specified address.
267 *
268 * \param[in] start_addr The entry point address of non-secure code.
269 */
270void tfm_spm_hal_boot_ns_cpu(uintptr_t start_addr);
271
272/**
273 * \brief Called on the secure CPU.
274 * Flags that the secure CPU has completed its initialization
275 * Waits, if necessary, for the non-secure CPU to flag that
276 * it has completed its initialisation
277 */
278void tfm_spm_hal_wait_for_ns_cpu_ready(void);
279
280/**
281 * \brief Retrieve the current active security configuration information and
282 * fills the \ref security_attr_info_t.
283 *
284 * \param[in] p Base address of target memory region
285 * \param[in] s Size of target memory region
286 * \param[out] p_attr Address of \ref security_attr_info_t to be filled
287 *
288 * \return void
289 */
290void tfm_spm_hal_get_mem_security_attr(const void *p, size_t s,
291 struct security_attr_info_t *p_attr);
292
293/**
294 * \brief Retrieve the secure memory protection configuration information and
295 * fills the \ref mem_attr_info_t.
296 *
297 * \param[in] p Base address of target memory region
298 * \param[in] s Size of target memory region
299 * \param[out] p_attr Address of \ref mem_attr_info_t to be filled
300 *
301 * \return void
302 */
303void tfm_spm_hal_get_secure_access_attr(const void *p, size_t s,
304 struct mem_attr_info_t *p_attr);
305
306/**
307 * \brief Retrieve the non-secure memory protection configuration information
308 * and fills the \ref mem_attr_info_t.
309 *
310 * \param[in] p Base address of target memory region
311 * \param[in] s Size of target memory region
312 * \param[out] p_attr Address of \ref mem_attr_info_t to be filled
313 *
314 * \return void
315 */
316void tfm_spm_hal_get_ns_access_attr(const void *p, size_t s,
317 struct mem_attr_info_t *p_attr);
318
319#endif /*TFM_MULTI_CORE_TOPOLOGY*/
320
Edison Ai1c266ae2019-03-20 11:21:21 +0800321#endif /* __TFM_SPM_HAL_H__ */