blob: b8d35413b25c9ab0b356cc02f90dbaa6d82f5003 [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
8#include "psa/update.h"
9#include "tfm_api.h"
10
11#include "tfm_ns_interface.h"
12#include "tfm_veneers.h"
13
14#define IOVEC_LEN(x) (uint32_t)(sizeof(x)/sizeof(x[0]))
15
16psa_status_t psa_fwu_write(uint32_t image_id,
17 size_t block_offset,
18 const void *block,
19 size_t block_size)
20{
21 psa_status_t status;
22
23 psa_invec in_vec[] = {
24 { .base = &image_id, .len = sizeof(image_id) },
25 { .base = &block_offset, .len = sizeof(block_offset) },
26 { .base = block, .len = block_size }
27 };
28
29 status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_write_req_veneer,
30 (uint32_t)in_vec, IOVEC_LEN(in_vec),
31 (uint32_t)NULL, 0);
32
33 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
34 return PSA_ERROR_INVALID_ARGUMENT;
35 }
36
37 return status;
38}
39
40psa_status_t psa_fwu_install(psa_image_id_t image_id,
41 psa_image_id_t *dependency_uuid,
42 psa_image_version_t *dependency_version)
43{
44 psa_status_t status;
45
46 psa_invec in_vec[] = {
47 { .base = &image_id, .len = sizeof(image_id) }
48 };
49
50 psa_outvec out_vec[] = {
51 { .base = dependency_uuid, .len = sizeof(*dependency_uuid) },
52 { .base = dependency_version, .len = sizeof(*dependency_version)}
53 };
54
55 if ((dependency_uuid == NULL) || (dependency_version == NULL)) {
56 return PSA_ERROR_INVALID_ARGUMENT;
57 }
58
59 status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_install_req_veneer,
60 (uint32_t)in_vec, IOVEC_LEN(in_vec),
61 (uint32_t)out_vec, IOVEC_LEN(out_vec));
62
63 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
64 return PSA_ERROR_INVALID_ARGUMENT;
65 }
66
67 return status;
68}
69
70psa_status_t psa_fwu_abort(psa_image_id_t image_id)
71{
72 psa_status_t status;
73
74 psa_invec in_vec[] = {
75 { .base = &image_id, .len = sizeof(image_id) }
76 };
77
78 status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_abort_req_veneer,
79 (uint32_t)in_vec, IOVEC_LEN(in_vec),
80 (uint32_t)NULL, 0);
81
82 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
83 return PSA_ERROR_INVALID_ARGUMENT;
84 }
85
86 return status;
87}
88
89psa_status_t psa_fwu_query(psa_image_id_t image_id, psa_image_info_t *info)
90{
91 psa_status_t status;
92
93 psa_invec in_vec[] = {
94 { .base = &image_id, .len = sizeof(image_id) }
95 };
96 psa_outvec out_vec[] = {
97 { .base = info, .len = sizeof(*info)}
98 };
99
100 status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_query_req_veneer,
101 (uint32_t)in_vec, IOVEC_LEN(in_vec),
102 (uint32_t)out_vec, IOVEC_LEN(out_vec));
103
104 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
105 return PSA_ERROR_INVALID_ARGUMENT;
106 }
107
108 return status;
109}
110
111psa_status_t psa_fwu_request_reboot(void)
112{
113 psa_status_t status;
114
115 status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_request_reboot_req_veneer,
116 (uint32_t)NULL, 0,
117 (uint32_t)NULL, 0);
118
119 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
120 return PSA_ERROR_INVALID_ARGUMENT;
121 }
122
123 return status;
124}
125
126psa_status_t psa_fwu_accept(void)
127{
128 psa_status_t status;
129
130 status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_accept_req_veneer,
131 (uint32_t)NULL, 0,
132 (uint32_t)NULL, 0);
133
134 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
135 return PSA_ERROR_INVALID_ARGUMENT;
136 }
137
138 return status;
139}
140
141psa_status_t psa_fwu_set_manifest(psa_image_id_t image_id,
142 const void *manifest,
143 size_t manifest_size,
144 psa_hash_t *manifest_dependency)
145{
146 psa_status_t status;
147
148 status = PSA_ERROR_NOT_SUPPORTED;
149
150 return status;
151}