Core: Add IPC Client and Service Secure Partition

Add Secure Partition for IPC Client and Service. Generate new partition
information by executing tfm_parse_manifest_list.py.

Change-Id: I8a0fe54113f9c5c2a32dd5d651a9722f0057dd2b
Signed-off-by: Summer Qin <summer.qin@arm.com>
diff --git a/platform/ext/target/mps2/an519/gcc/mps2_an519_s.ld b/platform/ext/target/mps2/an519/gcc/mps2_an519_s.ld
index e1b8f84..ee8ff7b 100644
--- a/platform/ext/target/mps2/an519/gcc/mps2_an519_s.ld
+++ b/platform/ext/target/mps2/an519/gcc/mps2_an519_s.ld
@@ -1,5 +1,5 @@
 ;/*
-; * Copyright (c) 2018 ARM Limited
+; * Copyright (c) 2018-2019 ARM Limited
 ; *
 ; * Licensed under the Apache License, Version 2.0 (the "License");
 ; * you may not use this file except in compliance with the License.
@@ -126,6 +126,16 @@
         LONG (ADDR(.TFM_SP_SECURE_TEST_PARTITION_DATA))
         LONG (SIZEOF(.TFM_SP_SECURE_TEST_PARTITION_DATA))
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_PSA_API
+        LONG (LOADADDR(.TFM_SP_IPC_SERVICE_TEST_DATA))
+        LONG (ADDR(.TFM_SP_IPC_SERVICE_TEST_DATA))
+        LONG (SIZEOF(.TFM_SP_IPC_SERVICE_TEST_DATA))
+#endif /* TFM_PSA_API */
+#ifdef TFM_PSA_API
+        LONG (LOADADDR(.TFM_SP_IPC_CLIENT_TEST_DATA))
+        LONG (ADDR(.TFM_SP_IPC_CLIENT_TEST_DATA))
+        LONG (SIZEOF(.TFM_SP_IPC_CLIENT_TEST_DATA))
+#endif /* TFM_PSA_API */
         __copy_table_end__ = .;
     } > FLASH
 
@@ -180,6 +190,18 @@
         LONG (ADDR(.TFM_SP_SECURE_TEST_PARTITION_STACK))
         LONG (SIZEOF(.TFM_SP_SECURE_TEST_PARTITION_STACK))
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_PSA_API
+        LONG (ADDR(.TFM_SP_IPC_SERVICE_TEST_BSS))
+        LONG (SIZEOF(.TFM_SP_IPC_SERVICE_TEST_BSS))
+        LONG (ADDR(.TFM_SP_IPC_SERVICE_TEST_STACK))
+        LONG (SIZEOF(.TFM_SP_IPC_SERVICE_TEST_STACK))
+#endif /* TFM_PSA_API */
+#ifdef TFM_PSA_API
+        LONG (ADDR(.TFM_SP_IPC_CLIENT_TEST_BSS))
+        LONG (SIZEOF(.TFM_SP_IPC_CLIENT_TEST_BSS))
+        LONG (ADDR(.TFM_SP_IPC_CLIENT_TEST_STACK))
+        LONG (SIZEOF(.TFM_SP_IPC_CLIENT_TEST_STACK))
+#endif /* TFM_PSA_API */
         LONG (ADDR(.TFM_UNPRIV_SCRATCH))
         LONG (SIZEOF(.TFM_UNPRIV_SCRATCH))
         __zero_table_end__ = .;
