Platform: Add device ID support

Add a getter function to platform code, to retrieve
the Universal Entity ID (UEID) of the device.

Change-Id: Id1f9abc5e96409da463098e92230099c1983c0c9
Signed-off-by: Tamas Ban <tamas.ban@arm.com>
diff --git a/CommonConfig.cmake b/CommonConfig.cmake
index 8418922..d5f4ab1 100644
--- a/CommonConfig.cmake
+++ b/CommonConfig.cmake
@@ -33,6 +33,7 @@
 set(BUILD_UART_STDOUT Off)
 set(BUILD_FLASH Off)
 set(BUILD_BOOT_SEED Off)
+set(BUILD_DEVICE_ID Off)
 if(NOT DEFINED PLATFORM_CMAKE_FILE)
 	message (FATAL_ERROR "Platform specific CMake is not defined. Please set PLATFORM_CMAKE_FILE.")
 elseif(NOT EXISTS ${PLATFORM_CMAKE_FILE})
diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt
index a4e390b..ca71227 100755
--- a/app/CMakeLists.txt
+++ b/app/CMakeLists.txt
@@ -71,6 +71,7 @@
 set(BUILD_UART_STDOUT Off)
 set(BUILD_FLASH Off)
 set(BUILD_BOOT_SEED Off)
+set(BUILD_DEVICE_ID Off)
 if(NOT DEFINED PLATFORM_CMAKE_FILE)
 	message (FATAL_ERROR "Platform specific CMake is not defined. Please set PLATFORM_CMAKE_FILE.")
 elseif(NOT EXISTS ${PLATFORM_CMAKE_FILE})
diff --git a/platform/ext/Mps2AN519.cmake b/platform/ext/Mps2AN519.cmake
index af4a560..a515199 100644
--- a/platform/ext/Mps2AN519.cmake
+++ b/platform/ext/Mps2AN519.cmake
@@ -173,3 +173,9 @@
 elseif(BUILD_BOOT_SEED)
   list(APPEND ALL_SRC_C "${PLATFORM_DIR}/target/mps2/an519/dummy_boot_seed.c")
 endif()
+
+if (NOT DEFINED BUILD_DEVICE_ID)
+  message(FATAL_ERROR "Configuration variable BUILD_DEVICE_ID (true|false) is undefined!")
+elseif(BUILD_DEVICE_ID)
+  list(APPEND ALL_SRC_C "${PLATFORM_DIR}/target/mps2/an519/dummy_device_id.c")
+endif()
diff --git a/platform/ext/Mps2AN521.cmake b/platform/ext/Mps2AN521.cmake
index 7459547..3e7902a 100644
--- a/platform/ext/Mps2AN521.cmake
+++ b/platform/ext/Mps2AN521.cmake
@@ -174,3 +174,9 @@
 elseif(BUILD_BOOT_SEED)
   list(APPEND ALL_SRC_C "${PLATFORM_DIR}/target/mps2/an521/dummy_boot_seed.c")
 endif()
+
+if (NOT DEFINED BUILD_DEVICE_ID)
+  message(FATAL_ERROR "Configuration variable BUILD_DEVICE_ID (true|false) is undefined!")
+elseif(BUILD_DEVICE_ID)
+  list(APPEND ALL_SRC_C "${PLATFORM_DIR}/target/mps2/an521/dummy_device_id.c")
+endif()
diff --git a/platform/ext/musca_a.cmake b/platform/ext/musca_a.cmake
index 985d8b9..5f0e88a 100755
--- a/platform/ext/musca_a.cmake
+++ b/platform/ext/musca_a.cmake
@@ -184,3 +184,9 @@
 elseif(BUILD_BOOT_SEED)
   list(APPEND ALL_SRC_C "${PLATFORM_DIR}/target/musca_a/dummy_boot_seed.c")
 endif()
