| /* |
| * Copyright (c) 2021-2022, Arm Limited. All rights reserved. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| * |
| */ |
| |
| #include "psa/client.h" |
| #include "psa/update.h" |
| #include "psa_manifest/sid.h" |
| |
| psa_status_t psa_fwu_start(psa_fwu_component_t component, |
| const void *manifest, |
| size_t manifest_size) |
| { |
| psa_invec in_vec[] = { |
| { .base = &component, .len = sizeof(component) }, |
| { .base = manifest, .len = manifest_size } |
| }; |
| |
| return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_START, |
| in_vec, IOVEC_LEN(in_vec), NULL, 0); |
| } |
| |
| psa_status_t psa_fwu_write(psa_fwu_component_t component, |
| size_t image_offset, |
| const void *block, |
| size_t block_size) |
| { |
| psa_invec in_vec[] = { |
| { .base = &component, .len = sizeof(component) }, |
| { .base = &image_offset, .len = sizeof(image_offset) }, |
| { .base = block, .len = block_size } |
| }; |
| |
| return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_WRITE, |
| in_vec, IOVEC_LEN(in_vec), NULL, 0); |
| } |
| |
| psa_status_t psa_fwu_finish(psa_fwu_component_t component) |
| { |
| psa_invec in_vec[] = { |
| { .base = &component, .len = sizeof(component) }, |
| }; |
| |
| return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_FINISH, |
| in_vec, IOVEC_LEN(in_vec), NULL, 0); |
| } |
| |
| psa_status_t psa_fwu_install(void) |
| { |
| return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_INSTALL, |
| NULL, 0, NULL, 0); |
| } |
| |
| psa_status_t psa_fwu_cancel(psa_fwu_component_t component) |
| { |
| psa_invec in_vec[] = { |
| { .base = &component, .len = sizeof(component) }, |
| }; |
| |
| return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_CANCEL, |
| in_vec, IOVEC_LEN(in_vec), NULL, 0); |
| } |
| |
| psa_status_t psa_fwu_clean(psa_fwu_component_t component) |
| { |
| psa_invec in_vec[] = { |
| { .base = &component, .len = sizeof(component) }, |
| }; |
| |
| return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_CLEAN, |
| in_vec, IOVEC_LEN(in_vec), NULL, 0); |
| } |
| |
| psa_status_t psa_fwu_query(psa_fwu_component_t component, |
| psa_fwu_component_info_t *info) |
| { |
| psa_invec in_vec[] = { |
| { .base = &component, .len = sizeof(component) } |
| }; |
| psa_outvec out_vec[] = { |
| { .base = info, .len = sizeof(*info)} |
| }; |
| |
| return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_QUERY, |
| in_vec, IOVEC_LEN(in_vec), out_vec, IOVEC_LEN(out_vec)); |
| } |
| |
| psa_status_t psa_fwu_request_reboot(void) |
| { |
| return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_REQUEST_REBOOT, |
| NULL, 0, NULL, 0); |
| } |
| |
| psa_status_t psa_fwu_accept(void) |
| { |
| return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_ACCEPT, |
| NULL, 0, NULL, 0); |
| } |
| |
| psa_status_t psa_fwu_reject(psa_status_t error) |
| { |
| psa_invec in_vec[] = { |
| { .base = &error, .len = sizeof(error) } |
| }; |
| |
| return psa_call(TFM_FIRMWARE_UPDATE_SERVICE_HANDLE, TFM_FWU_REJECT, |
| in_vec, IOVEC_LEN(in_vec), NULL, 0); |
| } |