blob: 3cba758021d80fa3e3ed2df6b9ed55c724c407a1 [file] [log] [blame]
Sherry Zhang3e7129f2021-01-13 13:42:47 +08001/*
2 * Copyright (c) 2021, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Sherry Zhang3e7129f2021-01-13 13:42:47 +08008#include "psa/client.h"
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08009#include "psa/update.h"
Sherry Zhang3e7129f2021-01-13 13:42:47 +080010#include "psa_manifest/sid.h"
Xinyu Zhangade2e0a2021-03-18 16:20:54 +080011#include "tfm_api.h"
Sherry Zhang3e7129f2021-01-13 13:42:47 +080012
13psa_status_t psa_fwu_write(const psa_image_id_t image_id,
14 size_t block_offset,
15 const void *block,
16 size_t block_size)
17{
Sherry Zhang3e7129f2021-01-13 13:42:47 +080018 psa_invec in_vec[] = {
19 { .base = &image_id, .len = sizeof(image_id) },
20 { .base = &block_offset, .len = sizeof(block_offset) },
21 { .base = block, .len = block_size }
22 };
23
Sherry Zhangf7e2ade2022-06-09 17:36:41 +080024 return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_WRITE,
25 in_vec, IOVEC_LEN(in_vec), NULL, 0);
Sherry Zhang3e7129f2021-01-13 13:42:47 +080026}
27
28psa_status_t psa_fwu_install(const psa_image_id_t image_id,
29 psa_image_id_t *dependency_uuid,
30 psa_image_version_t *dependency_version)
31{
Sherry Zhang3e7129f2021-01-13 13:42:47 +080032 psa_invec in_vec[] = {
33 { .base = &image_id, .len = sizeof(image_id) }
34 };
35
36 psa_outvec out_vec[] = {
37 { .base = dependency_uuid, .len = sizeof(*dependency_uuid) },
38 { .base = dependency_version, .len = sizeof(*dependency_version)}
39 };
40
41 if ((dependency_uuid == NULL) || (dependency_version == NULL)) {
42 return PSA_ERROR_INVALID_ARGUMENT;
43 }
44
Sherry Zhangf7e2ade2022-06-09 17:36:41 +080045 return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_INSTALL,
46 in_vec, IOVEC_LEN(in_vec), out_vec, IOVEC_LEN(out_vec));
Sherry Zhang3e7129f2021-01-13 13:42:47 +080047}
48
49psa_status_t psa_fwu_abort(const psa_image_id_t image_id)
50{
Sherry Zhang3e7129f2021-01-13 13:42:47 +080051 psa_invec in_vec[] = {
52 { .base = &image_id, .len = sizeof(image_id) }
53 };
54
Sherry Zhangf7e2ade2022-06-09 17:36:41 +080055 return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_ABORT,
56 in_vec, IOVEC_LEN(in_vec), NULL, 0);
Sherry Zhang3e7129f2021-01-13 13:42:47 +080057}
58
59psa_status_t psa_fwu_query(const psa_image_id_t image_id, psa_image_info_t *info)
60{
Sherry Zhang3e7129f2021-01-13 13:42:47 +080061 psa_invec in_vec[] = {
62 { .base = &image_id, .len = sizeof(image_id) }
63 };
64 psa_outvec out_vec[] = {
65 { .base = info, .len = sizeof(*info)}
66 };
67
Sherry Zhangf7e2ade2022-06-09 17:36:41 +080068 return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_QUERY,
69 in_vec, IOVEC_LEN(in_vec), out_vec, IOVEC_LEN(out_vec));
Sherry Zhang3e7129f2021-01-13 13:42:47 +080070}
71
72psa_status_t psa_fwu_request_reboot(void)
73{
Sherry Zhangf7e2ade2022-06-09 17:36:41 +080074 return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_REQUEST_REBOOT,
75 NULL, 0, NULL, 0);
Sherry Zhang3e7129f2021-01-13 13:42:47 +080076}
77
Sherry Zhang2da977d2021-05-10 16:59:05 +080078psa_status_t psa_fwu_accept(psa_image_id_t image_id)
Sherry Zhang3e7129f2021-01-13 13:42:47 +080079{
Sherry Zhang2da977d2021-05-10 16:59:05 +080080 psa_invec in_vec[] = {
81 { .base = &image_id, .len = sizeof(image_id) }
82 };
Sherry Zhang3e7129f2021-01-13 13:42:47 +080083
Sherry Zhangf7e2ade2022-06-09 17:36:41 +080084 return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_ACCEPT,
85 in_vec, IOVEC_LEN(in_vec), NULL, 0);
Sherry Zhang3e7129f2021-01-13 13:42:47 +080086}
87
88psa_status_t psa_fwu_set_manifest(psa_image_id_t image_id,
89 const void *manifest,
90 size_t manifest_size,
91 psa_hash_t *manifest_dependency)
92{
93 psa_status_t status;
94
95 status = PSA_ERROR_NOT_SUPPORTED;
96
97 return status;
98}