+
+if (NOT DEFINED BUILD_DEVICE_ID)
+  message(FATAL_ERROR "Configuration variable BUILD_DEVICE_ID (true|false) is undefined!")
+elseif(BUILD_DEVICE_ID)
+  list(APPEND ALL_SRC_C "${PLATFORM_DIR}/target/musca_a/dummy_device_id.c")
+endif()
diff --git a/platform/ext/musca_b1.cmake b/platform/ext/musca_b1.cmake
index db584af..510e90f 100755
--- a/platform/ext/musca_b1.cmake
+++ b/platform/ext/musca_b1.cmake
@@ -171,3 +171,9 @@
 elseif(BUILD_BOOT_SEED)
   list(APPEND ALL_SRC_C "${PLATFORM_DIR}/target/musca_b1/dummy_boot_seed.c")
 endif()
+
+if (NOT DEFINED BUILD_DEVICE_ID)
+  message(FATAL_ERROR "Configuration variable BUILD_DEVICE_ID (true|false) is undefined!")
+elseif(BUILD_DEVICE_ID)
+  list(APPEND ALL_SRC_C "${PLATFORM_DIR}/target/musca_b1/dummy_device_id.c")
+endif()
diff --git a/platform/ext/target/mps2/an519/armclang/mps2_an519_s.sct b/platform/ext/target/mps2/an519/armclang/mps2_an519_s.sct
index 5eef45a..3820076 100644
--- a/platform/ext/target/mps2/an519/armclang/mps2_an519_s.sct
+++ b/platform/ext/target/mps2/an519/armclang/mps2_an519_s.sct
@@ -61,6 +61,7 @@
         dummy_crypto_keys.o (+RO)
         dummy_nv_counters.o (+RO)
         dummy_boot_seed.o (+RO)
+        dummy_device_id.o (+RO)
         platform_retarget_dev.o (+RO)
         *(SFN)
         *armlib*
@@ -141,6 +142,7 @@
         dummy_crypto_keys.o (+RW +ZI)
         dummy_nv_counters.o (+RW +ZI)
         dummy_boot_seed.o (+RW +ZI)
+        dummy_device_id.o (+RW +ZI)
         platform_retarget_dev.o (+RW +ZI)
     }
 
diff --git a/platform/ext/target/mps2/an519/dummy_device_id.c b/platform/ext/target/mps2/an519/dummy_device_id.c
new file mode 100644
index 0000000..f7bbfe0
--- /dev/null
+++ b/platform/ext/target/mps2/an519/dummy_device_id.c
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2018 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "platform/include/tfm_plat_device_id.h"
+
+/*!
+ * \def DEVICE_ID_SIZE
+ *
+ * \brief Size of device ID in bytes
+ */
+#define DEVICE_ID_SIZE (16)
+
+/*!
+ * \def DEVICE_ID
+ *
+ * \brief Fixed value for device ID.
+ */
+#define DEVICE_ID    0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, \
+                     0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF
+
+static const uint8_t device_id[DEVICE_ID_SIZE] = {DEVICE_ID};
+
+int32_t tfm_plat_get_device_id(uint32_t size, uint8_t *buf)
+{
+    /* FixMe: This getter function must be ported per target platform. */
+
+    uint32_t i;
+    uint8_t *p_dst = buf;
+    const uint8_t *p_src = device_id;
+
+    if (size < DEVICE_ID_SIZE) {
+        return -1;
+    }
+
+    for (i = DEVICE_ID_SIZE; i > 0; i--) {
+        *p_dst = *p_src;
+        p_src++;
+        p_dst++;
+    }
+
+    return DEVICE_ID_SIZE;
+}
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 951db0d..8eb0502 100644
--- a/platform/ext/target/mps2/an519/gcc/mps2_an519_s.ld
+++ b/platform/ext/target/mps2/an519/gcc/mps2_an519_s.ld
@@ -190,6 +190,8 @@
         *dummy_nv_counters.o(.rodata*)
         *dummy_boot_seed.o(.text*)
         *dummy_boot_seed.o(.rodata*)
+        *dummy_device_id.o(.text*)
+        *dummy_device_id.o(.rodata*)
         *platform_retarget_dev.o(.text*)
         *platform_retarget_dev.o(.rodata*)
         *(SFN)
