blob: 39fde10ab331f90458e6e83b49dc149f8a06c9ee [file] [log] [blame]
Miklos Balint9ecb24c2018-03-29 15:30:28 +02001/*
Kevin Penge61e7052022-01-27 14:57:06 +08002 * Copyright (c) 2018-2022, Arm Limited. All rights reserved.
Chris Brand0cab3ee2023-07-05 14:17:54 -07003 * Copyright (c) 2023 Cypress Semiconductor Corporation (an Infineon company)
4 * or an affiliate of Cypress Semiconductor Corporation. All rights reserved.
Miklos Balint9ecb24c2018-03-29 15:30:28 +02005 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 *
8 */
9
10#ifndef __PSA_SERVICE_H__
11#define __PSA_SERVICE_H__
12
Jamie Fox520fb4d2019-06-13 14:27:21 +010013#include <stddef.h>
14#include <stdint.h>
15
Kevin Peng0fe83902023-03-16 16:59:25 +080016#include "config_impl.h"
17
Jamie Fox520fb4d2019-06-13 14:27:21 +010018#include "psa/client.h"
Ken Liu82e3eac2021-10-14 16:19:13 +080019#include "psa/error.h"
Shawn Shan038348e2021-09-08 17:11:04 +080020#include "psa/framework_feature.h"
Jamie Fox520fb4d2019-06-13 14:27:21 +010021
Miklos Balint9ecb24c2018-03-29 15:30:28 +020022#ifdef __cplusplus
23extern "C" {
24#endif
25
Edison Aib3e56962018-09-04 19:12:31 +080026/********************** PSA Secure Partition Macros and Types ****************/
27
Summer Qin4b1d03b2019-07-02 14:56:08 +080028/**
29 * A timeout value that requests a polling wait operation.
30 */
Miklos Balint9ecb24c2018-03-29 15:30:28 +020031#define PSA_POLL (0x00000000u)
Summer Qin4b1d03b2019-07-02 14:56:08 +080032
33/**
34 * A timeout value that requests a blocking wait operation.
35 */
Miklos Balint9ecb24c2018-03-29 15:30:28 +020036#define PSA_BLOCK (0x80000000u)
37
Summer Qin4b1d03b2019-07-02 14:56:08 +080038/**
39 * A mask value that includes all Secure Partition signals.
40 */
41#define PSA_WAIT_ANY (0xFFFFFFFFu)
Edison Aib3e56962018-09-04 19:12:31 +080042
Summer Qin4b1d03b2019-07-02 14:56:08 +080043/**
44 * The signal number for the Secure Partition doorbell.
45 */
Miklos Balint9ecb24c2018-03-29 15:30:28 +020046#define PSA_DOORBELL (0x00000008u)
47
48/* PSA message types */
Summer Qin4b1d03b2019-07-02 14:56:08 +080049/* An IPC message type that indicates a new connection. */
50#define PSA_IPC_CONNECT (-1)
51/* An IPC message type that indicates the end of a connection. */
52#define PSA_IPC_DISCONNECT (-2)
Edison Aib3e56962018-09-04 19:12:31 +080053
Kevin Peng9280ae92021-01-13 14:42:10 +080054/* FLIH return types */
55#define PSA_FLIH_NO_SIGNAL ((psa_flih_result_t) 0)
56#define PSA_FLIH_SIGNAL ((psa_flih_result_t) 1)
57
Edison Aib3e56962018-09-04 19:12:31 +080058/* Store a set of one or more Secure Partition signals */
Miklos Balint9ecb24c2018-03-29 15:30:28 +020059typedef uint32_t psa_signal_t;
60
Kevin Pengf9a0eb02021-01-05 15:06:05 +080061/* A type used to temporarily store a previous interrupt state. */
62typedef uint32_t psa_irq_status_t;
63
Kevin Peng9280ae92021-01-13 14:42:10 +080064/* The type of the return value from an FLIH function */
65typedef uint32_t psa_flih_result_t;
66
Miklos Balint9ecb24c2018-03-29 15:30:28 +020067/**
Edison Aib3e56962018-09-04 19:12:31 +080068 * Describe a message received by an RoT Service after calling \ref psa_get().
Miklos Balint9ecb24c2018-03-29 15:30:28 +020069 */
70typedef struct psa_msg_t {
Summer Qin4b1d03b2019-07-02 14:56:08 +080071 int32_t type; /* One of the following values:
Edison Aib3e56962018-09-04 19:12:31 +080072 * \ref PSA_IPC_CONNECT
Summer Qin4b1d03b2019-07-02 14:56:08 +080073 * >= 0
Edison Aib3e56962018-09-04 19:12:31 +080074 * \ref PSA_IPC_DISCONNECT
75 */
76 psa_handle_t handle; /* A reference generated by the SPM to the
77 * message returned by psa_get().
78 */
Kevin Penge61e7052022-01-27 14:57:06 +080079 int32_t client_id; /*
80 * Partition ID of the sender of the
81 * message:
82 * - secure partition id;
83 * - non secure client endpoint id.
84 */
Edison Aib3e56962018-09-04 19:12:31 +080085 void *rhandle; /* Be useful for binding a connection to some
86 * application-specific data or function
87 * pointer within the RoT Service
88 * implementation.
89 */
90 size_t in_size[PSA_MAX_IOVEC]; /* Provide the size of each client input
91 * vector in bytes.
92 */
93 size_t out_size[PSA_MAX_IOVEC];/* Provide the size of each client output
94 * vector in bytes.
95 */
Miklos Balint9ecb24c2018-03-29 15:30:28 +020096} psa_msg_t;
97
Edison Aib3e56962018-09-04 19:12:31 +080098/************************* PSA Secure Partition API **************************/
Miklos Balint9ecb24c2018-03-29 15:30:28 +020099
100/**
Edison Aib3e56962018-09-04 19:12:31 +0800101 * \brief Return the Secure Partition interrupt signals that have been asserted
102 * from a subset of signals provided by the caller.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200103 *
Edison Aib3e56962018-09-04 19:12:31 +0800104 * \param[in] signal_mask A set of signals to query. Signals that are not
105 * in this set will be ignored.
106 * \param[in] timeout Specify either blocking \ref PSA_BLOCK or
107 * polling \ref PSA_POLL operation.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200108 *
Edison Aib3e56962018-09-04 19:12:31 +0800109 * \retval >0 At least one signal is asserted.
110 * \retval 0 No signals are asserted. This is only seen when
111 * a polling timeout is used.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200112 */
Edison Aib3e56962018-09-04 19:12:31 +0800113psa_signal_t psa_wait(psa_signal_t signal_mask, uint32_t timeout);
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200114
115/**
Edison Aib3e56962018-09-04 19:12:31 +0800116 * \brief Retrieve the message which corresponds to a given RoT Service signal
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200117 * and remove the message from the RoT Service queue.
118 *
Edison Aib3e56962018-09-04 19:12:31 +0800119 * \param[in] signal The signal value for an asserted RoT Service.
120 * \param[out] msg Pointer to \ref psa_msg_t object for receiving
121 * the message.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200122 *
Edison Aib3e56962018-09-04 19:12:31 +0800123 * \retval PSA_SUCCESS Success, *msg will contain the delivered
124 * message.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800125 * \retval PSA_ERROR_DOES_NOT_EXIST Message could not be delivered.
126 * \retval "PROGRAMMER ERROR" The call is invalid because one or more of the
Edison Aib3e56962018-09-04 19:12:31 +0800127 * following are true:
128 * \arg signal has more than a single bit set.
129 * \arg signal does not correspond to an RoT Service.
130 * \arg The RoT Service signal is not currently
131 * asserted.
132 * \arg The msg pointer provided is not a valid memory
133 * reference.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200134 */
Edison Aib3e56962018-09-04 19:12:31 +0800135psa_status_t psa_get(psa_signal_t signal, psa_msg_t *msg);
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200136
137/**
Edison Aib3e56962018-09-04 19:12:31 +0800138 * \brief Associate some RoT Service private data with a client connection.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200139 *
Edison Aib3e56962018-09-04 19:12:31 +0800140 * \param[in] msg_handle Handle for the client's message.
141 * \param[in] rhandle Reverse handle allocated by the RoT Service.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200142 *
Edison Aib3e56962018-09-04 19:12:31 +0800143 * \retval void Success, rhandle will be provided with all
144 * subsequent messages delivered on this
145 * connection.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800146 * \retval "PROGRAMMER ERROR" msg_handle is invalid.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200147 */
148void psa_set_rhandle(psa_handle_t msg_handle, void *rhandle);
149
150/**
Edison Aib3e56962018-09-04 19:12:31 +0800151 * \brief Read a message parameter or part of a message parameter from a client
152 * input vector.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200153 *
Edison Aib3e56962018-09-04 19:12:31 +0800154 * \param[in] msg_handle Handle for the client's message.
155 * \param[in] invec_idx Index of the input vector to read from. Must be
156 * less than \ref PSA_MAX_IOVEC.
157 * \param[out] buffer Buffer in the Secure Partition to copy the
158 * requested data to.
159 * \param[in] num_bytes Maximum number of bytes to be read from the
160 * client input vector.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200161 *
Edison Aib3e56962018-09-04 19:12:31 +0800162 * \retval >0 Number of bytes copied.
163 * \retval 0 There was no remaining data in this input
164 * vector.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800165 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
Edison Aib3e56962018-09-04 19:12:31 +0800166 * following are true:
167 * \arg msg_handle is invalid.
168 * \arg msg_handle does not refer to a
169 * \ref PSA_IPC_CALL message.
170 * \arg invec_idx is equal to or greater than
171 * \ref PSA_MAX_IOVEC.
172 * \arg the memory reference for buffer is invalid or
173 * not writable.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200174 */
175size_t psa_read(psa_handle_t msg_handle, uint32_t invec_idx,
Edison Aib3e56962018-09-04 19:12:31 +0800176 void *buffer, size_t num_bytes);
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200177
178/**
Edison Aib3e56962018-09-04 19:12:31 +0800179 * \brief Skip over part of a client input vector.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200180 *
Edison Aib3e56962018-09-04 19:12:31 +0800181 * \param[in] msg_handle Handle for the client's message.
182 * \param[in] invec_idx Index of input vector to skip from. Must be
183 * less than \ref PSA_MAX_IOVEC.
184 * \param[in] num_bytes Maximum number of bytes to skip in the client
185 * input vector.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200186 *
Edison Aib3e56962018-09-04 19:12:31 +0800187 * \retval >0 Number of bytes skipped.
188 * \retval 0 There was no remaining data in this input
189 * vector.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800190 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
Edison Aib3e56962018-09-04 19:12:31 +0800191 * following are true:
192 * \arg msg_handle is invalid.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800193 * \arg msg_handle does not refer to a request
194 * message.
Edison Aib3e56962018-09-04 19:12:31 +0800195 * \arg invec_idx is equal to or greater than
196 * \ref PSA_MAX_IOVEC.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200197 */
198size_t psa_skip(psa_handle_t msg_handle, uint32_t invec_idx, size_t num_bytes);
199
200/**
Edison Aib3e56962018-09-04 19:12:31 +0800201 * \brief Write a message response to a client output vector.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200202 *
Edison Aib3e56962018-09-04 19:12:31 +0800203 * \param[in] msg_handle Handle for the client's message.
204 * \param[out] outvec_idx Index of output vector in message to write to.
205 * Must be less than \ref PSA_MAX_IOVEC.
206 * \param[in] buffer Buffer with the data to write.
207 * \param[in] num_bytes Number of bytes to write to the client output
208 * vector.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200209 *
Edison Aib3e56962018-09-04 19:12:31 +0800210 * \retval void Success
Summer Qin4b1d03b2019-07-02 14:56:08 +0800211 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
Edison Aib3e56962018-09-04 19:12:31 +0800212 * following are true:
213 * \arg msg_handle is invalid.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800214 * \arg msg_handle does not refer to a request
215 * message.
Edison Aib3e56962018-09-04 19:12:31 +0800216 * \arg outvec_idx is equal to or greater than
217 * \ref PSA_MAX_IOVEC.
218 * \arg The memory reference for buffer is invalid.
219 * \arg The call attempts to write data past the end
220 * of the client output vector.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200221 */
222void psa_write(psa_handle_t msg_handle, uint32_t outvec_idx,
Edison Aib3e56962018-09-04 19:12:31 +0800223 const void *buffer, size_t num_bytes);
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200224
225/**
Edison Aib3e56962018-09-04 19:12:31 +0800226 * \brief Complete handling of a specific message and unblock the client.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200227 *
Edison Aib3e56962018-09-04 19:12:31 +0800228 * \param[in] msg_handle Handle for the client's message.
229 * \param[in] status Message result value to be reported to the
230 * client.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200231 *
Edison Aib3e56962018-09-04 19:12:31 +0800232 * \retval void Success.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800233 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
Edison Aib3e56962018-09-04 19:12:31 +0800234 * following are true:
235 * \arg msg_handle is invalid.
236 * \arg An invalid status code is specified for the
237 * type of message.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200238 */
Edison Aib3e56962018-09-04 19:12:31 +0800239void psa_reply(psa_handle_t msg_handle, psa_status_t status);
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200240
241/**
Edison Aib3e56962018-09-04 19:12:31 +0800242 * \brief Send a PSA_DOORBELL signal to a specific Secure Partition.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200243 *
Edison Aib3e56962018-09-04 19:12:31 +0800244 * \param[in] partition_id Secure Partition ID of the target partition.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200245 *
Edison Aib3e56962018-09-04 19:12:31 +0800246 * \retval void Success.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800247 * \retval "PROGRAMMER ERROR" partition_id does not correspond to a Secure
Edison Aib3e56962018-09-04 19:12:31 +0800248 * Partition.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200249 */
250void psa_notify(int32_t partition_id);
251
252/**
Edison Aib3e56962018-09-04 19:12:31 +0800253 * \brief Clear the PSA_DOORBELL signal.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200254 *
Edison Aib3e56962018-09-04 19:12:31 +0800255 * \retval void Success.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800256 * \retval "PROGRAMMER ERROR" The Secure Partition's doorbell signal is not
Edison Aib3e56962018-09-04 19:12:31 +0800257 * currently asserted.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200258 */
259void psa_clear(void);
260
261/**
Edison Aib3e56962018-09-04 19:12:31 +0800262 * \brief Inform the SPM that an interrupt has been handled (end of interrupt).
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200263 *
Edison Aib3e56962018-09-04 19:12:31 +0800264 * \param[in] irq_signal The interrupt signal that has been processed.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200265 *
Edison Aib3e56962018-09-04 19:12:31 +0800266 * \retval void Success.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800267 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
Edison Aib3e56962018-09-04 19:12:31 +0800268 * following are true:
269 * \arg irq_signal is not an interrupt signal.
270 * \arg irq_signal indicates more than one signal.
271 * \arg irq_signal is not currently asserted.
Kevin Peng9280ae92021-01-13 14:42:10 +0800272 * \arg The interrupt is not using SLIH.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200273 */
Edison Aib3e56962018-09-04 19:12:31 +0800274void psa_eoi(psa_signal_t irq_signal);
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200275
Summer Qin4b1d03b2019-07-02 14:56:08 +0800276/**
277 * \brief Terminate execution within the calling Secure Partition and will not
278 * return.
279 *
280 * \retval "Does not return"
281 */
282void psa_panic(void);
283
Kevin Pengf9a0eb02021-01-05 15:06:05 +0800284/**
285 * \brief Enable an interrupt.
286 *
287 * \param[in] irq_signal The signal for the interrupt to be enabled.
288 * This must have a single bit set, which must be the
289 * signal value for an interrupt in the calling Secure
290 * Partition.
291 *
292 * \retval void
293 * \retval "PROGRAMMER ERROR" If one or more of the following are true:
Kevin Peng9280ae92021-01-13 14:42:10 +0800294 * \arg \a irq_signal is not an interrupt signal.
295 * \arg \a irq_signal indicates more than one signal.
Kevin Pengf9a0eb02021-01-05 15:06:05 +0800296 */
297void psa_irq_enable(psa_signal_t irq_signal);
298
299/**
300 * \brief Disable an interrupt and return the status of the interrupt prior to
301 * being disabled by this call.
302 *
303 * \param[in] irq_signal The signal for the interrupt to be disabled.
304 * This must have a single bit set, which must be the
305 * signal value for an interrupt in the calling Secure
306 * Partition.
307 *
308 * \retval 0 The interrupt was disabled prior to this call.
309 * 1 The interrupt was enabled prior to this call.
310 * \retval "PROGRAMMER ERROR" If one or more of the following are true:
Kevin Peng9280ae92021-01-13 14:42:10 +0800311 * \arg \a irq_signal is not an interrupt signal.
312 * \arg \a irq_signal indicates more than one signal.
Kevin Pengf9a0eb02021-01-05 15:06:05 +0800313 *
314 * \note The current implementation always return 1. Do not use the return.
315 */
316psa_irq_status_t psa_irq_disable(psa_signal_t irq_signal);
317
Kevin Peng9280ae92021-01-13 14:42:10 +0800318/**
319 * \brief Reset the signal for an interrupt that is using FLIH handling.
320 *
321 * \param[in] irq_signal The interrupt signal to be reset.
322 * This must have a single bit set, corresponding to a
323 * currently asserted signal for an interrupt that is
324 * defined to use FLIH handling.
325 *
326 * \retval void
327 * \retval "Programmer Error" if one or more of the following are true:
328 * \arg \a irq_signal is not a signal for an interrupt
329 * that is specified with FLIH handling in the Secure
330 * Partition manifest.
331 * \arg \a irq_signal indicates more than one signal.
332 * \arg \a irq_signal is not currently asserted.
333 */
334void psa_reset_signal(psa_signal_t irq_signal);
335
Shawn Shan038348e2021-09-08 17:11:04 +0800336#if PSA_FRAMEWORK_HAS_MM_IOVEC
337
338/**
339 * \brief Map a client input vector for direct access by a Secure Partition RoT
340 * Service.
341 *
342 * \param[in] msg_handle Handle for the client's message.
343 * \param[in] invec_idx Index of input vector to map. Must be
344 * less than \ref PSA_MAX_IOVEC.
345 *
346 * \retval A pointer to the input vector data.
347 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
348 * following are true:
349 * \arg MM-IOVEC has not been enabled for the RoT
350 * Service that received the message.
351 * \arg msg_handle is invalid.
352 * \arg msg_handle does not refer to a request
353 * message.
354 * \arg invec_idx is equal to or greater than
355 * \ref PSA_MAX_IOVEC.
356 * \arg The input vector has length zero.
357 * \arg The input vector has already been mapped using
358 * psa_map_invec().
359 * \arg The input vector has already been accessed
360 * using psa_read() or psa_skip().
361 */
362const void *psa_map_invec(psa_handle_t msg_handle, uint32_t invec_idx);
363
364/**
365 * \brief Unmap a previously mapped client input vector from a Secure Partition
366 * RoT Service.
367 *
368 * \param[in] msg_handle Handle for the client's message.
369 * \param[in] invec_idx Index of input vector to map. Must be
370 * less than \ref PSA_MAX_IOVEC.
371 *
372 * \retval void
373 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
374 * following are true:
375 * \arg msg_handle is invalid.
376 * \arg msg_handle does not refer to a request
377 * message.
378 * \arg invec_idx is equal to or greater than
379 * \ref PSA_MAX_IOVEC.
380 * \arg The input vector has not been mapped by a call
381 * to psa_map_invec().
382 * \arg The input vector has already been unmapped by
383 * a call to psa_unmap_invec().
384 */
385void psa_unmap_invec(psa_handle_t msg_handle, uint32_t invec_idx);
386
387/**
388 * \brief Map a client output vector for direct access by a Secure Partition RoT
389 * Service.
390 *
391 * \param[in] msg_handle Handle for the client's message.
392 * \param[in] outvec_idx Index of output vector to map. Must be
393 * less than \ref PSA_MAX_IOVEC.
394 *
395 * \retval A pointer to the output vector data.
396 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
397 * following are true:
398 * \arg MM-IOVEC has not been enabled for the RoT
399 * Service that received the message.
400 * \arg msg_handle is invalid.
401 * \arg msg_handle does not refer to a request
402 * message.
403 * \arg outvec_idx is equal to or greater than
404 * \ref PSA_MAX_IOVEC.
405 * \arg The output vector has length zero.
406 * \arg The output vector has already been mapped
407 * using psa_map_outvec().
408 * \arg The output vector has already been accessed
409 * using psa_write().
410 */
411void *psa_map_outvec(psa_handle_t msg_handle, uint32_t outvec_idx);
412
413/**
414 * \brief Unmap a previously mapped client output vector from a Secure Partition
415 * RoT Service.
416 *
417 * \param[in] msg_handle Handle for the client's message.
418 * \param[in] outvec_idx Index of output vector to map. Must be
419 * less than \ref PSA_MAX_IOVEC.
420 * \param[in] len The number of bytes written to the output
421 * vector. This must be less than or equal to the
422 * size of the output vector.
423 *
424 * \retval void
425 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
426 * following are true:
427 * \arg msg_handle is invalid.
428 * \arg msg_handle does not refer to a request
429 * message.
430 * \arg outvec_idx is equal to or greater than
431 * \ref PSA_MAX_IOVEC.
432 * \arg The output vector has not been mapped by a
433 * call to psa_map_outvec().
434 * \arg The output vector has already been unmapped by
435 * a call to psa_unmap_outvec().
436 */
437void psa_unmap_outvec(psa_handle_t msg_handle, uint32_t outvec_idx, size_t len);
438
439#endif /* PSA_FRAMEWORK_HAS_MM_IOVEC */
440
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200441#ifdef __cplusplus
442}
443#endif
444
445#endif /* __PSA_SERVICE_H__ */