SPM: Remove the IRQ priority in manifest
TF-M added a tfm_irq_priority attribute in the Partition manifest
for SPM to set IRQ priorities so that IRQ can work correctly - TF-M
requires external interrupt priorities must be higher than that of
PendSV.
However, a universal IRQ priority might not work on all platforms
because different platforms have different number of configurable
interrupt priorities. So the same value represents different
priorities on different platforms.
Besides, the attribute is not defined by FF-M.
This patch removes the IRQ priority in manifest and in the HAL API
as well so that platforms have the most flexibility to set priorities
for IRQs based on their own cases.
Note: the external interrupt priorities must be higher than PendSV.
Change-Id: Id9e544a9afffcc7d019177cf29e51f32d1600504
Signed-off-by: Kevin Peng <kevin.peng@arm.com>
diff --git a/docs/integration_guide/services/tfm_secure_partition_addition.rst b/docs/integration_guide/services/tfm_secure_partition_addition.rst
index a682128..7657632 100644
--- a/docs/integration_guide/services/tfm_secure_partition_addition.rst
+++ b/docs/integration_guide/services/tfm_secure_partition_addition.rst
@@ -120,7 +120,6 @@
{
"source": "TFM_A_IRQ",
"signal": "SPM_CORE_A_IRQ",
- "tfm_irq_priority": 64,
}
],
"linker_pattern": {
diff --git a/docs/technical_references/tfm_secure_irq_handling.rst b/docs/technical_references/tfm_secure_irq_handling.rst
index 253ef35..b9baae9 100644
--- a/docs/technical_references/tfm_secure_irq_handling.rst
+++ b/docs/technical_references/tfm_secure_irq_handling.rst
@@ -32,7 +32,6 @@
{
"source": "TFM_IRQ_LINE_TIMER_1",
"signal": "TIMER_1"
- "tfm_irq_priority": 64,
}
],
@@ -54,10 +53,6 @@
is important the macro name matches the platform's handler function for that
IRQ source.
- ``signal``: The name of the signal for this IRQ.
-- ``tfm_irq_priority``: The priority of the IRQ. This number must be in the
- range [0-255] inclusive. Please note that some of the less significant bits of
- this value might be dropped based on the number of priority bits implemented
- in the platform.
.. important::
@@ -79,14 +74,16 @@
``signal`` and ``source`` are mandatory.
- ``tfm_irq_priority`` is optional. If ``tfm_irq_priority`` is not set for an
- IRQ, the default is value is ``TFM_DEFAULT_SECURE_IRQ_PRIORITY``.
-
If an IRQ handler is registered, TF-M will:
- Set the IRQ with number or macro to target secure state
-- Set the priority of IRQ with number or macro to ``tfm_irq_priority`` or to
- the default.
+- Set the priority of IRQ, the number is platform dependent. Platforms can
+ decide the priorities of each IRQ.
+
+.. Note::
+
+ The priority value for IRQ must be smaller than the value of PendSV, which is
+ 0x80.
TF-M configures the interrupt lines to be disabled by default. Interrupts for a
service can be enabled by the secure service by calling
diff --git a/platform/ext/target/arm/mps2/an519/spm_hal.c b/platform/ext/target/arm/mps2/an519/spm_hal.c
index 1e081d2..9e2e044 100644
--- a/platform/ext/target/arm/mps2/an519/spm_hal.c
+++ b/platform/ext/target/arm/mps2/an519/spm_hal.c
@@ -128,11 +128,9 @@
return *((uint32_t *)(memory_regions.non_secure_code_start+ 4));
}
-enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line,
- uint32_t priority)
+enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line)
{
- uint32_t quantized_priority = priority >> (8U - __NVIC_PRIO_BITS);
- NVIC_SetPriority(irq_line, quantized_priority);
+ NVIC_SetPriority(irq_line, DEFAULT_IRQ_PRIORITY);
return TFM_PLAT_ERR_SUCCESS;
}
diff --git a/platform/ext/target/arm/mps2/an521/spm_hal.c b/platform/ext/target/arm/mps2/an521/spm_hal.c
index 9390b46..33e20b5 100644
--- a/platform/ext/target/arm/mps2/an521/spm_hal.c
+++ b/platform/ext/target/arm/mps2/an521/spm_hal.c
@@ -168,11 +168,9 @@
return *((uint32_t *)(memory_regions.non_secure_code_start+ 4));
}
-enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line,
- uint32_t priority)
+enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line)
{
- uint32_t quantized_priority = priority >> (8U - __NVIC_PRIO_BITS);
- NVIC_SetPriority(irq_line, quantized_priority);
+ NVIC_SetPriority(irq_line, DEFAULT_IRQ_PRIORITY);
return TFM_PLAT_ERR_SUCCESS;
}
diff --git a/platform/ext/target/arm/mps2/fvp_sse300/spm_hal.c b/platform/ext/target/arm/mps2/fvp_sse300/spm_hal.c
index ff26d6f..e7c4ca6 100644
--- a/platform/ext/target/arm/mps2/fvp_sse300/spm_hal.c
+++ b/platform/ext/target/arm/mps2/fvp_sse300/spm_hal.c
@@ -111,11 +111,9 @@
return *((uint32_t *)(memory_regions.non_secure_code_start+ 4));
}
-enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line,
- uint32_t priority)
+enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line)
{
- uint32_t quantized_priority = priority >> (8U - __NVIC_PRIO_BITS);
- NVIC_SetPriority(irq_line, quantized_priority);
+ NVIC_SetPriority(irq_line, DEFAULT_IRQ_PRIORITY);
return TFM_PLAT_ERR_SUCCESS;
}
diff --git a/platform/ext/target/arm/mps3/an524/spm_hal.c b/platform/ext/target/arm/mps3/an524/spm_hal.c
index 30907b2..6debc62 100644
--- a/platform/ext/target/arm/mps3/an524/spm_hal.c
+++ b/platform/ext/target/arm/mps3/an524/spm_hal.c
@@ -132,11 +132,9 @@
return TFM_PLAT_ERR_SUCCESS;
}
-enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line,
- uint32_t priority)
+enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line)
{
- uint32_t quantized_priority = priority >> (8U - __NVIC_PRIO_BITS);
- NVIC_SetPriority(irq_line, quantized_priority);
+ NVIC_SetPriority(irq_line, DEFAULT_IRQ_PRIORITY);
return TFM_PLAT_ERR_SUCCESS;
}
diff --git a/platform/ext/target/arm/mps3/an547/spm_hal.c b/platform/ext/target/arm/mps3/an547/spm_hal.c
index e8c8c8d..e575c41 100644
--- a/platform/ext/target/arm/mps3/an547/spm_hal.c
+++ b/platform/ext/target/arm/mps3/an547/spm_hal.c
@@ -113,11 +113,9 @@
return *((uint32_t *)(memory_regions.non_secure_code_start+ 4));
}
-enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line,
- uint32_t priority)
+enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line)
{
- uint32_t quantized_priority = priority >> (8U - __NVIC_PRIO_BITS);
- NVIC_SetPriority(irq_line, quantized_priority);
+ NVIC_SetPriority(irq_line, DEFAULT_IRQ_PRIORITY);
return TFM_PLAT_ERR_SUCCESS;
}
diff --git a/platform/ext/target/arm/musca_b1/secure_enclave/spm_hal.c b/platform/ext/target/arm/musca_b1/secure_enclave/spm_hal.c
index 207db15..a609802 100644
--- a/platform/ext/target/arm/musca_b1/secure_enclave/spm_hal.c
+++ b/platform/ext/target/arm/musca_b1/secure_enclave/spm_hal.c
@@ -54,11 +54,9 @@
}
}
-enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line,
- uint32_t priority)
+enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line)
{
- uint32_t quantized_priority = priority >> (8U - __NVIC_PRIO_BITS);
- NVIC_SetPriority(irq_line, quantized_priority);
+ NVIC_SetPriority(irq_line, DEFAULT_IRQ_PRIORITY);
return TFM_PLAT_ERR_SUCCESS;
}
diff --git a/platform/ext/target/arm/musca_b1/sse_200/spm_hal.c b/platform/ext/target/arm/musca_b1/sse_200/spm_hal.c
index 58ac546..d96f23c 100644
--- a/platform/ext/target/arm/musca_b1/sse_200/spm_hal.c
+++ b/platform/ext/target/arm/musca_b1/sse_200/spm_hal.c
@@ -145,11 +145,9 @@
return *((uint32_t *)(memory_regions.non_secure_code_start+ 4));
}
-enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line,
- uint32_t priority)
+enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line)
{
- uint32_t quantized_priority = priority >> (8U - __NVIC_PRIO_BITS);
- NVIC_SetPriority(irq_line, quantized_priority);
+ NVIC_SetPriority(irq_line, DEFAULT_IRQ_PRIORITY);
return TFM_PLAT_ERR_SUCCESS;
}
diff --git a/platform/ext/target/arm/musca_s1/spm_hal.c b/platform/ext/target/arm/musca_s1/spm_hal.c
index 46f0de0..47898ae 100644
--- a/platform/ext/target/arm/musca_s1/spm_hal.c
+++ b/platform/ext/target/arm/musca_s1/spm_hal.c
@@ -91,11 +91,9 @@
return *((uint32_t *)(memory_regions.non_secure_code_start+ 4));
}
-enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line,
- uint32_t priority)
+enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line)
{
- uint32_t quantized_priority = priority >> (8U - __NVIC_PRIO_BITS);
- NVIC_SetPriority(irq_line, quantized_priority);
+ NVIC_SetPriority(irq_line, DEFAULT_IRQ_PRIORITY);
return TFM_PLAT_ERR_SUCCESS;
}
diff --git a/platform/ext/target/cypress/psoc64/spm_hal.c b/platform/ext/target/cypress/psoc64/spm_hal.c
index b996368..d249c88 100644
--- a/platform/ext/target/cypress/psoc64/spm_hal.c
+++ b/platform/ext/target/cypress/psoc64/spm_hal.c
@@ -112,11 +112,9 @@
}
}
-enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line,
- uint32_t priority)
+enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line)
{
- uint32_t quantized_priority = priority >> (8U - __NVIC_PRIO_BITS);
- NVIC_SetPriority(irq_line, quantized_priority);
+ NVIC_SetPriority(irq_line, DEFAULT_IRQ_PRIORITY);
return TFM_PLAT_ERR_SUCCESS;
}
diff --git a/platform/ext/target/nordic_nrf/common/core/spm_hal.c b/platform/ext/target/nordic_nrf/common/core/spm_hal.c
index 5b9aa9c..801eb69 100644
--- a/platform/ext/target/nordic_nrf/common/core/spm_hal.c
+++ b/platform/ext/target/nordic_nrf/common/core/spm_hal.c
@@ -110,11 +110,9 @@
return *((const uint32_t *)(memory_regions.non_secure_code_start + 4));
}
-enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line,
- uint32_t priority)
+enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line)
{
- uint32_t quantized_priority = priority >> (8U - __NVIC_PRIO_BITS);
- NVIC_SetPriority(irq_line, quantized_priority);
+ NVIC_SetPriority(irq_line, DEFAULT_IRQ_PRIORITY);
return TFM_PLAT_ERR_SUCCESS;
}
diff --git a/platform/ext/target/nuvoton/common/spm_hal.c b/platform/ext/target/nuvoton/common/spm_hal.c
index 9772399..4f3df5c 100644
--- a/platform/ext/target/nuvoton/common/spm_hal.c
+++ b/platform/ext/target/nuvoton/common/spm_hal.c
@@ -84,11 +84,9 @@
return *((uint32_t *)(memory_regions.non_secure_code_start+ 4));
}
-enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line,
- uint32_t priority)
+enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line)
{
- uint32_t quantized_priority = priority >> (8U - __NVIC_PRIO_BITS);
- NVIC_SetPriority(irq_line, quantized_priority);
+ NVIC_SetPriority(irq_line, DEFAULT_IRQ_PRIORITY);
return TFM_PLAT_ERR_SUCCESS;
}
diff --git a/platform/ext/target/nxp/common/spm_hal.c b/platform/ext/target/nxp/common/spm_hal.c
index fee91a9..9844bb4 100644
--- a/platform/ext/target/nxp/common/spm_hal.c
+++ b/platform/ext/target/nxp/common/spm_hal.c
@@ -100,11 +100,9 @@
return *((uint32_t *)(memory_regions.non_secure_code_start+ 4));
}
-enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line,
- uint32_t priority)
+enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line)
{
- uint32_t quantized_priority = priority >> (8U - __NVIC_PRIO_BITS);
- NVIC_SetPriority(irq_line, quantized_priority);
+ NVIC_SetPriority(irq_line, DEFAULT_IRQ_PRIORITY);
return TFM_PLAT_ERR_SUCCESS;
}
diff --git a/platform/ext/target/stm/common/stm32l5xx/secure/spm_hal.c b/platform/ext/target/stm/common/stm32l5xx/secure/spm_hal.c
index 638d0cf..42af56e 100644
--- a/platform/ext/target/stm/common/stm32l5xx/secure/spm_hal.c
+++ b/platform/ext/target/stm/common/stm32l5xx/secure/spm_hal.c
@@ -41,11 +41,9 @@
return *((uint32_t *)(memory_regions.non_secure_code_start+ 4));
}
-enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line,
- uint32_t priority)
+enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line)
{
- uint32_t quantized_priority = priority >> (8U - __NVIC_PRIO_BITS);
- NVIC_SetPriority(irq_line, quantized_priority);
+ NVIC_SetPriority(irq_line, DEFAULT_IRQ_PRIORITY);
return TFM_PLAT_ERR_SUCCESS;
}
diff --git a/platform/include/tfm_spm_hal.h b/platform/include/tfm_spm_hal.h
index 5730492..91e9807 100644
--- a/platform/include/tfm_spm_hal.h
+++ b/platform/include/tfm_spm_hal.h
@@ -9,6 +9,7 @@
#define __TFM_SPM_HAL_H__
#include <stdint.h>
+#include "cmsis.h"
#include "fih.h"
#include "tfm_secure_api.h"
#ifdef TFM_MULTI_CORE_TOPOLOGY
@@ -16,6 +17,12 @@
#endif
#include "tfm_plat_defs.h"
+/*
+ * Quantized default IRQ priority, the value is:
+ * (Number of configurable priority) / 4: (1UL << __NVIC_PRIO_BITS) / 4
+ */
+#define DEFAULT_IRQ_PRIORITY (1UL << (__NVIC_PRIO_BITS - 2))
+
/**
* \brief Holds peripheral specific data fields required to manage the
* peripherals isolation
@@ -195,16 +202,17 @@
* \brief Set the priority of a secure IRQ
*
* \param[in] irq_line The IRQ to set the priority for. Might be less than 0
- * \param[in] priority The priority to set. [0..255]
*
* \details This function sets the priority for the IRQ passed in the parameter.
- * The precision of the priority value might be adjusted to match the
- * available priority bits in the underlying target platform.
*
* \return Returns values as specified by the \ref tfm_plat_err_t
+ *
+ * \note The priority value must be less than the value of PendSV (0x80) and
+ * greater than SVC (0x0).
+ * Platforms are responsible for the priority values assignment to each
+ * IRQ based on their platforms and use cases.
*/
-enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line,
- uint32_t priority);
+enum tfm_plat_err_t tfm_spm_hal_set_secure_irq_priority(IRQn_Type irq_line);
/**
* \brief Clears a pending IRQ
diff --git a/secure_fw/spm/cmsis_func/include/tfm_irq_list.h b/secure_fw/spm/cmsis_func/include/tfm_irq_list.h
index fbe01ad..bb93979 100644
--- a/secure_fw/spm/cmsis_func/include/tfm_irq_list.h
+++ b/secure_fw/spm/cmsis_func/include/tfm_irq_list.h
@@ -11,13 +11,10 @@
#include "tfm_hal_device_header.h"
#include "psa/service.h"
-#define TFM_DEFAULT_SECURE_IRQ_PRIORITY 128
-
struct tfm_core_irq_signal_data_t {
int32_t partition_id;
psa_signal_t signal_value;
uint32_t irq_line;
- uint32_t irq_priority;
};
extern const struct tfm_core_irq_signal_data_t tfm_core_irq_signals[];
diff --git a/secure_fw/spm/cmsis_func/main.c b/secure_fw/spm/cmsis_func/main.c
index 047207e..c9ef011 100644
--- a/secure_fw/spm/cmsis_func/main.c
+++ b/secure_fw/spm/cmsis_func/main.c
@@ -113,8 +113,7 @@
for (i = 0; i < tfm_core_irq_signals_count; ++i) {
plat_err = tfm_spm_hal_set_secure_irq_priority(
- tfm_core_irq_signals[i].irq_line,
- tfm_core_irq_signals[i].irq_priority);
+ tfm_core_irq_signals[i].irq_line);
if (plat_err != TFM_PLAT_ERR_SUCCESS) {
FIH_RET(fih_int_encode(TFM_ERROR_GENERIC));
}
diff --git a/secure_fw/spm/cmsis_func/tfm_secure_irq_handlers.inc.template b/secure_fw/spm/cmsis_func/tfm_secure_irq_handlers.inc.template
index 51945be..08a82ea 100644
--- a/secure_fw/spm/cmsis_func/tfm_secure_irq_handlers.inc.template
+++ b/secure_fw/spm/cmsis_func/tfm_secure_irq_handlers.inc.template
@@ -27,9 +27,8 @@
#endif /* {{partition.attr.conditional}} */
{% endif %}
{% endfor %}
-
-{% macro _irq_record(partition_name, signal, line, priority) -%}
-{ {{ partition_name }}, {{ signal }}, {{ line }}, {{ priority }} },
+{% macro _irq_record(partition_name, signal, line) -%}
+{ {{ partition_name }}, {{ signal }}, {{ line }} },
{%- endmacro %}
/* Definitions of the signals of the IRQs */
@@ -46,12 +45,7 @@
{% else %}
#error "Interrupt source isn't provided for 'irqs' in partition {{partition.manifest.name}}"
{% endif %}
- {% if handler.tfm_irq_priority %}
- {% set irq_data.priority = handler.tfm_irq_priority %}
- {% else %}
- {% set irq_data.priority = "TFM_DEFAULT_SECURE_IRQ_PRIORITY" %}
- {% endif %}
- {{ _irq_record(partition.manifest.name, handler.signal, irq_data.line, irq_data.priority) }}
+ {{ _irq_record(partition.manifest.name, handler.signal, irq_data.line) }}
{% endfor %}
{% if partition.attr.conditional %}
#endif /* {{partition.attr.conditional}} */
diff --git a/secure_fw/spm/cmsis_psa/static_load.c b/secure_fw/spm/cmsis_psa/static_load.c
index 3563dbc..c178fe1 100644
--- a/secure_fw/spm/cmsis_psa/static_load.c
+++ b/secure_fw/spm/cmsis_psa/static_load.c
@@ -180,8 +180,7 @@
for (i = 0; i < p_ldinf->nirqs; i++) {
p_partition->signals_allowed |= p_irq_info[i].signal;
- if (tfm_spm_hal_set_secure_irq_priority(p_irq_info[i].source,
- TFM_DEFAULT_SECURE_IRQ_PRIOTITY)
+ if (tfm_spm_hal_set_secure_irq_priority(p_irq_info[i].source)
!= TFM_PLAT_ERR_SUCCESS) {
tfm_core_panic();
}
diff --git a/secure_fw/spm/include/load/irq_defs.h b/secure_fw/spm/include/load/irq_defs.h
index db0abec..1540d23 100644
--- a/secure_fw/spm/include/load/irq_defs.h
+++ b/secure_fw/spm/include/load/irq_defs.h
@@ -10,8 +10,6 @@
#include "psa/service.h"
-#define TFM_DEFAULT_SECURE_IRQ_PRIOTITY 128
-
struct irq_load_info_t {
uint32_t source; /* IRQ source (number/index) */
uint32_t flih_func; /* FLIH function - 0 if SLIH */