@@ -412,6 +414,7 @@
         */dummy_crypto_keys.o(.data*)
         */dummy_nv_counters.o(.data*)
         */dummy_boot_seed.o(.data*)
+        */dummy_device_id.o(.data*)
         */platform_retarget_dev.o(.data*)
         . = ALIGN(32);
     } > RAM AT> FLASH
@@ -425,11 +428,13 @@
         */dummy_crypto_keys.o(.bss*)
         */dummy_nv_counters.o(.bss*)
         */dummy_boot_seed.o(.bss*)
+        */dummy_device_id.o(.bss*)
         */tfm_spm_services.o(COMMON)
         */platform_retarget_dev.o(COMMON)
         */dummy_crypto_keys.o(COMMON)
         */dummy_nv_counters.o(COMMON)
         */dummy_boot_seed.o(COMMON)
+        */dummy_device_id.o(COMMON)
         . = ALIGN(32);
     } > RAM AT> FLASH
     Image$$TFM_UNPRIV_RO_DATA$$ZI$$Base = ADDR(.TFM_UNPRIV_RO_BSS);
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 2d185b8..9a971a2 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
@@ -141,6 +141,8 @@
         *dummy_nv_counters.o(.rodata*)
         *dummy_boot_seed.o(.text*)
         *dummy_boot_seed.o(.rodata*)
+        *dummy_device_id.o(.text*)
+        *dummy_device_id.o(.rodata*)
         *platform_retarget_dev.o(.text*)
         *platform_retarget_dev.o(.rodata*)
         *(SFN)
@@ -273,6 +275,7 @@
         */dummy_crypto_keys.o(.data*)
         */dummy_nv_counters.o(.data*)
         */dummy_boot_seed.o(.data*)
+        */dummy_device_id.o(.data*)
         */platform_retarget_dev.o(.data*)
         . = ALIGN(32);
     } > RAM AT> FLASH
@@ -286,11 +289,13 @@
         */dummy_crypto_keys.o(.bss*)
         */dummy_nv_counters.o(.bss*)
         */dummy_boot_seed.o(.bss*)
+        */dummy_device_id.o(.bss*)
         */tfm_spm_services.o(COMMON)
         */platform_retarget_dev.o(COMMON)
         */dummy_crypto_keys.o(COMMON)
         */dummy_nv_counters.o(COMMON)
         */dummy_boot_seed.o(COMMON)
+        */dummy_device_id.o(COMMON)
         . = ALIGN(32);
     } > RAM AT> FLASH
     Image$$TFM_UNPRIV_RO_DATA$$ZI$$Base = ADDR(.TFM_UNPRIV_RO_BSS);
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 5eef45a..3820076 100644
--- a/platform/ext/target/mps2/an521/armclang/mps2_an521_s.sct
+++ b/platform/ext/target/mps2/an521/armclang/mps2_an521_s.sct
@@ -61,6 +61,7 @@
         dummy_crypto_keys.o (+RO)
         dummy_nv_counters.o (+RO)
         dummy_boot_seed.o (+RO)
+        dummy_device_id.o (+RO)
         platform_retarget_dev.o (+RO)
         *(SFN)
         *armlib*
@@ -141,6 +142,7 @@
         dummy_crypto_keys.o (+RW +ZI)
         dummy_nv_counters.o (+RW +ZI)
         dummy_boot_seed.o (+RW +ZI)
+        dummy_device_id.o (+RW +ZI)
         platform_retarget_dev.o (+RW +ZI)
     }
 
