blob: 1d34d03124a1f6d3d273f5147b3fb3c7602b3034 [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
27 status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_write_req_veneer,
28 (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
57 status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_install_req_veneer,
58 (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
76 status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_abort_req_veneer,
77 (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
98 status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_query_req_veneer,
99 (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
113 status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_request_reboot_req_veneer,
114 (uint32_t)NULL, 0,
115 (uint32_t)NULL, 0);
116
117 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
118 return PSA_ERROR_INVALID_ARGUMENT;
119 }
120
121 return status;
122}
123
124psa_status_t psa_fwu_accept(void)
125{
126 psa_status_t status;
127
128 status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_accept_req_veneer,
129 (uint32_t)NULL, 0,
130 (uint32_t)NULL, 0);
131
132 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
133 return PSA_ERROR_INVALID_ARGUMENT;
134 }
135
136 return status;
137}
138
139psa_status_t psa_fwu_set_manifest(psa_image_id_t image_id,
140 const void *manifest,
141 size_t manifest_size,
142 psa_hash_t *manifest_dependency)
143{
144 psa_status_t status;
145
146 status = PSA_ERROR_NOT_SUPPORTED;
147
148 return status;
149}