blob: 3d128f40b2f087ff36250a3835f49fae101dd5d6 [file] [log] [blame]
/*
* Copyright (c) 2019-2020, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*
*/
/*
* This is header file of common mailbox objects shared by NSPE and SPE.
* Please refer to tfm_ns_mailbox.h for the definitions only used in NSPE
* mailbox library.
* Please refer to tfm_spe_mailbox.h for the SPE specific definitions and APIs.
*/
#ifndef __TFM_MAILBOX_H__
#define __TFM_MAILBOX_H__
#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
#ifdef TFM_MULTI_CORE_MULTI_CLIENT_CALL
#include "device_cfg.h"
#endif
#include "psa/client.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
* If multiple outstanding NS PSA Client calls is enabled, multi-core platform
* should define the number of mailbox queue slots NUM_MAILBOX_QUEUE_SLOT in
* platform device_cfg.h.
* Otherwise, NUM_MAILBOX_QUEUE_SLOT is defined as 1.
*/
#ifdef TFM_MULTI_CORE_MULTI_CLIENT_CALL
#ifndef NUM_MAILBOX_QUEUE_SLOT
#error "Error: Platform doesn't define NUM_MAILBOX_QUEUE_SLOT for mailbox queue"
#endif
#if (NUM_MAILBOX_QUEUE_SLOT < 2)
#error "Error: Invalid NUM_MAILBOX_QUEUE_SLOT. The value should be more than 1"
#endif
/*
* The number of slots should be no more than the number of bits in
* mailbox_queue_status_t.
* Here the value is hardcoded. A better way is to define a sizeof() to
* calculate the bits in mailbox_queue_status_t and dump it with pragma message.
*/
#if (NUM_MAILBOX_QUEUE_SLOT > 32)
#error "Error: Invalid NUM_MAILBOX_QUEUE_SLOT. The value should be no more than 32"
#endif
#else /* TFM_MULTI_CORE_MULTI_CLIENT_CALL */
/* Force the number of mailbox queue slots as 1. */
#undef NUM_MAILBOX_QUEUE_SLOT
#define NUM_MAILBOX_QUEUE_SLOT (1)
#endif /* TFM_MULTI_CORE_MULTI_CLIENT_CALL */
/* PSA client call type value */
#define MAILBOX_PSA_FRAMEWORK_VERSION (0x1)
#define MAILBOX_PSA_VERSION (0x2)
#define MAILBOX_PSA_CONNECT (0x3)
#define MAILBOX_PSA_CALL (0x4)
#define MAILBOX_PSA_CLOSE (0x5)
/* Return code of mailbox APIs */
#define MAILBOX_SUCCESS (0)
#define MAILBOX_QUEUE_FULL (INT32_MIN + 1)
#define MAILBOX_INVAL_PARAMS (INT32_MIN + 2)
#define MAILBOX_NO_PERMS (INT32_MIN + 3)
#define MAILBOX_NO_PEND_EVENT (INT32_MIN + 4)
#define MAILBOX_CHAN_BUSY (INT32_MIN + 5)
#define MAILBOX_CALLBACK_REG_ERROR (INT32_MIN + 6)
#define MAILBOX_INIT_ERROR (INT32_MIN + 7)
/*
* This structure holds the parameters used in a PSA client call.
*/
struct psa_client_params_t {
union {
struct {
uint32_t sid;
} psa_version_params;
struct {
uint32_t sid;
uint32_t version;
} psa_connect_params;
struct {
psa_handle_t handle;
int32_t type;
const psa_invec *in_vec;
size_t in_len;
psa_outvec *out_vec;
size_t out_len;
} psa_call_params;
struct {
psa_handle_t handle;
} psa_close_params;
};
};
/* Mailbox message passed from NSPE to SPE to deliver a PSA client call */
struct mailbox_msg_t {
uint32_t call_type; /* PSA client call type */
struct psa_client_params_t params; /* Contain parameters used in PSA
* client call
*/
int32_t client_id; /* Optional client ID of the
* non-secure caller.
* It is required to identify the
* non-secure task when NSPE OS
* enforces non-secure task isolation
*/
};
/* A handle to a mailbox message in use */
typedef int32_t mailbox_msg_handle_t;
#define MAILBOX_MSG_NULL_HANDLE ((mailbox_msg_handle_t)0)
/*
* Mailbox reply structure in non-secure memory
* to hold the PSA client call return result from SPE
*/
struct mailbox_reply_t {
int32_t return_val;
};
/* A single slot structure in NSPE mailbox queue */
struct ns_mailbox_slot_t {
struct mailbox_msg_t msg;
struct mailbox_reply_t reply;
const void *owner; /* Handle of the owner task of this
* slot
*/
bool is_woken; /* Indicate that owner task has been
* or should be woken up, after the
* replied is received.
*/
};
typedef uint32_t mailbox_queue_status_t;
/* NSPE mailbox queue */
struct ns_mailbox_queue_t {
mailbox_queue_status_t empty_slots; /* Bitmask of empty slots */
mailbox_queue_status_t pend_slots; /* Bitmask of slots pending
* for SPE handling
*/
mailbox_queue_status_t replied_slots; /* Bitmask of active slots
* containing PSA client call
* return result
*/
struct ns_mailbox_slot_t queue[NUM_MAILBOX_QUEUE_SLOT];
#ifdef TFM_MULTI_CORE_TEST
uint32_t nr_tx; /* The total number of
* submission of NS PSA Client
* calls from NS task via
* mailbox.
*/
uint32_t nr_used_slots; /* The total number of used
* mailbox queue slots each time
* NS thread requests a mailbox
* queue slot.
*/
#endif
};
#ifdef __cplusplus
}
#endif
#endif /* __TFM_MAILBOX_H__ */