RPC: Merge RPC PSA Client APIs

Originally, connection-based APIs are optional, depends on whether the
TF-M provides any.
So the RPC APIs are also separated so that they can be selected.

Later, the APIs are always provided with returning NOT SUPPORTED in case
of no connection-based APIs.
And the RPC test framework followed up by always building all the APIs.

This patch makes it further by merging all the APIs.

Change-Id: I923c24e5e83cae4e3d8f4774d776dbe8d07610c2
Signed-off-by: Kevin Peng <kevin.peng@arm.com>
diff --git a/erpc/client/CMakeLists.txt b/erpc/client/CMakeLists.txt
index 53658aa..9472dc0 100644
--- a/erpc/client/CMakeLists.txt
+++ b/erpc/client/CMakeLists.txt
@@ -51,8 +51,7 @@
         ${ERPC_REPO_PATH}/erpc_c/setup/erpc_client_setup.cpp
         ${ERPC_REPO_PATH}/erpc_c/setup/erpc_setup_mbf_dynamic.cpp
         # Generated files
-        ${CMAKE_CURRENT_SOURCE_DIR}/../generated_files/tfm_erpc_psa_client_api_client.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/../generated_files/tfm_erpc_psa_connection_api_client.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/../generated_files/tfm_erpc_client.cpp
 )
 
 target_include_directories(erpc_client
diff --git a/erpc/client/erpc_client_wrapper.c b/erpc/client/erpc_client_wrapper.c
index 37b5f82..4b23f5f 100644
--- a/erpc/client/erpc_client_wrapper.c
+++ b/erpc/client/erpc_client_wrapper.c
@@ -7,7 +7,7 @@
 
 #include <stddef.h>
 #include "psa/client.h"
-#include "tfm_erpc_psa_client_api.h"
+#include "tfm_erpc.h"
 
 psa_status_t psa_call(psa_handle_t handle, int32_t type,
                       const psa_invec *in_vec, size_t in_len,
diff --git a/erpc/generated_files/tfm_erpc_psa_client_api.h b/erpc/generated_files/tfm_erpc.h
similarity index 78%
rename from erpc/generated_files/tfm_erpc_psa_client_api.h
rename to erpc/generated_files/tfm_erpc.h
index 6b6760e..0bff49a 100644
--- a/erpc/generated_files/tfm_erpc_psa_client_api.h
+++ b/erpc/generated_files/tfm_erpc.h
@@ -1,19 +1,19 @@
 /*
- * Copyright (c) 2022, Arm Limited. All rights reserved.
+ * Copyright (c) 2023, Arm Limited. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  *
  */
 
 /*
- * Generated by erpcgen 1.9.1 on Fri Dec 16 14:51:11 2022.
+ * Generated by erpcgen 1.9.1 on Fri Jul 21 17:28:31 2023.
  *
  * AUTOGENERATED - DO NOT EDIT
  */
 
 
-#if !defined(_tfm_erpc_psa_client_api_h_)
-#define _tfm_erpc_psa_client_api_h_
+#if !defined(_tfm_erpc_h_)
+#define _tfm_erpc_h_
 
 #include <stdbool.h>
 #include <stddef.h>
@@ -55,6 +55,8 @@
     kpsa_client_api_psa_framework_version_id = 1,
     kpsa_client_api_psa_version_id = 2,
     kpsa_client_api_erpc_psa_call_id = 3,
+    kpsa_client_api_psa_connect_id = 4,
+    kpsa_client_api_psa_close_id = 5,
 };
 
 #if defined(__cplusplus)
@@ -68,10 +70,14 @@
 uint32_t psa_version(uint32_t sid);
 
 psa_status_t erpc_psa_call(psa_handle_t handle, int32_t t, const list_binary_1_t * erpc_in_vec, list_binary_1_t * erpc_out_vec);
+
+psa_handle_t psa_connect(uint32_t sid, uint32_t ver);
+
+void psa_close(psa_handle_t handle);
 //@}
 
 #if defined(__cplusplus)
 }
 #endif
 