@@ -339,6 +361,34 @@
     Image$$TFM_SP_SECURE_TEST_PARTITION$$Limit = ADDR(.TFM_SP_SECURE_TEST_PARTITION) + SIZEOF(.TFM_SP_SECURE_TEST_PARTITION);
 
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_PSA_API
+    .TFM_SP_IPC_SERVICE_TEST : ALIGN(32)
+    {
+        *ipc_service_test*:*(.text*)
+        *ipc_service_test*:*(.rodata*)
+        *(TFM_SP_IPC_SERVICE_TEST_ATTR_FN)
+        . = ALIGN(32);
+    } > FLASH
+    Image$$TFM_SP_IPC_SERVICE_TEST$$RO$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST);
+    Image$$TFM_SP_IPC_SERVICE_TEST$$RO$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST);
+    Image$$TFM_SP_IPC_SERVICE_TEST$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST);
+    Image$$TFM_SP_IPC_SERVICE_TEST$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST);
+
+#endif /* TFM_PSA_API */
+#ifdef TFM_PSA_API
+    .TFM_SP_IPC_CLIENT_TEST : ALIGN(32)
+    {
+        *ipc_client_test*:*(.text*)
+        *ipc_client_test*:*(.rodata*)
+        *(TFM_SP_IPC_CLIENT_TEST_ATTR_FN)
+        . = ALIGN(32);
+    } > FLASH
+    Image$$TFM_SP_IPC_CLIENT_TEST$$RO$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST);
+    Image$$TFM_SP_IPC_CLIENT_TEST$$RO$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST);
+    Image$$TFM_SP_IPC_CLIENT_TEST$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST);
+    Image$$TFM_SP_IPC_CLIENT_TEST$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST);
+
+#endif /* TFM_PSA_API */
 
     .ARM.extab :
     {
@@ -713,6 +763,58 @@
     Image$$TFM_SP_SECURE_TEST_PARTITION_STACK$$ZI$$Limit = ADDR(.TFM_SP_SECURE_TEST_PARTITION_STACK) + SIZEOF(.TFM_SP_SECURE_TEST_PARTITION_STACK);
 
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_PSA_API
+    .TFM_SP_IPC_SERVICE_TEST_DATA : ALIGN(32)
+    {
+        *ipc_service_test*:*(.data*)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_SERVICE_TEST_DATA$$RW$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST_DATA);
+    Image$$TFM_SP_IPC_SERVICE_TEST_DATA$$RW$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST_DATA) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST_DATA);
+
+    .TFM_SP_IPC_SERVICE_TEST_BSS : ALIGN(32)
+    {
+        *ipc_service_test*:*(.bss*)
+        *ipc_service_test*:*(COMMON)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_SERVICE_TEST_DATA$$ZI$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST_BSS);
+    Image$$TFM_SP_IPC_SERVICE_TEST_DATA$$ZI$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST_BSS) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST_BSS);
+
+    .TFM_SP_IPC_SERVICE_TEST_STACK : ALIGN(128)
+    {
+        . += 0x1000;
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_SERVICE_TEST_STACK$$ZI$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST_STACK);
+    Image$$TFM_SP_IPC_SERVICE_TEST_STACK$$ZI$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST_STACK) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST_STACK);
+
+#endif /* TFM_PSA_API */
+#ifdef TFM_PSA_API
+    .TFM_SP_IPC_CLIENT_TEST_DATA : ALIGN(32)
+    {
+        *ipc_client_test*:*(.data*)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_CLIENT_TEST_DATA$$RW$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST_DATA);
+    Image$$TFM_SP_IPC_CLIENT_TEST_DATA$$RW$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST_DATA) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST_DATA);
+
+    .TFM_SP_IPC_CLIENT_TEST_BSS : ALIGN(32)
+    {
+        *ipc_client_test*:*(.bss*)
+        *ipc_client_test*:*(COMMON)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_CLIENT_TEST_DATA$$ZI$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST_BSS);
+    Image$$TFM_SP_IPC_CLIENT_TEST_DATA$$ZI$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST_BSS) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST_BSS);
+
+    .TFM_SP_IPC_CLIENT_TEST_STACK : ALIGN(128)
+    {
+        . += 0x1000;
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_CLIENT_TEST_STACK$$ZI$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST_STACK);
+    Image$$TFM_SP_IPC_CLIENT_TEST_STACK$$ZI$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST_STACK) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST_STACK);
+
+#endif /* TFM_PSA_API */
 
     .TFM_SP_SECURE_TEST_PARTITION_DATA : ALIGN(32)
     {
diff --git a/platform/ext/target/mps2/an519/gcc/mps2_an519_s.ld.template b/platform/ext/target/mps2/an519/gcc/mps2_an519_s.ld.template
index 9a971a2..1eb1e65 100644
--- a/platform/ext/target/mps2/an519/gcc/mps2_an519_s.ld.template
+++ b/platform/ext/target/mps2/an519/gcc/mps2_an519_s.ld.template
@@ -1,5 +1,5 @@
 ;/*
-; * Copyright (c) 2018 ARM Limited
+; * Copyright (c) 2018-2019 ARM Limited
 ; *
 ; * Licensed under the Apache License, Version 2.0 (the "License");
 ; * you may not use this file except in compliance with the License.
diff --git a/platform/ext/target/mps2/an521/armclang/mps2_an521_s.sct b/platform/ext/target/mps2/an521/armclang/mps2_an521_s.sct
index eaa08b1..9943733 100644
--- a/platform/ext/target/mps2/an521/armclang/mps2_an521_s.sct
+++ b/platform/ext/target/mps2/an521/armclang/mps2_an521_s.sct
@@ -1,7 +1,7 @@
 #! armclang --target=arm-arm-none-eabi -march=armv8-m.main -E -xc
 
 /*
- * Copyright (c) 2017-2018 ARM Limited
+ * Copyright (c) 2017-2019 ARM Limited
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -124,6 +124,15 @@
     }
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_PSA_API
+    TFM_SP_IPC_CLIENT_TEST +0 ALIGN 32 {
+        *ipc_client_test.* (+RO)
+    }
+    TFM_SP_IPC_SERVICE_TEST +0 ALIGN 32 {
+        *ipc_service_test.* (+RO)
+    }
+#endif /* TFM_PSA_API */
+
     /* Shared area between BL2 and runtime to exchange data */
     TFM_SHARED_DATA S_DATA_START ALIGN 32 OVERLAY EMPTY BOOT_TFM_SHARED_DATA_SIZE {
     }
@@ -230,6 +239,22 @@
     }
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_PSA_API
+    TFM_SP_IPC_CLIENT_TEST_DATA +0 ALIGN 32 {
+        ipc_client_test.o (+RW +ZI)
+    }
+
+    TFM_SP_IPC_CLIENT_TEST_STACK +0 ALIGN 128 EMPTY 0x1000 {
+    }
+
+    TFM_SP_IPC_SERVICE_TEST_DATA +0 ALIGN 32 {
+        ipc_service_test.o (+RW +ZI)
+    }
+
+    TFM_SP_IPC_SERVICE_TEST_STACK +0 ALIGN 128 EMPTY 0x1000 {
+    }
+#endif /* TFM_PSA_API */
+
 #endif /* TFM_LVL == 1 */
 
     /* This empty, zero long execution region is here to mark the limit address
diff --git a/platform/ext/target/mps2/an521/gcc/mps2_an521_s.ld b/platform/ext/target/mps2/an521/gcc/mps2_an521_s.ld
index 8855246..b6c5628 100644
--- a/platform/ext/target/mps2/an521/gcc/mps2_an521_s.ld
+++ b/platform/ext/target/mps2/an521/gcc/mps2_an521_s.ld
@@ -1,5 +1,5 @@
 ;/*
-; * Copyright (c) 2017-2018 ARM Limited
+; * Copyright (c) 2017-2019 ARM Limited
 ; *
 ; * Licensed under the Apache License, Version 2.0 (the "License");
 ; * you may not use this file except in compliance with the License.
@@ -126,6 +126,16 @@
         LONG (ADDR(.TFM_SP_SECURE_TEST_PARTITION_DATA))
         LONG (SIZEOF(.TFM_SP_SECURE_TEST_PARTITION_DATA))
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_PSA_API
+        LONG (LOADADDR(.TFM_SP_IPC_SERVICE_TEST_DATA))
+        LONG (ADDR(.TFM_SP_IPC_SERVICE_TEST_DATA))
+        LONG (SIZEOF(.TFM_SP_IPC_SERVICE_TEST_DATA))
+#endif /* TFM_PSA_API */
+#ifdef TFM_PSA_API
+        LONG (LOADADDR(.TFM_SP_IPC_CLIENT_TEST_DATA))
+        LONG (ADDR(.TFM_SP_IPC_CLIENT_TEST_DATA))
+        LONG (SIZEOF(.TFM_SP_IPC_CLIENT_TEST_DATA))
+#endif /* TFM_PSA_API */
         __copy_table_end__ = .;
     } > FLASH
 