diff --git a/platform/ext/target/mps2/an521/dummy_device_id.c b/platform/ext/target/mps2/an521/dummy_device_id.c
new file mode 100644
index 0000000..f7bbfe0
--- /dev/null
+++ b/platform/ext/target/mps2/an521/dummy_device_id.c
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2018 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "platform/include/tfm_plat_device_id.h"
+
+/*!
+ * \def DEVICE_ID_SIZE
+ *
+ * \brief Size of device ID in bytes
+ */
+#define DEVICE_ID_SIZE (16)
+
+/*!
+ * \def DEVICE_ID
+ *
+ * \brief Fixed value for device ID.
+ */
+#define DEVICE_ID    0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, \
+                     0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF
+
+static const uint8_t device_id[DEVICE_ID_SIZE] = {DEVICE_ID};
+
+int32_t tfm_plat_get_device_id(uint32_t size, uint8_t *buf)
+{
+    /* FixMe: This getter function must be ported per target platform. */
+
+    uint32_t i;
+    uint8_t *p_dst = buf;
+    const uint8_t *p_src = device_id;
+
+    if (size < DEVICE_ID_SIZE) {
+        return -1;
+    }
+
+    for (i = DEVICE_ID_SIZE; i > 0; i--) {
+        *p_dst = *p_src;
+        p_src++;
+        p_dst++;
+    }
+
+    return DEVICE_ID_SIZE;
+}
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 b9e6080..880dace 100644
--- a/platform/ext/target/mps2/an521/gcc/mps2_an521_s.ld
+++ b/platform/ext/target/mps2/an521/gcc/mps2_an521_s.ld
@@ -190,6 +190,8 @@
         *dummy_nv_counters.o(.rodata*)
         *dummy_boot_seed.o(.text*)
         *dummy_boot_seed.o(.rodata*)
+        *dummy_device_id.o(.text*)
+        *dummy_device_id.o(.rodata*)
         *platform_retarget_dev.o(.text*)
         *platform_retarget_dev.o(.rodata*)
         *(SFN)
@@ -412,6 +414,7 @@
         */dummy_crypto_keys.o(.data*)
         */dummy_nv_counters.o(.data*)
         */dummy_boot_seed.o(.data*)
+        */dummy_device_id.o(.data*)
         */platform_retarget_dev.o(.data*)
         . = ALIGN(32);
     } > RAM AT> FLASH
@@ -425,11 +428,13 @@
         */dummy_crypto_keys.o(.bss*)
         */dummy_nv_counters.o(.bss*)
         */dummy_boot_seed.o(.bss*)
+        */dummy_device_id.o(.bss*)
         */tfm_spm_services.o(COMMON)
         */platform_retarget_dev.o(COMMON)
         */dummy_crypto_keys.o(COMMON)
         */dummy_nv_counters.o(COMMON)
         */dummy_boot_seed.o(COMMON)
+        */dummy_device_id.o(COMMON)
         . = ALIGN(32);
     } > RAM AT> FLASH
     Image$$TFM_UNPRIV_RO_DATA$$ZI$$Base = ADDR(.TFM_UNPRIV_RO_BSS);
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 876a47a..c749aa3 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
@@ -141,6 +141,8 @@
         *dummy_nv_counters.o(.rodata*)
         *dummy_boot_seed.o(.text*)
         *dummy_boot_seed.o(.rodata*)
+        *dummy_device_id.o(.text*)
+        *dummy_device_id.o(.rodata*)
         *platform_retarget_dev.o(.text*)
         *platform_retarget_dev.o(.rodata*)
         *(SFN)
@@ -273,6 +275,7 @@
         */dummy_crypto_keys.o(.data*)
         */dummy_nv_counters.o(.data*)
         */dummy_boot_seed.o(.data*)
+        */dummy_device_id.o(.data*)
         */platform_retarget_dev.o(.data*)
         . = ALIGN(32);
     } > RAM AT> FLASH
@@ -286,11 +289,13 @@
         */dummy_crypto_keys.o(.bss*)
         */dummy_nv_counters.o(.bss*)
         */dummy_boot_seed.o(.bss*)
+        */dummy_device_id.o(.bss*)
         */tfm_spm_services.o(COMMON)
         */platform_retarget_dev.o(COMMON)
         */dummy_crypto_keys.o(COMMON)
         */dummy_nv_counters.o(COMMON)
         */dummy_boot_seed.o(COMMON)
+        */dummy_device_id.o(COMMON)
         . = ALIGN(32);
     } > RAM AT> FLASH
     Image$$TFM_UNPRIV_RO_DATA$$ZI$$Base = ADDR(.TFM_UNPRIV_RO_BSS);