-#endif // _tfm_erpc_psa_client_api_h_
+#endif // _tfm_erpc_h_
diff --git a/erpc/generated_files/tfm_erpc_psa_client_api_client.cpp b/erpc/generated_files/tfm_erpc_client.cpp
similarity index 71%
rename from erpc/generated_files/tfm_erpc_psa_client_api_client.cpp
rename to erpc/generated_files/tfm_erpc_client.cpp
index fa7dee9..11c6fae 100644
--- a/erpc/generated_files/tfm_erpc_psa_client_api_client.cpp
+++ b/erpc/generated_files/tfm_erpc_client.cpp
@@ -1,12 +1,12 @@
 /*
- * Copyright (c) 2022, Arm Limited. All rights reserved.
+ * Copyright (c) 2023, Arm Limited. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  *
  */
 
 /*
- * Generated by erpcgen 1.9.1 on Fri Dec 16 14:51:11 2022.
+ * Generated by erpcgen 1.9.1 on Fri Jul 21 17:28:31 2023.
  *
  * AUTOGENERATED - DO NOT EDIT
  */
@@ -19,9 +19,7 @@
 #include "erpc_codec.h"
 extern "C"
 {
-#include "tfm_erpc_psa_client_api.h"
-// import callbacks declaration from other groups
-#include "tfm_erpc_psa_connection_api.h"
+#include "tfm_erpc.h"
 }
 
 #if 10901 != ERPC_VERSION_NUMBER
@@ -298,3 +296,123 @@
 
     return result;
 }
