blob: f7565bf20a5b859ca5a61c627d8c1f2ad6fdd3e6 [file] [log] [blame]
Sherry Zhang3e7129f2021-01-13 13:42:47 +08001/*
Sherry Zhang71468952022-10-19 14:09:05 +08002 * Copyright (c) 2021-2022, Arm Limited. All rights reserved.
Sherry Zhang3e7129f2021-01-13 13:42:47 +08003 *
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
Sherry Zhang71468952022-10-19 14:09:05 +080013psa_status_t psa_fwu_start(psa_fwu_component_t component,
14 const void *manifest,
15 size_t manifest_size)
16{
17 psa_invec in_vec[] = {
18 { .base = &component, .len = sizeof(component) },
19 { .base = manifest, .len = manifest_size }
20 };
21
22 return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_START,
23 in_vec, IOVEC_LEN(in_vec), NULL, 0);
24}
25
26psa_status_t psa_fwu_write(psa_fwu_component_t component,
27 size_t image_offset,
Sherry Zhang3e7129f2021-01-13 13:42:47 +080028 const void *block,
29 size_t block_size)
30{
Sherry Zhang3e7129f2021-01-13 13:42:47 +080031 psa_invec in_vec[] = {
Sherry Zhang71468952022-10-19 14:09:05 +080032 { .base = &component, .len = sizeof(component) },
33 { .base = &image_offset, .len = sizeof(image_offset) },
Sherry Zhang3e7129f2021-01-13 13:42:47 +080034 { .base = block, .len = block_size }
35 };
36
Sherry Zhangf7e2ade2022-06-09 17:36:41 +080037 return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_WRITE,
Sherry Zhang71468952022-10-19 14:09:05 +080038 in_vec, IOVEC_LEN(in_vec), NULL, 0);
39}
40
41psa_status_t psa_fwu_finish(psa_fwu_component_t component)
42{
43 psa_invec in_vec[] = {
44 { .base = &component, .len = sizeof(component) },
45 };
46
47 return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_FINISH,
Sherry Zhangf7e2ade2022-06-09 17:36:41 +080048 in_vec, IOVEC_LEN(in_vec), NULL, 0);
Sherry Zhang3e7129f2021-01-13 13:42:47 +080049}
50
Sherry Zhang71468952022-10-19 14:09:05 +080051psa_status_t psa_fwu_install(void)
Sherry Zhang3e7129f2021-01-13 13:42:47 +080052{
Sherry Zhangf7e2ade2022-06-09 17:36:41 +080053 return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_INSTALL,
Sherry Zhang71468952022-10-19 14:09:05 +080054 NULL, 0, NULL, 0);
Sherry Zhang3e7129f2021-01-13 13:42:47 +080055}
56
Sherry Zhang71468952022-10-19 14:09:05 +080057psa_status_t psa_fwu_cancel(psa_fwu_component_t component)
Sherry Zhang3e7129f2021-01-13 13:42:47 +080058{
Sherry Zhang3e7129f2021-01-13 13:42:47 +080059 psa_invec in_vec[] = {
Sherry Zhang71468952022-10-19 14:09:05 +080060 { .base = &component, .len = sizeof(component) },
Sherry Zhang3e7129f2021-01-13 13:42:47 +080061 };
62
Sherry Zhang71468952022-10-19 14:09:05 +080063 return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_CANCEL,
Sherry Zhangf7e2ade2022-06-09 17:36:41 +080064 in_vec, IOVEC_LEN(in_vec), NULL, 0);
Sherry Zhang3e7129f2021-01-13 13:42:47 +080065}
66
Sherry Zhang71468952022-10-19 14:09:05 +080067psa_status_t psa_fwu_clean(psa_fwu_component_t component)
Sherry Zhang3e7129f2021-01-13 13:42:47 +080068{
Sherry Zhang3e7129f2021-01-13 13:42:47 +080069 psa_invec in_vec[] = {
Sherry Zhang71468952022-10-19 14:09:05 +080070 { .base = &component, .len = sizeof(component) },
71 };
72
73 return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_CLEAN,
74 in_vec, IOVEC_LEN(in_vec), NULL, 0);
75}
76
77psa_status_t psa_fwu_query(psa_fwu_component_t component,
78 psa_fwu_component_info_t *info)
79{
80 psa_invec in_vec[] = {
81 { .base = &component, .len = sizeof(component) }
Sherry Zhang3e7129f2021-01-13 13:42:47 +080082 };
83 psa_outvec out_vec[] = {
84 { .base = info, .len = sizeof(*info)}
85 };
86
Sherry Zhangf7e2ade2022-06-09 17:36:41 +080087 return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_QUERY,
88 in_vec, IOVEC_LEN(in_vec), out_vec, IOVEC_LEN(out_vec));
Sherry Zhang3e7129f2021-01-13 13:42:47 +080089}
90
91psa_status_t psa_fwu_request_reboot(void)
92{
Sherry Zhangf7e2ade2022-06-09 17:36:41 +080093 return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_REQUEST_REBOOT,
94 NULL, 0, NULL, 0);
Sherry Zhang3e7129f2021-01-13 13:42:47 +080095}
96
Sherry Zhang71468952022-10-19 14:09:05 +080097psa_status_t psa_fwu_accept(void)
Sherry Zhang3e7129f2021-01-13 13:42:47 +080098{
Sherry Zhangf7e2ade2022-06-09 17:36:41 +080099 return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_ACCEPT,
Sherry Zhang71468952022-10-19 14:09:05 +0800100 NULL, 0, NULL, 0);
Sherry Zhang3e7129f2021-01-13 13:42:47 +0800101}
102
Sherry Zhang71468952022-10-19 14:09:05 +0800103psa_status_t psa_fwu_reject(psa_status_t error)
Sherry Zhang3e7129f2021-01-13 13:42:47 +0800104{
Sherry Zhang71468952022-10-19 14:09:05 +0800105 psa_invec in_vec[] = {
106 { .base = &error, .len = sizeof(error) }
107 };
Sherry Zhang3e7129f2021-01-13 13:42:47 +0800108
Sherry Zhang71468952022-10-19 14:09:05 +0800109 return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_REJECT,
110 in_vec, IOVEC_LEN(in_vec), NULL, 0);
Sherry Zhang3e7129f2021-01-13 13:42:47 +0800111}