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/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