diff --git a/platform/ext/target/musca_a/Device/Source/armclang/musca_s.sct b/platform/ext/target/musca_a/Device/Source/armclang/musca_s.sct
index bc40a2f..694b050 100755
--- a/platform/ext/target/musca_a/Device/Source/armclang/musca_s.sct
+++ b/platform/ext/target/musca_a/Device/Source/armclang/musca_s.sct
@@ -61,6 +61,7 @@
         dummy_crypto_keys.o (+RO)
         dummy_nv_counters.o (+RO)
         dummy_boot_seed.o (+RO)
+        dummy_device_id.o (+RO)
         platform_retarget_dev.o (+RO)
         *(SFN)
         *armlib*
@@ -141,6 +142,7 @@
         dummy_crypto_keys.o (+RW +ZI)
         dummy_nv_counters.o (+RW +ZI)
         dummy_boot_seed.o (+RW +ZI)
+        dummy_device_id.o (+RW +ZI)
         platform_retarget_dev.o (+RW +ZI)
     }
 
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 951db0d..8eb0502 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
@@ -190,6 +190,8 @@
         *dummy_nv_counters.o(.rodata*)
         *dummy_boot_seed.o(.text*)
         *dummy_boot_seed.o(.rodata*)
+        *dummy_device_id.o(.text*)
+        *dummy_device_id.o(.rodata*)
         *platform_retarget_dev.o(.text*)
         *platform_retarget_dev.o(.rodata*)
         *(SFN)
@@ -412,6 +414,7 @@
         */dummy_crypto_keys.o(.data*)
         */dummy_nv_counters.o(.data*)
         */dummy_boot_seed.o(.data*)
+        */dummy_device_id.o(.data*)
         */platform_retarget_dev.o(.data*)
         . = ALIGN(32);
     } > RAM AT> FLASH
@@ -425,11 +428,13 @@
         */dummy_crypto_keys.o(.bss*)
         */dummy_nv_counters.o(.bss*)
         */dummy_boot_seed.o(.bss*)
+        */dummy_device_id.o(.bss*)
         */tfm_spm_services.o(COMMON)
         */platform_retarget_dev.o(COMMON)
         */dummy_crypto_keys.o(COMMON)
         */dummy_nv_counters.o(COMMON)
         */dummy_boot_seed.o(COMMON)
+        */dummy_device_id.o(COMMON)
         . = ALIGN(32);
     } > RAM AT> FLASH
     Image$$TFM_UNPRIV_RO_DATA$$ZI$$Base = ADDR(.TFM_UNPRIV_RO_BSS);
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 2d185b8..9a971a2 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
@@ -141,6 +141,8 @@
         *dummy_nv_counters.o(.rodata*)
         *dummy_boot_seed.o(.text*)
         *dummy_boot_seed.o(.rodata*)
+        *dummy_device_id.o(.text*)
+        *dummy_device_id.o(.rodata*)
         *platform_retarget_dev.o(.text*)
         *platform_retarget_dev.o(.rodata*)
         *(SFN)
@@ -273,6 +275,7 @@
         */dummy_crypto_keys.o(.data*)
         */dummy_nv_counters.o(.data*)
         */dummy_boot_seed.o(.data*)
+        */dummy_device_id.o(.data*)
         */platform_retarget_dev.o(.data*)
         . = ALIGN(32);
     } > RAM AT> FLASH
@@ -286,11 +289,13 @@
         */dummy_crypto_keys.o(.bss*)
         */dummy_nv_counters.o(.bss*)
         */dummy_boot_seed.o(.bss*)
+        */dummy_device_id.o(.bss*)
         */tfm_spm_services.o(COMMON)
         */platform_retarget_dev.o(COMMON)
         */dummy_crypto_keys.o(COMMON)
         */dummy_nv_counters.o(COMMON)
         */dummy_boot_seed.o(COMMON)
+        */dummy_device_id.o(COMMON)
         . = ALIGN(32);
     } > RAM AT> FLASH
     Image$$TFM_UNPRIV_RO_DATA$$ZI$$Base = ADDR(.TFM_UNPRIV_RO_BSS);