@@ -180,6 +190,18 @@
         LONG (ADDR(.TFM_SP_SECURE_TEST_PARTITION_STACK))
         LONG (SIZEOF(.TFM_SP_SECURE_TEST_PARTITION_STACK))
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_PSA_API
+        LONG (ADDR(.TFM_SP_IPC_SERVICE_TEST_BSS))
+        LONG (SIZEOF(.TFM_SP_IPC_SERVICE_TEST_BSS))
+        LONG (ADDR(.TFM_SP_IPC_SERVICE_TEST_STACK))
+        LONG (SIZEOF(.TFM_SP_IPC_SERVICE_TEST_STACK))
+#endif /* TFM_PSA_API */
+#ifdef TFM_PSA_API
+        LONG (ADDR(.TFM_SP_IPC_CLIENT_TEST_BSS))
+        LONG (SIZEOF(.TFM_SP_IPC_CLIENT_TEST_BSS))
+        LONG (ADDR(.TFM_SP_IPC_CLIENT_TEST_STACK))
+        LONG (SIZEOF(.TFM_SP_IPC_CLIENT_TEST_STACK))
+#endif /* TFM_PSA_API */
         LONG (ADDR(.TFM_UNPRIV_SCRATCH))
         LONG (SIZEOF(.TFM_UNPRIV_SCRATCH))
         __zero_table_end__ = .;
@@ -339,6 +361,34 @@
     Image$$TFM_SP_SECURE_TEST_PARTITION$$Limit = ADDR(.TFM_SP_SECURE_TEST_PARTITION) + SIZEOF(.TFM_SP_SECURE_TEST_PARTITION);
 
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_PSA_API
+    .TFM_SP_IPC_SERVICE_TEST : ALIGN(32)
+    {
+        *ipc_service_test*:*(.text*)
+        *ipc_service_test*:*(.rodata*)
+        *(TFM_SP_IPC_SERVICE_TEST_ATTR_FN)
+        . = ALIGN(32);
+    } > FLASH
+    Image$$TFM_SP_IPC_SERVICE_TEST$$RO$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST);
+    Image$$TFM_SP_IPC_SERVICE_TEST$$RO$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST);
+    Image$$TFM_SP_IPC_SERVICE_TEST$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST);
+    Image$$TFM_SP_IPC_SERVICE_TEST$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST);
+
+#endif /* TFM_PSA_API */
+#ifdef TFM_PSA_API
+    .TFM_SP_IPC_CLIENT_TEST : ALIGN(32)
+    {
+        *ipc_client_test*:*(.text*)
+        *ipc_client_test*:*(.rodata*)
+        *(TFM_SP_IPC_CLIENT_TEST_ATTR_FN)
+        . = ALIGN(32);
+    } > FLASH
+    Image$$TFM_SP_IPC_CLIENT_TEST$$RO$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST);
+    Image$$TFM_SP_IPC_CLIENT_TEST$$RO$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST);
+    Image$$TFM_SP_IPC_CLIENT_TEST$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST);
+    Image$$TFM_SP_IPC_CLIENT_TEST$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST);
+
+#endif /* TFM_PSA_API */
 
     .ARM.extab :
     {
@@ -713,6 +763,58 @@
     Image$$TFM_SP_SECURE_TEST_PARTITION_STACK$$ZI$$Limit = ADDR(.TFM_SP_SECURE_TEST_PARTITION_STACK) + SIZEOF(.TFM_SP_SECURE_TEST_PARTITION_STACK);
 
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_PSA_API
+    .TFM_SP_IPC_SERVICE_TEST_DATA : ALIGN(32)
+    {
+        *ipc_service_test*:*(.data*)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_SERVICE_TEST_DATA$$RW$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST_DATA);
+    Image$$TFM_SP_IPC_SERVICE_TEST_DATA$$RW$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST_DATA) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST_DATA);
+
+    .TFM_SP_IPC_SERVICE_TEST_BSS : ALIGN(32)
+    {
+        *ipc_service_test*:*(.bss*)
+        *ipc_service_test*:*(COMMON)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_SERVICE_TEST_DATA$$ZI$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST_BSS);
+    Image$$TFM_SP_IPC_SERVICE_TEST_DATA$$ZI$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST_BSS) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST_BSS);
+
+    .TFM_SP_IPC_SERVICE_TEST_STACK : ALIGN(128)
+    {
+        . += 0x1000;
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_SERVICE_TEST_STACK$$ZI$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST_STACK);
+    Image$$TFM_SP_IPC_SERVICE_TEST_STACK$$ZI$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST_STACK) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST_STACK);
+
+#endif /* TFM_PSA_API */
+#ifdef TFM_PSA_API
+    .TFM_SP_IPC_CLIENT_TEST_DATA : ALIGN(32)
+    {
+        *ipc_client_test*:*(.data*)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_CLIENT_TEST_DATA$$RW$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST_DATA);
+    Image$$TFM_SP_IPC_CLIENT_TEST_DATA$$RW$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST_DATA) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST_DATA);
+
+    .TFM_SP_IPC_CLIENT_TEST_BSS : ALIGN(32)
+    {
+        *ipc_client_test*:*(.bss*)
+        *ipc_client_test*:*(COMMON)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_CLIENT_TEST_DATA$$ZI$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST_BSS);
+    Image$$TFM_SP_IPC_CLIENT_TEST_DATA$$ZI$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST_BSS) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST_BSS);
+
+    .TFM_SP_IPC_CLIENT_TEST_STACK : ALIGN(128)
+    {
+        . += 0x1000;
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_CLIENT_TEST_STACK$$ZI$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST_STACK);
+    Image$$TFM_SP_IPC_CLIENT_TEST_STACK$$ZI$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST_STACK) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST_STACK);
+
+#endif /* TFM_PSA_API */
 
     .TFM_SP_SECURE_TEST_PARTITION_DATA : ALIGN(32)
     {
diff --git a/platform/ext/target/mps2/an521/gcc/mps2_an521_s.ld.template b/platform/ext/target/mps2/an521/gcc/mps2_an521_s.ld.template
index c749aa3..c971c6d 100644
--- a/platform/ext/target/mps2/an521/gcc/mps2_an521_s.ld.template
+++ b/platform/ext/target/mps2/an521/gcc/mps2_an521_s.ld.template
@@ -1,5 +1,5 @@
 ;/*
-; * Copyright (c) 2017-2018 ARM Limited
+; * Copyright (c) 2017-2019 ARM Limited
 ; *
 ; * Licensed under the Apache License, Version 2.0 (the "License");
 ; * you may not use this file except in compliance with the License.
diff --git a/platform/ext/target/musca_a/Device/Source/gcc/musca_s.ld b/platform/ext/target/musca_a/Device/Source/gcc/musca_s.ld
index e1b8f84..ee8ff7b 100644
--- a/platform/ext/target/musca_a/Device/Source/gcc/musca_s.ld
+++ b/platform/ext/target/musca_a/Device/Source/gcc/musca_s.ld
@@ -1,5 +1,5 @@
 ;/*
-; * Copyright (c) 2018 ARM Limited
+; * Copyright (c) 2018-2019 ARM Limited
 ; *
 ; * Licensed under the Apache License, Version 2.0 (the "License");
 ; * you may not use this file except in compliance with the License.
@@ -126,6 +126,16 @@
         LONG (ADDR(.TFM_SP_SECURE_TEST_PARTITION_DATA))
         LONG (SIZEOF(.TFM_SP_SECURE_TEST_PARTITION_DATA))
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_PSA_API
+        LONG (LOADADDR(.TFM_SP_IPC_SERVICE_TEST_DATA))
+        LONG (ADDR(.TFM_SP_IPC_SERVICE_TEST_DATA))
+        LONG (SIZEOF(.TFM_SP_IPC_SERVICE_TEST_DATA))
+#endif /* TFM_PSA_API */
+#ifdef TFM_PSA_API
+        LONG (LOADADDR(.TFM_SP_IPC_CLIENT_TEST_DATA))
+        LONG (ADDR(.TFM_SP_IPC_CLIENT_TEST_DATA))
+        LONG (SIZEOF(.TFM_SP_IPC_CLIENT_TEST_DATA))
+#endif /* TFM_PSA_API */
         __copy_table_end__ = .;
     } > FLASH
 
