blob: 1d34d03124a1f6d3d273f5147b3fb3c7602b3034 [file] [log] [blame]
/*
* Copyright (c) 2021, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*
*/
#include "psa/client.h"
#include "psa/update.h"
#include "tfm_api.h"
#include "tfm_ns_interface.h"
#include "tfm_veneers.h"
psa_status_t psa_fwu_write(uint32_t image_id,
size_t block_offset,
const void *block,
size_t block_size)
{
psa_status_t status;
psa_invec in_vec[] = {
{ .base = &image_id, .len = sizeof(image_id) },
{ .base = &block_offset, .len = sizeof(block_offset) },
{ .base = block, .len = block_size }
};
status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_write_req_veneer,
(uint32_t)in_vec, IOVEC_LEN(in_vec),
(uint32_t)NULL, 0);
if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
return PSA_ERROR_INVALID_ARGUMENT;
}
return status;
}
psa_status_t psa_fwu_install(psa_image_id_t image_id,
psa_image_id_t *dependency_uuid,
psa_image_version_t *dependency_version)
{
psa_status_t status;
psa_invec in_vec[] = {
{ .base = &image_id, .len = sizeof(image_id) }
};
psa_outvec out_vec[] = {
{ .base = dependency_uuid, .len = sizeof(*dependency_uuid) },
{ .base = dependency_version, .len = sizeof(*dependency_version)}
};
if ((dependency_uuid == NULL) || (dependency_version == NULL)) {
return PSA_ERROR_INVALID_ARGUMENT;
}
status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_install_req_veneer,
(uint32_t)in_vec, IOVEC_LEN(in_vec),
(uint32_t)out_vec, IOVEC_LEN(out_vec));
if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
return PSA_ERROR_INVALID_ARGUMENT;
}
return status;
}
psa_status_t psa_fwu_abort(psa_image_id_t image_id)
{
psa_status_t status;
psa_invec in_vec[] = {
{ .base = &image_id, .len = sizeof(image_id) }
};
status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_abort_req_veneer,
(uint32_t)in_vec, IOVEC_LEN(in_vec),
(uint32_t)NULL, 0);
if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
return PSA_ERROR_INVALID_ARGUMENT;
}
return status;
}
psa_status_t psa_fwu_query(psa_image_id_t image_id, psa_image_info_t *info)
{
psa_status_t status;
psa_invec in_vec[] = {
{ .base = &image_id, .len = sizeof(image_id) }
};
psa_outvec out_vec[] = {
{ .base = info, .len = sizeof(*info)}
};
status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_query_req_veneer,
(uint32_t)in_vec, IOVEC_LEN(in_vec),
(uint32_t)out_vec, IOVEC_LEN(out_vec));
if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
return PSA_ERROR_INVALID_ARGUMENT;
}
return status;
}
psa_status_t psa_fwu_request_reboot(void)
{
psa_status_t status;
status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_request_reboot_req_veneer,
(uint32_t)NULL, 0,
(uint32_t)NULL, 0);
if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
return PSA_ERROR_INVALID_ARGUMENT;
}
return status;
}
psa_status_t psa_fwu_accept(void)
{
psa_status_t status;
status = tfm_ns_interface_dispatch((veneer_fn)tfm_tfm_fwu_accept_req_veneer,
(uint32_t)NULL, 0,
(uint32_t)NULL, 0);
if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
return PSA_ERROR_INVALID_ARGUMENT;
}
return status;
}
psa_status_t psa_fwu_set_manifest(psa_image_id_t image_id,
const void *manifest,
size_t manifest_size,
psa_hash_t *manifest_dependency)
{
psa_status_t status;
status = PSA_ERROR_NOT_SUPPORTED;
return status;
}