blob: 00d95eeb2bbbbcb8a2a3320ea8f53c5adf69224a [file] [log] [blame]
Edison Aif09acd42018-09-20 14:00:07 +08001/*
Xinyu Zhang99b069f2021-04-09 14:36:42 +08002 * Copyright (c) 2018-2021, Arm Limited. All rights reserved.
Edison Aif09acd42018-09-20 14:00:07 +08003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8#include <inttypes.h>
Jamie Foxcc31d402019-01-28 17:13:52 +00009#include "psa/client.h"
Kevin Pengfc7b7712021-05-08 13:42:56 +080010#include "svc_num.h"
Summer Qin806af742019-10-18 14:44:43 +080011#include "tfm_api.h"
Kevin Pengfc7b7712021-05-08 13:42:56 +080012#include "tfm_hal_device_header.h"
Xinyu Zhang99b069f2021-04-09 14:36:42 +080013#include "tfm_psa_call_param.h"
Edison Aif09acd42018-09-20 14:00:07 +080014
Summer Qin254ee972019-10-18 17:36:04 +080015__attribute__((naked))
Edison Aif09acd42018-09-20 14:00:07 +080016uint32_t psa_framework_version(void)
17{
Antonio de Angelisf2dea5b2019-04-16 14:50:50 +010018 __ASM volatile("SVC %0 \n"
19 "BX LR \n"
20 : : "I" (TFM_SVC_PSA_FRAMEWORK_VERSION));
Edison Aif09acd42018-09-20 14:00:07 +080021}
22
Summer Qin254ee972019-10-18 17:36:04 +080023__attribute__((naked))
Edison Aif09acd42018-09-20 14:00:07 +080024uint32_t psa_version(uint32_t sid)
25{
Antonio de Angelisf2dea5b2019-04-16 14:50:50 +010026 __ASM volatile("SVC %0 \n"
27 "BX LR \n"
28 : : "I" (TFM_SVC_PSA_VERSION));
Edison Aif09acd42018-09-20 14:00:07 +080029}
30
Summer Qin254ee972019-10-18 17:36:04 +080031__attribute__((naked))
Summer Qin4b1d03b2019-07-02 14:56:08 +080032psa_handle_t psa_connect(uint32_t sid, uint32_t version)
Edison Aif09acd42018-09-20 14:00:07 +080033{
Antonio de Angelisf2dea5b2019-04-16 14:50:50 +010034 __ASM volatile("SVC %0 \n"
35 "BX LR \n"
36 : : "I" (TFM_SVC_PSA_CONNECT));
Edison Aif09acd42018-09-20 14:00:07 +080037}
38
Summer Qin254ee972019-10-18 17:36:04 +080039__attribute__((naked))
Summer Qin806af742019-10-18 14:44:43 +080040static psa_status_t psa_call_param_pack(psa_handle_t handle,
Xinyu Zhang99b069f2021-04-09 14:36:42 +080041 uint32_t ctrl_param,
42 const psa_invec *in_vec,
43 psa_outvec *out_vec)
Summer Qin806af742019-10-18 14:44:43 +080044{
45 __ASM volatile("SVC %0 \n"
46 "BX LR \n"
47 : : "I" (TFM_SVC_PSA_CALL));
48}
49
Edison Aif09acd42018-09-20 14:00:07 +080050psa_status_t psa_call(psa_handle_t handle,
Summer Qin4b1d03b2019-07-02 14:56:08 +080051 int32_t type,
Edison Aif09acd42018-09-20 14:00:07 +080052 const psa_invec *in_vec,
53 size_t in_len,
54 psa_outvec *out_vec,
55 size_t out_len)
56{
Xinyu Zhang99b069f2021-04-09 14:36:42 +080057 if ((type > INT16_MAX) ||
58 (type < INT16_MIN) ||
59 (in_len > PSA_MAX_IOVEC) ||
60 (out_len > PSA_MAX_IOVEC) ||
61 ((in_len + out_len) > PSA_MAX_IOVEC)) {
62 return PSA_ERROR_INVALID_ARGUMENT;
63 }
Summer Qin806af742019-10-18 14:44:43 +080064
Xinyu Zhang99b069f2021-04-09 14:36:42 +080065 return psa_call_param_pack(handle,
66 PARAM_PACK(type, in_len, out_len),
67 in_vec,
68 out_vec);
Edison Aif09acd42018-09-20 14:00:07 +080069}
70
Summer Qin254ee972019-10-18 17:36:04 +080071__attribute__((naked))
Edison Aif09acd42018-09-20 14:00:07 +080072void psa_close(psa_handle_t handle)
73{
Antonio de Angelisf2dea5b2019-04-16 14:50:50 +010074 __ASM volatile("SVC %0 \n"
75 "BX LR \n"
76 : : "I" (TFM_SVC_PSA_CLOSE));
Edison Aif09acd42018-09-20 14:00:07 +080077}