+
+// psa_client_api interface psa_connect function client shim.
+psa_handle_t psa_connect(uint32_t sid, uint32_t ver)
+{
+    erpc_status_t err = kErpcStatus_Success;
+
+    psa_handle_t result;
+
+#if ERPC_PRE_POST_ACTION
+    pre_post_action_cb preCB = g_client->getPreCB();
+    if (preCB)
+    {
+        preCB();
+    }
+#endif
+
+    // Get a new request.
+    RequestContext request = g_client->createRequest(false);
+
+    // Encode the request.
+    Codec * codec = request.getCodec();
+
+    if (codec == NULL)
+    {
+        err = kErpcStatus_MemoryError;
+    }
+    else
+    {
+        codec->startWriteMessage(kInvocationMessage, kpsa_client_api_service_id, kpsa_client_api_psa_connect_id, request.getSequence());
+
+        codec->write(sid);
+
+        codec->write(ver);
+
+        // Send message to server
+        // Codec status is checked inside this function.
+        g_client->performRequest(request);
+
+        codec->read(&result);
+
+        err = codec->getStatus();
+    }
+
+    // Dispose of the request.
+    g_client->releaseRequest(request);
+
+    // Invoke error handler callback function
+    g_client->callErrorHandler(err, kpsa_client_api_psa_connect_id);
+
+#if ERPC_PRE_POST_ACTION
+    pre_post_action_cb postCB = g_client->getPostCB();
+    if (postCB)
+    {
+        postCB();
+    }
+#endif
+
+
+    if (err != kErpcStatus_Success)
+    {
+        result = -1;
+    }
+
+    return result;
+}
+
+// psa_client_api interface psa_close function client shim.
+void psa_close(psa_handle_t handle)
+{
+    erpc_status_t err = kErpcStatus_Success;
+
+
+#if ERPC_PRE_POST_ACTION
+    pre_post_action_cb preCB = g_client->getPreCB();
+    if (preCB)
+    {
+        preCB();
+    }
+#endif
+
+    // Get a new request.
+    RequestContext request = g_client->createRequest(false);
+
+    // Encode the request.
+    Codec * codec = request.getCodec();
+
+    if (codec == NULL)
+    {
+        err = kErpcStatus_MemoryError;
+    }
+    else
+    {
+        codec->startWriteMessage(kInvocationMessage, kpsa_client_api_service_id, kpsa_client_api_psa_close_id, request.getSequence());
+
+        codec->write(handle);
+
+        // Send message to server
+        // Codec status is checked inside this function.
+        g_client->performRequest(request);
+
+        err = codec->getStatus();
+    }
+
+    // Dispose of the request.
+    g_client->releaseRequest(request);
+
+    // Invoke error handler callback function
+    g_client->callErrorHandler(err, kpsa_client_api_psa_close_id);
+
+#if ERPC_PRE_POST_ACTION
+    pre_post_action_cb postCB = g_client->getPostCB();
+    if (postCB)
+    {
+        postCB();
+    }
+#endif
+
+
+    return;
+}
diff --git a/erpc/generated_files/tfm_erpc_psa_connection_api.h b/erpc/generated_files/tfm_erpc_psa_connection_api.h
deleted file mode 100644
index 4155916..0000000
--- a/erpc/generated_files/tfm_erpc_psa_connection_api.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2022, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
-
-/*
- * Generated by erpcgen 1.9.1 on Fri Dec 16 14:51:11 2022.
- *
- * AUTOGENERATED - DO NOT EDIT
- */
-
-
-#if !defined(_tfm_erpc_psa_connection_api_h_)
-#define _tfm_erpc_psa_connection_api_h_
-
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdint.h>
-#include "erpc_version.h"
-#include "psa/client.h"
-
-#if 10901 != ERPC_VERSION_NUMBER
-#error "The generated shim code version is different to the rest of eRPC code."
-#endif
-
-#if !defined(ERPC_TYPE_DEFINITIONS)
-#define ERPC_TYPE_DEFINITIONS
-
-// Aliases data types declarations
-typedef struct list_binary_1_t list_binary_1_t;
-typedef struct binary_t binary_t;
-
-// Structures/unions data types declarations
-struct list_binary_1_t
-{
-    binary_t * elements;
-    uint32_t elementsCount;
-};
-
-struct binary_t
-{
-    uint8_t * data;
-    uint32_t dataLength;
-};
-
-
-#endif // ERPC_TYPE_DEFINITIONS
-
-/*! @brief psa_connection_api identifiers */
-enum _psa_connection_api_ids
-{
-    kpsa_connection_api_service_id = 2,
-    kpsa_connection_api_psa_connect_id = 1,
-    kpsa_connection_api_psa_close_id = 2,
-};
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-//! @name psa_connection_api
-//@{
-psa_handle_t psa_connect(uint32_t sid, uint32_t ver);
-
-void psa_close(psa_handle_t handle);
-//@}
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif // _tfm_erpc_psa_connection_api_h_
diff --git a/erpc/generated_files/tfm_erpc_psa_connection_api_client.cpp b/erpc/generated_files/tfm_erpc_psa_connection_api_client.cpp
deleted file mode 100644
index ab24967..0000000
--- a/erpc/generated_files/tfm_erpc_psa_connection_api_client.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (c) 2022, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
-
-/*
- * Generated by erpcgen 1.9.1 on Fri Dec 16 14:51:11 2022.
- *
- * AUTOGENERATED - DO NOT EDIT
- */
-
-
-#include "erpc_client_manager.h"
-#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
-#include "erpc_port.h"
-#endif
-#include "erpc_codec.h"
-extern "C"
-{
-#include "tfm_erpc_psa_connection_api.h"
-// import callbacks declaration from other groups
-#include "tfm_erpc_psa_client_api.h"
-}
-
-#if 10901 != ERPC_VERSION_NUMBER
-#error "The generated shim code version is different to the rest of eRPC code."
-#endif
-
-using namespace erpc;
-using namespace std;
-
-extern ClientManager *g_client;
-
-
-// psa_connection_api interface psa_connect function client shim.
-psa_handle_t psa_connect(uint32_t sid, uint32_t ver)
-{
-    erpc_status_t err = kErpcStatus_Success;
-
-    psa_handle_t result;
-
-#if ERPC_PRE_POST_ACTION
-    pre_post_action_cb preCB = g_client->getPreCB();
-    if (preCB)
-    {
-        preCB();
-    }
-#endif
-
-    // Get a new request.
-    RequestContext request = g_client->createRequest(false);
-
-    // Encode the request.
-    Codec * codec = request.getCodec();
-
-    if (codec == NULL)
-    {
-        err = kErpcStatus_MemoryError;
-    }
-    else
-    {
-        codec->startWriteMessage(kInvocationMessage, kpsa_connection_api_service_id, kpsa_connection_api_psa_connect_id, request.getSequence());
-
-        codec->write(sid);
-
-        codec->write(ver);
-
-        // Send message to server
-        // Codec status is checked inside this function.
-        g_client->performRequest(request);
-
-        codec->read(&result);
-
-        err = codec->getStatus();
-    }
-
-    // Dispose of the request.
-    g_client->releaseRequest(request);
-
-    // Invoke error handler callback function
-    g_client->callErrorHandler(err, kpsa_connection_api_psa_connect_id);
-
-#if ERPC_PRE_POST_ACTION
-    pre_post_action_cb postCB = g_client->getPostCB();
-    if (postCB)
-    {
-        postCB();
-    }
-#endif
-
-
-    if (err != kErpcStatus_Success)
-    {
-        result = -1;
-    }
-
-    return result;
-}
-
-// psa_connection_api interface psa_close function client shim.
-void psa_close(psa_handle_t handle)
-{
-    erpc_status_t err = kErpcStatus_Success;
-
-
-#if ERPC_PRE_POST_ACTION
-    pre_post_action_cb preCB = g_client->getPreCB();
-    if (preCB)
-    {
-        preCB();
-    }
-#endif
-
-    // Get a new request.
-    RequestContext request = g_client->createRequest(false);
-
-    // Encode the request.
-    Codec * codec = request.getCodec();
-
-    if (codec == NULL)
-    {
-        err = kErpcStatus_MemoryError;
-    }
-    else
-    {
-        codec->startWriteMessage(kInvocationMessage, kpsa_connection_api_service_id, kpsa_connection_api_psa_close_id, request.getSequence());
-
-        codec->write(handle);
-
-        // Send message to server
-        // Codec status is checked inside this function.
-        g_client->performRequest(request);
-
-        err = codec->getStatus();
-    }
-
-    // Dispose of the request.
-    g_client->releaseRequest(request);
-
-    // Invoke error handler callback function
-    g_client->callErrorHandler(err, kpsa_connection_api_psa_close_id);
-
-#if ERPC_PRE_POST_ACTION
-    pre_post_action_cb postCB = g_client->getPostCB();
-    if (postCB)
-    {
-        postCB();
-    }
-#endif
-
-
-    return;
-}
diff --git a/erpc/generated_files/tfm_erpc_psa_connection_api_server.cpp b/erpc/generated_files/tfm_erpc_psa_connection_api_server.cpp
deleted file mode 100644
index 8e51d8d..0000000
--- a/erpc/generated_files/tfm_erpc_psa_connection_api_server.cpp
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright (c) 2022, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
-
-/*
- * Generated by erpcgen 1.9.1 on Fri Dec 16 14:51:11 2022.
- *
- * AUTOGENERATED - DO NOT EDIT
- */
-
-
-#include "tfm_erpc_psa_connection_api_server.h"
-#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
-#include <new>
-#include "erpc_port.h"
-#endif
-#include "erpc_manually_constructed.h"
-
-#if 10901 != ERPC_VERSION_NUMBER
-#error "The generated shim code version is different to the rest of eRPC code."
-#endif
-
-using namespace erpc;
-using namespace std;
-
-#if ERPC_NESTED_CALLS_DETECTION
-extern bool nestingDetection;
-#endif
-
-ERPC_MANUALLY_CONSTRUCTED_STATIC(psa_connection_api_service, s_psa_connection_api_service);
-
-
-
-// Call the correct server shim based on method unique ID.
-erpc_status_t psa_connection_api_service::handleInvocation(uint32_t methodId, uint32_t sequence, Codec * codec, MessageBufferFactory *messageFactory)
-{
-    erpc_status_t erpcStatus;
-    switch (methodId)
-    {
-        case kpsa_connection_api_psa_connect_id:
-        {
-            erpcStatus = psa_connect_shim(codec, messageFactory, sequence);
-            break;
-        }
-
-        case kpsa_connection_api_psa_close_id:
-        {
-            erpcStatus = psa_close_shim(codec, messageFactory, sequence);
-            break;
-        }
-
-        default:
-        {
-            erpcStatus = kErpcStatus_InvalidArgument;
-            break;
-        }
-    }
-
-    return erpcStatus;
-}
-
-// Server shim for psa_connect of psa_connection_api interface.
-erpc_status_t psa_connection_api_service::psa_connect_shim(Codec * codec, MessageBufferFactory *messageFactory, uint32_t sequence)
-{
-    erpc_status_t err = kErpcStatus_Success;
-
-    uint32_t sid;
-    uint32_t ver;
-    psa_handle_t result;
-
-    // startReadMessage() was already called before this shim was invoked.
-
-    codec->read(&sid);
-
-    codec->read(&ver);
-
-    err = codec->getStatus();
-    if (err == kErpcStatus_Success)
-    {
-        // Invoke the actual served function.
-#if ERPC_NESTED_CALLS_DETECTION
-        nestingDetection = true;
-#endif
-        result = psa_connect(sid, ver);
-#if ERPC_NESTED_CALLS_DETECTION
-        nestingDetection = false;
-#endif
-
-        // preparing MessageBuffer for serializing data
-        err = messageFactory->prepareServerBufferForSend(codec->getBuffer());
-    }
-
-    if (err == kErpcStatus_Success)
-    {
-        // preparing codec for serializing data
-        codec->reset();
-
-        // Build response message.
-        codec->startWriteMessage(kReplyMessage, kpsa_connection_api_service_id, kpsa_connection_api_psa_connect_id, sequence);
-
-        codec->write(result);
-
-        err = codec->getStatus();
-    }
-
-    return err;
-}
-
-// Server shim for psa_close of psa_connection_api interface.
-erpc_status_t psa_connection_api_service::psa_close_shim(Codec * codec, MessageBufferFactory *messageFactory, uint32_t sequence)
-{
-    erpc_status_t err = kErpcStatus_Success;
-
-    psa_handle_t handle;
-
-    // startReadMessage() was already called before this shim was invoked.
-
-    codec->read(&handle);
-
-    err = codec->getStatus();
-    if (err == kErpcStatus_Success)
-    {
-        // Invoke the actual served function.
-#if ERPC_NESTED_CALLS_DETECTION
-        nestingDetection = true;
-#endif
-        psa_close(handle);
-#if ERPC_NESTED_CALLS_DETECTION
-        nestingDetection = false;
-#endif
-
-        // preparing MessageBuffer for serializing data
-        err = messageFactory->prepareServerBufferForSend(codec->getBuffer());
-    }
-
-    if (err == kErpcStatus_Success)
-    {
-        // preparing codec for serializing data
-        codec->reset();
-
-        // Build response message.
-        codec->startWriteMessage(kReplyMessage, kpsa_connection_api_service_id, kpsa_connection_api_psa_close_id, sequence);
-
-        err = codec->getStatus();
-    }
-
-    return err;
-}
-
-#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
-erpc_service_t create_psa_connection_api_service()
-{
-    return new (nothrow) psa_connection_api_service();
-}
-
-void destroy_psa_connection_api_service(erpc_service_t service)
-{
-    if (service)
-    {
-        delete (psa_connection_api_service *)service;
-    }
-}
-#elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC
-erpc_service_t create_psa_connection_api_service()
-{
-    s_psa_connection_api_service.construct();
-    return s_psa_connection_api_service.get();
-}
-
-void destroy_psa_connection_api_service()
-{
-    s_psa_connection_api_service.destroy();
-}
-#else
-#warning "Unknown eRPC allocation policy!"
-#endif
diff --git a/erpc/generated_files/tfm_erpc_psa_connection_api_server.h b/erpc/generated_files/tfm_erpc_psa_connection_api_server.h
deleted file mode 100644
index 01dbc1f..0000000
--- a/erpc/generated_files/tfm_erpc_psa_connection_api_server.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2022, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
-
-/*
- * Generated by erpcgen 1.9.1 on Fri Dec 16 14:51:11 2022.
- *
- * AUTOGENERATED - DO NOT EDIT
- */
-
-
-#if !defined(_tfm_erpc_psa_connection_api_server_h_)
-#define _tfm_erpc_psa_connection_api_server_h_
-
-#ifdef __cplusplus
-#include "erpc_server.h"
-#include "erpc_codec.h"
-extern "C"
-{
-#include "tfm_erpc_psa_connection_api.h"
-#include <stdint.h>
-#include <stdbool.h>
-}
-
-#if 10901 != ERPC_VERSION_NUMBER
-#error "The generated shim code version is different to the rest of eRPC code."
-#endif
-
-
-/*!
- * @brief Service subclass for psa_connection_api.
- */
-class psa_connection_api_service : public erpc::Service
-{
-public:
-    psa_connection_api_service() : Service(kpsa_connection_api_service_id) {}
-
-    /*! @brief Call the correct server shim based on method unique ID. */
-    virtual erpc_status_t handleInvocation(uint32_t methodId, uint32_t sequence, erpc::Codec * codec, erpc::MessageBufferFactory *messageFactory);
-
-private:
-    /*! @brief Server shim for psa_connect of psa_connection_api interface. */
-    erpc_status_t psa_connect_shim(erpc::Codec * codec, erpc::MessageBufferFactory *messageFactory, uint32_t sequence);
-
-    /*! @brief Server shim for psa_close of psa_connection_api interface. */
-    erpc_status_t psa_close_shim(erpc::Codec * codec, erpc::MessageBufferFactory *messageFactory, uint32_t sequence);
-};
-
-extern "C" {
-#else
-#include "tfm_erpc_psa_connection_api.h"
-#endif // __cplusplus
-
-typedef void * erpc_service_t;
-
-erpc_service_t create_psa_connection_api_service(void);
-
-#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
-void destroy_psa_connection_api_service(erpc_service_t service);
-#elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC
-void destroy_psa_connection_api_service(void);
-#else
-#warning "Unknown eRPC allocation policy!"
-#endif
-
-#ifdef __cplusplus
-}
-#endif // __cplusplus
-
-#endif // _tfm_erpc_psa_connection_api_server_h_
diff --git a/erpc/generated_files/tfm_erpc_psa_client_api_server.cpp b/erpc/generated_files/tfm_erpc_server.cpp
similarity index 75%
rename from erpc/generated_files/tfm_erpc_psa_client_api_server.cpp
rename to erpc/generated_files/tfm_erpc_server.cpp
index 82fb722..d2ec345 100644
--- a/erpc/generated_files/tfm_erpc_psa_client_api_server.cpp
+++ b/erpc/generated_files/tfm_erpc_server.cpp
@@ -1,18 +1,18 @@
 /*
- * Copyright (c) 2022, Arm Limited. All rights reserved.
+ * Copyright (c) 2023, Arm Limited. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  *
  */
 
 /*
- * Generated by erpcgen 1.9.1 on Fri Dec 16 14:51:11 2022.
+ * Generated by erpcgen 1.9.1 on Fri Jul 21 17:28:31 2023.
  *
  * AUTOGENERATED - DO NOT EDIT
  */
 
 
