Platform: Create platform service for pin functions
This patch creates new platform service API for
alternate functions, default input and pin mode setting.
The functions are implemented only for Musca B1,
not needed on Musca A, AN519 and AN521
Change-Id: Ic6d6dbeafe059aadc4f57a066513281afa8aa61b
Signed-off-by: Tamas Kaman <tamas.kaman@arm.com>
diff --git a/platform/ext/target/mps2/an519/tfm_platform_system.c b/platform/ext/target/mps2/an519/tfm_platform_system.c
index 1e8a9ab..26c2a73 100644
--- a/platform/ext/target/mps2/an519/tfm_platform_system.c
+++ b/platform/ext/target/mps2/an519/tfm_platform_system.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018, Arm Limited. All rights reserved.
+ * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*
@@ -14,3 +14,15 @@
NVIC_SystemReset();
}
+enum tfm_plat_err_t
+tfm_platform_hal_pin_service(const psa_invec *in_vec, uint32_t num_invec,
+ const psa_outvec *out_vec, uint32_t num_outvec)
+{
+ (void)in_vec;
+ (void)num_invec;
+ (void)out_vec;
+ (void)num_outvec;
+ /* Not needed for this platform */
+ return TFM_PLAT_ERR_SUCCESS;
+}
+
diff --git a/platform/ext/target/mps2/an521/tfm_platform_system.c b/platform/ext/target/mps2/an521/tfm_platform_system.c
index 1e8a9ab..26c2a73 100644
--- a/platform/ext/target/mps2/an521/tfm_platform_system.c
+++ b/platform/ext/target/mps2/an521/tfm_platform_system.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018, Arm Limited. All rights reserved.
+ * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*
@@ -14,3 +14,15 @@
NVIC_SystemReset();
}
+enum tfm_plat_err_t
+tfm_platform_hal_pin_service(const psa_invec *in_vec, uint32_t num_invec,
+ const psa_outvec *out_vec, uint32_t num_outvec)
+{
+ (void)in_vec;
+ (void)num_invec;
+ (void)out_vec;
+ (void)num_outvec;
+ /* Not needed for this platform */
+ return TFM_PLAT_ERR_SUCCESS;
+}
+
diff --git a/platform/ext/target/musca_a/tfm_platform_system.c b/platform/ext/target/musca_a/tfm_platform_system.c
index 7cd0c84..cc21804 100644
--- a/platform/ext/target/musca_a/tfm_platform_system.c
+++ b/platform/ext/target/musca_a/tfm_platform_system.c
@@ -14,3 +14,17 @@
NVIC_SystemReset();
}
+enum tfm_plat_err_t
+tfm_platform_hal_pin_service(const psa_invec *in_vec, uint32_t num_invec,
+ const psa_outvec *out_vec, uint32_t num_outvec)
+{
+ (void)in_vec;
+ (void)num_invec;
+ (void)out_vec;
+ (void)num_outvec;
+ /* SCC is configured as non-secure through PPC,
+ * so this function is not needed on this platform
+ */
+ return TFM_PLAT_ERR_SUCCESS;
+}
+
diff --git a/platform/ext/target/musca_b1/tfm_platform_system.c b/platform/ext/target/musca_b1/tfm_platform_system.c
index c4d544d..2fb9657 100644
--- a/platform/ext/target/musca_b1/tfm_platform_system.c
+++ b/platform/ext/target/musca_b1/tfm_platform_system.c
@@ -5,9 +5,39 @@
*
*/
+#include <stdbool.h>
#include "platform/include/tfm_platform_system.h"
#include "platform_description.h"
#include "target_cfg.h"
+#include "device_definition.h"
+#include "psa_client.h"
+#include "tfm_platform_defs.h"
+#include "tfm_secure_api.h"
+
+/*!
+ * \brief Verify access rights for memory addresses sent in io vectors
+ *
+ * \param[in] in_vec Pointer to in_vec array, which contains pointer
+ * to input arguments for the service
+ * \param[in] out_vec Pointer out_vec array, which contains pointer to
+ * output data of the pin service
+ *
+ * \return Returns true if memory is accessible by the service
+ */
+static bool memory_addr_check(const psa_invec *in_vec,
+ const psa_outvec *out_vec)
+{
+ if ((in_vec->base != NULL) &&
+ (tfm_core_memory_permission_check((void *)in_vec->base, in_vec->len,
+ TFM_MEMORY_ACCESS_RO) == TFM_SUCCESS) &&
+ (out_vec->base != NULL) &&
+ (tfm_core_memory_permission_check((void *)out_vec->base, out_vec->len,
+ TFM_MEMORY_ACCESS_RW) == TFM_SUCCESS)) {
+ return true;
+ } else {
+ return false;
+ }
+}
void tfm_platform_hal_system_reset(void)
{
@@ -26,3 +56,55 @@
NVIC_SystemReset();
}
+enum tfm_plat_err_t
+tfm_platform_hal_pin_service(const psa_invec *in_vec, uint32_t num_invec,
+ const psa_outvec *out_vec, uint32_t num_outvec)
+{
+ struct tfm_pin_service_args_t *args;
+ uint32_t *result;
+ enum gpio_altfunc_t altfunc;
+ enum pinmode_select_t pin_mode;
+
+ while (num_invec && num_outvec) {
+ if (memory_addr_check(in_vec, out_vec) == false) {
+ return TFM_PLAT_ERR_SYSTEM_ERR;
+ }
+ if (in_vec->len != sizeof(struct tfm_pin_service_args_t) ||
+ out_vec->len != sizeof(uint32_t)) {
+ return TFM_PLAT_ERR_SYSTEM_ERR;
+ }
+
+ args = (struct tfm_pin_service_args_t *)in_vec->base;
+ result = (uint32_t *)out_vec->base;
+ switch (args->type) {
+ case TFM_PIN_SERVICE_TYPE_SET_ALTFUNC:
+ altfunc = (enum gpio_altfunc_t)args->u.set_altfunc.alt_func;
+ *result = musca_b1_scc_set_alt_func(&MUSCA_B1_SCC_DEV_S, altfunc,
+ args->u.set_altfunc.pin_mask);
+ break;
+ case TFM_PIN_SERVICE_TYPE_SET_DEFAULT_IN:
+ altfunc = (enum gpio_altfunc_t)args->u.set_altfunc.alt_func;
+ *result = musca_b1_scc_set_default_in(&MUSCA_B1_SCC_DEV_S, altfunc,
+ args->u.set_default_in.pin_value,
+ args->u.set_default_in.default_in_value);
+ break;
+ case TFM_PIN_SERVICE_TYPE_SET_PIN_MODE:
+ pin_mode = (enum pinmode_select_t)args->u.set_pin_mode.pin_mode;
+ *result = musca_b1_scc_set_pinmode(&MUSCA_B1_SCC_DEV_S,
+ args->u.set_pin_mode.pin_mask,
+ pin_mode);
+ break;
+ default:
+ *result = SCC_INVALID_ARG;
+ break;
+ }
+
+ num_invec--;
+ num_outvec--;
+ in_vec++;
+ out_vec++;
+ }
+
+ return TFM_PLAT_ERR_SUCCESS;
+}
+
diff --git a/platform/include/tfm_platform_system.h b/platform/include/tfm_platform_system.h
index d0e5683..411be49 100644
--- a/platform/include/tfm_platform_system.h
+++ b/platform/include/tfm_platform_system.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018, Arm Limited. All rights reserved.
+ * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*
@@ -13,6 +13,8 @@
*/
#include "tfm_plat_defs.h"
+#include "psa_client.h"
+#include "tfm_plat_defs.h"
#ifdef __cplusplus
extern "C" {
@@ -26,6 +28,23 @@
TFM_LINK_SET_OBJECT_IN_PARTITION_SECTION("TFM_SP_PLATFORM")
void tfm_platform_hal_system_reset(void);
+/*!
+ * \brief Performs pin services of the platform
+ *
+ * \param[in] in_vec Pointer to in_vec array, which contains input
+ * arguments for the pin service
+ * \param[in] num_invec Number of elements in in_vec array
+ * \param[in,out] out_vec Pointer out_vec array, which contains output data
+ * of the pin service
+ * \param[in] num_outvec Number of elements in out_vec array
+ *
+ * \return Returns values as specified by the \ref tfm_plat_err_t
+ */
+TFM_LINK_SET_OBJECT_IN_PARTITION_SECTION("TFM_SP_PLATFORM")
+enum tfm_plat_err_t
+tfm_platform_hal_pin_service(const psa_invec *in_vec, uint32_t num_invec,
+ const psa_outvec *out_vec, uint32_t num_outvec);
+
#ifdef __cplusplus
}
#endif