@@ -180,6 +190,18 @@
         LONG (ADDR(.TFM_SP_SECURE_TEST_PARTITION_STACK))
         LONG (SIZEOF(.TFM_SP_SECURE_TEST_PARTITION_STACK))
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_PSA_API
+        LONG (ADDR(.TFM_SP_IPC_SERVICE_TEST_BSS))
+        LONG (SIZEOF(.TFM_SP_IPC_SERVICE_TEST_BSS))
+        LONG (ADDR(.TFM_SP_IPC_SERVICE_TEST_STACK))
+        LONG (SIZEOF(.TFM_SP_IPC_SERVICE_TEST_STACK))
+#endif /* TFM_PSA_API */
+#ifdef TFM_PSA_API
+        LONG (ADDR(.TFM_SP_IPC_CLIENT_TEST_BSS))
+        LONG (SIZEOF(.TFM_SP_IPC_CLIENT_TEST_BSS))
+        LONG (ADDR(.TFM_SP_IPC_CLIENT_TEST_STACK))
+        LONG (SIZEOF(.TFM_SP_IPC_CLIENT_TEST_STACK))
+#endif /* TFM_PSA_API */
         LONG (ADDR(.TFM_UNPRIV_SCRATCH))
         LONG (SIZEOF(.TFM_UNPRIV_SCRATCH))
         __zero_table_end__ = .;