-#include "tfm_erpc_psa_client_api_server.h"
+#include "tfm_erpc_server.h"
 #if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
 #include <new>
 #include "erpc_port.h"
@@ -126,7 +126,10 @@
 // Free space allocated inside struct binary_t function implementation
 static void free_binary_t_struct(binary_t * data)
 {
-    erpc_free(data->data);
+    if (data->data)
+    {
+        erpc_free(data->data);
+    }
 }
 
 // Free space allocated inside struct list_binary_1_t function implementation
@@ -137,7 +140,10 @@
         free_binary_t_struct(&data->elements[listCount]);
     }
 
-    erpc_free(data->elements);
+    if (data->elements)
+    {
+        erpc_free(data->elements);
+    }
 }
 
 
@@ -166,6 +172,18 @@
             break;
         }
 
+        case kpsa_client_api_psa_connect_id:
+        {
+            erpcStatus = psa_connect_shim(codec, messageFactory, sequence);
+            break;
+        }
+
+        case kpsa_client_api_psa_close_id:
+        {
+            erpcStatus = psa_close_shim(codec, messageFactory, sequence);
+            break;
+        }
+
         default:
         {
             erpcStatus = kErpcStatus_InvalidArgument;
@@ -327,13 +345,107 @@
     {
         free_list_binary_1_t_struct(erpc_in_vec);
     }
-    erpc_free(erpc_in_vec);
+    if (erpc_in_vec)
+    {
+        erpc_free(erpc_in_vec);
+    }
 
     if (erpc_out_vec)
     {
         free_list_binary_1_t_struct(erpc_out_vec);
     }
-    erpc_free(erpc_out_vec);
+    if (erpc_out_vec)
+    {
+        erpc_free(erpc_out_vec);
+    }
+
+    return err;
+}
+
+// Server shim for psa_connect of psa_client_api interface.
+erpc_status_t psa_client_api_service::psa_connect_shim(Codec * codec, MessageBufferFactory *messageFactory, uint32_t sequence)
+{
+    erpc_status_t err = kErpcStatus_Success;
+
+    uint32_t sid;
+    uint32_t ver;
+    psa_handle_t result;
+
+    // startReadMessage() was already called before this shim was invoked.
+
+    codec->read(&sid);
+
+    codec->read(&ver);
+
+    err = codec->getStatus();
+    if (err == kErpcStatus_Success)
+    {
+        // Invoke the actual served function.
+#if ERPC_NESTED_CALLS_DETECTION
+        nestingDetection = true;
+#endif
+        result = psa_connect(sid, ver);
+#if ERPC_NESTED_CALLS_DETECTION
+        nestingDetection = false;
+#endif
+
+        // preparing MessageBuffer for serializing data
+        err = messageFactory->prepareServerBufferForSend(codec->getBuffer());
+    }
+
+    if (err == kErpcStatus_Success)
+    {
+        // preparing codec for serializing data
+        codec->reset();
+
+        // Build response message.
+        codec->startWriteMessage(kReplyMessage, kpsa_client_api_service_id, kpsa_client_api_psa_connect_id, sequence);
+
+        codec->write(result);
+
+        err = codec->getStatus();
+    }
+
+    return err;
+}
+
+// Server shim for psa_close of psa_client_api interface.
+erpc_status_t psa_client_api_service::psa_close_shim(Codec * codec, MessageBufferFactory *messageFactory, uint32_t sequence)
+{
+    erpc_status_t err = kErpcStatus_Success;
+
+    psa_handle_t handle;
+
+    // startReadMessage() was already called before this shim was invoked.
+
+    codec->read(&handle);
+
+    err = codec->getStatus();
+    if (err == kErpcStatus_Success)
+    {
+        // Invoke the actual served function.
+#if ERPC_NESTED_CALLS_DETECTION
+        nestingDetection = true;
+#endif
+        psa_close(handle);
+#if ERPC_NESTED_CALLS_DETECTION
+        nestingDetection = false;
+#endif
+
+        // preparing MessageBuffer for serializing data
+        err = messageFactory->prepareServerBufferForSend(codec->getBuffer());
+    }
+
+    if (err == kErpcStatus_Success)
+    {
+        // preparing codec for serializing data
+        codec->reset();
+
+        // Build response message.
+        codec->startWriteMessage(kReplyMessage, kpsa_client_api_service_id, kpsa_client_api_psa_close_id, sequence);
+
+        err = codec->getStatus();
+    }
 
     return err;
 }
