mirror of https://github.com/ARMmbed/mbed-os.git
psoc64: Update TF-M release image
- Fix key derivation issue - Update PSoC64 BSP - Replace IPC semaphore spin-lock with IPC lock Signed-off-by: Charley Chu <haoc@cypress.com>pull/13418/head
parent
d8a50aa21e
commit
4749e176d7
|
@ -13,7 +13,6 @@
|
||||||
|
|
||||||
#include "cy_ipc_drv.h"
|
#include "cy_ipc_drv.h"
|
||||||
#include "cy_sysint.h"
|
#include "cy_sysint.h"
|
||||||
#include "cy_ipc_sema.h"
|
|
||||||
|
|
||||||
#include "ns_ipc_config.h"
|
#include "ns_ipc_config.h"
|
||||||
#include "tfm_ns_mailbox.h"
|
#include "tfm_ns_mailbox.h"
|
||||||
|
@ -52,21 +51,6 @@ int32_t tfm_ns_mailbox_hal_notify_peer(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mailbox_sema_init(void)
|
|
||||||
{
|
|
||||||
#if defined(CY_IPC_DEFAULT_CFG_DISABLE)
|
|
||||||
/* semaphore data */
|
|
||||||
static uint32_t tfm_sema __attribute__((section("TFM_SHARED_DATA")));
|
|
||||||
|
|
||||||
if (Cy_IPC_Sema_Init(PLATFORM_MAILBOX_IPC_CHAN_SEMA,
|
|
||||||
sizeof(tfm_sema) * CHAR_BIT,
|
|
||||||
&tfm_sema) != CY_IPC_SEMA_SUCCESS) {
|
|
||||||
return PLATFORM_MAILBOX_INIT_ERROR;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return PLATFORM_MAILBOX_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tfm_ns_mailbox_hal_init(struct ns_mailbox_queue_t *queue)
|
int32_t tfm_ns_mailbox_hal_init(struct ns_mailbox_queue_t *queue)
|
||||||
{
|
{
|
||||||
uint32_t stage;
|
uint32_t stage;
|
||||||
|
@ -75,10 +59,6 @@ int32_t tfm_ns_mailbox_hal_init(struct ns_mailbox_queue_t *queue)
|
||||||
return MAILBOX_INVAL_PARAMS;
|
return MAILBOX_INVAL_PARAMS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Init semaphores used for critical sections */
|
|
||||||
if (mailbox_sema_init() != PLATFORM_MAILBOX_SUCCESS)
|
|
||||||
return MAILBOX_INIT_ERROR;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME
|
* FIXME
|
||||||
* Further verification of mailbox queue address may be required according
|
* Further verification of mailbox queue address may be required according
|
||||||
|
@ -120,7 +100,7 @@ int32_t tfm_ns_mailbox_hal_init(struct ns_mailbox_queue_t *queue)
|
||||||
|
|
||||||
const void *tfm_ns_mailbox_get_task_handle(void)
|
const void *tfm_ns_mailbox_get_task_handle(void)
|
||||||
{
|
{
|
||||||
return osThreadGetId();;
|
return osThreadGetId();
|
||||||
}
|
}
|
||||||
|
|
||||||
void tfm_ns_mailbox_hal_wait_reply(mailbox_msg_handle_t handle)
|
void tfm_ns_mailbox_hal_wait_reply(mailbox_msg_handle_t handle)
|
||||||
|
@ -128,137 +108,39 @@ void tfm_ns_mailbox_hal_wait_reply(mailbox_msg_handle_t handle)
|
||||||
osThreadFlagsWait(handle, osFlagsWaitAll, osWaitForever);
|
osThreadFlagsWait(handle, osFlagsWaitAll, osWaitForever);
|
||||||
}
|
}
|
||||||
|
|
||||||
static cy_en_ipcsema_status_t mailbox_raw_spin_lock(uint32_t ipc_channel,
|
|
||||||
uint32_t sema_num)
|
|
||||||
{
|
|
||||||
uint32_t semaIndex;
|
|
||||||
uint32_t semaMask;
|
|
||||||
cy_stc_ipc_sema_t *semaStruct;
|
|
||||||
cy_en_ipcdrv_status_t acqStatus;
|
|
||||||
cy_en_ipcsema_status_t ret = CY_IPC_SEMA_BAD_PARAM;
|
|
||||||
bool is_lock = false;
|
|
||||||
IPC_STRUCT_Type *semaIpcStruct;
|
|
||||||
|
|
||||||
/* Get IPC register structure */
|
|
||||||
semaIpcStruct = Cy_IPC_Drv_GetIpcBaseAddress(ipc_channel);
|
|
||||||
/* Get pointer to structure */
|
|
||||||
semaStruct = (cy_stc_ipc_sema_t *)Cy_IPC_Drv_ReadDataValue(semaIpcStruct);
|
|
||||||
|
|
||||||
if (sema_num < semaStruct->maxSema) {
|
|
||||||
semaIndex = sema_num / CY_IPC_SEMA_PER_WORD;
|
|
||||||
semaMask = (uint32_t)(1ul << (sema_num - \
|
|
||||||
(semaIndex * CY_IPC_SEMA_PER_WORD)));
|
|
||||||
|
|
||||||
while (!is_lock) {
|
|
||||||
/* Check to make sure the IPC channel is released
|
|
||||||
If so, check if specific channel can be locked. */
|
|
||||||
do {
|
|
||||||
acqStatus = Cy_IPC_Drv_LockAcquire(semaIpcStruct);
|
|
||||||
} while (acqStatus != CY_IPC_DRV_SUCCESS);
|
|
||||||
|
|
||||||
if ((semaStruct->arrayPtr[semaIndex] & semaMask) == 0ul) {
|
|
||||||
semaStruct->arrayPtr[semaIndex] |= semaMask;
|
|
||||||
is_lock = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Release, but do not trigger a release event */
|
|
||||||
(void)Cy_IPC_Drv_LockRelease(semaIpcStruct,
|
|
||||||
CY_IPC_NO_NOTIFICATION);
|
|
||||||
|
|
||||||
if (!is_lock) {
|
|
||||||
/*
|
|
||||||
* The secure core is occupying this lock. Insert a small delay
|
|
||||||
* to give the secure core a chance to acquire the IPC channel
|
|
||||||
* and release the lock.
|
|
||||||
* Otherwise, the secure core may not be able to release the
|
|
||||||
* lock if non-secure core has higher CPU frequency. It will
|
|
||||||
* generate a deadlock.
|
|
||||||
* This delay won't harm performance too much since non-secure
|
|
||||||
* core has to busy wait here anyway.
|
|
||||||
* Alternatively, non-secure core can wait for release
|
|
||||||
* notification event from secure core. However, it is more
|
|
||||||
* complex and requires more code and more modifications.
|
|
||||||
*/
|
|
||||||
volatile uint32_t count = 1000;
|
|
||||||
while(count > 0) {
|
|
||||||
count--;
|
|
||||||
}
|
|
||||||
Cy_IPC_Sema_Status(sema_num);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = CY_IPC_SEMA_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cy_en_ipcsema_status_t mailbox_raw_spin_unlock(uint32_t ipc_channel,
|
|
||||||
uint32_t sema_num)
|
|
||||||
{
|
|
||||||
uint32_t semaIndex;
|
|
||||||
uint32_t semaMask;
|
|
||||||
cy_stc_ipc_sema_t *semaStruct;
|
|
||||||
cy_en_ipcdrv_status_t acqStatus;
|
|
||||||
cy_en_ipcsema_status_t ret = CY_IPC_SEMA_BAD_PARAM;
|
|
||||||
bool is_unlock = false;
|
|
||||||
IPC_STRUCT_Type *semaIpcStruct;
|
|
||||||
|
|
||||||
/* Get IPC register structure */
|
|
||||||
semaIpcStruct = Cy_IPC_Drv_GetIpcBaseAddress(ipc_channel);
|
|
||||||
/* Get pointer to structure */
|
|
||||||
semaStruct = (cy_stc_ipc_sema_t *)Cy_IPC_Drv_ReadDataValue(semaIpcStruct);
|
|
||||||
|
|
||||||
if (sema_num < semaStruct->maxSema) {
|
|
||||||
semaIndex = sema_num / CY_IPC_SEMA_PER_WORD;
|
|
||||||
semaMask = (uint32_t)(1ul << (sema_num - \
|
|
||||||
(semaIndex * CY_IPC_SEMA_PER_WORD)));
|
|
||||||
|
|
||||||
while (!is_unlock) {
|
|
||||||
/* Check to make sure the IPC channel is released
|
|
||||||
If so, check if specific channel can be locked. */
|
|
||||||
do {
|
|
||||||
acqStatus = Cy_IPC_Drv_LockAcquire(semaIpcStruct);
|
|
||||||
} while (acqStatus != CY_IPC_DRV_SUCCESS);
|
|
||||||
|
|
||||||
if ((semaStruct->arrayPtr[semaIndex] & semaMask) != 0ul) {
|
|
||||||
semaStruct->arrayPtr[semaIndex] &= ~semaMask;
|
|
||||||
is_unlock = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Release, but do not trigger a release event */
|
|
||||||
(void)Cy_IPC_Drv_LockRelease(semaIpcStruct,
|
|
||||||
CY_IPC_NO_NOTIFICATION);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = CY_IPC_SEMA_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void tfm_ns_mailbox_hal_enter_critical(void)
|
void tfm_ns_mailbox_hal_enter_critical(void)
|
||||||
{
|
{
|
||||||
saved_irq_state = Cy_SysLib_EnterCriticalSection();
|
saved_irq_state = Cy_SysLib_EnterCriticalSection();
|
||||||
|
|
||||||
mailbox_raw_spin_lock(CY_IPC_CHAN_SEMA, MAILBOX_SEMAPHORE_NUM);
|
IPC_STRUCT_Type* ipc_struct =
|
||||||
|
Cy_IPC_Drv_GetIpcBaseAddress(IPC_PSA_MAILBOX_LOCK_CHAN);
|
||||||
|
while(CY_IPC_DRV_SUCCESS != Cy_IPC_Drv_LockAcquire (ipc_struct))
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tfm_ns_mailbox_hal_exit_critical(void)
|
void tfm_ns_mailbox_hal_exit_critical(void)
|
||||||
{
|
{
|
||||||
mailbox_raw_spin_unlock(CY_IPC_CHAN_SEMA, MAILBOX_SEMAPHORE_NUM);
|
IPC_STRUCT_Type* ipc_struct =
|
||||||
|
Cy_IPC_Drv_GetIpcBaseAddress(IPC_PSA_MAILBOX_LOCK_CHAN);
|
||||||
|
Cy_IPC_Drv_LockRelease(ipc_struct, CY_IPC_NO_NOTIFICATION);
|
||||||
Cy_SysLib_ExitCriticalSection(saved_irq_state);
|
Cy_SysLib_ExitCriticalSection(saved_irq_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tfm_ns_mailbox_hal_enter_critical_isr(void)
|
void tfm_ns_mailbox_hal_enter_critical_isr(void)
|
||||||
{
|
{
|
||||||
mailbox_raw_spin_lock(CY_IPC_CHAN_SEMA, MAILBOX_SEMAPHORE_NUM);
|
IPC_STRUCT_Type* ipc_struct =
|
||||||
|
Cy_IPC_Drv_GetIpcBaseAddress(IPC_PSA_MAILBOX_LOCK_CHAN);
|
||||||
|
while(CY_IPC_DRV_SUCCESS != Cy_IPC_Drv_LockAcquire (ipc_struct))
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tfm_ns_mailbox_hal_exit_critical_isr(void)
|
void tfm_ns_mailbox_hal_exit_critical_isr(void)
|
||||||
{
|
{
|
||||||
mailbox_raw_spin_unlock(CY_IPC_CHAN_SEMA, MAILBOX_SEMAPHORE_NUM);
|
IPC_STRUCT_Type* ipc_struct =
|
||||||
|
Cy_IPC_Drv_GetIpcBaseAddress(IPC_PSA_MAILBOX_LOCK_CHAN);
|
||||||
|
Cy_IPC_Drv_LockRelease(ipc_struct, CY_IPC_NO_NOTIFICATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool mailbox_clear_intr(void)
|
static bool mailbox_clear_intr(void)
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
eecaad9e4014
|
9fd2fd6250d5
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
#define IPC_PSA_CLIENT_REPLY_NOTIFY_MASK (1 << IPC_PSA_CLIENT_REPLY_INTR_STRUCT)
|
#define IPC_PSA_CLIENT_REPLY_NOTIFY_MASK (1 << IPC_PSA_CLIENT_REPLY_INTR_STRUCT)
|
||||||
#define IPC_PSA_CLIENT_REPLY_IPC_INTR cpuss_interrupts_ipc_8_IRQn
|
#define IPC_PSA_CLIENT_REPLY_IPC_INTR cpuss_interrupts_ipc_8_IRQn
|
||||||
|
|
||||||
|
#define IPC_PSA_MAILBOX_LOCK_CHAN (10)
|
||||||
|
|
||||||
#define IPC_RX_RELEASE_MASK (0)
|
#define IPC_RX_RELEASE_MASK (0)
|
||||||
|
|
||||||
#define CY_IPC_NOTIFY_SHIFT (16)
|
#define CY_IPC_NOTIFY_SHIFT (16)
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
e90e02327eb3
|
9fd2fd6250d5
|
||||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue