diff options
Diffstat (limited to 'platform/ext/target/arm/musca_s1/services/src/tfm_ioctl_ns_api.c')
-rw-r--r-- | platform/ext/target/arm/musca_s1/services/src/tfm_ioctl_ns_api.c | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/platform/ext/target/arm/musca_s1/services/src/tfm_ioctl_ns_api.c b/platform/ext/target/arm/musca_s1/services/src/tfm_ioctl_ns_api.c new file mode 100644 index 0000000000..d834f87007 --- /dev/null +++ b/platform/ext/target/arm/musca_s1/services/src/tfm_ioctl_ns_api.c @@ -0,0 +1,299 @@ +/* + * Copyright (c) 2019-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include <stdint.h> +#include <stdbool.h> +#include "tfm_platform_api.h" +#include "tfm_ioctl_api.h" + +enum tfm_platform_err_t +tfm_platform_set_pin_alt_func(uint32_t alt_func, uint64_t pin_mask, + uint32_t *result) +{ + enum tfm_platform_err_t ret; + psa_invec in_vec; + psa_outvec out_vec; + struct tfm_pin_service_args_t args; + + if (result == NULL) { + return TFM_PLATFORM_ERR_INVALID_PARAM; + } + + args.type = TFM_PIN_SERVICE_TYPE_SET_ALTFUNC; + args.u.set_altfunc.alt_func = alt_func; + args.u.set_altfunc.pin_mask = pin_mask; + + in_vec.base = (const void *)&args; + in_vec.len = sizeof(args); + + out_vec.base = (void *)result; + out_vec.len = sizeof(*result); + + ret = tfm_platform_ioctl(TFM_PLATFORM_IOCTL_PIN_SERVICE, + &in_vec, + &out_vec); + + return ret; +} + +enum tfm_platform_err_t +tfm_platform_set_pin_default_in(uint32_t alt_func, uint32_t pin_value, + bool default_in_value, uint32_t *result) +{ + enum tfm_platform_err_t ret; + psa_invec in_vec; + psa_outvec out_vec; + struct tfm_pin_service_args_t args; + + if (result == NULL) { + return TFM_PLATFORM_ERR_INVALID_PARAM; + } + + args.type = TFM_PIN_SERVICE_TYPE_SET_DEFAULT_IN; + args.u.set_default_in.alt_func = alt_func; + args.u.set_default_in.pin_value = pin_value; + args.u.set_default_in.default_in_value = default_in_value; + + in_vec.base = (const void *)&args; + in_vec.len = sizeof(args); + + out_vec.base = (void *)result; + out_vec.len = sizeof(*result); + + ret = tfm_platform_ioctl(TFM_PLATFORM_IOCTL_PIN_SERVICE, + &in_vec, + &out_vec); + + return ret; +} + +enum tfm_platform_err_t +tfm_platform_set_pin_mode(uint64_t pin_mask, uint32_t pin_mode, + uint32_t *result) +{ + enum tfm_platform_err_t ret; + psa_invec in_vec; + psa_outvec out_vec; + struct tfm_pin_service_args_t args; + + if (result == NULL) { + return TFM_PLATFORM_ERR_INVALID_PARAM; + } + + args.type = TFM_PIN_SERVICE_TYPE_SET_PIN_MODE; + args.u.set_pin_mode.pin_mask = pin_mask; + args.u.set_pin_mode.pin_mode = pin_mode; + + in_vec.base = (const void *)&args; + in_vec.len = sizeof(args); + + out_vec.base = (void *)result; + out_vec.len = sizeof(*result); + + ret = tfm_platform_ioctl(TFM_PLATFORM_IOCTL_PIN_SERVICE, + &in_vec, + &out_vec); + + return ret; +} + +enum tfm_platform_err_t tfm_platform_gpio_init(uint32_t *result) +{ + enum tfm_platform_err_t ret; + psa_invec in_vec; + psa_outvec out_vec; + struct tfm_gpio_service_args_t args; + struct tfm_gpio_service_out_t out; + + args.type = TFM_GPIO_SERVICE_TYPE_INIT; + + in_vec.base = (const void *)&args; + in_vec.len = sizeof(args); + + out_vec.base = (void *)&out; + out_vec.len = sizeof(out); + + ret = tfm_platform_ioctl(TFM_PLATFORM_IOCTL_GPIO_SERVICE, + &in_vec, + &out_vec); + + *result = out.u.result; + + return ret; +} + +enum tfm_platform_err_t +tfm_platform_gpio_pin_config(uint32_t pin_num, uint32_t direction, + uint32_t *result) +{ + enum tfm_platform_err_t ret; + psa_invec in_vec; + psa_outvec out_vec; + struct tfm_gpio_service_args_t args; + struct tfm_gpio_service_out_t out; + + args.type = TFM_GPIO_SERVICE_TYPE_PIN_CONFIG; + args.u.gpio_config.pin_num_or_mask = pin_num; + args.u.gpio_config.direction = direction; + + in_vec.base = (const void *)&args; + in_vec.len = sizeof(args); + + out_vec.base = (void *)&out; + out_vec.len = sizeof(out); + + ret = tfm_platform_ioctl(TFM_PLATFORM_IOCTL_GPIO_SERVICE, + &in_vec, + &out_vec); + + *result = out.u.result; + + return ret; +} + +enum tfm_platform_err_t +tfm_platform_gpio_pin_write(uint32_t pin_num, uint32_t value, uint32_t *result) +{ + enum tfm_platform_err_t ret; + psa_invec in_vec; + psa_outvec out_vec; + struct tfm_gpio_service_args_t args; + struct tfm_gpio_service_out_t out; + + args.type = TFM_GPIO_SERVICE_TYPE_PIN_WRITE; + args.u.gpio_write.pin_num_or_mask = pin_num; + args.u.gpio_write.value = value; + + in_vec.base = (const void *)&args; + in_vec.len = sizeof(args); + + out_vec.base = (void *)&out; + out_vec.len = sizeof(out); + + ret = tfm_platform_ioctl(TFM_PLATFORM_IOCTL_GPIO_SERVICE, + &in_vec, + &out_vec); + + *result = out.u.result; + + return ret; +} + +enum tfm_platform_err_t +tfm_platform_gpio_pin_read(uint32_t pin_num, uint32_t *data, uint32_t *result) +{ + enum tfm_platform_err_t ret; + psa_invec in_vec; + psa_outvec out_vec; + struct tfm_gpio_service_args_t args; + struct tfm_gpio_service_out_t out; + + args.type = TFM_GPIO_SERVICE_TYPE_PIN_READ; + args.u.gpio_read.pin_num_or_mask = pin_num; + + in_vec.base = (const void *)&args; + in_vec.len = sizeof(args); + + out_vec.base = (void *)&out; + out_vec.len = sizeof(out); + + ret = tfm_platform_ioctl(TFM_PLATFORM_IOCTL_GPIO_SERVICE, + &in_vec, + &out_vec); + + *result = out.u.gpio_read_result.result; + *data = out.u.gpio_read_result.data; + + return ret; +} + +enum tfm_platform_err_t +tfm_platform_gpio_port_config(uint32_t pin_mask, uint32_t direction, + uint32_t *result) +{ + enum tfm_platform_err_t ret; + psa_invec in_vec; + psa_outvec out_vec; + struct tfm_gpio_service_args_t args; + struct tfm_gpio_service_out_t out; + + args.type = TFM_GPIO_SERVICE_TYPE_PORT_CONFIG; + args.u.gpio_config.pin_num_or_mask = pin_mask; + args.u.gpio_config.direction = direction; + + in_vec.base = (const void *)&args; + in_vec.len = sizeof(args); + + out_vec.base = (void *)&out; + out_vec.len = sizeof(out); + + ret = tfm_platform_ioctl(TFM_PLATFORM_IOCTL_GPIO_SERVICE, + &in_vec, + &out_vec); + + *result = out.u.result; + + return ret; +} + +enum tfm_platform_err_t +tfm_platform_gpio_port_write(uint32_t pin_mask, uint32_t value, + uint32_t *result) +{ + enum tfm_platform_err_t ret; + psa_invec in_vec; + psa_outvec out_vec; + struct tfm_gpio_service_args_t args; + struct tfm_gpio_service_out_t out; + + args.type = TFM_GPIO_SERVICE_TYPE_PORT_WRITE; + args.u.gpio_write.pin_num_or_mask = pin_mask; + args.u.gpio_write.value = value; + + in_vec.base = (const void *)&args; + in_vec.len = sizeof(args); + + out_vec.base = (void *)&out; + out_vec.len = sizeof(out); + + ret = tfm_platform_ioctl(TFM_PLATFORM_IOCTL_GPIO_SERVICE, + &in_vec, + &out_vec); + + *result = out.u.result; + + return ret; + +} + +enum tfm_platform_err_t +tfm_platform_gpio_port_read(uint32_t pin_mask, uint32_t *data, uint32_t *result) +{ + enum tfm_platform_err_t ret; + psa_invec in_vec; + psa_outvec out_vec; + struct tfm_gpio_service_args_t args; + struct tfm_gpio_service_out_t out; + + args.type = TFM_GPIO_SERVICE_TYPE_PORT_READ; + args.u.gpio_read.pin_num_or_mask = pin_mask; + + in_vec.base = (const void *)&args; + in_vec.len = sizeof(args); + + out_vec.base = (void *)&out; + out_vec.len = sizeof(out); + + ret = tfm_platform_ioctl(TFM_PLATFORM_IOCTL_GPIO_SERVICE, + &in_vec, + &out_vec); + + *result = out.u.gpio_read_result.result; + *data = out.u.gpio_read_result.data; + + return ret; +} |