@@ -339,6 +361,34 @@
     Image$$TFM_SP_SECURE_TEST_PARTITION$$Limit = ADDR(.TFM_SP_SECURE_TEST_PARTITION) + SIZEOF(.TFM_SP_SECURE_TEST_PARTITION);
 
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_PSA_API
+    .TFM_SP_IPC_SERVICE_TEST : ALIGN(32)
+    {
+        *ipc_service_test*:*(.text*)
+        *ipc_service_test*:*(.rodata*)
+        *(TFM_SP_IPC_SERVICE_TEST_ATTR_FN)
+        . = ALIGN(32);
+    } > FLASH
+    Image$$TFM_SP_IPC_SERVICE_TEST$$RO$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST);
+    Image$$TFM_SP_IPC_SERVICE_TEST$$RO$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST);
+    Image$$TFM_SP_IPC_SERVICE_TEST$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST);
+    Image$$TFM_SP_IPC_SERVICE_TEST$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST);
+
+#endif /* TFM_PSA_API */
+#ifdef TFM_PSA_API
+    .TFM_SP_IPC_CLIENT_TEST : ALIGN(32)
+    {
+        *ipc_client_test*:*(.text*)
+        *ipc_client_test*:*(.rodata*)
+        *(TFM_SP_IPC_CLIENT_TEST_ATTR_FN)
+        . = ALIGN(32);
+    } > FLASH
+    Image$$TFM_SP_IPC_CLIENT_TEST$$RO$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST);
+    Image$$TFM_SP_IPC_CLIENT_TEST$$RO$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST);
+    Image$$TFM_SP_IPC_CLIENT_TEST$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST);
+    Image$$TFM_SP_IPC_CLIENT_TEST$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST);
+
+#endif /* TFM_PSA_API */
 
     .ARM.extab :
     {
@@ -713,6 +763,58 @@
     Image$$TFM_SP_SECURE_TEST_PARTITION_STACK$$ZI$$Limit = ADDR(.TFM_SP_SECURE_TEST_PARTITION_STACK) + SIZEOF(.TFM_SP_SECURE_TEST_PARTITION_STACK);
 
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_PSA_API
+    .TFM_SP_IPC_SERVICE_TEST_DATA : ALIGN(32)
+    {
+        *ipc_service_test*:*(.data*)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_SERVICE_TEST_DATA$$RW$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST_DATA);
+    Image$$TFM_SP_IPC_SERVICE_TEST_DATA$$RW$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST_DATA) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST_DATA);
+
+    .TFM_SP_IPC_SERVICE_TEST_BSS : ALIGN(32)
+    {
+        *ipc_service_test*:*(.bss*)
+        *ipc_service_test*:*(COMMON)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_SERVICE_TEST_DATA$$ZI$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST_BSS);
+    Image$$TFM_SP_IPC_SERVICE_TEST_DATA$$ZI$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST_BSS) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST_BSS);
+
+    .TFM_SP_IPC_SERVICE_TEST_STACK : ALIGN(128)
+    {
+        . += 0x1000;
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_SERVICE_TEST_STACK$$ZI$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST_STACK);
+    Image$$TFM_SP_IPC_SERVICE_TEST_STACK$$ZI$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST_STACK) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST_STACK);
+
+#endif /* TFM_PSA_API */
+#ifdef TFM_PSA_API
+    .TFM_SP_IPC_CLIENT_TEST_DATA : ALIGN(32)
+    {
+        *ipc_client_test*:*(.data*)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_CLIENT_TEST_DATA$$RW$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST_DATA);
+    Image$$TFM_SP_IPC_CLIENT_TEST_DATA$$RW$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST_DATA) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST_DATA);
+
+    .TFM_SP_IPC_CLIENT_TEST_BSS : ALIGN(32)
+    {
+        *ipc_client_test*:*(.bss*)
+        *ipc_client_test*:*(COMMON)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_CLIENT_TEST_DATA$$ZI$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST_BSS);
+    Image$$TFM_SP_IPC_CLIENT_TEST_DATA$$ZI$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST_BSS) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST_BSS);
+
+    .TFM_SP_IPC_CLIENT_TEST_STACK : ALIGN(128)
+    {
+        . += 0x1000;
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_CLIENT_TEST_STACK$$ZI$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST_STACK);
+    Image$$TFM_SP_IPC_CLIENT_TEST_STACK$$ZI$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST_STACK) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST_STACK);
+
+#endif /* TFM_PSA_API */
 
     .TFM_SP_SECURE_TEST_PARTITION_DATA : ALIGN(32)
     {
diff --git a/platform/ext/target/musca_a/Device/Source/gcc/musca_s.ld.template b/platform/ext/target/musca_a/Device/Source/gcc/musca_s.ld.template
index 9a971a2..1eb1e65 100644
--- a/platform/ext/target/musca_a/Device/Source/gcc/musca_s.ld.template
+++ b/platform/ext/target/musca_a/Device/Source/gcc/musca_s.ld.template
@@ -1,5 +1,5 @@
 ;/*
-; * Copyright (c) 2018 ARM Limited
+; * Copyright (c) 2018-2019 ARM Limited
 ; *
 ; * Licensed under the Apache License, Version 2.0 (the "License");
 ; * you may not use this file except in compliance with the License.
diff --git a/platform/ext/target/musca_b1/Device/Source/gcc/musca_s.ld b/platform/ext/target/musca_b1/Device/Source/gcc/musca_s.ld
index dfaf83b..9cce586 100644
--- a/platform/ext/target/musca_b1/Device/Source/gcc/musca_s.ld
+++ b/platform/ext/target/musca_b1/Device/Source/gcc/musca_s.ld
@@ -1,5 +1,5 @@
 ;/*
-; * Copyright (c) 2009-2018 ARM Limited
+; * Copyright (c) 2009-2019 ARM Limited
 ; *
 ; * Licensed under the Apache License, Version 2.0 (the "License");
 ; * you may not use this file except in compliance with the License.
@@ -126,6 +126,16 @@
         LONG (ADDR(.TFM_SP_SECURE_TEST_PARTITION_DATA))
         LONG (SIZEOF(.TFM_SP_SECURE_TEST_PARTITION_DATA))
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_PSA_API
+        LONG (LOADADDR(.TFM_SP_IPC_SERVICE_TEST_DATA))
+        LONG (ADDR(.TFM_SP_IPC_SERVICE_TEST_DATA))
+        LONG (SIZEOF(.TFM_SP_IPC_SERVICE_TEST_DATA))
+#endif /* TFM_PSA_API */
+#ifdef TFM_PSA_API
+        LONG (LOADADDR(.TFM_SP_IPC_CLIENT_TEST_DATA))
+        LONG (ADDR(.TFM_SP_IPC_CLIENT_TEST_DATA))
+        LONG (SIZEOF(.TFM_SP_IPC_CLIENT_TEST_DATA))
+#endif /* TFM_PSA_API */
         __copy_table_end__ = .;
     } > FLASH
 
@@ -180,6 +190,18 @@
         LONG (ADDR(.TFM_SP_SECURE_TEST_PARTITION_STACK))
         LONG (SIZEOF(.TFM_SP_SECURE_TEST_PARTITION_STACK))
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_PSA_API
+        LONG (ADDR(.TFM_SP_IPC_SERVICE_TEST_BSS))
+        LONG (SIZEOF(.TFM_SP_IPC_SERVICE_TEST_BSS))
+        LONG (ADDR(.TFM_SP_IPC_SERVICE_TEST_STACK))
+        LONG (SIZEOF(.TFM_SP_IPC_SERVICE_TEST_STACK))
+#endif /* TFM_PSA_API */
+#ifdef TFM_PSA_API
+        LONG (ADDR(.TFM_SP_IPC_CLIENT_TEST_BSS))
+        LONG (SIZEOF(.TFM_SP_IPC_CLIENT_TEST_BSS))
+        LONG (ADDR(.TFM_SP_IPC_CLIENT_TEST_STACK))
+        LONG (SIZEOF(.TFM_SP_IPC_CLIENT_TEST_STACK))
+#endif /* TFM_PSA_API */
         LONG (ADDR(.TFM_UNPRIV_SCRATCH))
         LONG (SIZEOF(.TFM_UNPRIV_SCRATCH))
         __zero_table_end__ = .;
