/* | |
* Copyright (c) 2018, Arm Limited. All rights reserved. | |
* | |
* SPDX-License-Identifier: BSD-3-Clause | |
* | |
*/ | |
#ifndef __TFM_SPM_HAL_H__ | |
#define __TFM_SPM_HAL_H__ | |
#include <stdint.h> | |
#include "tfm_secure_api.h" | |
#include "spm_api.h" | |
/** | |
* \brief Holds peripheral specific data fields required to manage the | |
* peripherals isolation | |
* | |
* This structure has to be defined in the platform directory, and may have | |
* different definition for each platform. The structure should contain fields | |
* that describe the peripheral for the functions that are prototyped in this | |
* file and are responsible for configuring the isolation of the peripherals. | |
* | |
* Pointers to structures of this type are managed by the SPM, and passed to the | |
* necessary function on isolation request. The pointers are also defined by the | |
* platform in the header file tfm_peripherals_def.h. For details on this, see | |
* the documentation of that file. | |
*/ | |
struct tfm_spm_partition_platform_data_t; | |
#if TFM_LVL != 1 | |
/** | |
* \brief Holds SPM db fields that define the memory regions used by a | |
* partition. | |
*/ | |
struct tfm_spm_partition_memory_data_t | |
{ | |
uint32_t code_start; /*!< Start of the code memory of this partition. */ | |
uint32_t code_limit; /*!< Address of the byte beyond the end of the code | |
* memory of this partition. | |
*/ | |
uint32_t ro_start; /*!< Start of the read only memory of this | |
* partition. | |
*/ | |
uint32_t ro_limit; /*!< Address of the byte beyond the end of the read | |
* only memory of this partition. | |
*/ | |
uint32_t rw_start; /*!< Start of the data region of this partition. */ | |
uint32_t rw_limit; /*!< Address of the byte beyond the end of the data | |
* region of this partition. | |
*/ | |
uint32_t zi_start; /*!< Start of the zero initialised data region of | |
* this partition. | |
*/ | |
uint32_t zi_limit; /*!< Address of the byte beyond the end of the zero | |
* initialised region of this partition. | |
*/ | |
uint32_t stack_bottom; /*!< The bottom of the stack for the partition. */ | |
uint32_t stack_top; /*!< The top of the stack for the partition. */ | |
}; | |
#endif | |
/** | |
* \brief This function initialises the HW used for isolation, and sets the | |
* default configuration for them. | |
* | |
* This function is called during TF-M core early startup, before DB init | |
*/ | |
void tfm_spm_hal_init_isolation_hw(void); | |
/** | |
* \brief This function initialises the HW used for isolation, and sets the | |
* default configuration for them. | |
* This function is called during TF-M core early startup, after DB init | |
*/ | |
void tfm_spm_hal_setup_isolation_hw(void); | |
/** | |
* \brief Configure peripherals for a partition based on the platfotm data from | |
* the DB | |
* | |
* This function is called during partition initialisation (before calling the | |
* init function for the partition) | |
* | |
* \param[in] platform_data The platform fields of the partition DB record to | |
* be used for configuration. Can be NULL. | |
*/ | |
void tfm_spm_hal_configure_default_isolation( | |
const struct tfm_spm_partition_platform_data_t *platform_data); | |
/** | |
* \brief Enables the fault handlers | |
*/ | |
void enable_fault_handlers(void); | |
/** | |
* \brief Configures all external interrupts to target the | |
* NS state, apart for the ones associated to secure | |
* peripherals (plus MPC and PPC) | |
*/ | |
void nvic_interrupt_target_state_cfg(void); | |
/** | |
* \brief This function enable the interrupts associated | |
* to the secure peripherals (plus the isolation boundary violation | |
* interrupts) | |
*/ | |
void nvic_interrupt_enable(void); | |
/** | |
* \brief Get the VTOR value of non-secure image | |
* | |
* \return Returns the address where the vector table of the non-secure image | |
* is located | |
*/ | |
uint32_t tfm_spm_hal_get_ns_VTOR(void); | |
/** | |
* \brief Get the initial address of non-secure image main stack | |
* | |
* \return Returns the initial non-secure MSP | |
*/ | |
uint32_t tfm_spm_hal_get_ns_MSP(void); | |
/** | |
* \brief Get the entry point of the non-secure image | |
* | |
* \return Returns the address of the non-secure image entry point | |
*/ | |
uint32_t tfm_spm_hal_get_ns_entry_point(void); | |
#if TFM_LVL != 1 | |
/** | |
* \brief Configure the sandbox for a partition. | |
* | |
* \param[in] memory_data The memory ranges from the partition DB for this | |
* partition | |
* \param[in] platform_data The platform fields of the partition DB record | |
* for this partition. Can be NULL. | |
* | |
* \return Returns the result operation as per \ref spm_err_t | |
*/ | |
enum spm_err_t tfm_spm_hal_partition_sandbox_config( | |
const struct tfm_spm_partition_memory_data_t *memory_data, | |
const struct tfm_spm_partition_platform_data_t *platform_data); | |
/** | |
* \brief Deconfigure the sandbox for a partition. | |
* | |
* \param[in] memory_data The memory ranges from the partition DB for this | |
* partition | |
* \param[in] platform_data The platform fields of the partition DB record | |
* for this partition. Can be NULL. | |
* | |
* \return Returns the result operation as per \ref spm_err_t | |
*/ | |
enum spm_err_t tfm_spm_hal_partition_sandbox_deconfig( | |
const struct tfm_spm_partition_memory_data_t *memory_data, | |
const struct tfm_spm_partition_platform_data_t *platform_data); | |
/** | |
* \brief Set the share region mode | |
* | |
* \param[in] share The mode to set | |
* | |
* \return Returns the result operation as per \ref spm_err_t | |
*/ | |
enum spm_err_t tfm_spm_hal_set_share_region( | |
enum tfm_buffer_share_region_e share); | |
#endif | |
#endif /* __TFM_SPM_HAL_H__ */ |