blob: b6e944cf224567ee6e0f9d8abc29ccb7ccd3f68a [file] [log] [blame]
David Wang517e0012021-08-18 10:43:28 +08001/*
2 * Copyright (c) 2021, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8#ifndef __TFM_NS_CLIENT_EXT_H__
9#define __TFM_NS_CLIENT_EXT_H__
10
11#ifdef __cplusplus
12extern "C" {
13#endif
14
15#include <stdint.h>
16
17#define TFM_NS_CLIENT_INVALID_TOKEN 0xFFFFFFFF
18
19/* TF-M NSID Error code */
20#define TFM_NS_CLIENT_ERR_SUCCESS 0x0
21#define TFM_NS_CLIENT_ERR_INVALID_TOKEN 0x1
22#define TFM_NS_CLIENT_ERR_INVALID_NSID 0x2
23#define TFM_NS_CLIENT_ERR_INVALID_ACCESS 0x3
24
25/**
26 * \brief Initialize the non-secure client extension
27 *
28 * \details This function should be called before any other non-secure client
29 * APIs. It gives NSPE the opportunity to initialize the non-secure
30 * client extension in TF-M. Also, NSPE can get the number of allocated
31 * non-secure client context slots in the return value. That is useful
32 * if NSPE wants to decide the group (context) assignment at runtime.
33 *
34 * \param[in] ctx_requested The number of non-secure context requested from the
35 * NS entity. If request maximum available context, then set it to 0.
36 *
37 * \return Returns the number of non-secure context allocated to the NS entity.
38 * The allocated context number <= maximum supported context number.
39 * If the initialization is failed, then 0 is returned.
40 */
41uint32_t tfm_nsce_init(uint32_t ctx_requested);
42
43/**
44 * \brief Acquire the context for a non-secure client
45 *
46 * \details This function should be called before a non-secure client calling
47 * the PSA API into TF-M. It is to request the allocation of the
48 * context for the upcoming service call from that non-secure client.
49 * The non-secure clients in one group share the same context.
50 * The thread ID is used to identify the different non-secure clients.
51 *
52 * \param[in] group_id The group ID of the non-secure client
53 * \param[in] thread_id The thread ID of the non-secure client
54 *
55 * \return Returns the token of the allocated context. 0xFFFFFFFF means the
56 * allocation failed and the token is invalid.
57 */
58uint32_t tfm_nsce_acquire_ctx(uint8_t group_id, uint8_t thread_id);
59
60/**
61 * \brief Release the context for the non-secure client
62 *
63 * \details This function should be called when a non-secure client is going to
64 * be terminated or will not call TF-M secure services in the future.
65 * It is to release the context allocated for the calling non-secure
66 * client. If the calling non-secure client is the only thread in the
67 * group, then the context will be deallocated. Otherwise, the context
68 * will still be taken for the other threads in the group.
69 *
70 * \param[in] token The token returned by tfm_nsce_acquire_ctx
71 *
72 * \return Returns the error code.
73 */
74uint32_t tfm_nsce_release_ctx(uint32_t token);
75
76/**
77 * \brief Load the context for the non-secure client
78 *
79 * \details This function should be called when a non-secure client is going to
80 * be scheduled in at the non-secure side.
81 * The caller is usually the scheduler of the RTOS.
82 * The non-secure client ID is managed by the non-secure world and
83 * passed to TF-M as the input parameter of TF-M.
84 *
85 * \param[in] token The token returned by tfm_nsce_acquire_ctx
86 * \param[in] nsid The non-secure client ID for this client
87 *
88 * \return Returns the error code.
89 */
90uint32_t tfm_nsce_load_ctx(uint32_t token, int32_t nsid);
91
92/**
93 * \brief Save the context for the non-secure client
94 *
95 * \details This function should be called when a non-secure client is going to
96 * be scheduled out at the non-secure side.
97 * The caller is usually the scheduler of the RTOS.
98 *
99 * \param[in] token The token returned by tfm_nsce_acquire_ctx
100 *
101 * \return Returns the error code.
102 */
103uint32_t tfm_nsce_save_ctx(uint32_t token);
104
105#ifdef __cplusplus
106}
107#endif
108
109#endif /* __TFM_NS_CLIENT_EXT_H__ */