psa: Init IPC, Mailbox and Non-secure Interface

These changes are for TFM_DUALCPU and TFM_V8M platforms.
The initialization happens after mbed-os kernel is kicked off and
when the thread is up and running.

We are initializing the following for TFM_DUALCPU platforms:
* IPC Interrupts for syncing multi-core platforms.
* NS Mailbox to receive messages.
* NS interface.

We are only initializing Non-secure interface for TFM_V8M platforms.

mbed_tfm_init() in tfm_mbed_boot.c overrides the WEAK mbed_tfm_init()
for a specific platform.

Signed-off-by: Vikas Katariya <vikas.katariya@arm.com>
pull/12271/head
Vikas Katariya 2020-03-25 17:29:54 +00:00
parent c447278727
commit 9b7ef82b40
4 changed files with 128 additions and 2 deletions

View File

@ -0,0 +1,67 @@
/* mbed Microcontroller Library
* Copyright (c) 2020 ARM Limited
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "mbed_error.h"
#include "tfm_multi_core_api.h"
#include "tfm_ns_mailbox.h"
#include "platform_multicore.h"
#include "tfm_ns_interface.h"
static struct ns_mailbox_queue_t ns_mailbox_queue;
void mbed_tfm_init(void)
{
/*
* In case the of dual CPU, we need to initialize IPC, mailbox
* and NS interface after the RTOS has started to enable
* communication from Secure and Non-Secure cores.
*/
int32_t ret;
ret = tfm_ns_wait_for_s_cpu_ready();
/*
* Normally would expect "TFM_SUCCESS" returned here by TF-M, as this
* isn't a mailbox function. There may be some platforms other than PSoC6,
* which doesn't require tfm_ns_wait_for_s_cpu_ready() implementation.
* "PLATFORM_MAILBOX_SUCCESS" is a low-level error code and should be
* replaced by "TFM_SUCCESS".
* As the function definition has been imported from the TF-M, therefore
* a issue has been raised - https://developer.trustedfirmware.org/T660
*/
if (ret != PLATFORM_MAILBOX_SUCCESS) {
/* Avoid undefined behavior after multi-core sync-up failed */
MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM,
MBED_ERROR_CODE_INITIALIZATION_FAILED),
"Failed to sync-up multi-core");
}
ret = tfm_ns_mailbox_init(&ns_mailbox_queue);
if (ret != MAILBOX_SUCCESS) {
/* Avoid undefined behavior after NS mailbox initialization failed */
MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM,
MBED_ERROR_CODE_INITIALIZATION_FAILED),
"Failed to initialize NS mailbox");
}
ret = tfm_ns_interface_init();
if (ret != TFM_SUCCESS) {
/* Avoid undefined behavior after NS interface initialization failed */
MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM,
MBED_ERROR_CODE_INITIALIZATION_FAILED),
"Failed to initialize NS interface");
}
}

View File

@ -0,0 +1,37 @@
/* mbed Microcontroller Library
* Copyright (c) 2020 ARM Limited
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "mbed_error.h"
#include "tfm_ns_interface.h"
void mbed_tfm_init(void)
{
/*
* In case of V8-M, we need to initialize NS interface
* after the RTOS has started to enable
* communication from Secure and Non-Secure cores.
*/
int32_t ret;
ret = tfm_ns_interface_init();
if (ret != TFM_SUCCESS) {
/* Avoid undefined behavior after NS interface initialization failed */
MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM,
MBED_ERROR_CODE_INITIALIZATION_FAILED),
"Failed to initialize NS interface");
}
}

View File

@ -1,5 +1,5 @@
/* mbed Microcontroller Library
* Copyright (c) 2006-2016 ARM Limited
* Copyright (c) 2006-2020 ARM Limited
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -95,6 +95,7 @@ void mbed_init(void)
void mbed_start(void)
{
mbed_toolchain_init();
mbed_tfm_init();
mbed_main();
mbed_error_initialize();
main();
@ -110,6 +111,11 @@ MBED_WEAK void software_init_hook_rtos()
// Nothing by default
}
MBED_WEAK void mbed_tfm_init(void)
{
// Nothing by default
}
MBED_WEAK void mbed_main(void)
{
// Nothing by default

View File

@ -1,5 +1,5 @@
/* mbed Microcontroller Library
* Copyright (c) 2018-2019 ARM Limited
* Copyright (c) 2018-2020 ARM Limited
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -47,6 +47,7 @@ extern "C" {
* - Start scheduler
* - main thread calls start mbed
* 4. Start mbed
* - Call mbed_tfm_init
* - Call mbed_main
* - Call main
*
@ -149,6 +150,20 @@ void mbed_toolchain_init(void);
*/
void mbed_sdk_init(void);
/**
* TF-M specific application hook for running code before mbed_main
*
* This is a weak function which can be overridden by an application
* to allow code to run before mbed_main is called.
* Some TF-M supported platforms require synchronization between
* Secure and Non-Secure cores, therefore these tasks are done here.
*
* Preconditions:
* - The RTOS has been started by a call to mbed_rtos_start
* - The toolchain has been initialized by a call to mbed_toolchain_init
*/
void mbed_tfm_init(void);
/**
* Application hook for running code before main
*
@ -157,6 +172,7 @@ void mbed_sdk_init(void);
*
* Preconditions:
* - The RTOS has been started by a call to mbed_rtos_start
* - TFM support has been initialized by a call to mbed_tfm_init.
* - The toolchain has been initialized by a call to mbed_toolchain_init
*/
void mbed_main(void);