diff --git a/platform/ext/target/musca_a/dummy_device_id.c b/platform/ext/target/musca_a/dummy_device_id.c
new file mode 100644
index 0000000..f7bbfe0
--- /dev/null
+++ b/platform/ext/target/musca_a/dummy_device_id.c
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2018 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "platform/include/tfm_plat_device_id.h"
+
+/*!
+ * \def DEVICE_ID_SIZE
+ *
+ * \brief Size of device ID in bytes
+ */
+#define DEVICE_ID_SIZE (16)
+
+/*!
+ * \def DEVICE_ID
+ *
+ * \brief Fixed value for device ID.
+ */
+#define DEVICE_ID    0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, \
+                     0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF
+
+static const uint8_t device_id[DEVICE_ID_SIZE] = {DEVICE_ID};
+
+int32_t tfm_plat_get_device_id(uint32_t size, uint8_t *buf)
+{
+    /* FixMe: This getter function must be ported per target platform. */
+
+    uint32_t i;
+    uint8_t *p_dst = buf;
+    const uint8_t *p_src = device_id;
+
+    if (size < DEVICE_ID_SIZE) {
+        return -1;
+    }
+
+    for (i = DEVICE_ID_SIZE; i > 0; i--) {
+        *p_dst = *p_src;
+        p_src++;
+        p_dst++;
+    }
+
+    return DEVICE_ID_SIZE;
+}
diff --git a/platform/ext/target/musca_b1/Device/Source/armclang/musca_s.sct b/platform/ext/target/musca_b1/Device/Source/armclang/musca_s.sct
index 80d901c..966a796 100644
--- a/platform/ext/target/musca_b1/Device/Source/armclang/musca_s.sct
+++ b/platform/ext/target/musca_b1/Device/Source/armclang/musca_s.sct
@@ -61,6 +61,7 @@
         dummy_crypto_keys.o (+RO)
         dummy_nv_counters.o (+RO)
         dummy_boot_seed.o (+RO)
+        dummy_device_id.o (+RO)
         platform_retarget_dev.o (+RO)
         *(SFN)
         *armlib*
@@ -141,6 +142,7 @@
         dummy_crypto_keys.o (+RW +ZI)
         dummy_nv_counters.o (+RW +ZI)
         dummy_boot_seed.o (+RW +ZI)
+        dummy_device_id.o (+RW +ZI)
         platform_retarget_dev.o (+RW +ZI)
     }
 
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 9d046b4..bf5796c 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
@@ -190,6 +190,8 @@
         *dummy_nv_counters.o(.rodata*)
         *dummy_boot_seed.o(.text*)
         *dummy_boot_seed.o(.rodata*)
+        *dummy_device_id.o(.text*)
+        *dummy_device_id.o(.rodata*)
         *platform_retarget_dev.o(.text*)
         *platform_retarget_dev.o(.rodata*)
         *(SFN)
@@ -412,6 +414,7 @@
         */dummy_crypto_keys.o(.data*)
         */dummy_nv_counters.o(.data*)
         */dummy_boot_seed.o(.data*)
+        */dummy_device_id.o(.data*)
         */platform_retarget_dev.o(.data*)
         . = ALIGN(32);
     } > RAM AT> FLASH
@@ -425,11 +428,13 @@
         */dummy_crypto_keys.o(.bss*)
         */dummy_nv_counters.o(.bss*)
         */dummy_boot_seed.o(.bss*)
+        */dummy_device_id.o(.bss*)
         */tfm_spm_services.o(COMMON)
         */platform_retarget_dev.o(COMMON)
         */dummy_crypto_keys.o(COMMON)
         */dummy_nv_counters.o(COMMON)
         */dummy_boot_seed.o(COMMON)
+        */dummy_device_id.o(COMMON)
         . = ALIGN(32);
     } > RAM AT> FLASH
     Image$$TFM_UNPRIV_RO_DATA$$ZI$$Base = ADDR(.TFM_UNPRIV_RO_BSS);
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 7ec8696..ccf5556 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
@@ -141,6 +141,8 @@
         *dummy_nv_counters.o(.rodata*)
         *dummy_boot_seed.o(.text*)
         *dummy_boot_seed.o(.rodata*)
