SPM: Add build-time config for optional PSA APIs
When there is no connection-based service,
the following PSA APIs are optional:
- psa_connect
- psa_close
- psa_set_rhandle
Currently, they are always built, linked and not removed
because the SVC handler references them.
This patch adds a config CONFIG_TFM_CONNECTION_BASED_SERVICE_API
so that they can be excluded and save memory footprints.
Signed-off-by: Xinyu Zhang <xinyu.zhang@arm.com>
Change-Id: I0205ca6a569d375fb1879ab673470a4b2a7a7c01
diff --git a/interface/include/config_impl.h.template b/interface/include/config_impl.h.template
index 2a220ab..0696b91 100644
--- a/interface/include/config_impl.h.template
+++ b/interface/include/config_impl.h.template
@@ -59,4 +59,9 @@
#error "FP is not supported for SFN model."
#endif
+{% if partition_statistics['connection_based_srv_num'] > 0 %}
+/* Connection-based services exist, include the connection-specific API set. */
+#define {{"%-56s"|format("CONFIG_TFM_CONNECTION_BASED_SERVICE_API")}} 1
+{% endif %}
+
#endif /* __CONFIG_IMPL_H__ */
diff --git a/interface/include/psa_interface_redirect.h b/interface/include/psa_interface_redirect.h
index 1514f93..3c16cdf 100644
--- a/interface/include/psa_interface_redirect.h
+++ b/interface/include/psa_interface_redirect.h
@@ -13,12 +13,9 @@
#define psa_framework_version psa_framework_version_svc
#define psa_version psa_version_svc
-#define psa_connect psa_connect_svc
#define tfm_psa_call_pack tfm_psa_call_pack_svc
-#define psa_close psa_close_svc
#define psa_wait psa_wait_svc
#define psa_get psa_get_svc
-#define psa_set_rhandle psa_set_rhandle_svc
#define psa_read psa_read_svc
#define psa_skip psa_skip_svc
#define psa_write psa_write_svc
@@ -31,17 +28,20 @@
#define psa_irq_disable psa_irq_disable_svc
#define psa_reset_signal psa_reset_signal_svc
#define psa_rot_lifecycle_state psa_rot_lifecycle_state_svc
+/* Following PSA APIs are only needed by connection-based services */
+#if CONFIG_TFM_CONNECTION_BASED_SERVICE_API == 1
+#define psa_connect psa_connect_svc
+#define psa_close psa_close_svc
+#define psa_set_rhandle psa_set_rhandle_svc
+#endif /* CONFIG_TFM_CONNECTION_BASED_SERVICE_API */
#elif defined(CONFIG_TFM_PSA_API_CROSS_CALL)
#define psa_framework_version psa_framework_version_cross
#define psa_version psa_version_cross
-#define psa_connect psa_connect_cross
#define tfm_psa_call_pack tfm_psa_call_pack_cross
-#define psa_close psa_close_cross
#define psa_wait psa_wait_cross
#define psa_get psa_get_cross
-#define psa_set_rhandle psa_set_rhandle_cross
#define psa_read psa_read_cross
#define psa_skip psa_skip_cross
#define psa_write psa_write_cross
@@ -54,6 +54,12 @@
#define psa_irq_disable psa_irq_disable_cross
#define psa_reset_signal psa_reset_signal_cross
#define psa_rot_lifecycle_state psa_rot_lifecycle_state_cross
+/* Following PSA APIs are only needed by connection-based services */
+#if CONFIG_TFM_CONNECTION_BASED_SERVICE_API == 1
+#define psa_connect psa_connect_cross
+#define psa_close psa_close_cross
+#define psa_set_rhandle psa_set_rhandle_cross
+#endif /* CONFIG_TFM_CONNECTION_BASED_SERVICE_API */
#if PSA_FRAMEWORK_HAS_MM_IOVEC
#define psa_map_invec psa_map_invec_cross
@@ -66,14 +72,17 @@
#define psa_framework_version psa_framework_version_sfn
#define psa_version psa_version_sfn
-#define psa_connect psa_connect_sfn
#define tfm_psa_call_pack psa_call_pack_sfn
-#define psa_close psa_close_sfn
#define psa_wait psa_wait_sfn
#define psa_read psa_read_sfn
#define psa_skip psa_skip_sfn
#define psa_write psa_write_sfn
#define psa_panic psa_panic_sfn
+/* Following PSA APIs are only needed by connection-based services */
+#if CONFIG_TFM_CONNECTION_BASED_SERVICE_API == 1
+#define psa_connect psa_connect_sfn
+#define psa_close psa_close_sfn
+#endif /* CONFIG_TFM_CONNECTION_BASED_SERVICE_API */
#if PSA_FRAMEWORK_HAS_MM_IOVEC
#define psa_map_invec psa_map_invec_sfn