@@ -339,6 +361,34 @@
     Image$$TFM_SP_SECURE_TEST_PARTITION$$Limit = ADDR(.TFM_SP_SECURE_TEST_PARTITION) + SIZEOF(.TFM_SP_SECURE_TEST_PARTITION);
 
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_PSA_API
+    .TFM_SP_IPC_SERVICE_TEST : ALIGN(32)
+    {
+        *ipc_service_test*:*(.text*)
+        *ipc_service_test*:*(.rodata*)
+        *(TFM_SP_IPC_SERVICE_TEST_ATTR_FN)
+        . = ALIGN(32);
+    } > FLASH
+    Image$$TFM_SP_IPC_SERVICE_TEST$$RO$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST);
+    Image$$TFM_SP_IPC_SERVICE_TEST$$RO$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST);
+    Image$$TFM_SP_IPC_SERVICE_TEST$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST);
+    Image$$TFM_SP_IPC_SERVICE_TEST$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST);
+
+#endif /* TFM_PSA_API */
+#ifdef TFM_PSA_API
+    .TFM_SP_IPC_CLIENT_TEST : ALIGN(32)
+    {
+        *ipc_client_test*:*(.text*)
+        *ipc_client_test*:*(.rodata*)
+        *(TFM_SP_IPC_CLIENT_TEST_ATTR_FN)
+        . = ALIGN(32);
+    } > FLASH
+    Image$$TFM_SP_IPC_CLIENT_TEST$$RO$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST);
+    Image$$TFM_SP_IPC_CLIENT_TEST$$RO$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST);
+    Image$$TFM_SP_IPC_CLIENT_TEST$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST);
+    Image$$TFM_SP_IPC_CLIENT_TEST$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST);
+
+#endif /* TFM_PSA_API */
 
     .ARM.extab :
     {
@@ -713,6 +763,58 @@
     Image$$TFM_SP_SECURE_TEST_PARTITION_STACK$$ZI$$Limit = ADDR(.TFM_SP_SECURE_TEST_PARTITION_STACK) + SIZEOF(.TFM_SP_SECURE_TEST_PARTITION_STACK);
 
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_PSA_API
+    .TFM_SP_IPC_SERVICE_TEST_DATA : ALIGN(32)
+    {
+        *ipc_service_test*:*(.data*)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_SERVICE_TEST_DATA$$RW$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST_DATA);
+    Image$$TFM_SP_IPC_SERVICE_TEST_DATA$$RW$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST_DATA) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST_DATA);
+
+    .TFM_SP_IPC_SERVICE_TEST_BSS : ALIGN(32)
+    {
+        *ipc_service_test*:*(.bss*)
+        *ipc_service_test*:*(COMMON)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_SERVICE_TEST_DATA$$ZI$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST_BSS);
+    Image$$TFM_SP_IPC_SERVICE_TEST_DATA$$ZI$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST_BSS) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST_BSS);
+
+    .TFM_SP_IPC_SERVICE_TEST_STACK : ALIGN(128)
+    {
+        . += 0x1000;
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_SERVICE_TEST_STACK$$ZI$$Base = ADDR(.TFM_SP_IPC_SERVICE_TEST_STACK);
+    Image$$TFM_SP_IPC_SERVICE_TEST_STACK$$ZI$$Limit = ADDR(.TFM_SP_IPC_SERVICE_TEST_STACK) + SIZEOF(.TFM_SP_IPC_SERVICE_TEST_STACK);
+
+#endif /* TFM_PSA_API */
+#ifdef TFM_PSA_API
+    .TFM_SP_IPC_CLIENT_TEST_DATA : ALIGN(32)
+    {
+        *ipc_client_test*:*(.data*)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_CLIENT_TEST_DATA$$RW$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST_DATA);
+    Image$$TFM_SP_IPC_CLIENT_TEST_DATA$$RW$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST_DATA) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST_DATA);
+
+    .TFM_SP_IPC_CLIENT_TEST_BSS : ALIGN(32)
+    {
+        *ipc_client_test*:*(.bss*)
+        *ipc_client_test*:*(COMMON)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_CLIENT_TEST_DATA$$ZI$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST_BSS);
+    Image$$TFM_SP_IPC_CLIENT_TEST_DATA$$ZI$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST_BSS) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST_BSS);
+
+    .TFM_SP_IPC_CLIENT_TEST_STACK : ALIGN(128)
+    {
+        . += 0x1000;
+    } > RAM AT> FLASH
+    Image$$TFM_SP_IPC_CLIENT_TEST_STACK$$ZI$$Base = ADDR(.TFM_SP_IPC_CLIENT_TEST_STACK);
+    Image$$TFM_SP_IPC_CLIENT_TEST_STACK$$ZI$$Limit = ADDR(.TFM_SP_IPC_CLIENT_TEST_STACK) + SIZEOF(.TFM_SP_IPC_CLIENT_TEST_STACK);
+
+#endif /* TFM_PSA_API */
 
     .TFM_SP_SECURE_TEST_PARTITION_DATA : ALIGN(32)
     {
diff --git a/platform/ext/target/musca_b1/Device/Source/gcc/musca_s.ld.template b/platform/ext/target/musca_b1/Device/Source/gcc/musca_s.ld.template
index ccf5556..1a6b8bb 100644
--- a/platform/ext/target/musca_b1/Device/Source/gcc/musca_s.ld.template
+++ b/platform/ext/target/musca_b1/Device/Source/gcc/musca_s.ld.template
@@ -1,5 +1,5 @@
 ;/*
-; * Copyright (c) 2009-2018 ARM Limited
+; * Copyright (c) 2009-2019 ARM Limited
 ; *
 ; * Licensed under the Apache License, Version 2.0 (the "License");
 ; * you may not use this file except in compliance with the License.
diff --git a/secure_fw/CMakeLists.txt b/secure_fw/CMakeLists.txt
index 1f99ad1..cd8399d 100644
--- a/secure_fw/CMakeLists.txt
+++ b/secure_fw/CMakeLists.txt
@@ -199,6 +199,12 @@
 		embedded_set_target_link_defines(TARGET ${EXE_NAME} DEFINES "BL2")
 	endif()
 
+	if (NOT DEFINED TFM_PSA_API)
+		message(FATAL_ERROR "Incomplete build configuration: TFM_PSA_API is undefined. ")
+	elseif (TFM_PSA_API)
+		embedded_set_target_link_defines(TARGET ${PROJECT_NAME} DEFINES "TFM_PSA_API")
+	endif()
+
 	if(CORE_TEST)
 		set(SECURE_AXF_DIR_PREFIX "${CMAKE_BINARY_DIR}/unit_test/")
 		set_target_properties(${EXE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SECURE_AXF_DIR_PREFIX})
diff --git a/secure_fw/services/tfm_partition_defs.inc b/secure_fw/services/tfm_partition_defs.inc
index a84c54b..b713839 100644
--- a/secure_fw/services/tfm_partition_defs.inc
+++ b/secure_fw/services/tfm_partition_defs.inc
@@ -36,6 +36,14 @@
 #define TFM_SP_SECURE_TEST_PARTITION_ID (TFM_SP_BASE + 8)
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
-#define TFM_MAX_USER_PARTITIONS (9)
+#ifdef TFM_PSA_API
+#define TFM_SP_IPC_SERVICE_TEST_ID (TFM_SP_BASE + 9)
+#endif /* TFM_PSA_API */
+
+#ifdef TFM_PSA_API
+#define TFM_SP_IPC_CLIENT_TEST_ID (TFM_SP_BASE + 10)
+#endif /* TFM_PSA_API */
+
+#define TFM_MAX_USER_PARTITIONS (11)
 
 #endif /* __TFM_PARTITION_DEFS_INC__ */
diff --git a/secure_fw/services/tfm_partition_list.inc b/secure_fw/services/tfm_partition_list.inc
index 57dd18f..f903edd 100644
--- a/secure_fw/services/tfm_partition_list.inc
+++ b/secure_fw/services/tfm_partition_list.inc
@@ -59,4 +59,16 @@
 PARTITION_ADD_PERIPHERAL(TFM_SP_SECURE_TEST_PARTITION, TFM_PERIPHERAL_STD_UART);
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_PSA_API
+/******** TFM_SP_IPC_SERVICE_TEST ********/
+PARTITION_DECLARE(TFM_SP_IPC_SERVICE_TEST, SPM_PART_FLAG_SECURE);
+PARTITION_ADD_INIT_FUNC(TFM_SP_IPC_SERVICE_TEST, ipc_service_test_main);
+#endif /* TFM_PSA_API */
+
+#ifdef TFM_PSA_API
+/******** TFM_SP_IPC_CLIENT_TEST ********/
+PARTITION_DECLARE(TFM_SP_IPC_CLIENT_TEST, SPM_PART_FLAG_SECURE);
+PARTITION_ADD_INIT_FUNC(TFM_SP_IPC_CLIENT_TEST, ipc_client_init);
+#endif /* TFM_PSA_API */
+
 #endif /* __TFM_PARTITION_LIST_INC__ */
diff --git a/secure_fw/services/tfm_sfid_list.inc b/secure_fw/services/tfm_sfid_list.inc
index e224dce..4681697 100644
--- a/secure_fw/services/tfm_sfid_list.inc
+++ b/secure_fw/services/tfm_sfid_list.inc
@@ -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
  *
@@ -79,4 +79,14 @@
     {tfm_secure_client_service_sfn_run_tests, TFM_SECURE_CLIENT_SFN_RUN_TESTS_SFID},
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_PSA_API
+    /******** TFM_SP_IPC_SERVICE_TEST ********/
+    {ipc_service_call, IPC_SERVICE_CALL_SFID},
+#endif /* TFM_PSA_API */
+
+#ifdef TFM_PSA_API
+    /******** TFM_SP_IPC_CLIENT_TEST ********/
+    {False, False},
+#endif /* TFM_PSA_API */
+
 #endif /* __TFM_SFID_LIST_INC__ */
diff --git a/secure_fw/services/tfm_sfid_list.inc.template b/secure_fw/services/tfm_sfid_list.inc.template
index 08e5918..7f9bb92 100644
--- a/secure_fw/services/tfm_sfid_list.inc.template
+++ b/secure_fw/services/tfm_sfid_list.inc.template
@@ -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

  *

diff --git a/test/test_services/CMakeLists.inc b/test/test_services/CMakeLists.inc
index 85eda32..5ac6602 100644
--- a/test/test_services/CMakeLists.inc
+++ b/test/test_services/CMakeLists.inc
@@ -65,7 +65,8 @@
 if (NOT DEFINED CORE_TEST_IPC)
 	message(FATAL_ERROR "Incomplete build configuration: CORE_TEST_IPC is undefined. ")
 elseif (CORE_TEST_IPC)
-	list(APPEND ALL_SRC_C_S "${CORE_TEST_DIR}/tfm_ipc_test/ipc_test_service.c"
+	list(APPEND ALL_SRC_C_S "${CORE_TEST_DIR}/tfm_ipc_service/ipc_service_test.c"
+		"${CORE_TEST_DIR}/tfm_ipc_client/ipc_client_test.c"
 		)
 endif()
 
diff --git a/test/test_services/tfm_ipc_client/ipc_client_test.c b/test/test_services/tfm_ipc_client/ipc_client_test.c
new file mode 100644
index 0000000..6c449eb
--- /dev/null
+++ b/test/test_services/tfm_ipc_client/ipc_client_test.c
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#include <stdio.h>
+#include "psa_client.h"
+#include "secure_utilities.h"
+
+/*
+ * FixMe: These SID should come from manifest.
+ * Temporarily adds them here for test.
+ */
+#define IPC_TEST_SERVICE1_SID        (01)
+#define IPC_TEST_SERVICE1_MIN_VER    (0x0001)
+
+int ipc_client_init(void)
+{
+    psa_handle_t handle;
+    psa_status_t status;
+    char str1[] = "123";
+    char str2[] = "456";
+    char str3[64], str4[64];
+    struct psa_invec invecs[2] = {{str1, sizeof(str1)/sizeof(char)},
+                                  {str2, sizeof(str2)/sizeof(char)}};
+    struct psa_outvec outvecs[2] = {{str3, sizeof(str3)/sizeof(char)},
+                                    {str4, sizeof(str4)/sizeof(char)}};
+
+
+    LOG_MSG("hello! this is ipc client test sp!");
+
+    handle = psa_connect(IPC_TEST_SERVICE1_SID, IPC_TEST_SERVICE1_MIN_VER);
+    if (handle > 0) {
+        LOG_MSG("Connect success!");
+    } else {
+        LOG_MSG("The RoT Service has refused the connection!");
+    }
+
+    status = psa_call(handle, invecs, 2, outvecs, 2);
+    if (status >= 0) {
+        LOG_MSG("Call success!");
+    } else {
+        LOG_MSG("Call failed!");
+    }
+
+    psa_close(handle);
+    return 0;
+}
diff --git a/test/test_services/tfm_ipc_client/manifest.yaml b/test/test_services/tfm_ipc_client/manifest.yaml
new file mode 100644
index 0000000..8c8ccdb
--- /dev/null
+++ b/test/test_services/tfm_ipc_client/manifest.yaml
@@ -0,0 +1,26 @@
+#-------------------------------------------------------------------------------
+# Copyright (c) 2018-2019, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+#-------------------------------------------------------------------------------
+
+{
+  "name": "IPC_CLIENT",
+  "type": "SECURE",
+  "tfm_partition_name": "TFM_SP_IPC_CLIENT_TEST",
+  "priority": "NORMAL",
+  "id": "0x00000006",
+  "entry_point": "main",
+  "stack_size": "0x1000",
+  "heap_size": "0x0400",
+  "tfm_init_symbol": "ipc_client_init",
+  "source_files": [
+    "ipc_client_test.c",
+  ],
+  "tfm_linker_pattern": {
+    "library_list": [
+      "*ipc_client_test*"
+    ]
+  }
+}
diff --git a/test/test_services/tfm_ipc_test/ipc_test_service.c b/test/test_services/tfm_ipc_service/ipc_service_test.c
similarity index 64%
rename from test/test_services/tfm_ipc_test/ipc_test_service.c
rename to test/test_services/tfm_ipc_service/ipc_service_test.c
index 85ca0fb..279d1b1 100644
--- a/test/test_services/tfm_ipc_test/ipc_test_service.c
+++ b/test/test_services/tfm_ipc_service/ipc_service_test.c
@@ -13,30 +13,11 @@
 #include "secure_fw/core/tfm_secure_api.h"
 #include "tfm_api.h"
 
-#define IPC_SERVICE_BUFFER_LEN 256
-#define PSA_IPC_SIGNAL 1
+#define IPC_SERVICE_BUFFER_LEN 64
+#define IPC_BASIC_SIGNAL 1
 
 static int inuse = 0;
 
-static psa_status_t ipc_service_connect(psa_msg_t *msg)
-{
-    uint32_t minor_version;
-
-    if (msg->in_size[0] == 0) {
-        return PSA_CONNECTION_REFUSED;
-    }
-
-    psa_read(msg->handle, 0, &minor_version, sizeof(minor_version));
-    printf("Requested minor version for service1 connect: %d.\r\n",
-           minor_version);
-
-    /* notify client if accepted or refused */
-    if (minor_version == 0) {
-        return PSA_CONNECTION_REFUSED;
-    }
-    return PSA_SUCCESS;
-}
-
 static psa_status_t ipc_service_call(psa_msg_t *msg)
 {
     int i;
@@ -46,8 +27,6 @@
     for (i = 0; i < PSA_MAX_IOVEC; i++) {
         if (msg->in_size[i] != 0) {
             psa_read(msg->handle, i, rec_buf, IPC_SERVICE_BUFFER_LEN);
-            printf("receive buffer index is %d, data is %s.\r\n", i,
-                                            (char *)rec_buf);
         }
         if (msg->out_size[i] != 0) {
             psa_write(msg->handle, i, send_buf, IPC_SERVICE_BUFFER_LEN);
@@ -57,7 +36,7 @@
 }
 
 /* Test thread */
-void *ipc_test_partition_main(void *param)
+void ipc_service_test_main(void *param)
 {
     uint32_t signals = 0;
     psa_msg_t msg;
@@ -65,18 +44,15 @@
 
     while (1) {
         signals = psa_wait(PSA_WAIT_ANY, PSA_BLOCK);
-
-        printf("ipc get signals 0x%x\r\n", signals);
-
-        if (signals & PSA_IPC_SIGNAL) {
-            psa_get(PSA_IPC_SIGNAL, &msg);
+        if (signals & IPC_BASIC_SIGNAL) {
+            psa_get(IPC_BASIC_SIGNAL, &msg);
             switch (msg.type) {
             case PSA_IPC_CONNECT:
                 if (inuse) {
                     r = PSA_CONNECTION_REFUSED;
                 } else {
                     inuse = 1;
-                    r = ipc_service_connect(&msg);
+                    r = PSA_SUCCESS;
                 }
                 psa_reply(msg.handle, r);
                 break;
@@ -95,5 +71,5 @@
         }
     }
 
-    return NULL;
+    return;
 }
diff --git a/test/test_services/tfm_ipc_service/manifest.yaml b/test/test_services/tfm_ipc_service/manifest.yaml
new file mode 100644
index 0000000..8594f04
--- /dev/null
+++ b/test/test_services/tfm_ipc_service/manifest.yaml
@@ -0,0 +1,36 @@
+#-------------------------------------------------------------------------------
+# Copyright (c) 2018-2019, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+#-------------------------------------------------------------------------------
+
+{
+  "name": "IPC_SERVICE_TEST",
+  "tfm_partition_name": "TFM_SP_IPC_SERVICE_TEST",
+  "type": "SECURE", "IPC",
+  "priority": "NORMAL",
+  "id": "0x00000007",
+  "entry_point": "main",
+  "stack_size": "0x1000",
+  "heap_size": "0x0400",
+  "tfm_init_symbol": "ipc_service_test_main",
+  "secure_functions": [
+    {
+      "sfid": "IPC_SERVICE_CALL_SFID",
+      "signal": "IPC_SERVICE_CALL",
+      "tfm_symbol": "ipc_service_call",
+      "non_secure_clients": true,
+      "minor_version": 1,
+      "minor_policy": "strict"
+    }
+  ],
+  "source_files": [
+    "./ipc_service_test.c",
+  ],
+  "tfm_linker_pattern": {
+    "library_list": [
+      "*ipc_service_test*"
+    ]
+  }
+}
diff --git a/tools/tfm_manifest_list.yaml b/tools/tfm_manifest_list.yaml
index c06a13e..9edbd32 100644
--- a/tools/tfm_manifest_list.yaml
+++ b/tools/tfm_manifest_list.yaml
@@ -86,6 +86,24 @@
       "conditional": "TFM_PARTITION_TEST_SECURE_SERVICES",

       "version_major": 0,

       "version_minor": 1

+    },

+    {

+      "name": "TFM IPC Service Test",

+      "short_name": "TFM_IPC_Service",

+      "manifest": "test/test_services/tfm_ipc_service/manifest.yaml",

+      "tfm_extensions": true,

+      "conditional": "TFM_PSA_API",

+      "version_major": 0,

+      "version_minor": 1

+    },

+    {

+      "name": "TFM IPC Client Service",

+      "short_name": "TFM_IPC_Client",

+      "manifest": "test/test_services/tfm_ipc_client/manifest.yaml",

+      "tfm_extensions": true,

+      "conditional": "TFM_PSA_API",

+      "version_major": 0,

+      "version_minor": 1

     }

   ]

 }