blob: 487028897717bff50069ec61fb2ac4fdc86c2c8e [file] [log] [blame]
Sherry Zhang07b42412021-01-07 14:19:41 +08001/*
2 * Copyright (c) 2021, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08008#include "psa/client.h"
Sherry Zhang07b42412021-01-07 14:19:41 +08009#include "psa/update.h"
10#include "tfm_api.h"
Sherry Zhang07b42412021-01-07 14:19:41 +080011#include "tfm_ns_interface.h"
12#include "tfm_veneers.h"
13
Sherry Zhang07b42412021-01-07 14:19:41 +080014psa_status_t psa_fwu_write(uint32_t image_id,
15 size_t block_offset,
16 const void *block,
17 size_t block_size)
18{
19 psa_status_t status;
20
21 psa_invec in_vec[] = {
22 { .base = &image_id, .len = sizeof(image_id) },
23 { .base = &block_offset, .len = sizeof(block_offset) },
24 { .base = block, .len = block_size }
25 };
26
David Hu7c2a7442021-04-01 16:34:30 +080027 status = tfm_ns_interface_dispatch((veneer_fn)tfm_fwu_write_req_veneer,
Sherry Zhang07b42412021-01-07 14:19:41 +080028 (uint32_t)in_vec, IOVEC_LEN(in_vec),
29 (uint32_t)NULL, 0);
30
31 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
32 return PSA_ERROR_INVALID_ARGUMENT;
33 }
34
35 return status;
36}
37
38psa_status_t psa_fwu_install(psa_image_id_t image_id,
39 psa_image_id_t *dependency_uuid,
40 psa_image_version_t *dependency_version)
41{
42 psa_status_t status;
43
44 psa_invec in_vec[] = {
45 { .base = &image_id, .len = sizeof(image_id) }
46 };
47
48 psa_outvec out_vec[] = {
49 { .base = dependency_uuid, .len = sizeof(*dependency_uuid) },
50 { .base = dependency_version, .len = sizeof(*dependency_version)}
51 };
52
53 if ((dependency_uuid == NULL) || (dependency_version == NULL)) {
54 return PSA_ERROR_INVALID_ARGUMENT;
55 }
56
David Hu7c2a7442021-04-01 16:34:30 +080057 status = tfm_ns_interface_dispatch((veneer_fn)tfm_fwu_install_req_veneer,
Sherry Zhang07b42412021-01-07 14:19:41 +080058 (uint32_t)in_vec, IOVEC_LEN(in_vec),
59 (uint32_t)out_vec, IOVEC_LEN(out_vec));
60
61 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
62 return PSA_ERROR_INVALID_ARGUMENT;
63 }
64
65 return status;
66}
67
68psa_status_t psa_fwu_abort(psa_image_id_t image_id)
69{
70 psa_status_t status;
71
72 psa_invec in_vec[] = {
73 { .base = &image_id, .len = sizeof(image_id) }
74 };
75
David Hu7c2a7442021-04-01 16:34:30 +080076 status = tfm_ns_interface_dispatch((veneer_fn)tfm_fwu_abort_req_veneer,
Sherry Zhang07b42412021-01-07 14:19:41 +080077 (uint32_t)in_vec, IOVEC_LEN(in_vec),
78 (uint32_t)NULL, 0);
79
80 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
81 return PSA_ERROR_INVALID_ARGUMENT;
82 }
83
84 return status;
85}
86
87psa_status_t psa_fwu_query(psa_image_id_t image_id, psa_image_info_t *info)
88{
89 psa_status_t status;
90
91 psa_invec in_vec[] = {
92 { .base = &image_id, .len = sizeof(image_id) }
93 };
94 psa_outvec out_vec[] = {
95 { .base = info, .len = sizeof(*info)}
96 };
97
David Hu7c2a7442021-04-01 16:34:30 +080098 status = tfm_ns_interface_dispatch((veneer_fn)tfm_fwu_query_req_veneer,
Sherry Zhang07b42412021-01-07 14:19:41 +080099 (uint32_t)in_vec, IOVEC_LEN(in_vec),
100 (uint32_t)out_vec, IOVEC_LEN(out_vec));
101
102 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
103 return PSA_ERROR_INVALID_ARGUMENT;
104 }
105
106 return status;
107}
108
109psa_status_t psa_fwu_request_reboot(void)
110{
111 psa_status_t status;
112
David Hu7c2a7442021-04-01 16:34:30 +0800113 status = tfm_ns_interface_dispatch(
114 (veneer_fn)tfm_fwu_request_reboot_req_veneer,
115 (uint32_t)NULL, 0,
116 (uint32_t)NULL, 0);
Sherry Zhang07b42412021-01-07 14:19:41 +0800117
118 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
119 return PSA_ERROR_INVALID_ARGUMENT;
120 }
121
122 return status;
123}
124
125psa_status_t psa_fwu_accept(void)
126{
127 psa_status_t status;
128
David Hu7c2a7442021-04-01 16:34:30 +0800129 status = tfm_ns_interface_dispatch((veneer_fn)tfm_fwu_accept_req_veneer,
Sherry Zhang07b42412021-01-07 14:19:41 +0800130 (uint32_t)NULL, 0,
131 (uint32_t)NULL, 0);
132
133 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
134 return PSA_ERROR_INVALID_ARGUMENT;
135 }
136
137 return status;
138}
139
140psa_status_t psa_fwu_set_manifest(psa_image_id_t image_id,
141 const void *manifest,
142 size_t manifest_size,
143 psa_hash_t *manifest_dependency)
144{
145 psa_status_t status;
146
147 status = PSA_ERROR_NOT_SUPPORTED;
148
149 return status;
150}