diff --git a/erpc/generated_files/tfm_erpc_psa_client_api_server.h b/erpc/generated_files/tfm_erpc_server.h
similarity index 74%
rename from erpc/generated_files/tfm_erpc_psa_client_api_server.h
rename to erpc/generated_files/tfm_erpc_server.h
index 3146840..b8162a4 100644
--- a/erpc/generated_files/tfm_erpc_psa_client_api_server.h
+++ b/erpc/generated_files/tfm_erpc_server.h
@@ -1,26 +1,26 @@
 /*
- * Copyright (c) 2022, Arm Limited. All rights reserved.
+ * Copyright (c) 2023, Arm Limited. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  *
  */
 
 /*
- * Generated by erpcgen 1.9.1 on Fri Dec 16 14:51:11 2022.
+ * Generated by erpcgen 1.9.1 on Fri Jul 21 17:28:31 2023.
  *
  * AUTOGENERATED - DO NOT EDIT
  */
 
 
-#if !defined(_tfm_erpc_psa_client_api_server_h_)
-#define _tfm_erpc_psa_client_api_server_h_
+#if !defined(_tfm_erpc_server_h_)
+#define _tfm_erpc_server_h_
 
 #ifdef __cplusplus
 #include "erpc_server.h"
 #include "erpc_codec.h"
 extern "C"
 {
-#include "tfm_erpc_psa_client_api.h"
+#include "tfm_erpc.h"
 #include <stdint.h>
 #include <stdbool.h>
 }