+        *dummy_device_id.o(.text*)
+        *dummy_device_id.o(.rodata*)
         *platform_retarget_dev.o(.text*)
         *platform_retarget_dev.o(.rodata*)
         *(SFN)
@@ -273,6 +275,7 @@
         */dummy_crypto_keys.o(.data*)
         */dummy_nv_counters.o(.data*)
         */dummy_boot_seed.o(.data*)
+        */dummy_device_id.o(.data*)
         */platform_retarget_dev.o(.data*)
         . = ALIGN(32);
     } > RAM AT> FLASH
@@ -286,11 +289,13 @@
         */dummy_crypto_keys.o(.bss*)
         */dummy_nv_counters.o(.bss*)
         */dummy_boot_seed.o(.bss*)
+        */dummy_device_id.o(.bss*)
         */tfm_spm_services.o(COMMON)
         */platform_retarget_dev.o(COMMON)
         */dummy_crypto_keys.o(COMMON)
         */dummy_nv_counters.o(COMMON)
         */dummy_boot_seed.o(COMMON)
+        */dummy_device_id.o(COMMON)
         . = ALIGN(32);
     } > RAM AT> FLASH
     Image$$TFM_UNPRIV_RO_DATA$$ZI$$Base = ADDR(.TFM_UNPRIV_RO_BSS);
diff --git a/platform/ext/target/musca_b1/dummy_device_id.c b/platform/ext/target/musca_b1/dummy_device_id.c
new file mode 100644
index 0000000..f7bbfe0
--- /dev/null
+++ b/platform/ext/target/musca_b1/dummy_device_id.c
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2018 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "platform/include/tfm_plat_device_id.h"
+
+/*!
+ * \def DEVICE_ID_SIZE
+ *
+ * \brief Size of device ID in bytes
+ */
+#define DEVICE_ID_SIZE (16)
+
+/*!
+ * \def DEVICE_ID
+ *
+ * \brief Fixed value for device ID.
+ */
+#define DEVICE_ID    0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, \
+                     0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF
+
+static const uint8_t device_id[DEVICE_ID_SIZE] = {DEVICE_ID};
+
+int32_t tfm_plat_get_device_id(uint32_t size, uint8_t *buf)
+{
+    /* FixMe: This getter function must be ported per target platform. */
+
+    uint32_t i;
+    uint8_t *p_dst = buf;
+    const uint8_t *p_src = device_id;
+
+    if (size < DEVICE_ID_SIZE) {
+        return -1;
+    }
+
+    for (i = DEVICE_ID_SIZE; i > 0; i--) {
+        *p_dst = *p_src;
+        p_src++;
+        p_dst++;
+    }
+
+    return DEVICE_ID_SIZE;
+}
diff --git a/platform/include/tfm_plat_device_id.h b/platform/include/tfm_plat_device_id.h
new file mode 100644
index 0000000..eb7d1ba
--- /dev/null
+++ b/platform/include/tfm_plat_device_id.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2018, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#ifndef __TFM_PLAT_DEVICE_ID_H__
+#define __TFM_PLAT_DEVICE_ID_H__
+/**
+ * \file tfm_plat_device_id.h
+ * Provide the Universal Entity ID (UEID) of the device.
+ * It identifies the entire device or a submodule or subsystem. Must be
+ * universally and globally unique and immutable. Variable length with a
+ * maximum size of 33 bytes: 1 type byte and 256 bits.
+ */
+
+/**
+ * \note The interfaces defined in this file must be implemented for each
+ *       SoC.
+ */
+
+#include <stdint.h>
+#include "tfm_plat_defs.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \def DEVICE_ID_MAX_SIZE
+ *
+ * \brief Maximum size of device ID in bytes
+ */
+#define DEVICE_ID_MAX_SIZE (33u)
+
+/**
+ * \brief Get the UEID of the device.
+ *
+ * \param[in]  size The size of the buffer in bytes to store the UEID
+ * \param[out] buf  Pointer to the buffer to store the UEID
+ *
+ * \return  The size of device ID in bytes, if buffer big enough to store the
+ *          ID, otherwise -1.
+ */
+int32_t tfm_plat_get_device_id(uint32_t size, uint8_t *buf);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TFM_PLAT_DEVICE_ID_H__ */
diff --git a/secure_fw/CMakeLists.txt b/secure_fw/CMakeLists.txt
index ec583c3..9008f07 100644
--- a/secure_fw/CMakeLists.txt
+++ b/secure_fw/CMakeLists.txt
@@ -47,6 +47,7 @@
 set(BUILD_UART_STDOUT On)
 set(BUILD_FLASH On)
 set(BUILD_BOOT_SEED On)
