blob: 9342ed68239f905ed39efe29f86f7bb5236a0b50 [file] [log] [blame]
/*
* Copyright (c) 2019, 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 <stdint.h>
#include <stddef.h>
#include "psa/client.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
* The number of slots in NSPE mailbox queue and SPE mailbox queue.
* So far only one slot is supported in either NSPE mailbox queue or
* SPE mailbox queue.
*/
#define NUM_MAILBOX_QUEUE_SLOT (1)
/* 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;
void *owner; /* Identification of the owner of this
* slot
*/
};
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 __cplusplus
}
#endif
#endif /* __TFM_MAILBOX_H__ */