@@ -50,11 +50,17 @@
 
     /*! @brief Server shim for erpc_psa_call of psa_client_api interface. */
     erpc_status_t erpc_psa_call_shim(erpc::Codec * codec, erpc::MessageBufferFactory *messageFactory, uint32_t sequence);
+
+    /*! @brief Server shim for psa_connect of psa_client_api interface. */
+    erpc_status_t psa_connect_shim(erpc::Codec * codec, erpc::MessageBufferFactory *messageFactory, uint32_t sequence);
+
+    /*! @brief Server shim for psa_close of psa_client_api interface. */
+    erpc_status_t psa_close_shim(erpc::Codec * codec, erpc::MessageBufferFactory *messageFactory, uint32_t sequence);
 };
 
 extern "C" {
 #else
-#include "tfm_erpc_psa_client_api.h"
+#include "tfm_erpc.h"
 #endif // __cplusplus
 
 typedef void * erpc_service_t;
@@ -73,4 +79,4 @@
 }
 #endif // __cplusplus
 
-#endif // _tfm_erpc_psa_client_api_server_h_
+#endif // _tfm_erpc_server_h_
diff --git a/erpc/host_example/main.c b/erpc/host_example/main.c
index 1545525..c2d1357 100644
--- a/erpc/host_example/main.c
+++ b/erpc/host_example/main.c
@@ -10,7 +10,7 @@
 #include <string.h>
 #include "erpc_port.h"
 #include "erpc_client_start.h"
