SPM: Enhance build control for IPC and SFN models

Currently, different models configuration such as
CONFIG_TFM_PSA_API_xxx_CALL are configured in generated header
file config_impl.h. CMake build system has no information on
which model should be built. As a result, files for different
models are always build in IPC model, such as psa_interface_cross.c,
psa_interface_sfn.c and psa_interface_svc.c.
This patch:
- Generate CMake variables for each model.
- Configure the build system based on generated CMake variables.

Signed-off-by: Sherry Zhang <sherry.zhang2@arm.com>
Change-Id: If3f92b07b618b13ca596306ffd19867010de83b7
diff --git a/tools/config_impl.cmake.template b/tools/config_impl.cmake.template
new file mode 100644
index 0000000..59a327c
--- /dev/null
+++ b/tools/config_impl.cmake.template
@@ -0,0 +1,39 @@
+#-------------------------------------------------------------------------------
+# Copyright (c) 2022, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+#-------------------------------------------------------------------------------
+
+
+########{{utilities.donotedit_warning}}########
+
+if(TFM_PSA_API)
+{% if partition_statistics['ipc_partition_num'] > 0
+    and partition_statistics['sfn_partition_num'] == 0 %}
+    set(CONFIG_TFM_SPM_BACKEND_IPC ON PARENT_SCOPE)
+
+    if(TFM_ISOLATION_LEVEL GREATER 1)
+        set(CONFIG_TFM_PSA_API_SUPERVISOR_CALL ON PARENT_SCOPE)
+    else()
+        set(CONFIG_TFM_PSA_API_CROSS_CALL ON PARENT_SCOPE)
+    endif()
+{% elif partition_statistics['sfn_partition_num'] > 0
+    and partition_statistics['ipc_partition_num'] == 0 %}
+    set(CONFIG_TFM_SPM_BACKEND_SFN ON PARENT_SCOPE)
+    set(CONFIG_TFM_PSA_API_SFN_CALL ON PARENT_SCOPE)
+
+    if(TFM_ISOLATION_LEVEL GREATER 1)
+        message(FATAL_ERROR "High isolation level SFN model is not supported.")
+    endif()
+{% elif partition_statistics['sfn_partition_num'] > 0
+    and partition_statistics['ipc_partition_num'] > 0 %}
+    message(FATAL_ERROR "IPC and SFN co-work not supported yet.")
+{% else %}
+    message(FATAL_ERROR "Invalid partition number input, check configurations.")
+{% endif %}
+
+    if((CONFIG_TFM_SPE_FP GREATER 0) AND CONFIG_TFM_SPM_BACKEND_SFN)
+        message(FATAL_ERROR "FP is not supported for SFN model.")
+    endif()
+endif()