+set(BUILD_DEVICE_ID On)
 if(NOT DEFINED PLATFORM_CMAKE_FILE)
 	message (FATAL_ERROR "Platform specific CMake is not defined. Please set PLATFORM_CMAKE_FILE.")
 elseif(NOT EXISTS ${PLATFORM_CMAKE_FILE})
diff --git a/secure_fw/core/CMakeLists.inc b/secure_fw/core/CMakeLists.inc
index 249bdc9..c7e4392 100644
--- a/secure_fw/core/CMakeLists.inc
+++ b/secure_fw/core/CMakeLists.inc
@@ -61,6 +61,7 @@
 set(BUILD_UART_STDOUT Off)
 set(BUILD_FLASH Off)
 set(BUILD_BOOT_SEED Off)
+set(BUILD_DEVICE_ID Off)
 if(NOT DEFINED PLATFORM_CMAKE_FILE)
 	message (FATAL_ERROR "Platform specific CMake is not defined. Please set PLATFORM_CMAKE_FILE.")
 elseif(NOT EXISTS ${PLATFORM_CMAKE_FILE})
diff --git a/secure_fw/services/secure_storage/CMakeLists.inc b/secure_fw/services/secure_storage/CMakeLists.inc
index bd270e4..a822e08 100644
--- a/secure_fw/services/secure_storage/CMakeLists.inc
+++ b/secure_fw/services/secure_storage/CMakeLists.inc
@@ -144,6 +144,7 @@
 	set(BUILD_UART_STDOUT Off)
 	set(BUILD_FLASH Off)
 	set(BUILD_BOOT_SEED Off)
+	set(BUILD_DEVICE_ID Off)
 	if(NOT DEFINED PLATFORM_CMAKE_FILE)
 		message (FATAL_ERROR "Platform specific CMake is not defined. Please set PLATFORM_CMAKE_FILE.")
 	elseif(NOT EXISTS ${PLATFORM_CMAKE_FILE})
diff --git a/secure_fw/spm/CMakeLists.inc b/secure_fw/spm/CMakeLists.inc
index 640234c..d1e57d8 100644
--- a/secure_fw/spm/CMakeLists.inc
+++ b/secure_fw/spm/CMakeLists.inc
@@ -50,6 +50,7 @@
 set(BUILD_UART_STDOUT Off)
 set(BUILD_FLASH Off)
 set(BUILD_BOOT_SEED Off)
+set(BUILD_DEVICE_ID Off)
 if(NOT DEFINED PLATFORM_CMAKE_FILE)
 	message (FATAL_ERROR "Platform specific CMake is not defined. Please set PLATFORM_CMAKE_FILE.")
 elseif(NOT EXISTS ${PLATFORM_CMAKE_FILE})
diff --git a/test/test_services/CMakeLists.inc b/test/test_services/CMakeLists.inc
index 521534a..7f25834 100644
--- a/test/test_services/CMakeLists.inc
+++ b/test/test_services/CMakeLists.inc
@@ -77,6 +77,7 @@
 set(BUILD_UART_STDOUT Off)
 set(BUILD_FLASH Off)
 set(BUILD_BOOT_SEED Off)
+set(BUILD_DEVICE_ID Off)
 if(NOT DEFINED PLATFORM_CMAKE_FILE)
 	message (FATAL_ERROR "Platform specific CMake is not defined. Please set PLATFORM_CMAKE_FILE.")
 elseif(NOT EXISTS ${PLATFORM_CMAKE_FILE})