-#include "tfm_erpc_psa_client_api.h"
+#include "tfm_erpc.h"
 #include "tfm_crypto_defs.h"
 #include "psa/client.h"
 #include "psa/crypto.h"
diff --git a/erpc/server/CMakeLists.txt b/erpc/server/CMakeLists.txt
index 0562f7f..8e43295 100644
--- a/erpc/server/CMakeLists.txt
+++ b/erpc/server/CMakeLists.txt
@@ -37,8 +37,7 @@
         ${ERPC_REPO_PATH}/erpc_c/setup/erpc_setup_mbf_dynamic.cpp
         ${ERPC_REPO_PATH}/erpc_c/setup/erpc_server_setup.cpp
         # Generated files
-        ${CMAKE_CURRENT_SOURCE_DIR}/../generated_files/tfm_erpc_psa_client_api_server.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/../generated_files/tfm_erpc_psa_connection_api_server.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/../generated_files/tfm_erpc_server.cpp
 )
 
 target_include_directories(erpc_server
diff --git a/erpc/server/erpc_server_start.c b/erpc/server/erpc_server_start.c
index 4d27876..ca3b6e9 100644
--- a/erpc/server/erpc_server_start.c
+++ b/erpc/server/erpc_server_start.c
@@ -9,14 +9,12 @@
 
 #include "erpc_mbf_setup.h"
 #include "erpc_server_setup.h"
-#include "tfm_erpc_psa_client_api_server.h"
-#include "tfm_erpc_psa_connection_api_server.h"
+#include "tfm_erpc_server.h"
 
 void erpc_server_start(erpc_transport_t transport)
 {
     erpc_server_init(transport, erpc_mbf_dynamic_init());
     erpc_add_service_to_server(create_psa_client_api_service());
-    erpc_add_service_to_server(create_psa_connection_api_service());
 
     erpc_server_run();
 
diff --git a/erpc/server/erpc_server_wrapper.c b/erpc/server/erpc_server_wrapper.c
index 8215c9a..b27a1da 100644
--- a/erpc/server/erpc_server_wrapper.c
+++ b/erpc/server/erpc_server_wrapper.c
@@ -7,7 +7,7 @@
 
 #include <stddef.h>
 #include "psa/client.h"
-#include "tfm_erpc_psa_client_api.h"
+#include "tfm_erpc.h"
 
 psa_status_t erpc_psa_call(psa_handle_t handle, int32_t t,
                            const list_binary_1_t *erpc_in_vec,
diff --git a/erpc/tfm.erpc b/erpc/tfm.erpc
index 20a7d1e..ace775e 100644
--- a/erpc/tfm.erpc
+++ b/erpc/tfm.erpc
@@ -12,13 +12,10 @@
 @external type psa_handle_t = int32
 @external type psa_status_t = int32
 
-@group(psa_client_api) interface psa_client_api {
+interface psa_client_api {
     psa_framework_version() -> uint32
     psa_version(uint32 sid) -> uint32
     erpc_psa_call(psa_handle_t handle, int32 t, list<binary> erpc_in_vec, inout list<binary> erpc_out_vec) -> psa_status_t
-}
-
-@group(psa_connection_api) interface psa_connection_api {
     psa_connect(uint32 sid, uint32 ver) -> psa_handle_t
     psa_close(psa_handle_t handle) -> void
 }