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