From 1b058b6ccc4318f6805d96da5073debf99c764a5 Mon Sep 17 00:00:00 2001
From: Frazer Carsley <frazer.carsley@arm.com>
Date: Mon, 2 Mar 2026 14:37:12 +0000
Subject: [PATCH] plat: cs1k: Changed to use new GPT library

Corstone1000 already had a basic GPT parser implementation however
lacked full GPT support. Since the addition of the new GPT library, this
commit removes Corstone1000's parser and uses the library instead for
parsing/read operations. Because Corstone1000's firmware update
mechanism uses two banks with fixed offsets in each for the different
images/partitions, the GPT library is not used to modify any partitions.

The GPT library requires callers to register a pseudo-device driver and
this is implemented by the io_gpt module. As such, there is no need
anymore for the abstraction provided by the previous io_* modules, as
this new module handles the translation between LBAs and
sectors/addresses of flash.

Change-Id: I1bde0e482a4c5286997ae383f90648e9f8043083
Signed-off-by: Frazer Carsley <frazer.carsley@arm.com>
Upstream-Status: Submitted [https://review.trustedfirmware.org/c/TF-M/trusted-firmware-m/+/49429]
---
 .../target/arm/corstone1000/CMakeLists.txt    |  68 ++-
 .../arm/corstone1000/bl2/boot_hal_bl2.c       |  67 ++-
 .../arm/corstone1000/bootloader/fwu_agent.h   |  21 +-
 .../bootloader/mcuboot/tfm_mcuboot_fwu.c      | 328 +++++++----
 .../bootloader/mcuboot/uefi_fmp.c             |  13 +-
 .../arm/corstone1000/bootloader/uefi_fmp.h    |   3 +-
 .../ci_regression_tests/CMakeLists.txt        |  12 -
 .../Driver_Flash_SRAM_Emu.c                   | 327 -----------
 .../ci_regression_tests/s_io_storage_test.c   | 147 -----
 .../ci_regression_tests/s_io_storage_test.h   |  15 -
 .../corstone1000/ci_regression_tests/s_test.c |   3 +-
 .../ci_regression_tests/s_test_config.cmake   |  13 -
 .../ci_regression_tests/test_flash.h          |  25 -
 .../ext/target/arm/corstone1000/config.cmake  |   4 +
 .../corstone1000/fip_parser/external/uuid.h   |  74 ---
 .../arm/corstone1000/fip_parser/fip_parser.c  |  12 +-
 .../arm/corstone1000/fip_parser/fip_parser.h  |  26 +-
 .../ext/target/arm/corstone1000/io/io_block.c | 528 ------------------
 .../ext/target/arm/corstone1000/io/io_block.h |  40 --
 .../ext/target/arm/corstone1000/io/io_defs.h  |  27 -
 .../target/arm/corstone1000/io/io_driver.h    |  54 --
 .../ext/target/arm/corstone1000/io/io_flash.c | 183 ------
 .../ext/target/arm/corstone1000/io/io_flash.h |  37 --
 .../ext/target/arm/corstone1000/io/io_gpt.c   | 179 ++++++
 .../ext/target/arm/corstone1000/io/io_gpt.h   |  25 +
 .../target/arm/corstone1000/io/io_storage.c   | 289 ----------
 .../target/arm/corstone1000/io/io_storage.h   |  92 ---
 .../target/arm/corstone1000/partition/efi.h   |  37 --
 .../target/arm/corstone1000/partition/gpt.c   |  58 --
 .../target/arm/corstone1000/partition/gpt.h   |  51 --
 .../target/arm/corstone1000/partition/mbr.h   |  29 -
 .../arm/corstone1000/partition/partition.c    | 324 -----------
 .../arm/corstone1000/partition/partition.h    |  48 --
 .../target/arm/corstone1000/partition/uuid.h  |  76 ---
 .../ext/target/arm/corstone1000/platform.c    |  71 +--
 .../ext/target/arm/corstone1000/platform.h    |  32 +-
 .../arm/corstone1000/soft_crc/soft_crc.c      | 121 ----
 .../arm/corstone1000/soft_crc/soft_crc.h      |  18 -
 38 files changed, 606 insertions(+), 2871 deletions(-)
 delete mode 100644 platform/ext/target/arm/corstone1000/ci_regression_tests/Driver_Flash_SRAM_Emu.c
 delete mode 100644 platform/ext/target/arm/corstone1000/ci_regression_tests/s_io_storage_test.c
 delete mode 100644 platform/ext/target/arm/corstone1000/ci_regression_tests/s_io_storage_test.h
 delete mode 100644 platform/ext/target/arm/corstone1000/ci_regression_tests/s_test_config.cmake
 delete mode 100644 platform/ext/target/arm/corstone1000/ci_regression_tests/test_flash.h
 delete mode 100644 platform/ext/target/arm/corstone1000/fip_parser/external/uuid.h
 delete mode 100644 platform/ext/target/arm/corstone1000/io/io_block.c
 delete mode 100644 platform/ext/target/arm/corstone1000/io/io_block.h
 delete mode 100644 platform/ext/target/arm/corstone1000/io/io_defs.h
 delete mode 100644 platform/ext/target/arm/corstone1000/io/io_driver.h
 delete mode 100644 platform/ext/target/arm/corstone1000/io/io_flash.c
 delete mode 100644 platform/ext/target/arm/corstone1000/io/io_flash.h
 create mode 100644 platform/ext/target/arm/corstone1000/io/io_gpt.c
 create mode 100644 platform/ext/target/arm/corstone1000/io/io_gpt.h
 delete mode 100644 platform/ext/target/arm/corstone1000/io/io_storage.c
 delete mode 100644 platform/ext/target/arm/corstone1000/io/io_storage.h
 delete mode 100644 platform/ext/target/arm/corstone1000/partition/efi.h
 delete mode 100644 platform/ext/target/arm/corstone1000/partition/gpt.c
 delete mode 100644 platform/ext/target/arm/corstone1000/partition/gpt.h
 delete mode 100644 platform/ext/target/arm/corstone1000/partition/mbr.h
 delete mode 100644 platform/ext/target/arm/corstone1000/partition/partition.c
 delete mode 100644 platform/ext/target/arm/corstone1000/partition/partition.h
 delete mode 100644 platform/ext/target/arm/corstone1000/partition/uuid.h
 delete mode 100644 platform/ext/target/arm/corstone1000/soft_crc/soft_crc.c
 delete mode 100644 platform/ext/target/arm/corstone1000/soft_crc/soft_crc.h

diff --git a/platform/ext/target/arm/corstone1000/CMakeLists.txt b/platform/ext/target/arm/corstone1000/CMakeLists.txt
index 58edae74e..7168c1ca9 100644
--- a/platform/ext/target/arm/corstone1000/CMakeLists.txt
+++ b/platform/ext/target/arm/corstone1000/CMakeLists.txt
@@ -116,9 +116,11 @@ target_include_directories(platform_s
     INTERFACE
         cc312
         bootloader
-        soft_crc
         io
         partition
+        ${CMAKE_SOURCE_DIR}/lib/ext/efi_soft_crc/inc
+        ${CMAKE_SOURCE_DIR}/lib/efi_guid/inc
+        ${CMAKE_SOURCE_DIR}/lib/gpt/inc
 )
 
 target_sources(platform_s
@@ -135,19 +137,23 @@ target_sources(platform_s
         $<$<BOOL:TFM_PARTITION_PLATFORM>:${CMAKE_CURRENT_SOURCE_DIR}/services/src/tfm_platform_system.c>
         bootloader/mcuboot/tfm_mcuboot_fwu.c
         bootloader/mcuboot/uefi_fmp.c
-        soft_crc/soft_crc.c
-        io/io_block.c
-        io/io_flash.c
-        io/io_storage.c
-        partition/partition.c
-        partition/gpt.c
         $<$<NOT:$<BOOL:${PLATFORM_DEFAULT_OTP}>>:${PLATFORM_DIR}/ext/accelerator/cc312/otp_cc312.c>
         rse_comms_permissions_hal.c
         mem_check_v6m_v7m_hal.c
         ${PLATFORM_DIR}/ext/common/mem_check_v6m_v7m.c
+        io/io_gpt.c
         platform.c
 )
 
+target_link_libraries(platform_s
+    PUBLIC
+        tfm_log
+    PRIVATE
+        tfm_efi_soft_crc
+        tfm_efi_guid
+        tfm_gpt
+)
+
 if (PLATFORM_IS_FVP)
 target_sources(platform_s
     PRIVATE
@@ -167,6 +173,9 @@ target_compile_definitions(platform_s
     PUBLIC
         $<$<BOOL:${EXTERNAL_SYSTEM_SUPPORT}>:EXTERNAL_SYSTEM_SUPPORT>
         $<$<BOOL:${PLATFORM_IS_FVP}>:PLATFORM_IS_FVP>
+        TFM_GPT_BLOCK_SIZE=${TFM_GPT_BLOCK_SIZE}
+        PLAT_MAX_PARTITION_ENTRIES=${PLAT_MAX_PARTITION_ENTRIES}
+        LOG_LEVEL=${GPT_LOG_LEVEL}
     PRIVATE
         $<$<BOOL:${TFM_S_REG_TEST}>:TFM_S_REG_TEST>
         $<$<BOOL:${ENABLE_FWU_AGENT_DEBUG_LOGS}>:ENABLE_FWU_AGENT_DEBUG_LOGS>
@@ -200,7 +209,6 @@ target_sources(platform_bl1_1
         ./bl1/provisioning.c
         ./bootloader/mcuboot/tfm_mcuboot_fwu.c
         ./bootloader/mcuboot/uefi_fmp.c
-        ./soft_crc/soft_crc.c
         $<$<NOT:$<BOOL:${PLATFORM_DEFAULT_OTP}>>:${PLATFORM_DIR}/ext/accelerator/cc312/otp_cc312.c>
         $<$<NOT:$<BOOL:${TFM_BL1_SOFTWARE_CRYPTO}>>:${CMAKE_CURRENT_SOURCE_DIR}/bl1/cc312_rom_crypto.c>
         $<$<NOT:$<BOOL:${TFM_BL1_SOFTWARE_CRYPTO}>>:${CMAKE_CURRENT_SOURCE_DIR}/bl1/cc312_rom_trng.c>
@@ -231,7 +239,6 @@ target_include_directories(platform_bl1_1_interface
         ./Native_Driver
         ./CMSIS_Driver/Config
         ./bootloader
-        ./soft_crc
         ${PLATFORM_DIR}/ext/target/arm/drivers/flash/cfi
         ${PLATFORM_DIR}/ext/target/arm/drivers/flash/common
         ${PLATFORM_DIR}/ext/target/arm/drivers/flash/strata
@@ -243,16 +250,22 @@ target_include_directories(platform_bl1_1_interface
         $<$<BOOL:${CRYPTO_HW_ACCELERATOR}>:${CMAKE_SOURCE_DIR}/platform/ext/accelerator/interface>
         ${PLATFORM_DIR}/ext/accelerator/cc312/
         ${CMAKE_SOURCE_DIR}/lib/fih/inc/
+        ${CMAKE_SOURCE_DIR}/lib/gpt/inc # for GPT_ENTRY_NAME_LENGTH
 )
 
 target_link_libraries(platform_bl1_1
     PRIVATE
         $<$<NOT:$<BOOL:${TFM_BL1_SOFTWARE_CRYPTO}>>:cc3xx>
+        tfm_efi_soft_crc
+        tfm_efi_guid
 )
 
 target_include_directories(platform_bl1_1
     PRIVATE
     ${CMAKE_SOURCE_DIR}/interface/include # for psa/error.h
+    ${CMAKE_SOURCE_DIR}/lib/ext/efi_soft_crc/inc
+    ${CMAKE_SOURCE_DIR}/lib/efi_guid/inc
+    ${CMAKE_SOURCE_DIR}/lib/gpt/inc
 )
 
 target_sources(platform_bl1_2
@@ -281,7 +294,6 @@ target_include_directories(platform_bl1_2
         ./Native_Driver
         ./CMSIS_Driver/Config
         ./bootloader
-        ./soft_crc
         ${PLATFORM_DIR}/ext/target/arm/drivers/flash/common
         ${PLATFORM_DIR}/ext/target/arm/drivers/flash/cfi
         ${PLATFORM_DIR}/ext/target/arm/drivers/flash/strata
@@ -290,6 +302,15 @@ target_include_directories(platform_bl1_2
         ${PLATFORM_DIR}/ext/target/arm/drivers/flash/sst26vf064b/
         ${PLATFORM_DIR}/ext/accelerator/cc312/
         ${CMAKE_SOURCE_DIR}/interface/include # for psa/error.h
+        ${CMAKE_SOURCE_DIR}/lib/ext/efi_soft_crc/inc
+        ${CMAKE_SOURCE_DIR}/lib/efi_guid/inc
+        ${CMAKE_SOURCE_DIR}/lib/gpt/inc # for GPT_ENTRY_NAME_LENGTH
+)
+
+target_link_libraries(platform_bl1_2
+    PRIVATE
+        tfm_efi_soft_crc
+        tfm_efi_guid
 )
 
 #========================= Platform BL2 =======================================#
@@ -309,12 +330,7 @@ target_sources(platform_bl2
         bootloader/mcuboot/tfm_mcuboot_fwu.c
         bl2/security_cnt_bl2.c
         $<$<NOT:$<BOOL:${PLATFORM_DEFAULT_OTP}>>:${PLATFORM_DIR}/ext/accelerator/cc312/otp_cc312.c>
-        io/io_block.c
-        io/io_flash.c
-        io/io_storage.c
-        soft_crc/soft_crc.c
-        partition/partition.c
-        partition/gpt.c
+        io/io_gpt.c
         platform.c
 )
 
@@ -334,6 +350,10 @@ target_sources(platform_bl2
 endif()
 
 target_compile_definitions(platform_bl2
+    PUBLIC
+        TFM_GPT_BLOCK_SIZE=${TFM_GPT_BLOCK_SIZE}
+        PLAT_MAX_PARTITION_ENTRIES=${PLAT_MAX_PARTITION_ENTRIES}
+        LOG_LEVEL=${GPT_LOG_LEVEL}
     PRIVATE
         $<$<BOOL:${PLATFORM_IS_FVP}>:PLATFORM_IS_FVP>
         $<$<BOOL:${TFM_S_REG_TEST}>:TFM_S_REG_TEST>
@@ -353,6 +373,14 @@ target_sources(bl2
 target_link_libraries(bl2
     PRIVATE
         $<$<BOOL:${PLATFORM_PSA_ADAC_SECURE_DEBUG}>:trusted-firmware-m-psa-adac>
+        tfm_log
+)
+
+target_link_libraries(platform_bl2
+    PRIVATE
+        tfm_gpt
+        tfm_efi_soft_crc
+        tfm_efi_guid
 )
 
 target_compile_definitions(bl2
@@ -365,6 +393,10 @@ target_compile_definitions(bl2
 target_include_directories(bl2
     PRIVATE
        ${CMAKE_SOURCE_DIR}/interface/include # for psa/error.h
+       ${CMAKE_SOURCE_DIR}/lib/efi_guid/inc # for efi_guid_structs.h
+       ${CMAKE_SOURCE_DIR}/lib/gpt/inc
+       ${CMAKE_SOURCE_DIR}/lib/tfm_log/inc
+       ${CMAKE_SOURCE_DIR}/lib/tfm_vprintf/inc
 )
 
 target_compile_definitions(bootutil
@@ -379,7 +411,6 @@ target_include_directories(platform_bl2
         fip_parser
         Native_Driver
         bootloader
-        soft_crc
         io
         ${PLATFORM_DIR}/ext/target/arm/drivers/flash/common
         ${PLATFORM_DIR}/ext/target/arm/drivers/flash/cfi
@@ -398,6 +429,9 @@ target_include_directories(platform_bl2
         ${CMAKE_BINARY_DIR}/bl2/ext/mcuboot # for mcuboot_config.h only
         $<BUILD_INTERFACE:${BL2_SOURCE}/ext/mcuboot/include>
         ${CMAKE_SOURCE_DIR}/interface/include # for psa/error.h
+        ${CMAKE_SOURCE_DIR}/lib/ext/efi_soft_crc/inc
+        ${CMAKE_SOURCE_DIR}/lib/efi_guid/inc
+        ${CMAKE_SOURCE_DIR}/lib/gpt/inc
 )
 
 #========================= ns_agent_mailbox ===================================#
diff --git a/platform/ext/target/arm/corstone1000/bl2/boot_hal_bl2.c b/platform/ext/target/arm/corstone1000/bl2/boot_hal_bl2.c
index bf7b62881..1ed111af6 100644
--- a/platform/ext/target/arm/corstone1000/bl2/boot_hal_bl2.c
+++ b/platform/ext/target/arm/corstone1000/bl2/boot_hal_bl2.c
@@ -5,6 +5,7 @@
  *
  */
 
+#include <errno.h>
 #include <stdio.h>
 #include <string.h>
 #include "tfm_hal_device_header.h"
@@ -31,8 +32,8 @@
 #include "crypto_hw.h"
 #endif
 
-#include "efi.h"
-#include "partition.h"
+#include "gpt.h"
+#include "io_gpt.h"
 #include "platform.h"
 
 static const char* const tfm_part_names[] = {"tfm_primary", "tfm_secondary"};
@@ -49,6 +50,14 @@ REGION_DECLARE(Image$$, ARM_LIB_HEAP, $$ZI$$Limit)[];
 #define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0]))
 extern struct flash_area flash_map[];
 
+static void ascii_to_unicode(const char *ascii, char *unicode)
+{
+    for (int i = 0; i < strlen(ascii) + 1; ++i) {
+        unicode[i << 1] = ascii[i];
+        unicode[(i << 1) + 1] = '\0';
+    }
+}
+
 static bool fill_flash_map_with_tfm_data(uint8_t boot_index) {
 
     if (boot_index >= ARRAY_SIZE(tfm_part_names)) {
@@ -56,14 +65,28 @@ static bool fill_flash_map_with_tfm_data(uint8_t boot_index) {
                      boot_index, ARRAY_SIZE(tfm_part_names));
         return false;
     }
-    const partition_entry_t *tfm_entry =
-        get_partition_entry(tfm_part_names[boot_index]);
-    if (tfm_entry == NULL) {
+
+    /* Convert ascii to unicode so GPT library understands */
+    char unicode_name[GPT_ENTRY_NAME_LENGTH] = {'\0'};
+    ascii_to_unicode(tfm_part_names[boot_index], unicode_name);
+    struct partition_entry_t tfm_entry;
+    psa_status_t ret = gpt_entry_read_by_name(
+            unicode_name,
+            0,
+            &tfm_entry);
+    if (ret == PSA_ERROR_DOES_NOT_EXIST) {
+        BOOT_LOG_ERR("Could not find partition %s", tfm_part_names[boot_index]);
+        return false;
+    } else if (ret == PSA_ERROR_STORAGE_FAILURE) {
+        BOOT_LOG_ERR("%s: I/O error occurred with flash device", __func__);
+        return false;
+    } else if (ret < 0) {
         BOOT_LOG_ERR("Could not find partition %s", tfm_part_names[boot_index]);
         return false;
     }
-    flash_map[0].fa_off = tfm_entry->start;
-    flash_map[0].fa_size = tfm_entry->length;
+
+    flash_map[0].fa_off = tfm_entry.start * TFM_GPT_BLOCK_SIZE;
+    flash_map[0].fa_size = tfm_entry.size * TFM_GPT_BLOCK_SIZE;
     return true;
 }
 
@@ -80,15 +103,27 @@ static bool fill_flash_map_with_fip_data(uint8_t boot_index) {
                      boot_index, ARRAY_SIZE(fip_part_names));
         return false;
     }
-    const partition_entry_t *fip_entry =
-        get_partition_entry(fip_part_names[boot_index]);
-    if (fip_entry == NULL) {
+
+    struct partition_entry_t fip_entry;
+    char unicode_name[GPT_ENTRY_NAME_LENGTH] = {'\0'};
+    ascii_to_unicode(fip_part_names[boot_index], unicode_name);
+    psa_status_t ret = gpt_entry_read_by_name(
+            unicode_name,
+            0,
+            &fip_entry);
+    if (ret == PSA_ERROR_DOES_NOT_EXIST) {
+        BOOT_LOG_ERR("Could not find partition %s", fip_part_names[boot_index]);
+        return false;
+    } else if (ret == PSA_ERROR_STORAGE_FAILURE) {
+        BOOT_LOG_ERR("%s: I/O error occurred with flash device", __func__);
+        return false;
+    } else if (ret < 0) {
         BOOT_LOG_ERR("Could not find partition %s", fip_part_names[boot_index]);
         return false;
     }
 
-    fip_offset = fip_entry->start;
-    fip_size = fip_entry->length;
+    fip_offset = fip_entry.start * TFM_GPT_BLOCK_SIZE;
+    fip_size = fip_entry.size * TFM_GPT_BLOCK_SIZE;
 
     /* parse directly from flash using XIP mode */
     /* FIP is large so its not a good idea to load it in memory */
@@ -130,20 +165,21 @@ int32_t boot_platform_init(void)
     }
 
     plat_io_storage_init();
-    partition_init(PLATFORM_GPT_IMAGE);
+    gpt_init(&io_gpt_flash_driver, PLAT_GPT_MAX_PARTITIONS);
 
     boot_index = bl2_get_boot_bank();
 
+    result = 0;
     if (!fill_flash_map_with_tfm_data(boot_index)
 #ifndef TFM_S_REG_TEST
     || !fill_flash_map_with_fip_data(boot_index)
 #endif
     ) {
         BOOT_LOG_ERR("Filling flash map has failed!");
-        return 1;
+        result = 1;
     }
 
-    return 0;
+    return result;
 }
 
 int32_t boot_platform_post_init(void)
@@ -223,5 +259,6 @@ void boot_platform_start_next_image(struct boot_arm_vector_table *vt)
     __DSB();
     __ISB();
 
+    gpt_uninit();
     boot_jump_to_next_image(vt_cpy->reset);
 }
diff --git a/platform/ext/target/arm/corstone1000/bootloader/fwu_agent.h b/platform/ext/target/arm/corstone1000/bootloader/fwu_agent.h
index aa5af15b2..4393f5f7b 100644
--- a/platform/ext/target/arm/corstone1000/bootloader/fwu_agent.h
+++ b/platform/ext/target/arm/corstone1000/bootloader/fwu_agent.h
@@ -9,7 +9,8 @@
 #define FWU_AGENT_H
 
 #include "psa/error.h"
-#include "../fip_parser/external/uuid.h"
+#include "efi_guid_structs.h"
+#include "gpt.h"
 
 #define ENABLE_FWU_AGENT_DEBUG_LOGS
 #ifdef ENABLE_FWU_AGENT_DEBUG_LOGS
@@ -29,6 +30,9 @@
 /* Version used for the very first image of the device. */
 #define FWU_IMAGE_INITIAL_VERSION 0
 
+/* Maximum ascii name length of image */
+#define FWU_IMAGE_NAME_LENGTH (GPT_ENTRY_NAME_LENGTH >> 1)
+
 #define EFI_SYSTEM_RESOURCE_TABLE_FIRMWARE_RESOURCE_VERSION  1
 typedef struct {
     uint32_t signature;
@@ -43,21 +47,24 @@ typedef struct {
     size_t image_size_recvd;
 } __packed fmp_header_image_info_t;
 
-/* Store image information common for both the banks */
+/* Image information common for both the banks */
 typedef struct {
     /* Total size of the image */
     uint32_t image_size;
 
-    /* Offset of image within a bank */
+    /* Offset of image within a bank. */
     uint32_t image_offset;
 
-    /* Image GUID */
-    struct efi_guid image_guid;
-} __packed fwu_bank_image_info_t;
+    /* Name of the image in ascii */
+    char image_name[FWU_IMAGE_NAME_LENGTH];
+
+    /* Image-type GUID */
+    struct efi_guid_t image_type;
+} fwu_image_info_t;
 
 /* ESRT v1 */
 struct __attribute__((__packed__)) efi_system_resource_entry {
-    struct   efi_guid fw_class;
+    struct   efi_guid_t fw_class;
     uint32_t fw_type;
     uint32_t fw_version;
     uint32_t lowest_supported_fw_version;
diff --git a/platform/ext/target/arm/corstone1000/bootloader/mcuboot/tfm_mcuboot_fwu.c b/platform/ext/target/arm/corstone1000/bootloader/mcuboot/tfm_mcuboot_fwu.c
index dc7503d41..5e1c4ecc5 100644
--- a/platform/ext/target/arm/corstone1000/bootloader/mcuboot/tfm_mcuboot_fwu.c
+++ b/platform/ext/target/arm/corstone1000/bootloader/mcuboot/tfm_mcuboot_fwu.c
@@ -4,17 +4,19 @@
  * SPDX-License-Identifier: BSD-3-Clause
  *
  */
+#include <errno.h>
 #include <string.h>
 #include "psa/crypto.h"
 #include "psa/error.h"
 #include "tfm_bootloader_fwu_abstraction.h"
+#include "efi_soft_crc.h"
 
 #include <stdint.h>
 #include <string.h>
 #include "fwu_agent.h"
 #include "Driver_Flash.h"
+#include "efi_guid_structs.h"
 #include "flash_layout.h"
-#include "fip_parser/external/uuid.h"
 #include "region_defs.h"
 #include "flash_common.h"
 #include "platform_base_address.h"
@@ -23,10 +25,10 @@
 #include "tfm_plat_defs.h"
 #include "uefi_fmp.h"
 #include "uart_stdout.h"
-#include "soft_crc.h"
 #ifndef BL1_BUILD
-#include "partition.h"
+#include "gpt.h"
 #include "platform.h"
+#include "io_gpt.h"
 #endif
 
 #define FWU_METADATA_VERSION		2
@@ -72,7 +74,7 @@
 struct fwu_image_properties {
 
         /* The UUID of the image in this bank */
-        uuid_t img_uuid;
+        struct efi_guid_t img_uuid;
 
         /* [0]: bit describing the image acceptance status –
          * status - 1 means the image is accepted
@@ -90,10 +92,10 @@ struct fwu_image_properties {
 struct fwu_image_entry {
 
         /* The UUID identifying the image type */
-        uuid_t img_type_uuid;
+        struct efi_guid_t img_type_uuid;
 
         /* The UUID of the storage volume where the image is located */
-        uuid_t location_uuid;
+        struct efi_guid_t location_uuid;
 
         /* The Properties of images with img_type_uuid in the different FW banks */
         struct fwu_image_properties img_props[NR_OF_FW_BANKS];
@@ -206,99 +208,114 @@ struct __attribute__((__packed__)) fwu_esrt_data_wrapper {
  * The GUIDs are generating with the UUIDv5 format.
  * Namespace used for FVP GUIDs: 989f3a4e-46e0-4cd0-9877-a25c70c01329
  * Namespace used for MPS3 GUIDs: df1865d1-90fb-4d59-9c38-c9f2c1bba8cc
- * Names: the image names stated in the fw_name field
  */
-fwu_bank_image_info_t fwu_image[NR_OF_IMAGES_IN_FW_BANK] = {
+const fwu_image_info_t fwu_image[NR_OF_IMAGES_IN_FW_BANK] = {
 #if PLATFORM_IS_FVP
     // FVP payloads GUIDs
-    // bl2_signed
     {
+        .image_name = "bl2_secondary",
         .image_size = SE_BL2_PARTITION_SIZE,
         .image_offset = SE_BL2_PARTITION_BANK_OFFSET,
-        .image_guid = {
+        .image_type = {
             .time_low = 0xf1d883f9,
             .time_mid = 0xdfeb,
             .time_hi_and_version = 0x5363,
-            .clock_seq_and_node = {0x98, 0xd8, 0x68, 0x6e, 0xe3, 0xb6, 0x9f, 0x4f}
+            .clock_seq_hi_and_reserved = 0x98,
+            .clock_seq_low = 0xd8,
+            .node = {0x68, 0x6e, 0xe3, 0xb6, 0x9f, 0x4f}
         },
     },
-    // tfm_s_signed
     {
+        .image_name = "tfm_secondary",
         .image_size = TFM_PARTITION_SIZE,
         .image_offset = TFM_PARTITION_BANK_OFFSET,
-        .image_guid = {
+        .image_type = {
             .time_low = 0x7fad470e,
             .time_mid = 0x5ec5,
             .time_hi_and_version = 0x5c03,
-            .clock_seq_and_node = {0xa2, 0xc1, 0x47, 0x56, 0xb4, 0x95, 0xde, 0x61}
+            .clock_seq_hi_and_reserved = 0xa2,
+            .clock_seq_low = 0xc1,
+            .node = {0x47, 0x56, 0xb4, 0x95, 0xde, 0x61}
         },
     },
-    // signed_fip-corstone1000
     {
+        .image_name = "FIP_B",
         .image_size = FIP_PARTITION_SIZE,
         .image_offset = FIP_PARTITION_BANK_OFFSET,
-        .image_guid = {
+        .image_type = {
             .time_low = 0xf1933675,
             .time_mid = 0x5a8c,
             .time_hi_and_version = 0x5b6d,
-            .clock_seq_and_node = {0x9e, 0xf4, 0x84, 0x67, 0x39, 0xe8, 0x9b, 0xc8}
+            .clock_seq_hi_and_reserved = 0x9e,
+            .clock_seq_low = 0xf4,
+            .node = {0x84, 0x67, 0x39, 0xe8, 0x9b, 0xc8}
         },
     },
-    // Image.gz-initramfs-corstone1000-fvp
     {
+        .image_name = "kernel_secondary",
         .image_size = INITRAMFS_PARTITION_SIZE,
         .image_offset = INITRAMFS_PARTITION_BANK_OFFSET,
-        .image_guid = {
+        .image_type = {
             .time_low = 0xf771aff9,
             .time_mid = 0xc7e9,
             .time_hi_and_version = 0x5f99,
-            .clock_seq_and_node = {0x9e, 0xda, 0x23, 0x69, 0xdd, 0x69, 0x4f, 0x61}
+            .clock_seq_hi_and_reserved = 0x9e,
+            .clock_seq_low = 0xda,
+            .node = {0x23, 0x69, 0xdd, 0x69, 0x4f, 0x61}
         },
     },
 #else
     // MPS3 payloads GUIDs
-    // bl2_signed payload GUID
     {
+        .image_name = "bl2_secondary",
         .image_size = SE_BL2_PARTITION_SIZE,
         .image_offset = SE_BL2_PARTITION_BANK_OFFSET,
-        .image_guid = {
+        .image_type = {
             .time_low = 0xfbfbefaa,
             .time_mid = 0x0a56,
             .time_hi_and_version = 0x50d5,
-            .clock_seq_and_node = {0xb6, 0x51, 0x74, 0x09, 0x1d, 0x3d, 0x62, 0xcf}
+            .clock_seq_hi_and_reserved = 0xb6,
+            .clock_seq_low = 0x51,
+            .node = {0x74, 0x09, 0x1d, 0x3d, 0x62, 0xcf}
         },
     },
-    // tfm_s_signed
     {
+        .image_name = "tfm_secondary",
         .image_size = TFM_PARTITION_SIZE,
         .image_offset = TFM_PARTITION_BANK_OFFSET,
-        .image_guid = {
+        .image_type = {
             .time_low = 0xaf4cc7ad,
             .time_mid = 0xee2e,
             .time_hi_and_version = 0x5a39,
-            .clock_seq_and_node = {0xaa, 0xd5, 0xfa, 0xc8, 0xa1, 0xe6, 0x17, 0x3c}
-        },
+            .clock_seq_hi_and_reserved = 0xaa,
+            .clock_seq_low = 0xd5,
+            .node = {0xfa, 0xc8, 0xa1, 0xe6, 0x17, 0x3c}
+        }
     },
-    // signed_fip-corstone1000
     {
+        .image_name = "FIP_B",
         .image_size = FIP_PARTITION_SIZE,
         .image_offset = FIP_PARTITION_BANK_OFFSET,
-        .image_guid = {
+        .image_type = {
             .time_low = 0x55302f96,
             .time_mid = 0xc4f0,
             .time_hi_and_version = 0x5cf9,
-            .clock_seq_and_node = {0x86, 0x24, 0xe7, 0xcc, 0x38, 0x8f, 0x2b, 0x68}
-        },
+            .clock_seq_hi_and_reserved = 0x86,
+            .clock_seq_low = 0x24,
+            .node = {0xe7, 0xcc, 0x38, 0x8f, 0x2b, 0x68}
+        }
     },
-    // Image.gz-initramfs-corstone1000-mps3
     {
+        .image_name = "kernel_secondary",
         .image_size = INITRAMFS_PARTITION_SIZE,
         .image_offset = INITRAMFS_PARTITION_BANK_OFFSET,
-        .image_guid = {
+        .image_type = {
             .time_low = 0x3e8ac972,
             .time_mid = 0xc33c,
             .time_hi_and_version = 0x5cc9,
-            .clock_seq_and_node = {0x90, 0xa0, 0xcd, 0xd3, 0x15, 0x96, 0x83, 0xea}
+            .clock_seq_hi_and_reserved = 0x90,
+            .clock_seq_low = 0xa0,
+            .node = {0xcd, 0xd3, 0x15, 0x96, 0x83, 0xea}
         },
     },
 #endif
@@ -370,8 +387,8 @@ static psa_status_t private_metadata_read(
 static psa_status_t private_metadata_read(
         struct fwu_private_metadata* priv_metadata)
 {
-    partition_entry_t *part;
-    uuid_t private_uuid = PRIVATE_METADATA_TYPE_UUID;
+    struct partition_entry_t part;
+    struct efi_guid_t private_uuid = PRIVATE_METADATA_TYPE_UUID;
 
     FWU_LOG_FUNC_ENTER;
 
@@ -380,13 +397,19 @@ static psa_status_t private_metadata_read(
         return PSA_ERROR_INVALID_ARGUMENT;
     }
 
-    part = get_partition_entry_by_type(&private_uuid);
-    if (!part) {
+    psa_status_t ret = gpt_entry_read_by_type(&private_uuid, 0, &part);
+    if (ret == PSA_ERROR_DOES_NOT_EXIST) {
         FWU_LOG_MSG("Private metadata partition not found\n\r");
-        return PSA_ERROR_GENERIC_ERROR;
+        return ret;
+    } else if (ret == PSA_ERROR_STORAGE_FAILURE) {
+        FWU_LOG_MSG("%s : ERROR - flash failure reading private metadata\n\r", __func__);
+        return ret;
+    } else if (ret < 0) {
+        FWU_LOG_MSG("Unable to find private metadata partition, ret: %d\n\r", ret);
+        return ret;
     }
 
-    int ret = FWU_METADATA_FLASH_DEV.ReadData(part->start, priv_metadata,
+    ret = FWU_METADATA_FLASH_DEV.ReadData(part.start * TFM_GPT_BLOCK_SIZE, priv_metadata,
                                           sizeof(*priv_metadata));
     if (ret < 0) {
         FWU_LOG_MSG("%s: ERROR - Flash read failed (ret = %d)\n\r", __func__, ret);
@@ -444,8 +467,8 @@ static psa_status_t private_metadata_write(
 static psa_status_t private_metadata_write(
         struct fwu_private_metadata* priv_metadata)
 {
-    uuid_t private_uuid = PRIVATE_METADATA_TYPE_UUID;
-    partition_entry_t *part;
+    struct efi_guid_t private_uuid = PRIVATE_METADATA_TYPE_UUID;
+    struct partition_entry_t part;
 
     FWU_LOG_MSG("%s: enter: boot_index = %u\n\r", __func__,
                         priv_metadata->boot_index);
@@ -455,19 +478,25 @@ static psa_status_t private_metadata_write(
         return PSA_ERROR_INVALID_ARGUMENT;
     }
 
-    part = get_partition_entry_by_type(&private_uuid);
-    if (!part) {
+    psa_status_t ret = gpt_entry_read_by_type(&private_uuid, 0, &part);
+    if (ret == PSA_ERROR_DOES_NOT_EXIST) {
         FWU_LOG_MSG("Private metadata partition not found\n\r");
-        return PSA_ERROR_GENERIC_ERROR;
+        return ret;
+    } else if (ret == PSA_ERROR_STORAGE_FAILURE) {
+        FWU_LOG_MSG("%s: ERROR - flash failure reading private metadata\n\r", __func__);
+        return ret;
+    } else if (ret < 0) {
+        FWU_LOG_MSG("Unable to find private metadata partition, ret: %d\n\r", ret);
+        return ret;
     }
 
-    int ret = FWU_METADATA_FLASH_DEV.EraseSector(part->start);
+    ret = FWU_METADATA_FLASH_DEV.EraseSector(part.start * TFM_GPT_BLOCK_SIZE);
     if (ret != ARM_DRIVER_OK) {
         FWU_LOG_MSG("%s: ERROR - Flash erase failed (ret = %d)\n\r", __func__, ret);
         return PSA_ERROR_STORAGE_FAILURE;
     }
 
-    ret = FWU_METADATA_FLASH_DEV.ProgramData(part->start,
+    ret = FWU_METADATA_FLASH_DEV.ProgramData(part.start * TFM_GPT_BLOCK_SIZE,
                                 priv_metadata, sizeof(*priv_metadata));
     if (ret < 0) {
         FWU_LOG_MSG("%s: ERROR - Flash write failed (ret = %d)\n\r", __func__, ret);
@@ -494,8 +523,10 @@ static psa_status_t metadata_validate(struct fwu_metadata *metadata)
         return PSA_ERROR_INVALID_ARGUMENT;
     }
 
-    uint32_t calculated_crc32 = crc32((uint8_t *)&(metadata->version),
-                                      sizeof(*metadata) - sizeof(uint32_t));
+    uint32_t calculated_crc32 = efi_soft_crc32_update(
+            0,
+            (uint8_t *)&(metadata->version),
+            sizeof(*metadata) - sizeof(uint32_t));
 
     if (metadata->crc_32 != calculated_crc32) {
         FWU_LOG_MSG("%s: failed: crc32 calculated: 0x%x, given: 0x%x\n\r", __func__,
@@ -558,8 +589,8 @@ static psa_status_t metadata_read(struct fwu_metadata *metadata, uint8_t replica
 #else
 static psa_status_t metadata_read(struct fwu_metadata *metadata, uint8_t replica_num)
 {
-    uuid_t metadata_uuid = FWU_METADATA_TYPE_UUID;
-    partition_entry_t *part;
+    struct efi_guid_t metadata_uuid = FWU_METADATA_TYPE_UUID;
+    struct partition_entry_t part;
 
     FWU_LOG_FUNC_ENTER;
 
@@ -568,24 +599,32 @@ static psa_status_t metadata_read(struct fwu_metadata *metadata, uint8_t replica
         return PSA_ERROR_INVALID_ARGUMENT;
     }
 
-    if (replica_num == 1) {
-        part = get_partition_entry_by_type(&metadata_uuid);
-    } else if (replica_num == 2) {
-        part = get_partition_replica_by_type(&metadata_uuid);
-    } else {
+    psa_status_t ret;
+    switch (replica_num) {
+    case 1:
+    case 2:
+        ret = gpt_entry_read_by_type(&metadata_uuid, replica_num - 1, &part);
+        break;
+    default:
         FWU_LOG_MSG("%s: replica_num must be 1 or 2\n\r", __func__);
         return PSA_ERROR_GENERIC_ERROR;
     }
 
-    if (!part) {
+    if (ret == PSA_ERROR_DOES_NOT_EXIST) {
         FWU_LOG_MSG("%s: FWU metadata partition not found\n\r", __func__);
-        return PSA_ERROR_GENERIC_ERROR;
+        return ret;
+    } else if (ret == PSA_ERROR_STORAGE_FAILURE) {
+        FWU_LOG_MSG("%s: ERROR - flash failure reading private metadata\n\r", __func__);
+        return ret;
+    } else if (ret < 0) {
+        FWU_LOG_MSG("%s: Unable to find FWU partition, ret: %d\n\r", __func__, ret);
+        return ret;
     }
 
     FWU_LOG_MSG("%s: enter: flash addr = %u, size = %d\n\r", __func__,
-                  part->start, sizeof(*metadata));
+                  part.start * TFM_GPT_BLOCK_SIZE, sizeof(*metadata));
 
-    int ret = FWU_METADATA_FLASH_DEV.ReadData(part->start,
+    ret = FWU_METADATA_FLASH_DEV.ReadData(part.start * TFM_GPT_BLOCK_SIZE,
                                 metadata, sizeof(*metadata));
     if (ret < 0) {
         FWU_LOG_MSG("%s: ERROR - Flash read failed (ret = %d)\n\r", __func__, ret);
@@ -663,8 +702,8 @@ static psa_status_t metadata_write(
 static psa_status_t metadata_write(
                         struct fwu_metadata *metadata, uint8_t replica_num)
 {
-    uuid_t metadata_uuid = FWU_METADATA_TYPE_UUID;
-    partition_entry_t *part;
+    struct efi_guid_t metadata_uuid = FWU_METADATA_TYPE_UUID;
+    struct partition_entry_t part;
 
     FWU_LOG_FUNC_ENTER;
 
@@ -673,30 +712,38 @@ static psa_status_t metadata_write(
         return PSA_ERROR_INVALID_ARGUMENT;
     }
 
-    if (replica_num == 1) {
-        part = get_partition_entry_by_type(&metadata_uuid);
-    } else if (replica_num == 2) {
-        part = get_partition_replica_by_type(&metadata_uuid);
-    } else {
+    psa_status_t ret;
+    switch (replica_num) {
+    case 1:
+    case 2:
+        ret = gpt_entry_read_by_type(&metadata_uuid, replica_num - 1, &part);
+        break;
+    default:
         FWU_LOG_MSG("%s: replica_num must be 1 or 2\n\r", __func__);
         return PSA_ERROR_GENERIC_ERROR;
     }
 
-    if (!part) {
+    if (ret == PSA_ERROR_DOES_NOT_EXIST) {
         FWU_LOG_MSG("%s: FWU metadata partition not found\n\r", __func__);
-        return PSA_ERROR_GENERIC_ERROR;
+        return ret;
+    } else if (ret == PSA_ERROR_STORAGE_FAILURE) {
+        FWU_LOG_MSG("%s: ERROR - flash failure reading private metadata\n\r", __func__);
+        return PSA_ERROR_STORAGE_FAILURE;
+    } else if (ret < 0) {
+        FWU_LOG_MSG("%s: Unable to find FWU partition, ret: %d\n\r", __func__, ret);
+        return ret;
     }
 
     FWU_LOG_MSG("%s: enter: flash addr = %u, size = %d\n\r", __func__,
-                  part->start, sizeof(*metadata));
+                  part.start * TFM_GPT_BLOCK_SIZE, sizeof(*metadata));
 
-    int ret = FWU_METADATA_FLASH_DEV.EraseSector(part->start);
+    ret = FWU_METADATA_FLASH_DEV.EraseSector(part.start * TFM_GPT_BLOCK_SIZE);
     if (ret != ARM_DRIVER_OK) {
         FWU_LOG_MSG("%s: ERROR - Flash erase failed (ret = %d)\n\r", __func__, ret);
         return PSA_ERROR_STORAGE_FAILURE;
     }
 
-    ret = FWU_METADATA_FLASH_DEV.ProgramData(part->start,
+    ret = FWU_METADATA_FLASH_DEV.ProgramData(part.start * TFM_GPT_BLOCK_SIZE,
                                 metadata, sizeof(*metadata));
     if (ret < 0) {
         FWU_LOG_MSG("%s: ERROR - Flash write failed (ret = %d)\n\r", __func__, ret);
@@ -733,8 +780,41 @@ static psa_status_t metadata_write_both_replica(
     return PSA_SUCCESS;
 }
 
+#ifndef BL1_BUILD
+/* Ensure both GPT headers are valid */
+psa_status_t ensure_gpt_headers_valid(void)
+{
+    psa_status_t ret = gpt_validate(true);
+    if (ret == PSA_ERROR_INVALID_SIGNATURE) {
+        ret = gpt_restore(true);
+        if (ret == PSA_ERROR_INVALID_SIGNATURE) {
+            FWU_LOG_MSG("Invalid primary GPT\r\n");
+            return ret;
+        }
+    }
+
+    ret = gpt_validate(false);
+    if (ret == PSA_ERROR_INVALID_SIGNATURE) {
+        ret = gpt_restore(false);
+        if (ret == PSA_ERROR_INVALID_SIGNATURE) {
+            FWU_LOG_MSG("Invalid primary GPT\r\n");
+            return ret;
+        }
+    }
+
+    return PSA_SUCCESS;
+}
+#endif /* BL1_BUILD */
+
 psa_status_t fwu_metadata_check_and_correct_integrity(void)
 {
+#ifndef BL1_BUILD
+    psa_status_t ret = ensure_gpt_headers_valid();
+    if (ret != PSA_SUCCESS) {
+        return ret;
+    }
+#endif
+
     psa_status_t ret_replica_1 = PSA_ERROR_GENERIC_ERROR;
     psa_status_t ret_replica_2 = PSA_ERROR_GENERIC_ERROR;
 
@@ -760,14 +840,22 @@ psa_status_t fwu_metadata_init(void)
     psa_status_t ret;
     ARM_FLASH_INFO* flash_info;
 
+    if (is_initialized) {
+        return PSA_SUCCESS;
+    }
+
 #ifndef BL1_BUILD
     plat_io_storage_init();
-    partition_init(PLATFORM_GPT_IMAGE);
-#endif
+    ret = gpt_init(&io_gpt_flash_driver, PLAT_MAX_PARTITION_ENTRIES);
+    if (ret < 0) {
+        return ret;
+    }
 
-    if (is_initialized) {
-        return PSA_SUCCESS;
+    ret = ensure_gpt_headers_valid();
+    if (ret != PSA_SUCCESS) {
+        return ret;
     }
+#endif
 
     /* Code assumes everything fits into a sector */
     if (sizeof(struct fwu_metadata) > FWU_METADATA_FLASH_SECTOR_SIZE) {
@@ -830,17 +918,19 @@ static psa_status_t fwu_metadata_configure(void)
 
         _metadata.fw_desc.img_entry[i].img_props[BANK_0].accepted = IMAGE_ACCEPTED;
         _metadata.fw_desc.img_entry[i].img_props[BANK_0].version = image_version;
-        memcpy(&(_metadata.fw_desc.img_entry[i].img_props[BANK_0].img_uuid), (const void *)&fwu_image[i].image_guid, sizeof(struct efi_guid));
+        memcpy(&(_metadata.fw_desc.img_entry[i].img_props[BANK_0].img_uuid), (const void *)&fwu_image[i].image_type, sizeof(struct efi_guid_t));
 
         _metadata.fw_desc.img_entry[i].img_props[BANK_1].accepted = INVALID_IMAGE;
         _metadata.fw_desc.img_entry[i].img_props[BANK_1].version = INVALID_VERSION;
-        memcpy(&(_metadata.fw_desc.img_entry[i].img_props[BANK_1].img_uuid), (const void *)&fwu_image[i].image_guid, sizeof(struct efi_guid));
+        memcpy(&(_metadata.fw_desc.img_entry[i].img_props[BANK_1].img_uuid), (const void *)&fwu_image[i].image_type, sizeof(struct efi_guid_t));
     }
 
     /* Calculate CRC32 for fwu metadata. The first filed in the _metadata has to be the crc_32.
      * This should be omited from the calculation. */
-    _metadata.crc_32 = crc32((uint8_t *)&_metadata.version,
-                             sizeof(struct fwu_metadata) - sizeof(uint32_t));
+    _metadata.crc_32 = efi_soft_crc32_update(
+            0,
+            (uint8_t *)&_metadata.version,
+            sizeof(struct fwu_metadata) - sizeof(uint32_t));
 
     ret = metadata_write_both_replica(&_metadata);
     if (ret) {
@@ -1045,8 +1135,10 @@ static psa_status_t fwu_select_previous(
     if (ret) {
         return ret;
     }
-    metadata->crc_32 = crc32((uint8_t *)&metadata->version,
-                              sizeof(struct fwu_metadata) - sizeof(uint32_t));
+    metadata->crc_32 = efi_soft_crc32_update(
+            0,
+            (uint8_t *)&metadata->version,
+            sizeof(struct fwu_metadata) - sizeof(uint32_t));
 
     ret = metadata_write_both_replica(metadata);
     if (ret) {
@@ -1243,7 +1335,7 @@ psa_status_t corstone1000_fwu_host_ack(void)
         ret = PSA_SUCCESS; /* nothing to be done */
 
         for (int i = 0; i < NR_OF_IMAGES_IN_FW_BANK; i++) {
-                fmp_set_image_info(&fwu_image[i].image_guid,
+                fmp_set_image_info(&fwu_image[i].image_type,
                         priv_metadata.fmp_version[i],
                         priv_metadata.fmp_last_attempt_version[i],
                         priv_metadata.fmp_last_attempt_status[i]);
@@ -1274,7 +1366,7 @@ psa_status_t corstone1000_fwu_host_ack(void)
     if (ret == PSA_SUCCESS) {
         disable_host_ack_timer();
         for (int i = 0; i < NR_OF_IMAGES_IN_FW_BANK; i++) {
-            fmp_set_image_info(&fwu_image[i].image_guid,
+            fmp_set_image_info(&fwu_image[i].image_type,
                     priv_metadata.fmp_version[i],
                     priv_metadata.fmp_last_attempt_version[i],
                     priv_metadata.fmp_last_attempt_status[i]);
@@ -1428,7 +1520,7 @@ static psa_status_t get_esrt_data(struct fwu_esrt_data_wrapper *esrt)
 
     for (int i = 0; i < NR_OF_IMAGES_IN_FW_BANK; i++)
     {
-        memcpy(&esrt->entries[i].fw_class, &fwu_image[i].image_guid, sizeof(struct efi_guid));
+        memcpy(&esrt->entries[i].fw_class, &fwu_image[i].image_type, sizeof(struct efi_guid_t));
         esrt->entries[i].fw_version = priv_metadata.fmp_version[i];
         esrt->entries[i].lowest_supported_fw_version = FWU_IMAGE_INITIAL_VERSION;
         esrt->entries[i].last_attempt_version = priv_metadata.fmp_last_attempt_version[i];
@@ -1491,8 +1583,10 @@ static psa_status_t fwu_accept_image(struct fwu_metadata *metadata,
     if (ret) {
         return ret;
     }
-    metadata->crc_32 = crc32((uint8_t *)&metadata->version,
-                              sizeof(struct fwu_metadata) - sizeof(uint32_t));
+    metadata->crc_32 = efi_soft_crc32_update(
+            0,
+            (uint8_t *)&metadata->version,
+            sizeof(struct fwu_metadata) - sizeof(uint32_t));
 
     ret = metadata_write_both_replica(metadata);
     if (ret) {
@@ -1658,9 +1752,7 @@ psa_status_t fwu_bootloader_load_image(psa_fwu_component_t component,
     psa_status_t ret;
     int drv_ret;
     int image_index;
-    uint32_t bank_offset;
     uint32_t active_index;
-    uint32_t previous_active_index;
     uint32_t nr_images;
     uint32_t current_state;
     uint32_t image_offset;
@@ -1717,7 +1809,7 @@ psa_status_t fwu_bootloader_load_image(psa_fwu_component_t component,
         priv_metadata.fmp_last_attempt_status[fwu_image_index] = LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL;
         private_metadata_write(&priv_metadata);
 
-        fmp_set_image_info(&fwu_image[fwu_image_index].image_guid,
+        fmp_set_image_info(&fwu_image[fwu_image_index].image_type,
                 priv_metadata.fmp_version[fwu_image_index],
                 priv_metadata.fmp_last_attempt_version[fwu_image_index],
                 priv_metadata.fmp_last_attempt_status[fwu_image_index]);
@@ -1727,11 +1819,11 @@ psa_status_t fwu_bootloader_load_image(psa_fwu_component_t component,
         goto out;
     }
 
+#ifdef BL1_BUILD
+    uint32_t bank_offset;
     if (active_index == BANK_0) {
-        previous_active_index = BANK_1;
         bank_offset = BANK_1_PARTITION_OFFSET;
     } else if (active_index == BANK_1) {
-        previous_active_index = BANK_0;
         bank_offset = BANK_0_PARTITION_OFFSET;
     } else {
         FWU_LOG_MSG("ERROR: %s: active_index %d\n\r",__func__,active_index);
@@ -1740,6 +1832,38 @@ psa_status_t fwu_bootloader_load_image(psa_fwu_component_t component,
     }
 
     image_offset = bank_offset + fwu_image[fwu_image_index].image_offset;
+#else
+    uint32_t previous_active_index;
+    struct partition_entry_t part;
+
+    if (active_index == BANK_0) {
+        previous_active_index = BANK_1;
+    } else if (active_index == BANK_1) {
+        previous_active_index = BANK_0;
+    } else {
+        FWU_LOG_MSG("ERROR: %s: active_index %d\n\r",__func__,active_index);
+        ret = PSA_ERROR_DATA_INVALID;
+        goto out;
+    }
+
+    ret = gpt_entry_read_by_type(&(fwu_image[fwu_image_index].image_type), 1, &part);
+
+    if (ret == PSA_ERROR_DOES_NOT_EXIST) {
+        FWU_LOG_MSG("%s: Partition '%s' not found\n\r",
+                __func__, fwu_image[fwu_image_index].image_names[previous_active_index]);
+        goto out;
+    } else if (ret == PSA_ERROR_STORAGE_FAILURE) {
+        FWU_LOG_MSG("%s : ERROR - flash failure reading partition '%s'\n\r",
+                __func__, fwu_image[fwu_image_index].image_names[previous_active_index]);
+        goto out;
+    } else if (ret < 0) {
+        FWU_LOG_MSG("Unable to find partition '%s', ret: %d\n\r",
+                fwu_image[fwu_image_index].image_names[previous_active_index], ret);
+        goto out;
+    }
+
+    image_offset = part.start * TFM_GPT_BLOCK_SIZE;
+#endif /* BL1_BUILD */
 
     /* Firmware update process can only start in regular state. */
     current_state = get_fwu_image_state(&_metadata, &priv_metadata, fwu_image_index);
@@ -1762,7 +1886,7 @@ psa_status_t fwu_bootloader_load_image(psa_fwu_component_t component,
 
         private_metadata_write(&priv_metadata);
 
-        fmp_set_image_info(&fwu_image[fwu_image_index].image_guid,
+        fmp_set_image_info(&fwu_image[fwu_image_index].image_type,
                 priv_metadata.fmp_version[fwu_image_index],
                 priv_metadata.fmp_last_attempt_version[fwu_image_index],
                 priv_metadata.fmp_last_attempt_status[fwu_image_index]);
@@ -1828,8 +1952,10 @@ static psa_status_t fwu_update_metadata(const psa_fwu_component_t *candidates, u
         _metadata.fw_desc.img_entry[fwu_image_index].img_props[previous_active_index].version = fmp_header_image_info[fwu_image_index].fmp_hdr.fw_version;
     }
 
-    _metadata.crc_32 = crc32((uint8_t *)&_metadata.version,
-                              sizeof(struct fwu_metadata) - sizeof(uint32_t));
+    _metadata.crc_32 = efi_soft_crc32_update(
+            0,
+            (uint8_t *)&_metadata.version,
+            sizeof(struct fwu_metadata) - sizeof(uint32_t));
 
     ret = metadata_write_both_replica(&_metadata);
     if (ret) {
@@ -1960,8 +2086,10 @@ static psa_status_t maintain_bank_consistency(void)
             goto out;
         }
 
-        _metadata.crc_32 = crc32((uint8_t *)&_metadata.version,
-                                  sizeof(struct fwu_metadata) - sizeof(uint32_t));
+        _metadata.crc_32 = efi_soft_crc32_update(
+                0,
+                (uint8_t *)&_metadata.version,
+                sizeof(struct fwu_metadata) - sizeof(uint32_t));
 
         ret = metadata_write_both_replica(&_metadata);
         if (ret) {
@@ -2057,7 +2185,7 @@ psa_status_t fwu_bootloader_mark_image_accepted(const psa_fwu_component_t *trial
 
         current_state = get_fwu_image_state(&_metadata, &priv_metadata, fwu_image_index);
         if (current_state == PSA_FWU_READY) {
-            fmp_set_image_info(&fwu_image[fwu_image_index].image_guid,
+            fmp_set_image_info(&fwu_image[fwu_image_index].image_type,
                     priv_metadata.fmp_version[fwu_image_index],
                     priv_metadata.fmp_last_attempt_version[fwu_image_index],
                     priv_metadata.fmp_last_attempt_status[fwu_image_index]);
@@ -2091,7 +2219,7 @@ psa_status_t fwu_bootloader_mark_image_accepted(const psa_fwu_component_t *trial
             }
 
             fwu_image_index = trials[i] - FWU_FAKE_IMAGES_INDEX_COUNT;
-            fmp_set_image_info(&fwu_image[fwu_image_index].image_guid,
+            fmp_set_image_info(&fwu_image[fwu_image_index].image_type,
                     priv_metadata.fmp_version[fwu_image_index],
                     priv_metadata.fmp_last_attempt_version[fwu_image_index],
                     priv_metadata.fmp_last_attempt_status[fwu_image_index]);
@@ -2107,7 +2235,6 @@ out:
 /* Reject the staged image. */
 psa_status_t fwu_bootloader_reject_staged_image(psa_fwu_component_t component)
 {
-
     if (!is_image_index_valid(component)) {
         FWU_LOG_MSG("%s: Invalid image index received \n\r", __func__);
         return PSA_ERROR_INVALID_ARGUMENT;
@@ -2224,7 +2351,6 @@ psa_status_t fwu_bootloader_get_image_info(psa_fwu_component_t component,
 
     FWU_LOG_FUNC_ENTER;
 
-
     Select_Write_Mode_For_Shared_Flash();
     if (private_metadata_read(&priv_metadata)) {
         ret = PSA_ERROR_GENERIC_ERROR;
diff --git a/platform/ext/target/arm/corstone1000/bootloader/mcuboot/uefi_fmp.c b/platform/ext/target/arm/corstone1000/bootloader/mcuboot/uefi_fmp.c
index 3edd4ebd0..c41b1f9ea 100644
--- a/platform/ext/target/arm/corstone1000/bootloader/mcuboot/uefi_fmp.c
+++ b/platform/ext/target/arm/corstone1000/bootloader/mcuboot/uefi_fmp.c
@@ -10,6 +10,7 @@
 #include "tfm_hal_device_header.h"
 #include "uefi_fmp.h"
 #include "flash_layout.h"
+#include "efi_guid_structs.h"
 
 /* The count will increase when partial update is supported.
  * At present, only full WIC is considered as updatable image.
@@ -45,7 +46,7 @@ typedef uint8_t DescriptorCount_t;
 
 typedef __PACKED_STRUCT {
     uint8_t ImageIndex;
-    struct efi_guid ImageTypeId;
+    struct efi_guid_t ImageTypeId;
     uint64_t ImageId;
     uefi_ptr_t PtrImageIdName;
     uint32_t Version;
@@ -101,7 +102,7 @@ struct corstone_image_info image_info[NUMBER_OF_FMP_IMAGES] = {
 };
 static EFI_FIRMWARE_MANAGEMENT_PROTOCOL_IMAGE_INFO fmp_info[NUMBER_OF_FMP_IMAGES];
 
-extern fwu_bank_image_info_t fwu_image[];
+extern const fwu_image_info_t fwu_image[];
 
 static bool is_fmp_info_initialized = false;
 
@@ -127,8 +128,8 @@ static void init_fmp_info(void)
 
         fmp_info[i].ImageDescriptor.ImageIndex = i+1;
 
-        memcpy(&fmp_info[i].ImageDescriptor.ImageTypeId, &fwu_image[i].image_guid,
-                sizeof(struct efi_guid));
+        memcpy(&fmp_info[i].ImageDescriptor.ImageTypeId, &fwu_image[i].image_type,
+                sizeof(struct efi_guid_t));
 
         fmp_info[i].ImageDescriptor.ImageId = i+1;
         fmp_info[i].ImageDescriptor.Version = FWU_IMAGE_INITIAL_VERSION;
@@ -150,7 +151,7 @@ static void init_fmp_info(void)
     return;
 }
 
-psa_status_t fmp_set_image_info(struct efi_guid *guid,
+psa_status_t fmp_set_image_info(const struct efi_guid_t *guid,
                      uint32_t current_version, uint32_t attempt_version,
                      uint32_t last_attempt_status)
 {
@@ -164,7 +165,7 @@ psa_status_t fmp_set_image_info(struct efi_guid *guid,
 
     for (int i = 0; i < NUMBER_OF_FMP_IMAGES; i++) {
         if ((memcmp(guid, &fmp_info[i].ImageDescriptor.ImageTypeId,
-                        sizeof(struct efi_guid))) == 0)
+                        sizeof(struct efi_guid_t))) == 0)
         {
             FWU_LOG_MSG("FMP image update: image id = %u\n\r",
                                     fmp_info[i].ImageDescriptor.ImageId);
diff --git a/platform/ext/target/arm/corstone1000/bootloader/uefi_fmp.h b/platform/ext/target/arm/corstone1000/bootloader/uefi_fmp.h
index 36c604714..e185448ef 100644
--- a/platform/ext/target/arm/corstone1000/bootloader/uefi_fmp.h
+++ b/platform/ext/target/arm/corstone1000/bootloader/uefi_fmp.h
@@ -11,7 +11,6 @@
 
 #include <stdint.h>
 #include "fwu_agent.h"
-#include "../fip_parser/external/uuid.h"
 
 /*
  * Last Attempt Status Value
@@ -40,7 +39,7 @@
  * attempt_version: attempted versions for the image
  *
  */
-psa_status_t fmp_set_image_info(struct efi_guid *guid,
+psa_status_t fmp_set_image_info(const struct efi_guid_t *guid,
                      uint32_t current_version, uint32_t attempt_version,
                      uint32_t last_attempt_status);
 
diff --git a/platform/ext/target/arm/corstone1000/ci_regression_tests/CMakeLists.txt b/platform/ext/target/arm/corstone1000/ci_regression_tests/CMakeLists.txt
index 3b023c813..e92723026 100644
--- a/platform/ext/target/arm/corstone1000/ci_regression_tests/CMakeLists.txt
+++ b/platform/ext/target/arm/corstone1000/ci_regression_tests/CMakeLists.txt
@@ -9,26 +9,18 @@
 
 cmake_policy(SET CMP0079 NEW)
 
-include(${CMAKE_CURRENT_SOURCE_DIR}/s_test_config.cmake)
-
 ####################### Secure #################################################
 
 target_sources(tfm_test_suite_extra_s
     PRIVATE
         ${CMAKE_CURRENT_SOURCE_DIR}/s_test.c
         ../Native_Driver/firewall.c
-        ../io/io_storage.c
-        ../io/io_block.c
-        ../io/io_flash.c
-        Driver_Flash_SRAM_Emu.c
-        s_io_storage_test.c
 )
 
 target_include_directories(tfm_test_suite_extra_s
     PRIVATE
         ../Device/Include
         ../Native_Driver
-        ../io
 )
 
 target_link_libraries(tfm_test_suite_extra_s
@@ -39,10 +31,6 @@ target_link_libraries(tfm_test_suite_extra_s
 target_compile_definitions(tfm_test_suite_extra_s
     PRIVATE
         $<$<BOOL:${PLATFORM_IS_FVP}>:PLATFORM_IS_FVP>
-        TEST_FLASH_SIZE_IN_BYTES=${TEST_FLASH_SIZE_IN_BYTES}
-        TEST_FLASH_SECTOR_SIZE_IN_BYTES=${TEST_FLASH_SECTOR_SIZE_IN_BYTES}
-        TEST_FLASH_PAGE_SIZE=${TEST_FLASH_PAGE_SIZE}
-        TEST_FLASH_PROGRAM_UNIT=${TEST_FLASH_PROGRAM_UNIT}
 )
 
 target_compile_options(tfm_test_suite_extra_s PRIVATE -Wno-int-conversion)
diff --git a/platform/ext/target/arm/corstone1000/ci_regression_tests/Driver_Flash_SRAM_Emu.c b/platform/ext/target/arm/corstone1000/ci_regression_tests/Driver_Flash_SRAM_Emu.c
deleted file mode 100644
index 06b6b51c0..000000000
--- a/platform/ext/target/arm/corstone1000/ci_regression_tests/Driver_Flash_SRAM_Emu.c
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * Copyright (c) 2013-2022 ARM Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * 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
- *
- * 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 <string.h>
-#include <stdint.h>
-#include "Driver_Flash.h"
-#include "test_flash.h"
-#include "tfm_sp_log.h"
-
-#ifndef ARG_UNUSED
-#define ARG_UNUSED(arg)  ((void)arg)
-#endif
-
-/* Driver version */
-#define ARM_FLASH_DRV_VERSION      ARM_DRIVER_VERSION_MAJOR_MINOR(1, 1)
-#define ARM_FLASH_DRV_ERASE_VALUE  0xFF
-
-
-/**
- * There is no real flash memory. This driver just emulates a flash
- * interface and behaviour on top of the SRAM memory.
- */
-
-/**
- * Data width values for ARM_FLASH_CAPABILITIES::data_width
- * \ref ARM_FLASH_CAPABILITIES
- */
- enum {
-    DATA_WIDTH_8BIT   = 0u,
-    DATA_WIDTH_16BIT,
-    DATA_WIDTH_32BIT,
-    DATA_WIDTH_ENUM_SIZE
-};
-
-static const uint32_t data_width_byte[DATA_WIDTH_ENUM_SIZE] = {
-    sizeof(uint8_t),
-    sizeof(uint16_t),
-    sizeof(uint32_t),
-};
-
-
-/*
- * ARM FLASH device structure
- *
- */
-struct arm_flash_dev_t {
-    const uint8_t* memory_base;   /*!< FLASH memory base address */
-    ARM_FLASH_INFO *data;         /*!< FLASH data */
-};
-
-/* Flash emulated memory */
-static uint8_t flash_memory[TEST_FLASH_SIZE_IN_BYTES]
-    __attribute__((aligned(TEST_FLASH_SECTOR_SIZE_IN_BYTES)));
-
-/* Flash Status */
-static ARM_FLASH_STATUS FlashStatus = {0, 0, 0};
-
-/* Driver Version */
-static const ARM_DRIVER_VERSION DriverVersion = {
-    ARM_FLASH_API_VERSION,
-    ARM_FLASH_DRV_VERSION
-};
-
-/* Driver Capabilities */
-static const ARM_FLASH_CAPABILITIES DriverCapabilities = {
-    0, /* event_ready */
-    0, /* data_width = 0:8-bit, 1:16-bit, 2:32-bit */
-    1  /* erase_chip */
-};
-
-static int32_t is_range_valid(struct arm_flash_dev_t *flash_dev,
-                              uint32_t offset)
-{
-    uint32_t flash_limit = 0;
-    int32_t rc = 0;
-
-    flash_limit = (flash_dev->data->sector_count * flash_dev->data->sector_size);
-    if (offset > flash_limit) {
-        rc = -1;
-    }
-    return rc;
-}
-
-static int32_t is_write_aligned(struct arm_flash_dev_t *flash_dev,
-                                uint32_t param)
-{
-    int32_t rc = 0;
-
-    if ((param % flash_dev->data->program_unit) != 0) {
-        rc = -1;
-    }
-    return rc;
-}
-
-static int32_t is_sector_aligned(struct arm_flash_dev_t *flash_dev,
-                                 uint32_t offset)
-{
-    int32_t rc = 0;
-
-    if ((offset % flash_dev->data->sector_size) != 0) {
-        rc = -1;
-    }
-    return rc;
-}
-
-static int32_t is_flash_ready_to_write(const uint8_t *start_addr, uint32_t cnt)
-{
-    int32_t rc = 0;
-    uint32_t i;
-
-    for (i = 0; i < cnt; i++) {
-        if(start_addr[i] != ARM_FLASH_DRV_ERASE_VALUE) {
-            rc = -1;
-            break;
-        }
-    }
-
-    return rc;
-}
-
-static ARM_FLASH_INFO ARM_TEST_FLASH_DEV_DATA = {
-    .sector_info  = NULL,/* Uniform sector layout */
-    .sector_count = TEST_FLASH_SIZE_IN_BYTES / TEST_FLASH_SECTOR_SIZE_IN_BYTES,
-    .sector_size  = TEST_FLASH_SECTOR_SIZE_IN_BYTES,
-    .page_size    = TEST_FLASH_PAGE_SIZE,
-    .program_unit = TEST_FLASH_PROGRAM_UNIT,
-    .erased_value = ARM_FLASH_DRV_ERASE_VALUE};
-
-static struct arm_flash_dev_t ARM_TEST_FLASH_DEV = {
-    .memory_base = flash_memory,
-    .data        = &(ARM_TEST_FLASH_DEV_DATA)};
-
-static struct arm_flash_dev_t *TEST_FLASH_DEV = &ARM_TEST_FLASH_DEV;
-
-/*
- * Functions
- */
-
-static ARM_DRIVER_VERSION ARM_Flash_GetVersion(void)
-{
-    return DriverVersion;
-}
-
-static ARM_FLASH_CAPABILITIES ARM_Flash_GetCapabilities(void)
-{
-    return DriverCapabilities;
-}
-
-static int32_t ARM_Flash_Initialize(ARM_Flash_SignalEvent_t cb_event)
-{
-    ARG_UNUSED(cb_event);
-
-    if (DriverCapabilities.data_width >= DATA_WIDTH_ENUM_SIZE) {
-        return ARM_DRIVER_ERROR;
-    }
-
-    /* Nothing to be done */
-    return ARM_DRIVER_OK;
-}
-
-static int32_t ARM_Flash_Uninitialize(void)
-{
-    /* Nothing to be done */
-    return ARM_DRIVER_OK;
-}
-
-static int32_t ARM_Flash_PowerControl(ARM_POWER_STATE state)
-{
-    switch (state) {
-    case ARM_POWER_FULL:
-        /* Nothing to be done */
-        return ARM_DRIVER_OK;
-        break;
-
-    case ARM_POWER_OFF:
-    case ARM_POWER_LOW:
-    default:
-        return ARM_DRIVER_ERROR_UNSUPPORTED;
-    }
-}
-
-static int32_t ARM_Flash_ReadData(uint32_t addr, void *data, uint32_t cnt)
-{
-    int32_t rc = 0;
-
-    /* The addr given is a relative address*/
-    uint32_t offset = addr;
-    addr += (uint32_t)(TEST_FLASH_DEV->memory_base);
-
-    /* Conversion between data items and bytes */
-    cnt *= data_width_byte[DriverCapabilities.data_width];
-
-    /* Check flash memory boundaries */
-    rc = is_range_valid(TEST_FLASH_DEV, offset + cnt);
-    if (rc != 0) {
-        return ARM_DRIVER_ERROR_PARAMETER;
-    }
-
-    /* Flash interface just emulated over SRAM, use memcpy */
-    memcpy(data, (void *)addr, cnt);
-
-    /* Conversion between bytes and data items */
-    cnt /= data_width_byte[DriverCapabilities.data_width];
-
-    return cnt;
-}
-
-static int32_t ARM_Flash_ProgramData(uint32_t addr, const void *data,
-                                     uint32_t cnt)
-{
-    int32_t rc = 0;
-
-    /* The addr given is a relative address*/
-    uint32_t offset = addr;
-    addr += (uint32_t)(TEST_FLASH_DEV->memory_base);
-
-    /* Conversion between data items and bytes */
-    cnt *= data_width_byte[DriverCapabilities.data_width];
-
-    /* Check flash memory boundaries and alignment with minimal write size */
-    rc  = is_range_valid(TEST_FLASH_DEV, offset + cnt);
-    rc |= is_write_aligned(TEST_FLASH_DEV, offset);
-    rc |= is_write_aligned(TEST_FLASH_DEV, cnt);
-    if (rc != 0) {
-        return ARM_DRIVER_ERROR_PARAMETER;
-    }
-
-    /* Check if the flash area to write the data was erased previously */
-    rc = is_flash_ready_to_write((const uint8_t*)addr, cnt);
-    if (rc != 0) {
-        return ARM_DRIVER_ERROR;
-    }
-
-    /* Flash interface just emulated over SRAM, use memcpy */
-    memcpy((void *)addr, data, cnt);
-
-    /* Conversion between bytes and data items */
-    cnt /= data_width_byte[DriverCapabilities.data_width];
-
-    return cnt;
-}
-
-static int32_t ARM_Flash_EraseSector(uint32_t addr)
-{
-    uint32_t rc = 0;
-
-    /* The addr given is a relative address*/
-    uint32_t offset = addr;
-    addr += (uint32_t)(TEST_FLASH_DEV->memory_base);
-
-    rc  = is_range_valid(TEST_FLASH_DEV, offset);
-    rc |= is_sector_aligned(TEST_FLASH_DEV, offset);
-    if (rc != 0) {
-        return ARM_DRIVER_ERROR_PARAMETER;
-    }
-
-    /* Flash interface just emulated over SRAM, use memset */
-    memset((void *)addr,
-           TEST_FLASH_DEV->data->erased_value,
-           TEST_FLASH_DEV->data->sector_size);
-    return ARM_DRIVER_OK;
-}
-
-static int32_t ARM_Flash_EraseChip(void)
-{
-    uint32_t i;
-    uint32_t addr = TEST_FLASH_DEV->memory_base;
-    int32_t rc = ARM_DRIVER_ERROR_UNSUPPORTED;
-
-    /* Check driver capability erase_chip bit */
-    if (DriverCapabilities.erase_chip == 1) {
-        for (i = 0; i < TEST_FLASH_DEV->data->sector_count; i++) {
-            /* Flash interface just emulated over SRAM, use memset */
-            memset((void *)addr,
-                   TEST_FLASH_DEV->data->erased_value,
-                   TEST_FLASH_DEV->data->sector_size);
-
-            addr += TEST_FLASH_DEV->data->sector_size;
-            rc = ARM_DRIVER_OK;
-        }
-    }
-    return rc;
-}
-
-static ARM_FLASH_STATUS ARM_Flash_GetStatus(void)
-{
-    return FlashStatus;
-}
-
-static ARM_FLASH_INFO * ARM_Flash_GetInfo(void)
-{
-    return TEST_FLASH_DEV->data;
-}
-
-
-/* Global Variables */
-
-ARM_DRIVER_FLASH Driver_TEST_FLASH = {
-    ARM_Flash_GetVersion,
-    ARM_Flash_GetCapabilities,
-    ARM_Flash_Initialize,
-    ARM_Flash_Uninitialize,
-    ARM_Flash_PowerControl,
-    ARM_Flash_ReadData,
-    ARM_Flash_ProgramData,
-    ARM_Flash_EraseSector,
-    ARM_Flash_EraseChip,
-    ARM_Flash_GetStatus,
-    ARM_Flash_GetInfo
-};
-
-uintptr_t flash_base_address = flash_memory;
diff --git a/platform/ext/target/arm/corstone1000/ci_regression_tests/s_io_storage_test.c b/platform/ext/target/arm/corstone1000/ci_regression_tests/s_io_storage_test.c
deleted file mode 100644
index fb589c9d2..000000000
--- a/platform/ext/target/arm/corstone1000/ci_regression_tests/s_io_storage_test.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 2022, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
-
-#include <string.h>
-#include "s_io_storage_test.h"
-#include "Driver_Flash.h"
-#include "flash_layout.h"
-#include "io_block.h"
-#include "io_driver.h"
-#include "io_flash.h"
-#include "tfm_sp_log.h"
-
-#define ARRAY_LENGTH(array) (sizeof(array) / sizeof(*(array)))
-
-extern ARM_DRIVER_FLASH Driver_FLASH0;
-extern ARM_DRIVER_FLASH Driver_TEST_FLASH;
-extern uintptr_t flash_base_address;
-
-void s_test_io_storage_multiple_flash_simultaneous(struct test_result_t *ret) {
-    /* FLASH0 */
-    static io_dev_connector_t* flash0_dev_con;
-    static uint8_t local_block_flash0[FLASH_SECTOR_SIZE];
-    ARM_FLASH_INFO* flash0_info = Driver_FLASH0.GetInfo();
-    size_t flash0_block_size = flash0_info->sector_size;
-    io_flash_dev_spec_t flash0_dev_spec = {
-        .buffer = local_block_flash0,
-        .bufferlen = flash0_block_size,
-        .base_addr = FLASH_BASE_ADDRESS,
-        .flash_driver = &Driver_FLASH0,
-    };
-    io_block_spec_t flash0_spec = {
-        .offset = FLASH_BASE_ADDRESS,
-        .length = flash0_info->sector_count * flash0_info->sector_size};
-    uintptr_t flash0_dev_handle = NULL;
-    uintptr_t flash0_handle = NULL;
-
-    /* EMU TEST FLASH */
-    static io_dev_connector_t* flash_emu_dev_con;
-    static uint8_t local_block_flash_emu[TEST_FLASH_SECTOR_SIZE_IN_BYTES]
-        __attribute__((aligned(TEST_FLASH_SECTOR_SIZE_IN_BYTES)));
-    ARM_FLASH_INFO* flash_emu_info = Driver_TEST_FLASH.GetInfo();
-    size_t flash_emu_block_size = flash_emu_info->sector_size;
-    io_flash_dev_spec_t flash_emu_dev_spec = {
-        .buffer = local_block_flash_emu,
-        .bufferlen = flash_emu_block_size,
-        .base_addr = flash_base_address,
-        .flash_driver = &Driver_TEST_FLASH,
-    };
-    io_block_spec_t flash_emu_spec = {
-        .offset = flash_base_address,
-        .length = flash_emu_info->sector_count * flash_emu_info->sector_size};
-    uintptr_t flash_emu_dev_handle = NULL;
-    uintptr_t flash_emu_handle = NULL;
-
-    /* Common */
-    int rc = -1;
-    static uint8_t test_data[] = {0xEE, 0xDD, 0xCC, 0xBB, 0xAA,
-                                  0x10, 0x50, 0xA0, 0xD0, 0x51,
-                                  0x55, 0x44, 0x33, 0x22, 0x11};
-    static uint8_t actual_data[15];
-    size_t bytes_written_count = 0;
-    size_t bytes_read_count = 0;
-
-    memset(local_block_flash0, -1, sizeof(local_block_flash0));
-    memset(local_block_flash_emu, -1, sizeof(local_block_flash_emu));
-
-    /* Register */
-    register_io_dev_flash(&flash0_dev_con);
-    register_io_dev_flash(&flash_emu_dev_con);
-
-    io_dev_open(flash0_dev_con, &flash0_dev_spec, &flash0_dev_handle);
-    io_dev_open(flash_emu_dev_con, &flash_emu_dev_spec, &flash_emu_dev_handle);
-
-    /* Write Data */
-    io_open(flash0_dev_handle, &flash0_spec, &flash0_handle);
-    io_open(flash_emu_dev_handle, &flash_emu_spec, &flash_emu_handle);
-
-    io_seek(flash0_handle, IO_SEEK_SET,
-            BANK_1_PARTITION_OFFSET + flash0_info->sector_size - 7);
-    io_seek(flash_emu_handle, IO_SEEK_SET, flash_emu_info->sector_size - 7);
-
-    io_write(flash0_handle, test_data, ARRAY_LENGTH(test_data),
-             &bytes_written_count);
-    if (bytes_written_count != ARRAY_LENGTH(test_data)) {
-        LOG_ERRFMT("io_write failed to write %d bytes for flash0",
-                   ARRAY_LENGTH(test_data));
-        LOG_ERRFMT("bytes_written_count %d for flash0", bytes_written_count);
-        ret->val = TEST_FAILED;
-    }
-    io_write(flash_emu_handle, test_data, ARRAY_LENGTH(test_data),
-             &bytes_written_count);
-    if (bytes_written_count != ARRAY_LENGTH(test_data)) {
-        LOG_ERRFMT("io_write failed to write %d bytes for flash emu",
-                   ARRAY_LENGTH(test_data));
-        LOG_ERRFMT("bytes_written_count %d for flash emu", bytes_written_count);
-        ret->val = TEST_FAILED;
-    }
-    io_close(flash0_handle);
-    io_close(flash_emu_handle);
-
-    /* Read Data */
-    io_open(flash0_dev_handle, &flash0_spec, &flash0_handle);
-    io_open(flash_emu_dev_handle, &flash_emu_spec, &flash_emu_handle);
-
-    io_seek(flash0_handle, IO_SEEK_SET,
-            BANK_1_PARTITION_OFFSET + flash0_info->sector_size - 7);
-    io_seek(flash_emu_handle, IO_SEEK_SET, flash_emu_info->sector_size - 7);
-
-    /* Flash0 */
-    io_read(flash0_handle, actual_data, ARRAY_LENGTH(actual_data),
-            &bytes_read_count);
-    if (bytes_read_count != ARRAY_LENGTH(test_data)) {
-        LOG_ERRFMT("io_read failed to read %d bytes for flash0",
-                   ARRAY_LENGTH(test_data));
-        LOG_ERRFMT("bytes_read_count %d for flash0", bytes_read_count);
-        ret->val = TEST_FAILED;
-    }
-    if (memcmp((uint8_t*)test_data, actual_data, ARRAY_LENGTH(actual_data)) !=
-        0) {
-        LOG_ERRFMT("Data written != Data read\r\n");
-        ret->val = TEST_FAILED;
-    }
-
-    memset(actual_data, -1, sizeof(actual_data));
-
-    /* Flash Emu */
-    io_read(flash_emu_handle, actual_data, ARRAY_LENGTH(actual_data),
-            &bytes_read_count);
-    if (bytes_read_count != ARRAY_LENGTH(test_data)) {
-        LOG_ERRFMT("io_read failed to read %d bytes for flash emu",
-                   ARRAY_LENGTH(test_data));
-        LOG_ERRFMT("bytes_read_count %d for flash emu", bytes_read_count);
-        ret->val = TEST_FAILED;
-    }
-    if (memcmp((uint8_t*)test_data, actual_data, ARRAY_LENGTH(actual_data)) !=
-        0) {
-        LOG_ERRFMT("Data written != Data read\r\n");
-        ret->val = TEST_FAILED;
-    }
-
-    LOG_INFFMT("PASS: %s\n\r", __func__);
-    ret->val = TEST_PASSED;
-}
diff --git a/platform/ext/target/arm/corstone1000/ci_regression_tests/s_io_storage_test.h b/platform/ext/target/arm/corstone1000/ci_regression_tests/s_io_storage_test.h
deleted file mode 100644
index fa9012776..000000000
--- a/platform/ext/target/arm/corstone1000/ci_regression_tests/s_io_storage_test.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * Copyright (c) 2022, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
-
-#ifndef __S_IO_STORAGE_TEST_H__
-#define __S_IO_STORAGE_TEST_H__
-
-#include "extra_s_tests.h"
-
-void s_test_io_storage_multiple_flash_simultaneous(struct test_result_t *ret);
-
-#endif /* __S_IO_STORAGE_TEST_H__ */
\ No newline at end of file
diff --git a/platform/ext/target/arm/corstone1000/ci_regression_tests/s_test.c b/platform/ext/target/arm/corstone1000/ci_regression_tests/s_test.c
index 9a8453ff5..6bfdf2aeb 100644
--- a/platform/ext/target/arm/corstone1000/ci_regression_tests/s_test.c
+++ b/platform/ext/target/arm/corstone1000/ci_regression_tests/s_test.c
@@ -10,8 +10,7 @@
 #include "extra_s_tests.h"
 #include "platform_base_address.h"
 #include "firewall.h"
-#include "tfm_sp_log.h"
-#include "s_io_storage_test.h"
+#include "tfm_log_unpriv.h"
 
 /* TODO: if needed each test function can be made as a separate test case, in
  * such case EXTRA_TEST_XX definitions can be removed */
diff --git a/platform/ext/target/arm/corstone1000/ci_regression_tests/s_test_config.cmake b/platform/ext/target/arm/corstone1000/ci_regression_tests/s_test_config.cmake
deleted file mode 100644
index 05b7cd785..000000000
--- a/platform/ext/target/arm/corstone1000/ci_regression_tests/s_test_config.cmake
+++ /dev/null
@@ -1,13 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2021-22, Arm Limited. All rights reserved.
-#
-# SPDX-License-Identifier: BSD-3-Clause
-#
-#-------------------------------------------------------------------------------
-
-############ Define secure test specific cmake configurations here #############
-
-set (TEST_FLASH_SIZE_IN_BYTES         48U  CACHE STRING   "The size of the emulated flash used in io tests")
-set (TEST_FLASH_SECTOR_SIZE_IN_BYTES  16U  CACHE STRING   "The sector size of the emulated flash used in io tests")
-set (TEST_FLASH_PAGE_SIZE              8U  CACHE STRING   "The page size of the emulated flash used in io tests")
-set (TEST_FLASH_PROGRAM_UNIT           1U  CACHE STRING   "The program unit of the emulated flash used in io tests")
diff --git a/platform/ext/target/arm/corstone1000/ci_regression_tests/test_flash.h b/platform/ext/target/arm/corstone1000/ci_regression_tests/test_flash.h
deleted file mode 100644
index 4d073a1d7..000000000
--- a/platform/ext/target/arm/corstone1000/ci_regression_tests/test_flash.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2017-2022 Arm Limited. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __TEST_FLASH_H__
-#define __TEST_FLASH_H__
-
-#define TEST_FLASH_SIZE_IN_BYTES             (48)    // 48 bytes
-#define TEST_FLASH_SECTOR_SIZE_IN_BYTES      (16)    // 16 bytes
-#define TEST_FLASH_PAGE_SIZE                 (8U)    // 8 bytes
-#define TEST_FLASH_PROGRAM_UNIT              (1U)    /* 1 B */
-
-#endif /* __TEST_FLASH_H__ */
diff --git a/platform/ext/target/arm/corstone1000/config.cmake b/platform/ext/target/arm/corstone1000/config.cmake
index 032265cdf..ada6426e3 100644
--- a/platform/ext/target/arm/corstone1000/config.cmake
+++ b/platform/ext/target/arm/corstone1000/config.cmake
@@ -47,6 +47,7 @@ set(DEFAULT_MCUBOOT_SECURITY_COUNTERS       OFF          CACHE BOOL      "Whethe
 # LOG LEVEL
 set(TFM_SPM_LOG_LEVEL                   TFM_SPM_LOG_LEVEL_INFO          CACHE STRING    "Set default SPM log level as INFO level")
 set(TFM_PARTITION_LOG_LEVEL             TFM_PARTITION_LOG_LEVEL_INFO    CACHE STRING    "Set default Secure Partition log level as INFO level")
+set(GPT_LOG_LEVEL                       LOG_LEVEL_INFO                  CACHE STRING    "Set default GPT library log level as INFO level")
 
 # Partition
 set(TFM_PARTITION_PLATFORM              ON          CACHE BOOL      "Enable Platform partition")
@@ -62,6 +63,9 @@ set(TFM_FWU_BOOTLOADER_LIB                "${CMAKE_CURRENT_LIST_DIR}/bootloader/
 set(TFM_CONFIG_FWU_MAX_MANIFEST_SIZE      0          CACHE STRING    "The maximum permitted size for manifest in psa_fwu_start(), in bytes.")
 set(TFM_CONFIG_FWU_MAX_WRITE_SIZE         4096       CACHE STRING    "The maximum permitted size for block in psa_fwu_write, in bytes.")
 set(FWU_SUPPORT_TRIAL_STATE               ON         CACHE BOOL      "Device support TRIAL component state.")
+set(PLATFORM_GPT_LIBRARY                  ON         CACHE BOOL      "Build the GPT library")
+set(TFM_GPT_BLOCK_SIZE                    512        CACHE STRING    "The block size of a device formatted as a GUID Partition Table.")
+set(PLAT_MAX_PARTITION_ENTRIES            16         CACHE STRING    "The maximum number of GPT partition entries.")
 
 if (${CMAKE_BUILD_TYPE} STREQUAL Debug OR ${CMAKE_BUILD_TYPE} STREQUAL RelWithDebInfo)
   set(ENABLE_FWU_AGENT_DEBUG_LOGS     TRUE          CACHE BOOL      "Enable Firmware update agent debug logs.")
diff --git a/platform/ext/target/arm/corstone1000/fip_parser/external/uuid.h b/platform/ext/target/arm/corstone1000/fip_parser/external/uuid.h
deleted file mode 100644
index 2ced3a3fa..000000000
--- a/platform/ext/target/arm/corstone1000/fip_parser/external/uuid.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*-
- * Copyright (c) 2002 Marcel Moolenaar
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/*
- * Portions copyright (c) 2014-2020, ARM Limited and Contributors.
- * All rights reserved.
- */
-
-#ifndef UUID_H
-#define UUID_H
-
-/* Length of a node address (an IEEE 802 address). */
-#define	_UUID_NODE_LEN		6
-
-/* Length of UUID string including dashes. */
-#define _UUID_STR_LEN		36
-
-/*
- * See also:
- *      http://www.opengroup.org/dce/info/draft-leach-uuids-guids-01.txt
- *      http://www.opengroup.org/onlinepubs/009629399/apdxa.htm
- *
- * A DCE 1.1 compatible source representation of UUIDs.
- */
-struct uuid {
-	uint8_t		time_low[4];
-	uint8_t		time_mid[2];
-	uint8_t		time_hi_and_version[2];
-	uint8_t		clock_seq_hi_and_reserved;
-	uint8_t		clock_seq_low;
-	uint8_t		node[_UUID_NODE_LEN];
-};
-
-struct efi_guid {
-	uint32_t time_low;
-	uint16_t time_mid;
-	uint16_t time_hi_and_version;
-	uint8_t clock_seq_and_node[8];
-};
-
-union uuid_helper_t {
-	struct uuid uuid_struct;
-	struct efi_guid efi_guid;
-};
-
-/* XXX namespace pollution? */
-typedef struct uuid uuid_t;
-
-#endif /* UUID_H */
diff --git a/platform/ext/target/arm/corstone1000/fip_parser/fip_parser.c b/platform/ext/target/arm/corstone1000/fip_parser/fip_parser.c
index 5d264b3a6..cce657fbb 100644
--- a/platform/ext/target/arm/corstone1000/fip_parser/fip_parser.c
+++ b/platform/ext/target/arm/corstone1000/fip_parser/fip_parser.c
@@ -19,6 +19,8 @@
 #include "fip_parser.h"
 #include "bootutil/bootutil_log.h"
 
+#include "efi_guid_structs.h"
+
 #include <region_defs.h>
 #include <string.h>
 
@@ -27,13 +29,14 @@ int parse_fip_and_extract_tfa_info(uint32_t address, uint32_t fip_size,
 {
     FIP_TOC_HEADER *toc_header = NULL;
     FIP_TOC_ENTRY *toc_entry = NULL;
-    uuid_t uuid_null = {0};
-    uuid_t tfa_uuid = UUID_TRUSTED_BOOT_FIRMWARE_BL2;
+    struct efi_guid_t uuid_null = NULL_GUID;
+    struct efi_guid_t tfa_uuid = UUID_TRUSTED_BOOT_FIRMWARE_BL2;
     char *iter;
 
     toc_header = (FIP_TOC_HEADER *) address;
 
     if (toc_header->name != TOC_HEADER_NAME) {
+        BOOT_LOG_ERR("TOC header name does not match");
         return FIP_PARSER_ERROR;
     }
 
@@ -43,11 +46,11 @@ int parse_fip_and_extract_tfa_info(uint32_t address, uint32_t fip_size,
         iter <= (char *)toc_header + fip_size;
         iter = iter + sizeof(FIP_TOC_ENTRY), toc_entry++) {
 
-        if (!memcmp(iter, &uuid_null, sizeof(uuid_t))) {
+        if (efi_guid_cmp((struct efi_guid_t *)iter, &uuid_null) == 0) {
             return FIP_PARSER_ERROR;
         }
 
-        if (!memcmp(iter, &tfa_uuid, sizeof(uuid_t))) {
+        if (efi_guid_cmp((struct efi_guid_t *)iter, &tfa_uuid) == 0) {
             BOOT_LOG_INF("TF-A FIP at : address = 0x%x : size = 0x%x \n\r",
                                 toc_entry->address,
                                 toc_entry->size);
@@ -57,5 +60,6 @@ int parse_fip_and_extract_tfa_info(uint32_t address, uint32_t fip_size,
         }
     }
 
+    BOOT_LOG_ERR("Unable to find TF-A FIP\r\n");
     return FIP_PARSER_ERROR;
 }
diff --git a/platform/ext/target/arm/corstone1000/fip_parser/fip_parser.h b/platform/ext/target/arm/corstone1000/fip_parser/fip_parser.h
index b01000e00..92f35459c 100644
--- a/platform/ext/target/arm/corstone1000/fip_parser/fip_parser.h
+++ b/platform/ext/target/arm/corstone1000/fip_parser/fip_parser.h
@@ -24,8 +24,9 @@ extern "C"
 {
 #endif
 
+#include "efi_guid_structs.h"
+
 #include <stdint.h>
-#include "external/uuid.h"
 
 /* Return code of fip parser APIs */
 #define FIP_PARSER_SUCCESS                     (0)
@@ -35,10 +36,13 @@ extern "C"
 #define TOC_HEADER_NAME 0xAA640001
 
 /* ToC Entry UUIDs */
-#define UUID_TRUSTED_BOOT_FIRMWARE_BL2 \
-    {{0x5f, 0xf9, 0xec, 0x0b}, {0x4d, 0x22}, \
-    {0x3e, 0x4d}, 0xa5, 0x44, \
-    {0xc3, 0x9d, 0x81, 0xc7, 0x3f, 0x0a} }
+#define UUID_TRUSTED_BOOT_FIRMWARE_BL2  \
+    MAKE_EFI_GUID(                      \
+            0x0BECF95F,                 \
+            0x224D,                     \
+            0x4D3E,                     \
+            0xA5, 0x44,                 \
+            0xC3, 0x9D, 0x81, 0xC7, 0x3F, 0x0A)
 
 typedef struct _FIP_TOC_HEADER {
     uint32_t    name;
@@ -52,12 +56,12 @@ typedef struct _FIP_TOC_HEADER {
 */
 
 typedef struct _FIP_TOC_ENTRY {
-    uuid_t      uuid;
-    uint32_t    address;
-    uint32_t    pad1;
-    uint32_t    size;
-    uint32_t    pad2;
-    uint64_t    flags;
+    struct efi_guid_t   uuid;
+    uint32_t            address;
+    uint32_t            pad1;
+    uint32_t            size;
+    uint32_t            pad2;
+    uint64_t            flags;
 } FIP_TOC_ENTRY;
 
 int parse_fip_and_extract_tfa_info(uint32_t address, uint32_t fip_size,
diff --git a/platform/ext/target/arm/corstone1000/io/io_block.c b/platform/ext/target/arm/corstone1000/io/io_block.c
deleted file mode 100644
index a5c021ac5..000000000
--- a/platform/ext/target/arm/corstone1000/io/io_block.c
+++ /dev/null
@@ -1,528 +0,0 @@
-/*
- * Copyright (c) 2022 Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * 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 "io_block.h"
-
-#include <assert.h>
-#include <errno.h>
-#include <string.h>
-
-#include "io_defs.h"
-#include "io_driver.h"
-#include "io_storage.h"
-
-typedef struct {
-    io_block_dev_spec_t *dev_spec;
-    uintptr_t base;
-    uint32_t file_pos;
-    uint32_t size;
-} block_dev_state_t;
-
-#define is_power_of_2(x) (((x) != 0U) && (((x) & ((x)-1U)) == 0U))
-
-io_type_t device_type_block(void);
-
-static int block_open(io_dev_info_t *dev_info, const uintptr_t spec,
-                      io_entity_t *entity);
-static int block_seek(io_entity_t *entity, int mode, size_t offset);
-static int block_read(io_entity_t *entity, uintptr_t buffer, size_t length,
-                      size_t *length_read);
-static int block_write(io_entity_t *entity, const uintptr_t buffer,
-                       size_t length, size_t *length_written);
-static int block_close(io_entity_t *entity);
-static int block_dev_open(const uintptr_t dev_spec, io_dev_info_t **dev_info);
-static int block_dev_close(io_dev_info_t *dev_info);
-
-static const io_dev_connector_t block_dev_connector = {.dev_open =
-                                                           block_dev_open};
-
-static const io_dev_funcs_t block_dev_funcs = {
-    .type = device_type_block,
-    .open = block_open,
-    .seek = block_seek,
-    .size = NULL,
-    .read = block_read,
-    .write = block_write,
-    .close = block_close,
-    .dev_init = NULL,
-    .dev_close = block_dev_close,
-};
-
-static block_dev_state_t state_pool[MAX_IO_BLOCK_DEVICES];
-static io_dev_info_t dev_info_pool[MAX_IO_BLOCK_DEVICES];
-
-/* Track number of allocated block state */
-static unsigned int block_dev_count;
-
-io_type_t device_type_block(void) { return IO_TYPE_BLOCK; }
-
-/* Locate a block state in the pool, specified by address */
-static int find_first_block_state(const io_block_dev_spec_t *dev_spec,
-                                  unsigned int *index_out) {
-    unsigned int index;
-    int result = -ENOENT;
-
-    for (index = 0U; index < MAX_IO_BLOCK_DEVICES; ++index) {
-        /* dev_spec is used as identifier since it's unique */
-        if (state_pool[index].dev_spec == dev_spec) {
-            result = 0;
-            *index_out = index;
-            break;
-        }
-    }
-    return result;
-}
-
-/* Allocate a device info from the pool and return a pointer to it */
-static int allocate_dev_info(io_dev_info_t **dev_info) {
-    int result = -ENOMEM;
-    assert(dev_info != NULL);
-
-    if (block_dev_count < MAX_IO_BLOCK_DEVICES) {
-        unsigned int index = 0;
-        result = find_first_block_state(NULL, &index);
-        assert(result == 0);
-        /* initialize dev_info */
-        dev_info_pool[index].funcs = &block_dev_funcs;
-        dev_info_pool[index].info = (uintptr_t)&state_pool[index];
-        *dev_info = &dev_info_pool[index];
-        ++block_dev_count;
-    }
-
-    return result;
-}
-
-/* Release a device info to the pool */
-static int free_dev_info(io_dev_info_t *dev_info) {
-    int result;
-    unsigned int index = 0;
-    block_dev_state_t *state;
-    assert(dev_info != NULL);
-
-    state = (block_dev_state_t *)dev_info->info;
-    result = find_first_block_state(state->dev_spec, &index);
-    if (result == 0) {
-        /* free if device info is valid */
-        memset(state, 0, sizeof(block_dev_state_t));
-        memset(dev_info, 0, sizeof(io_dev_info_t));
-        --block_dev_count;
-    }
-
-    return result;
-}
-
-static int block_open(io_dev_info_t *dev_info, const uintptr_t spec,
-                      io_entity_t *entity) {
-    block_dev_state_t *cur;
-    io_block_spec_t *region;
-
-    assert((dev_info->info != (uintptr_t)NULL) && (spec != (uintptr_t)NULL) &&
-           (entity->info == (uintptr_t)NULL));
-
-    region = (io_block_spec_t *)spec;
-    cur = (block_dev_state_t *)dev_info->info;
-    assert(((region->offset % cur->dev_spec->block_size) == 0) &&
-           ((region->length % cur->dev_spec->block_size) == 0));
-
-    cur->base = region->offset;
-    cur->size = region->length;
-    cur->file_pos = 0;
-
-    entity->info = (uintptr_t)cur;
-    return 0;
-}
-
-/* parameter offset is relative address at here */
-static int block_seek(io_entity_t *entity, int mode, size_t offset) {
-    block_dev_state_t *cur;
-
-    assert(entity->info != (uintptr_t)NULL);
-
-    cur = (block_dev_state_t *)entity->info;
-
-    assert((offset >= 0) && ((uint32_t)offset < cur->size));
-    switch (mode) {
-        case IO_SEEK_SET:
-            cur->file_pos = (uint32_t)offset;
-            break;
-        case IO_SEEK_CUR:
-            cur->file_pos += (uint32_t)offset;
-            break;
-        default:
-            return -EINVAL;
-    }
-    assert(cur->file_pos < cur->size);
-    return 0;
-}
-
-/*
- * This function allows the caller to read any number of bytes
- * from any position. It hides from the caller that the low level
- * driver only can read aligned blocks of data. For this reason
- * we need to handle the use case where the first byte to be read is not
- * aligned to start of the block, the last byte to be read is also not
- * aligned to the end of a block, and there are zero or more blocks-worth
- * of data in between.
- *
- * In such a case we need to read more bytes than requested (i.e. full
- * blocks) and strip-out the leading bytes (aka skip) and the trailing
- * bytes (aka padding). See diagram below
- *
- * cur->file_pos ------------
- *                          |
- * cur->base                |
- *  |                       |
- *  v                       v<----  length   ---->
- *  --------------------------------------------------------------
- * |           |         block#1    |        |   block#n          |
- * |  block#0  |            +       |   ...  |     +              |
- * |           | <- skip -> +       |        |     + <- padding ->|
- *  ------------------------+----------------------+--------------
- *             ^                                                  ^
- *             |                                                  |
- *             v    iteration#1                iteration#n        v
- *              --------------------------------------------------
- *             |                    |        |                    |
- *             |<----  request ---->|  ...   |<----- request ---->|
- *             |                    |        |                    |
- *              --------------------------------------------------
- *            /                   /          |                    |
- *           /                   /           |                    |
- *          /                   /            |                    |
- *         /                   /             |                    |
- *        /                   /              |                    |
- *       /                   /               |                    |
- *      /                   /                |                    |
- *     /                   /                 |                    |
- *    /                   /                  |                    |
- *   /                   /                   |                    |
- *  <---- request ------>                    <------ request  ----->
- *  ---------------------                    -----------------------
- *  |        |          |                    |          |           |
- *  |<-skip->|<-nbytes->|           -------->|<-nbytes->|<-padding->|
- *  |        |          |           |        |          |           |
- *  ---------------------           |        -----------------------
- *  ^        \           \          |        |          |
- *  |         \           \         |        |          |
- *  |          \           \        |        |          |
- *  buf->offset \           \   buf->offset  |          |
- *               \           \               |          |
- *                \           \              |          |
- *                 \           \             |          |
- *                  \           \            |          |
- *                   \           \           |          |
- *                    \           \          |          |
- *                     \           \         |          |
- *                      --------------------------------
- *                      |           |        |         |
- * buffer-------------->|           | ...    |         |
- *                      |           |        |         |
- *                      --------------------------------
- *                      <-count#1->|                   |
- *                      <----------  count#n   -------->
- *                      <----------  length  ---------->
- *
- * Additionally, the IO driver has an underlying buffer that is at least
- * one block-size and may be big enough to allow.
- */
-static int block_read(io_entity_t *entity, uintptr_t buffer, size_t length,
-                      size_t *length_read) {
-    block_dev_state_t *cur;
-    io_block_spec_t *buf;
-    io_block_ops_t *ops;
-    int lba;
-    size_t block_size, left;
-    size_t nbytes;  /* number of bytes read in one iteration */
-    size_t request; /* number of requested bytes in one iteration */
-    size_t count;   /* number of bytes already read */
-    /*
-     * number of leading bytes from start of the block
-     * to the first byte to be read
-     */
-    size_t skip;
-
-    /*
-     * number of trailing bytes between the last byte
-     * to be read and the end of the block
-     */
-    size_t padding;
-
-    assert(entity->info != (uintptr_t)NULL);
-    cur = (block_dev_state_t *)entity->info;
-    ops = &(cur->dev_spec->ops);
-    buf = &(cur->dev_spec->buffer);
-    block_size = cur->dev_spec->block_size;
-    assert((length <= cur->size) && (length > 0U) && (ops->read != 0));
-
-    /*
-     * We don't know the number of bytes that we are going
-     * to read in every iteration, because it will depend
-     * on the low level driver.
-     */
-    count = 0;
-    for (left = length; left > 0U; left -= nbytes) {
-        /*
-         * We must only request operations aligned to the block
-         * size. Therefore if file_pos is not block-aligned,
-         * we have to request the operation to start at the
-         * previous block boundary and skip the leading bytes. And
-         * similarly, the number of bytes requested must be a
-         * block size multiple
-         */
-        skip = cur->file_pos & (block_size - 1U);
-
-        /*
-         * Calculate the block number containing file_pos
-         * - e.g. block 3.
-         */
-        lba = (cur->file_pos + cur->base) / block_size;
-
-        if ((skip + left) > buf->length) {
-            /*
-             * The underlying read buffer is too small to
-             * read all the required data - limit to just
-             * fill the buffer, and then read again.
-             */
-            request = buf->length;
-        } else {
-            /*
-             * The underlying read buffer is big enough to
-             * read all the required data. Calculate the
-             * number of bytes to read to align with the
-             * block size.
-             */
-            request = skip + left;
-            request = (request + (block_size - 1U)) & ~(block_size - 1U);
-        }
-        request = ops->read(lba, buf->offset, request);
-
-        if (request <= skip) {
-            /*
-             * We couldn't read enough bytes to jump over
-             * the skip bytes, so we should have to read
-             * again the same block, thus generating
-             * the same error.
-             */
-            return -EIO;
-        }
-
-        /*
-         * Need to remove skip and padding bytes,if any, from
-         * the read data when copying to the user buffer.
-         */
-        nbytes = request - skip;
-        padding = (nbytes > left) ? nbytes - left : 0U;
-        nbytes -= padding;
-
-        memcpy((void *)(buffer + count), (void *)(buf->offset + skip), nbytes);
-
-        cur->file_pos += nbytes;
-        count += nbytes;
-    }
-    assert(count == length);
-    *length_read = count;
-
-    return 0;
-}
-
-/*
- * This function allows the caller to write any number of bytes
- * from any position. It hides from the caller that the low level
- * driver only can write aligned blocks of data.
- * See comments for block_read for more details.
- */
-static int block_write(io_entity_t *entity, const uintptr_t buffer,
-                       size_t length, size_t *length_written) {
-    block_dev_state_t *cur;
-    io_block_spec_t *buf;
-    io_block_ops_t *ops;
-    int lba;
-    size_t block_size, left;
-    size_t nbytes;  /* number of bytes read in one iteration */
-    size_t request; /* number of requested bytes in one iteration */
-    size_t count;   /* number of bytes already read */
-    /*
-     * number of leading bytes from start of the block
-     * to the first byte to be read
-     */
-    size_t skip;
-
-    /*
-     * number of trailing bytes between the last byte
-     * to be read and the end of the block
-     */
-    size_t padding;
-    assert(entity->info != (uintptr_t)NULL);
-    cur = (block_dev_state_t *)entity->info;
-    ops = &(cur->dev_spec->ops);
-    buf = &(cur->dev_spec->buffer);
-    block_size = cur->dev_spec->block_size;
-    assert((length <= cur->size) && (length > 0U) && (ops->read != 0) &&
-           (ops->write != 0));
-
-    /*
-     * We don't know the number of bytes that we are going
-     * to write in every iteration, because it will depend
-     * on the low level driver.
-     */
-    count = 0;
-    for (left = length; left > 0U; left -= nbytes) {
-        /*
-         * We must only request operations aligned to the block
-         * size. Therefore if file_pos is not block-aligned,
-         * we have to request the operation to start at the
-         * previous block boundary and skip the leading bytes. And
-         * similarly, the number of bytes requested must be a
-         * block size multiple
-         */
-        skip = cur->file_pos & (block_size - 1U);
-
-        /*
-         * Calculate the block number containing file_pos
-         * - e.g. block 3.
-         */
-        lba = (cur->file_pos + cur->base) / block_size;
-
-        if ((skip + left) > buf->length) {
-            /*
-             * The underlying read buffer is too small to
-             * read all the required data - limit to just
-             * fill the buffer, and then read again.
-             */
-            request = buf->length;
-        } else {
-            /*
-             * The underlying read buffer is big enough to
-             * read all the required data. Calculate the
-             * number of bytes to read to align with the
-             * block size.
-             */
-            request = skip + left;
-            request = (request + (block_size - 1U)) & ~(block_size - 1U);
-        }
-
-        /*
-         * The number of bytes that we are going to write
-         * from the user buffer will depend of the size
-         * of the current request.
-         */
-        nbytes = request - skip;
-        padding = (nbytes > left) ? nbytes - left : 0U;
-        nbytes -= padding;
-
-        /*
-         * If we have skip or padding bytes then we have to preserve
-         * some content and it means that we have to read before
-         * writing
-         */
-        if ((skip > 0U) || (padding > 0U)) {
-            request = ops->read(lba, buf->offset, request);
-            /*
-             * The read may return size less than
-             * requested. Round down to the nearest block
-             * boundary
-             */
-            request &= ~(block_size - 1U);
-            if (request <= skip) {
-                /*
-                 * We couldn't read enough bytes to jump over
-                 * the skip bytes, so we should have to read
-                 * again the same block, thus generating
-                 * the same error.
-                 */
-                return -EIO;
-            }
-            nbytes = request - skip;
-            padding = (nbytes > left) ? nbytes - left : 0U;
-            nbytes -= padding;
-        }
-
-        memcpy((void *)(buf->offset + skip), (void *)(buffer + count), nbytes);
-
-        request = ops->write(lba, buf->offset, request);
-        if (request <= skip) return -EIO;
-
-        /*
-         * And the previous write operation may modify the size
-         * of the request, so again, we have to calculate the
-         * number of bytes that we consumed from the user
-         * buffer
-         */
-        nbytes = request - skip;
-        padding = (nbytes > left) ? nbytes - left : 0U;
-        nbytes -= padding;
-
-        cur->file_pos += nbytes;
-        count += nbytes;
-    }
-    assert(count == length);
-    *length_written = count;
-
-    return 0;
-}
-
-static int block_close(io_entity_t *entity) {
-    entity->info = (uintptr_t)NULL;
-    return 0;
-}
-
-static int block_dev_open(const uintptr_t dev_spec, io_dev_info_t **dev_info) {
-    block_dev_state_t *cur;
-    io_block_spec_t *buffer;
-    io_dev_info_t *info;
-    size_t block_size;
-    int result;
-    assert(dev_info != NULL);
-    result = allocate_dev_info(&info);
-    if (result != 0) return -ENOENT;
-
-    cur = (block_dev_state_t *)info->info;
-    /* dev_spec is type of io_block_dev_spec_t. */
-    cur->dev_spec = (io_block_dev_spec_t *)dev_spec;
-    buffer = &(cur->dev_spec->buffer);
-    block_size = cur->dev_spec->block_size;
-
-    assert((block_size > 0U) && (is_power_of_2(block_size) != 0U) &&
-           ((buffer->length % block_size) == 0U));
-
-    *dev_info = info; /* cast away const */
-    (void)block_size;
-    (void)buffer;
-    return 0;
-}
-
-static int block_dev_close(io_dev_info_t *dev_info) {
-    return free_dev_info(dev_info);
-}
-
-/* Exported functions */
-
-/* Register the Block driver with the IO abstraction */
-int register_io_dev_block(const io_dev_connector_t **dev_con) {
-    int result;
-
-    assert(dev_con != NULL);
-
-    /*
-     * Since dev_info isn't really used in io_register_device, always
-     * use the same device info at here instead.
-     */
-    result = io_register_device(&dev_info_pool[0]);
-    if (result == 0) *dev_con = &block_dev_connector;
-    return result;
-}
diff --git a/platform/ext/target/arm/corstone1000/io/io_block.h b/platform/ext/target/arm/corstone1000/io/io_block.h
deleted file mode 100644
index 1603aa74c..000000000
--- a/platform/ext/target/arm/corstone1000/io/io_block.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2022 Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * 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.
- */
-
-#ifndef __IO_BLOCK_H__
-#define __IO_BLOCK_H__
-
-#include "io_storage.h"
-
-/* block devices ops */
-typedef struct io_block_ops {
-    size_t (*read)(int lba, uintptr_t buf, size_t size);
-    size_t (*write)(int lba, const uintptr_t buf, size_t size);
-} io_block_ops_t;
-
-typedef struct io_block_dev_spec {
-    io_block_spec_t buffer;
-    io_block_ops_t ops;
-    size_t block_size;
-} io_block_dev_spec_t;
-
-struct io_dev_connector;
-
-int register_io_dev_block(const struct io_dev_connector **dev_con);
-
-#endif /* __IO_BLOCK_H__ */
\ No newline at end of file
diff --git a/platform/ext/target/arm/corstone1000/io/io_defs.h b/platform/ext/target/arm/corstone1000/io/io_defs.h
deleted file mode 100644
index acba969ed..000000000
--- a/platform/ext/target/arm/corstone1000/io/io_defs.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2022 Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * 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.
- */
-
-#ifndef __IO_DEFS_H__
-#define __IO_DEFS_H__
-
-#define MAX_IO_DEVICES          (2)
-#define MAX_IO_HANDLES          (2)
-#define MAX_IO_BLOCK_DEVICES    (2)
-#define MAX_IO_FLASH_DEVICES    (2)
-
-#endif /* __IO_DEFS_H__ */
\ No newline at end of file
diff --git a/platform/ext/target/arm/corstone1000/io/io_driver.h b/platform/ext/target/arm/corstone1000/io/io_driver.h
deleted file mode 100644
index cf9e21a6d..000000000
--- a/platform/ext/target/arm/corstone1000/io/io_driver.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2014-2022, ARM Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#ifndef __IO_DRIVER_H__
-#define __IO_DRIVER_H__
-
-#include <io_storage.h>
-#include <stdint.h>
-
-/* Generic IO entity structure,representing an accessible IO construct on the
- * device, such as a file */
-typedef struct io_entity {
-    struct io_dev_info *dev_handle;
-    uintptr_t info;
-} io_entity_t;
-
-/* Device info structure, providing device-specific functions and a means of
- * adding driver-specific state */
-typedef struct io_dev_info {
-    const struct io_dev_funcs *funcs;
-    uintptr_t info;
-} io_dev_info_t;
-
-/* Structure used to create a connection to a type of device */
-typedef struct io_dev_connector {
-    /* dev_open opens a connection to a particular device driver */
-    int (*dev_open)(const uintptr_t dev_spec, io_dev_info_t **dev_info);
-} io_dev_connector_t;
-
-/* Structure to hold device driver function pointers */
-typedef struct io_dev_funcs {
-    io_type_t (*type)(void);
-    int (*open)(io_dev_info_t *dev_info, const uintptr_t spec,
-                io_entity_t *entity);
-    int (*seek)(io_entity_t *entity, int mode, size_t offset);
-    int (*size)(io_entity_t *entity, size_t *length);
-    int (*read)(io_entity_t *entity, uintptr_t buffer, size_t length,
-                size_t *length_read);
-    int (*write)(io_entity_t *entity, const uintptr_t buffer, size_t length,
-                 size_t *length_written);
-    int (*close)(io_entity_t *entity);
-    int (*dev_init)(io_dev_info_t *dev_info, const uintptr_t init_params);
-    int (*dev_close)(io_dev_info_t *dev_info);
-} io_dev_funcs_t;
-
-/* Operations intended to be performed during platform initialisation */
-
-/* Register an IO device */
-int io_register_device(const io_dev_info_t *dev_info);
-
-#endif /* __IO_DRIVER_H__ */
diff --git a/platform/ext/target/arm/corstone1000/io/io_flash.c b/platform/ext/target/arm/corstone1000/io/io_flash.c
deleted file mode 100644
index b90a81a48..000000000
--- a/platform/ext/target/arm/corstone1000/io/io_flash.c
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (c) 2022 Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * 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 "io_flash.h"
-
-#include <assert.h>
-#include <errno.h>
-
-#include "Driver_Flash.h"
-#include "io_block.h"
-#include "io_defs.h"
-#include "io_driver.h"
-#include "io_storage.h"
-
-#if MAX_IO_FLASH_DEVICES > MAX_IO_BLOCK_DEVICES
-#error \
-    "FLASH devices are BLOCK devices .. MAX_IO_FLASH_DEVICES should be less or equal to MAX_IO_BLOCK_DEVICES"
-#endif
-
-/* Private Prototypes */
-
-static int flash_dev_open(const uintptr_t dev_spec, io_dev_info_t **dev_info);
-static size_t flash_read(int lba, uintptr_t buf, size_t size, size_t flash_id);
-static size_t flash_write(int lba, const uintptr_t buf, size_t size,
-                          size_t flash_id);
-static size_t flash0_read(int lba, uintptr_t buf, size_t size);
-static size_t flash0_write(int lba, uintptr_t buf, size_t size);
-static size_t flash1_read(int lba, uintptr_t buf, size_t size);
-static size_t flash1_write(int lba, uintptr_t buf, size_t size);
-
-/** Private Data **/
-
-/* Flash device data */
-static const io_dev_connector_t flash_dev_connector = {.dev_open =
-                                                           flash_dev_open};
-static size_t flash_dev_count = 0;
-static io_flash_dev_spec_t *flash_dev_specs[MAX_IO_FLASH_DEVICES];
-
-/* Block device data */
-static io_dev_connector_t block_dev_connectors[MAX_IO_FLASH_DEVICES];
-static io_block_dev_spec_t block_dev_spec[MAX_IO_FLASH_DEVICES];
-
-/* Flash devices read/write function pointers */
-static io_block_ops_t flashs_ops[MAX_IO_FLASH_DEVICES] = {
-    [0] = {.read = flash0_read, .write = flash0_write},
-    [1] = {.read = flash1_read, .write = flash1_write},
-};
-
-/* Flash ops functions */
-static size_t flash_read(int lba, uintptr_t buf, size_t size, size_t flash_id) {
-    ARM_DRIVER_FLASH *flash_driver =
-        ((ARM_DRIVER_FLASH *)flash_dev_specs[flash_id]->flash_driver);
-    ARM_FLASH_INFO *info = flash_driver->GetInfo();
-    uint32_t addr = info->sector_size * lba;
-    uint32_t offset = addr - flash_dev_specs[flash_id]->base_addr;
-    size_t rem = info->sector_count * info->sector_size - offset;
-    size_t cnt = size < rem ? size : rem;
-
-    return flash_driver->ReadData(offset, (void *)buf, cnt);
-}
-
-static size_t flash_write(int lba, const uintptr_t buf, size_t size,
-                          size_t flash_id) {
-    ARM_DRIVER_FLASH *flash_driver =
-        ((ARM_DRIVER_FLASH *)flash_dev_specs[flash_id]->flash_driver);
-    ARM_FLASH_INFO *info = flash_driver->GetInfo();
-    int32_t rc = 0;
-    uint32_t addr = info->sector_size * lba;
-    uint32_t offset = addr - flash_dev_specs[flash_id]->base_addr;
-    size_t rem = info->sector_count * info->sector_size - offset;
-    size_t cnt = size < rem ? size : rem;
-
-    flash_driver->EraseSector(offset);
-    rc = flash_driver->ProgramData(offset, (const void *)buf, cnt);
-    return rc;
-}
-
-/* Flash ops functions wrapper for each device */
-
-static size_t flash0_read(int lba, uintptr_t buf, size_t size) {
-    return flash_read(lba, buf, size, 0);
-}
-
-static size_t flash0_write(int lba, uintptr_t buf, size_t size) {
-    return flash_write(lba, buf, size, 0);
-}
-
-static size_t flash1_read(int lba, uintptr_t buf, size_t size) {
-    return flash_read(lba, buf, size, 1);
-}
-
-static size_t flash1_write(int lba, uintptr_t buf, size_t size) {
-    return flash_write(lba, buf, size, 1);
-}
-
-/**
- *  Helper function to find the index of stored flash_dev_specs or
- *  return a free slot in case of a new dev_spec
- */
-static int find_flash_dev_specs(const uintptr_t dev_spec) {
-    /* Search in the saved ones */
-    for (int i = 0; i < flash_dev_count; ++i) {
-        if (flash_dev_specs[i] != NULL &&
-            flash_dev_specs[i]->flash_driver ==
-                ((io_flash_dev_spec_t *)dev_spec)->flash_driver) {
-            return i;
-        }
-    }
-    /* Find the first empty flash_dev_specs to be used */
-    for (int i = 0; i < flash_dev_count; ++i) {
-        if (flash_dev_specs[i] == NULL) {
-            return i;
-        }
-    }
-    return -1;
-}
-
-/**
- * This function should be called
- */
-static int flash_dev_open(const uintptr_t dev_spec, io_dev_info_t **dev_info) {
-    ARM_DRIVER_FLASH *flash_driver;
-    assert(dev_info != NULL);
-    assert(dev_spec != NULL);
-
-    size_t index = find_flash_dev_specs(dev_spec);
-
-    /* Check if Flash ops functions are defined for this flash */
-    assert(flashs_ops[index].read && flashs_ops[index].write);
-
-    flash_dev_specs[index] = (io_flash_dev_spec_t *)dev_spec;
-    flash_driver = (const ARM_DRIVER_FLASH *)flash_dev_specs[index]->flash_driver;
-
-    block_dev_spec[index].block_size = flash_driver->GetInfo()->sector_size;
-    block_dev_spec[index].buffer.offset = flash_dev_specs[index]->buffer;
-    block_dev_spec[index].buffer.length = flash_dev_specs[index]->bufferlen;
-    block_dev_spec[index].ops = flashs_ops[index];
-
-    flash_driver->Initialize(NULL);
-
-    block_dev_connectors[index].dev_open((uintptr_t)&block_dev_spec[index], dev_info);
-
-    return 0;
-}
-
-/* Exported functions */
-
-/**
- * Register the flash device.
- * Internally it register a block device.
- */
-int register_io_dev_flash(const io_dev_connector_t **dev_con) {
-    int result;
-
-    if (flash_dev_count >= MAX_IO_FLASH_DEVICES) {
-        return -ENOENT;
-    }
-    assert(dev_con != NULL);
-
-    result = register_io_dev_block(dev_con);
-    if (result == 0) {
-        /* Store the block dev connector */
-        block_dev_connectors[flash_dev_count++] = **dev_con;
-        /* Override dev_con with the flash dev connector */
-        *dev_con = &flash_dev_connector;
-    }
-    return result;
-}
diff --git a/platform/ext/target/arm/corstone1000/io/io_flash.h b/platform/ext/target/arm/corstone1000/io/io_flash.h
deleted file mode 100644
index 8bc38b582..000000000
--- a/platform/ext/target/arm/corstone1000/io/io_flash.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2022 Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * 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.
- */
-
-#ifndef __IO_FLASH_H__
-#define __IO_FLASH_H__
-
-#include "io_storage.h"
-
-typedef struct io_flash_dev_spec {
-    uintptr_t buffer;
-    size_t bufferlen;
-    uint32_t base_addr;
-    uintptr_t flash_driver;
-} io_flash_dev_spec_t;
-
-struct io_dev_connector;
-
-/* Register the flash driver with the IO abstraction internally it register a
- * block device*/
-int register_io_dev_flash(const struct io_dev_connector **dev_con);
-
-#endif /* __IO_FLASH_H__ */
diff --git a/platform/ext/target/arm/corstone1000/io/io_gpt.c b/platform/ext/target/arm/corstone1000/io/io_gpt.c
new file mode 100644
index 000000000..513c77016
--- /dev/null
+++ b/platform/ext/target/arm/corstone1000/io/io_gpt.c
@@ -0,0 +1,179 @@
+/*
+ * SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <inttypes.h>
+
+#include "io_gpt.h"
+
+#include "Driver_Flash.h"
+#include "gpt_flash.h"
+#include "flash_layout.h"
+
+/* Check if globals in module have been initialised */
+#define CHECK_INIT                      \
+    do {                                \
+        if (!flash_driver) {            \
+            return GPT_FLASH_NOT_INIT;  \
+        }                               \
+    } while (0)
+
+/* Check the given flash access is valid */
+#define CHECK_BOUNDS(addr, size)                                          \
+    do {                                                                  \
+        if (size > FLASH_TOTAL_SIZE || addr > FLASH_TOTAL_SIZE - size) {  \
+            return GPT_FLASH_BAD_PARAM;                                   \
+        }                                                                 \
+    } while (0)
+
+/* Aligns address to flash sector sizes */
+#define ALIGN_TO_SECTOR(addr) (((addr) / FLASH_SECTOR_SIZE) * FLASH_SECTOR_SIZE)
+
+/* Number of LBAs per sector of flash */
+#define LBAS_PER_SECTOR (FLASH_SECTOR_SIZE / TFM_GPT_BLOCK_SIZE)
+
+/* Returns the offset within a sector for the given lba */
+static inline uint64_t sector_offset(uint64_t lba)
+{
+    return (lba % LBAS_PER_SECTOR) * TFM_GPT_BLOCK_SIZE;
+}
+
+/* The actual flash driver under the hood */
+static ARM_DRIVER_FLASH *flash_driver = NULL;
+
+/* Buffer used to store sector of flash data */
+static uint8_t sector_buf[FLASH_SECTOR_SIZE];
+
+/* From io_gpt.h - the driver given to the GPT library */
+struct gpt_flash_driver_t io_gpt_flash_driver = {0};
+
+/* Erases TFM_GPT_BLOCK_SIZE bytes from offset within the sector beginning at
+ * sector_addr. This is done via a read-erase-write pattern whereby data is read,
+ * the sector is erased, and data written back to the parts of the sector that
+ * shouldn't have been erased
+ */
+static gpt_flash_err_t partially_erase_sector(uint32_t sector_addr,
+                                              uint32_t offset)
+{
+    if (flash_driver->ReadData(
+                sector_addr,
+                sector_buf,
+                FLASH_SECTOR_SIZE) != FLASH_SECTOR_SIZE)
+    {
+        return GPT_FLASH_GENERIC_ERROR;
+    }
+
+    if (flash_driver->EraseSector(sector_addr) != ARM_DRIVER_OK) {
+        return GPT_FLASH_GENERIC_ERROR;
+    }
+
+    memset(sector_buf + offset, flash_driver->GetInfo()->erased_value, TFM_GPT_BLOCK_SIZE);
+    if (flash_driver->ProgramData(
+                sector_addr,
+                sector_buf,
+                FLASH_SECTOR_SIZE) != FLASH_SECTOR_SIZE)
+    {
+        return GPT_FLASH_GENERIC_ERROR;
+    }
+
+    return GPT_FLASH_SUCCESS;
+}
+
+/* Reads the requested LBA into the given buffer */
+static ssize_t flash_read(uint64_t lba, void *buf)
+{
+    CHECK_INIT;
+
+    uint64_t read_addr = lba * TFM_GPT_BLOCK_SIZE;
+    CHECK_BOUNDS(read_addr, TFM_GPT_BLOCK_SIZE);
+
+    if (flash_driver->ReadData(read_addr, buf, TFM_GPT_BLOCK_SIZE) != TFM_GPT_BLOCK_SIZE) {
+        return GPT_FLASH_GENERIC_ERROR;
+    }
+
+    return TFM_GPT_BLOCK_SIZE;
+}
+
+/* Writes the given buffer to the requested LBA */
+static ssize_t flash_write(uint64_t lba, const void *buf)
+{
+    CHECK_INIT;
+
+    uint64_t write_addr = lba * TFM_GPT_BLOCK_SIZE;
+    CHECK_BOUNDS(write_addr, TFM_GPT_BLOCK_SIZE);
+
+    if (flash_driver->ProgramData(write_addr, buf, TFM_GPT_BLOCK_SIZE) != TFM_GPT_BLOCK_SIZE) {
+        return GPT_FLASH_GENERIC_ERROR;
+    }
+
+    return TFM_GPT_BLOCK_SIZE;
+}
+
+/* Erases a consecutive number of blocks, beginning with the given LBA */
+static ssize_t flash_erase(uint64_t lba, size_t num_blocks)
+{
+    CHECK_INIT;
+
+    if (num_blocks == 0) {
+        return GPT_FLASH_BAD_PARAM;
+    }
+
+    /* Convert blocks to sectors. The first and final sectors may be partially erased */
+    size_t num_sectors = num_blocks / LBAS_PER_SECTOR;
+    if (num_sectors == 0) {
+        /* Partially erase first sector and thats it */
+        num_sectors = 1;
+    }
+
+    uint64_t erase_addr = ALIGN_TO_SECTOR(lba * TFM_GPT_BLOCK_SIZE);
+    CHECK_BOUNDS(erase_addr, FLASH_SECTOR_SIZE);
+
+    uint64_t last_erase_addr = erase_addr + ((num_sectors - 1) * FLASH_SECTOR_SIZE);
+    CHECK_BOUNDS(last_erase_addr, FLASH_SECTOR_SIZE);
+
+    /* Whole sector erases until last sector */
+    for (size_t i = 0; i < num_sectors - 1; ++i) {
+        int32_t ret = flash_driver->EraseSector(erase_addr + i * FLASH_SECTOR_SIZE);
+        if (ret != ARM_DRIVER_OK) {
+            return i;
+        }
+    }
+
+    if (num_blocks % LBAS_PER_SECTOR == 0 && lba % LBAS_PER_SECTOR == 0) {
+        /* Fully erase final sector */
+        if (flash_driver->EraseSector(last_erase_addr) != ARM_DRIVER_OK) {
+            return (num_sectors - 1) * LBAS_PER_SECTOR;
+        }
+    } else {
+        /* Partial erase of final sector */
+        if (partially_erase_sector(
+                    last_erase_addr,
+                    sector_offset(lba)) != GPT_FLASH_SUCCESS)
+        {
+            return num_sectors == 0 ? GPT_FLASH_GENERIC_ERROR : (num_sectors - 1) * LBAS_PER_SECTOR;
+        }
+    }
+
+    return num_blocks;
+}
+
+int register_flash_io_gpt(ARM_DRIVER_FLASH *driver)
+{
+    /* Initialise the driver */
+    driver->Initialize(NULL);
+
+    /* Store everything needed */
+    flash_driver = driver;
+
+    io_gpt_flash_driver.read = flash_read;
+    io_gpt_flash_driver.write = flash_write;
+    io_gpt_flash_driver.erase = flash_erase;
+
+    return 0;
+}
diff --git a/platform/ext/target/arm/corstone1000/io/io_gpt.h b/platform/ext/target/arm/corstone1000/io/io_gpt.h
new file mode 100644
index 000000000..96dcda04e
--- /dev/null
+++ b/platform/ext/target/arm/corstone1000/io/io_gpt.h
@@ -0,0 +1,25 @@
+/*
+ * SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#ifndef __IO_GPT_H__
+#define __IO_GPT_H__
+
+#include "io_gpt.h"
+
+#include "Driver_Flash.h"
+#include "gpt_flash.h"
+
+/* The pseudo flash driver used by the GPT library. Each LBA maps
+ * FLASH_SECTOR_SIZE:TFM_GPT_BLOCK_SIZE to a sector of flash (so 1024:512 means
+ * two LBAs per sector of flash)
+ */
+extern struct gpt_flash_driver_t io_gpt_flash_driver;
+
+/* Sets up the gpt_flash_driver with the given driver and initialises the latter */
+int register_flash_io_gpt(ARM_DRIVER_FLASH *driver);
+
+#endif /* __IO_GPT_H__ */
diff --git a/platform/ext/target/arm/corstone1000/io/io_storage.c b/platform/ext/target/arm/corstone1000/io/io_storage.c
deleted file mode 100644
index f26f4980f..000000000
--- a/platform/ext/target/arm/corstone1000/io/io_storage.c
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Copyright (c) 2022 Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * 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 <assert.h>
-#include <errno.h>
-#include <stdbool.h>
-
-#include "io_defs.h"
-#include "io_driver.h"
-
-/* Storage for a fixed maximum number of IO entities, definable by platform */
-static io_entity_t entity_pool[MAX_IO_HANDLES];
-
-/* Simple way of tracking used storage - each entry is NULL or a pointer to an
- * entity */
-static io_entity_t *entity_map[MAX_IO_HANDLES];
-
-/* Track number of allocated entities */
-static unsigned int entity_count;
-
-/* Array of fixed maximum of registered devices, definable by platform */
-static const io_dev_info_t *devices[MAX_IO_DEVICES];
-
-/* Number of currently registered devices */
-static unsigned int dev_count;
-
-/* Return a boolean value indicating whether a device connector is valid */
-static bool is_valid_dev_connector(const io_dev_connector_t *dev_con) {
-    return (dev_con != NULL) && (dev_con->dev_open != NULL);
-}
-
-/* Return a boolean value indicating whether a device handle is valid */
-static bool is_valid_dev(const uintptr_t dev_handle) {
-    const io_dev_info_t *dev = (io_dev_info_t *)dev_handle;
-
-    return (dev != NULL) && (dev->funcs != NULL) &&
-           (dev->funcs->type != NULL) && (dev->funcs->type() < IO_TYPE_MAX);
-}
-
-/* Return a boolean value indicating whether an IO entity is valid */
-static bool is_valid_entity(const uintptr_t handle) {
-    const io_entity_t *entity = (io_entity_t *)handle;
-
-    return (entity != NULL) && (is_valid_dev((uintptr_t)entity->dev_handle));
-}
-
-/* Return a boolean value indicating whether a seek mode is valid */
-static bool is_valid_seek_mode(io_seek_mode_t mode) {
-    return ((mode != IO_SEEK_INVALID) && (mode < IO_SEEK_MAX));
-}
-
-/* Open a connection to a specific device */
-static int io_storage_dev_open(const io_dev_connector_t *dev_con,
-                               const uintptr_t dev_spec,
-                               io_dev_info_t **dev_info) {
-    assert(dev_info != NULL);
-    assert(is_valid_dev_connector(dev_con));
-
-    return dev_con->dev_open(dev_spec, dev_info);
-}
-
-/* Set a handle to track an entity */
-static void set_handle(uintptr_t *handle, io_entity_t *entity) {
-    assert(handle != NULL);
-    *handle = (uintptr_t)entity;
-}
-
-/* Locate an entity in the pool, specified by address */
-static int find_first_entity(const io_entity_t *entity,
-                             unsigned int *index_out) {
-    int result = -ENOENT;
-    for (unsigned int index = 0; index < MAX_IO_HANDLES; ++index) {
-        if (entity_map[index] == entity) {
-            result = 0;
-            *index_out = index;
-            break;
-        }
-    }
-    return result;
-}
-
-/* Allocate an entity from the pool and return a pointer to it */
-static int allocate_entity(io_entity_t **entity) {
-    int result = -ENOMEM;
-    assert(entity != NULL);
-
-    if (entity_count < MAX_IO_HANDLES) {
-        unsigned int index = 0;
-        result = find_first_entity(NULL, &index);
-        assert(result == 0);
-        *entity = &entity_pool[index];
-        entity_map[index] = &entity_pool[index];
-        ++entity_count;
-    }
-
-    return result;
-}
-
-/* Release an entity back to the pool */
-static int free_entity(const io_entity_t *entity) {
-    int result;
-    unsigned int index = 0;
-    assert(entity != NULL);
-
-    result = find_first_entity(entity, &index);
-    if (result == 0) {
-        entity_map[index] = NULL;
-        --entity_count;
-    }
-
-    return result;
-}
-
-/* Exported API */
-
-/* Register an io device */
-int io_register_device(const io_dev_info_t *dev_info) {
-    int result = -ENOMEM;
-    assert(dev_info != NULL);
-
-    if (dev_count < MAX_IO_DEVICES) {
-        devices[dev_count] = dev_info;
-        dev_count++;
-        result = 0;
-    }
-
-    return result;
-}
-
-/* Open a connection to an IO device */
-int io_dev_open(const io_dev_connector_t *dev_con, const uintptr_t dev_spec,
-                uintptr_t *handle) {
-    assert(handle != NULL);
-    return io_storage_dev_open(dev_con, dev_spec, (io_dev_info_t **)handle);
-}
-
-/* Initialise an IO device explicitly - to permit lazy initialisation or
- * re-initialisation */
-int io_dev_init(uintptr_t dev_handle, const uintptr_t init_params) {
-    int result = 0;
-    assert(dev_handle != (uintptr_t)NULL);
-    assert(is_valid_dev(dev_handle));
-
-    io_dev_info_t *dev = (io_dev_info_t *)dev_handle;
-
-    /* Absence of registered function implies NOP here */
-    if (dev->funcs->dev_init != NULL) {
-        result = dev->funcs->dev_init(dev, init_params);
-    }
-
-    return result;
-}
-
-/* Close a connection to a device */
-int io_dev_close(uintptr_t dev_handle) {
-    int result = 0;
-    assert(dev_handle != (uintptr_t)NULL);
-    assert(is_valid_dev(dev_handle));
-
-    io_dev_info_t *dev = (io_dev_info_t *)dev_handle;
-
-    /* Absence of registered function implies NOP here */
-    if (dev->funcs->dev_close != NULL) {
-        result = dev->funcs->dev_close(dev);
-    }
-
-    return result;
-}
-
-/* Synchronous operations */
-
-/* Open an IO entity */
-int io_open(uintptr_t dev_handle, const uintptr_t spec, uintptr_t *handle) {
-    int result;
-    assert((spec != (uintptr_t)NULL) && (handle != NULL));
-    assert(is_valid_dev(dev_handle));
-
-    io_dev_info_t *dev = (io_dev_info_t *)dev_handle;
-    io_entity_t *entity;
-
-    result = allocate_entity(&entity);
-
-    if (result == 0) {
-        assert(dev->funcs->open != NULL);
-        result = dev->funcs->open(dev, spec, entity);
-
-        if (result == 0) {
-            entity->dev_handle = dev;
-            set_handle(handle, entity);
-        } else
-            free_entity(entity);
-    }
-    return result;
-}
-
-/* Seek to a specific position in an IO entity */
-int io_seek(uintptr_t handle, io_seek_mode_t mode, int32_t offset) {
-    int result = -ENODEV;
-    assert(is_valid_entity(handle) && is_valid_seek_mode(mode));
-
-    io_entity_t *entity = (io_entity_t *)handle;
-
-    io_dev_info_t *dev = entity->dev_handle;
-
-    if (dev->funcs->seek != NULL)
-        result = dev->funcs->seek(entity, mode, offset);
-
-    return result;
-}
-
-/* Determine the length of an IO entity */
-int io_size(uintptr_t handle, size_t *length) {
-    int result = -ENODEV;
-    assert(is_valid_entity(handle) && (length != NULL));
-
-    io_entity_t *entity = (io_entity_t *)handle;
-
-    io_dev_info_t *dev = entity->dev_handle;
-
-    if (dev->funcs->size != NULL) result = dev->funcs->size(entity, length);
-
-    return result;
-}
-
-/* Read data from an IO entity */
-int io_read(uintptr_t handle, uintptr_t buffer, size_t length,
-            size_t *length_read) {
-    int result = -ENODEV;
-    assert(is_valid_entity(handle));
-
-    io_entity_t *entity = (io_entity_t *)handle;
-
-    io_dev_info_t *dev = entity->dev_handle;
-
-    if (dev->funcs->read != NULL)
-        result = dev->funcs->read(entity, buffer, length, length_read);
-
-    return result;
-}
-
-/* Write data to an IO entity */
-int io_write(uintptr_t handle, const uintptr_t buffer, size_t length,
-             size_t *length_written) {
-    int result = -ENODEV;
-    assert(is_valid_entity(handle));
-
-    io_entity_t *entity = (io_entity_t *)handle;
-
-    io_dev_info_t *dev = entity->dev_handle;
-
-    if (dev->funcs->write != NULL) {
-        result = dev->funcs->write(entity, buffer, length, length_written);
-    }
-
-    return result;
-}
-
-/* Close an IO entity */
-int io_close(uintptr_t handle) {
-    int result = 0;
-    assert(is_valid_entity(handle));
-
-    io_entity_t *entity = (io_entity_t *)handle;
-
-    io_dev_info_t *dev = entity->dev_handle;
-
-    /* Absence of registered function implies NOP here */
-    if (dev->funcs->close != NULL) result = dev->funcs->close(entity);
-
-    /* Ignore improbable free_entity failure */
-    (void)free_entity(entity);
-
-    return result;
-}
diff --git a/platform/ext/target/arm/corstone1000/io/io_storage.h b/platform/ext/target/arm/corstone1000/io/io_storage.h
deleted file mode 100644
index 0cdca5b26..000000000
--- a/platform/ext/target/arm/corstone1000/io/io_storage.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2022 Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * 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.
- */
-
-#ifndef __IO_STORAGE_H__
-#define __IO_STORAGE_H__
-
-#include <stddef.h>
-#include <stdint.h>
-
-/* Access modes used when accessing data on a device */
-#define IO_MODE_INVALID (0)
-#define IO_MODE_RO (1 << 0)
-#define IO_MODE_RW (1 << 1)
-
-/* Device type which can be used to enable policy decisions about which device
- * to access */
-typedef enum {
-    IO_TYPE_INVALID,
-    IO_TYPE_SEMIHOSTING,
-    IO_TYPE_MEMMAP,
-    IO_TYPE_DUMMY,
-    IO_TYPE_FIRMWARE_IMAGE_PACKAGE,
-    IO_TYPE_BLOCK,
-    IO_TYPE_MTD,
-    IO_TYPE_MMC,
-    IO_TYPE_STM32IMAGE,
-    IO_TYPE_ENCRYPTED,
-    IO_TYPE_MAX
-} io_type_t;
-
-/* Modes used when seeking data on a supported device */
-typedef enum {
-    IO_SEEK_INVALID,
-    IO_SEEK_SET,
-    IO_SEEK_END,
-    IO_SEEK_CUR,
-    IO_SEEK_MAX
-} io_seek_mode_t;
-
-/* Connector type, providing a means of identifying a device to open */
-struct io_dev_connector;
-
-/* Block specification - used to refer to data on a device supporting
- * block-like entities */
-typedef struct io_block_spec {
-    size_t offset;
-    size_t length;
-} io_block_spec_t;
-
-
-/* Open a connection to a device */
-int io_dev_open(const struct io_dev_connector *dev_con,
-                const uintptr_t dev_spec, uintptr_t *handle);
-
-/* Initialise a device explicitly - to permit lazy initialisation or
- * re-initialisation */
-int io_dev_init(uintptr_t dev_handle, const uintptr_t init_params);
-
-/* Close a connection to a device */
-int io_dev_close(uintptr_t dev_handle);
-
-/* Synchronous operations */
-int io_open(uintptr_t dev_handle, const uintptr_t spec, uintptr_t *handle);
-
-int io_seek(uintptr_t handle, io_seek_mode_t mode, int32_t offset);
-
-int io_size(uintptr_t handle, size_t *length);
-
-int io_read(uintptr_t handle, uintptr_t buffer, size_t length,
-            size_t *length_read);
-
-int io_write(uintptr_t handle, const uintptr_t buffer, size_t length,
-             size_t *length_written);
-
-int io_close(uintptr_t handle);
-
-#endif /* __IO_STORAGE_H__ */
diff --git a/platform/ext/target/arm/corstone1000/partition/efi.h b/platform/ext/target/arm/corstone1000/partition/efi.h
deleted file mode 100644
index 7e6a4bc88..000000000
--- a/platform/ext/target/arm/corstone1000/partition/efi.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2021, Linaro Limited
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
-
-#ifndef DRIVERS_PARTITION_EFI_H
-#define DRIVERS_PARTITION_EFI_H
-
-#include <stdint.h>
-#include <string.h>
-
-#include "uuid.h"
-
-#define EFI_NAMELEN 36
-
-static inline int guidcmp(const void *g1, const void *g2) {
-    return memcmp(g1, g2, sizeof(struct efi_guid));
-}
-
-static inline void *guidcpy(void *dst, const void *src) {
-    return memcpy(dst, src, sizeof(struct efi_guid));
-}
-
-#define EFI_GUID(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7)  \
-    {                                                      \
-        (a) & 0xffffffff, (b)&0xffff, (c)&0xffff, {        \
-            (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) \
-        }                                                  \
-    }
-
-#define NULL_GUID                                                            \
-    EFI_GUID(0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
-             0x00, 0x00)
-
-#endif /* DRIVERS_PARTITION_EFI_H */
diff --git a/platform/ext/target/arm/corstone1000/partition/gpt.c b/platform/ext/target/arm/corstone1000/partition/gpt.c
deleted file mode 100644
index 8549785e3..000000000
--- a/platform/ext/target/arm/corstone1000/partition/gpt.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2016-2022, ARM Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include "gpt.h"
-
-#include <assert.h>
-#include <errno.h>
-#include <string.h>
-
-#include "efi.h"
-
-static int unicode_to_ascii(unsigned short *str_in, unsigned char *str_out) {
-    uint8_t *name;
-    int i;
-
-    assert((str_in != NULL) && (str_out != NULL));
-
-    name = (uint8_t *)str_in;
-
-    assert(name[0] != '\0');
-
-    /* check whether the unicode string is valid */
-    for (i = 1; i < (EFI_NAMELEN << 1); i += 2) {
-        if (name[i] != '\0') return -EINVAL;
-    }
-    /* convert the unicode string to ascii string */
-    for (i = 0; i < (EFI_NAMELEN << 1); i += 2) {
-        str_out[i >> 1] = name[i];
-        if (name[i] == '\0') break;
-    }
-    return 0;
-}
-
-int parse_gpt_entry(gpt_entry_t *gpt_entry, partition_entry_t *entry) {
-    int result;
-
-    assert((gpt_entry != NULL) && (entry != NULL));
-
-    if ((gpt_entry->first_lba == 0) && (gpt_entry->last_lba == 0)) {
-        return -EINVAL;
-    }
-
-    memset(entry, 0, sizeof(partition_entry_t));
-    result = unicode_to_ascii(gpt_entry->name, (uint8_t *)entry->name);
-    if (result != 0) {
-        return result;
-    }
-    entry->start = (uint64_t)gpt_entry->first_lba * PLAT_PARTITION_BLOCK_SIZE;
-    entry->length = (uint64_t)(gpt_entry->last_lba - gpt_entry->first_lba + 1) *
-                    PLAT_PARTITION_BLOCK_SIZE;
-    guidcpy(&entry->part_guid, &gpt_entry->unique_uuid);
-    guidcpy(&entry->type_guid, &gpt_entry->type_uuid);
-
-    return 0;
-}
diff --git a/platform/ext/target/arm/corstone1000/partition/gpt.h b/platform/ext/target/arm/corstone1000/partition/gpt.h
deleted file mode 100644
index b528fc05c..000000000
--- a/platform/ext/target/arm/corstone1000/partition/gpt.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#ifndef GPT_H
-#define GPT_H
-
-#include "efi.h"
-#include "partition.h"
-#include "uuid.h"
-
-#define PARTITION_TYPE_GPT 0xee
-#define GPT_HEADER_OFFSET PLAT_PARTITION_BLOCK_SIZE
-#define GPT_ENTRY_OFFSET (GPT_HEADER_OFFSET + PLAT_PARTITION_BLOCK_SIZE)
-
-#define GPT_SIGNATURE "EFI PART"
-
-typedef struct gpt_entry {
-    struct efi_guid type_uuid;
-    struct efi_guid unique_uuid;
-    unsigned long long first_lba;
-    unsigned long long last_lba;
-    unsigned long long attr;
-    unsigned short name[EFI_NAMELEN];
-} gpt_entry_t;
-
-typedef struct gpt_header {
-    unsigned char signature[8];
-    unsigned int revision;
-    unsigned int size;
-    unsigned int header_crc;
-    unsigned int reserved;
-    unsigned long long current_lba;
-    unsigned long long backup_lba;
-    unsigned long long first_lba;
-    unsigned long long last_lba;
-    struct efi_guid disk_uuid;
-    /* starting LBA of array of partition entries */
-    unsigned long long part_lba;
-    /* number of partition entries in array */
-    unsigned int list_num;
-    /* size of a single partition entry (usually 128) */
-    unsigned int part_size;
-    unsigned int part_crc;
-} gpt_header_t;
-
-int parse_gpt_entry(gpt_entry_t *gpt_entry, partition_entry_t *entry);
-
-#endif /* GPT_H */
diff --git a/platform/ext/target/arm/corstone1000/partition/mbr.h b/platform/ext/target/arm/corstone1000/partition/mbr.h
deleted file mode 100644
index e77f36701..000000000
--- a/platform/ext/target/arm/corstone1000/partition/mbr.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#ifndef MBR_H
-#define MBR_H
-
-#define MBR_OFFSET 0
-
-#define MBR_PRIMARY_ENTRY_OFFSET 0x1be
-#define MBR_PRIMARY_ENTRY_SIZE 0x10
-#define MBR_PRIMARY_ENTRY_NUMBER 4
-#define MBR_CHS_ADDRESS_LEN 3
-
-#define MBR_SIGNATURE_FIRST 0x55
-#define MBR_SIGNATURE_SECOND 0xAA
-
-typedef struct mbr_entry {
-    unsigned char status;
-    unsigned char first_sector[MBR_CHS_ADDRESS_LEN];
-    unsigned char type;
-    unsigned char last_sector[MBR_CHS_ADDRESS_LEN];
-    unsigned int first_lba;
-    unsigned int sector_nums;
-} mbr_entry_t;
-
-#endif /* MBR_H */
diff --git a/platform/ext/target/arm/corstone1000/partition/partition.c b/platform/ext/target/arm/corstone1000/partition/partition.c
deleted file mode 100644
index d76e123d7..000000000
--- a/platform/ext/target/arm/corstone1000/partition/partition.c
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- * Copyright (c) 2016-2022, ARM Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include "partition.h"
-
-#include <assert.h>
-#include <errno.h>
-#include <inttypes.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "efi.h"
-#include "gpt.h"
-#include "mbr.h"
-
-#include "io_storage.h"
-#include "platform.h"
-#include "soft_crc.h"
-
-#define PLAT_LOG_MODULE_NAME "partition"
-#include "platform_log.h"
-
-static uint8_t mbr_sector[PLAT_PARTITION_BLOCK_SIZE];
-static partition_entry_list_t list;
-
-#if LOG_LEVEL >= LOG_LEVEL_DEBUG
-static void dump_entries(int num) {
-    char name[EFI_NAMELEN];
-    int i, j, len;
-
-    VERBOSE("Partition table with %d entries:", num);
-    for (i = 0; i < num; i++) {
-        len = snprintf(name, EFI_NAMELEN, "%s", list.list[i].name);
-        for (j = 0; j < EFI_NAMELEN - len - 1; j++) {
-            name[len + j] = ' ';
-        }
-        name[EFI_NAMELEN - 1] = '\0';
-        VERBOSE("%d: %s %x%x %d", i + 1, name,
-                (uint32_t)(list.list[i].start >> 32),
-                (uint32_t)list.list[i].start,
-                (uint32_t)(list.list[i].start + list.list[i].length - 4));
-    }
-}
-#else
-#define dump_entries(num) ((void)num)
-#endif
-
-/*
- * Load the first sector that carries MBR header.
- * The MBR boot signature should be always valid whether it's MBR or GPT.
- */
-static int load_mbr_header(uintptr_t image_handle, mbr_entry_t *mbr_entry) {
-    size_t bytes_read;
-    uintptr_t offset;
-    int result;
-
-    assert(mbr_entry != NULL);
-    /* MBR partition table is in LBA0. */
-    result = io_seek(image_handle, IO_SEEK_SET, MBR_OFFSET);
-    if (result != 0) {
-        WARN("Failed to seek (%i)\n", result);
-        return result;
-    }
-    result = io_read(image_handle, (uintptr_t)&mbr_sector,
-                     PLAT_PARTITION_BLOCK_SIZE, &bytes_read);
-    if (result != 0) {
-        WARN("Failed to read data (%i)\n", result);
-        return result;
-    }
-
-    /* Check MBR boot signature. */
-    if ((mbr_sector[LEGACY_PARTITION_BLOCK_SIZE - 2] != MBR_SIGNATURE_FIRST) ||
-        (mbr_sector[LEGACY_PARTITION_BLOCK_SIZE - 1] != MBR_SIGNATURE_SECOND)) {
-        ERROR("MBR signature isn't correct");
-        return -ENOENT;
-    }
-    offset = (uintptr_t)&mbr_sector + MBR_PRIMARY_ENTRY_OFFSET;
-    memcpy(mbr_entry, (void *)offset, sizeof(mbr_entry_t));
-    return 0;
-}
-
-/*
- * Load GPT header and check the GPT signature and header CRC.
- * If partition numbers could be found, check & update it.
- */
-static int load_gpt_header(uintptr_t image_handle) {
-    gpt_header_t header;
-    size_t bytes_read;
-    int result;
-    uint32_t header_crc, calc_crc;
-
-    result = io_seek(image_handle, IO_SEEK_SET, GPT_HEADER_OFFSET);
-    if (result != 0) {
-        return result;
-    }
-    result = io_read(image_handle, (uintptr_t)&header, sizeof(gpt_header_t),
-                     &bytes_read);
-    if ((result != 0) || (sizeof(gpt_header_t) != bytes_read)) {
-        return result;
-    }
-    if (memcmp(header.signature, GPT_SIGNATURE, sizeof(header.signature)) !=
-        0) {
-        return -EINVAL;
-    }
-
-    /*
-     * UEFI Spec 2.8 March 2019 Page 119: HeaderCRC32 value is
-     * computed by setting this field to 0, and computing the
-     * 32-bit CRC for HeaderSize bytes.
-     */
-    header_crc = header.header_crc;
-    header.header_crc = 0U;
-
-    calc_crc = crc32((uint8_t *)&header, DEFAULT_GPT_HEADER_SIZE);
-    if (header_crc != calc_crc) {
-        ERROR("Invalid GPT Header CRC: Expected 0x%x but got 0x%x.\n",
-              header_crc, calc_crc);
-        return -EINVAL;
-    }
-
-    header.header_crc = header_crc;
-
-    /* partition numbers can't exceed PLAT_PARTITION_MAX_ENTRIES */
-    list.entry_count = header.list_num;
-    if (list.entry_count > PLAT_PARTITION_MAX_ENTRIES) {
-        list.entry_count = PLAT_PARTITION_MAX_ENTRIES;
-    }
-    return 0;
-}
-
-static int load_mbr_entry(uintptr_t image_handle, mbr_entry_t *mbr_entry,
-                          int part_number) {
-    size_t bytes_read;
-    uintptr_t offset;
-    int result;
-
-    assert(mbr_entry != NULL);
-    /* MBR partition table is in LBA0. */
-    result = io_seek(image_handle, IO_SEEK_SET, MBR_OFFSET);
-    if (result != 0) {
-        WARN("Failed to seek (%i)\n", result);
-        return result;
-    }
-    result = io_read(image_handle, (uintptr_t)&mbr_sector,
-                     PLAT_PARTITION_BLOCK_SIZE, &bytes_read);
-    if (result != 0) {
-        WARN("Failed to read data (%i)\n", result);
-        return result;
-    }
-
-    /* Check MBR boot signature. */
-    if ((mbr_sector[LEGACY_PARTITION_BLOCK_SIZE - 2] != MBR_SIGNATURE_FIRST) ||
-        (mbr_sector[LEGACY_PARTITION_BLOCK_SIZE - 1] != MBR_SIGNATURE_SECOND)) {
-        return -ENOENT;
-    }
-    offset = (uintptr_t)&mbr_sector + MBR_PRIMARY_ENTRY_OFFSET +
-             MBR_PRIMARY_ENTRY_SIZE * part_number;
-    memcpy(mbr_entry, (void *)offset, sizeof(mbr_entry_t));
-
-    return 0;
-}
-
-static int load_mbr_entries(uintptr_t image_handle) {
-    mbr_entry_t mbr_entry;
-    int i;
-
-    list.entry_count = MBR_PRIMARY_ENTRY_NUMBER;
-
-    for (i = 0; i < list.entry_count; i++) {
-        load_mbr_entry(image_handle, &mbr_entry, i);
-        list.list[i].start = mbr_entry.first_lba * 512;
-        list.list[i].length = mbr_entry.sector_nums * 512;
-        list.list[i].name[0] = mbr_entry.type;
-    }
-
-    return 0;
-}
-
-static int load_gpt_entry(uintptr_t image_handle, gpt_entry_t *entry) {
-    size_t bytes_read;
-    int result;
-
-    assert(entry != NULL);
-    result = io_read(image_handle, (uintptr_t)entry, sizeof(gpt_entry_t),
-                     &bytes_read);
-    if (sizeof(gpt_entry_t) != bytes_read) return -EINVAL;
-    return result;
-}
-
-static int verify_partition_gpt(uintptr_t image_handle) {
-    gpt_entry_t entry;
-    int result, i;
-
-    for (i = 0; i < list.entry_count; i++) {
-        result = load_gpt_entry(image_handle, &entry);
-        assert(result == 0);
-        if (result != 0) {
-            break;
-        }
-        result = parse_gpt_entry(&entry, &list.list[i]);
-        if (result != 0) {
-            break;
-        }
-    }
-    if (i == 0) {
-        return -EINVAL;
-    }
-    /*
-     * Only records the valid partition number that is loaded from
-     * partition table.
-     */
-    list.entry_count = i;
-    dump_entries(list.entry_count);
-
-    return 0;
-}
-
-int load_partition_table(unsigned int image_id) {
-    uintptr_t dev_handle, image_handle, image_spec = 0;
-    mbr_entry_t mbr_entry;
-    int result;
-
-    result = plat_get_image_source(image_id, &dev_handle, &image_spec);
-    if (result != 0) {
-        WARN("Failed to obtain reference to image id=%u (%i)\n", image_id,
-             result);
-        return result;
-    }
-
-    result = io_open(dev_handle, image_spec, &image_handle);
-    if (result != 0) {
-        WARN("Failed to open image id=%u (%i)\n", image_id, result);
-        return result;
-    }
-
-    result = load_mbr_header(image_handle, &mbr_entry);
-    if (result != 0) {
-        ERROR("Loading mbr header failed with image id=%u (%i)\n", image_id,
-              result);
-        return result;
-    }
-    if (mbr_entry.type == PARTITION_TYPE_GPT) {
-        INFO("Loading gpt header");
-        result = load_gpt_header(image_handle);
-        assert(result == 0);
-        if (result != 0) {
-            ERROR("Failed load gpt header! %i", result);
-            goto load_partition_table_exit;
-        }
-        result = io_seek(image_handle, IO_SEEK_SET, GPT_ENTRY_OFFSET);
-        assert(result == 0);
-        if (result != 0) {
-            ERROR("Failed seek gpt header! %i", result);
-            goto load_partition_table_exit;
-        }
-        result = verify_partition_gpt(image_handle);
-        if (result != 0) {
-            ERROR("Failed verify gpt partition %i", result);
-            goto load_partition_table_exit;
-        }
-    } else {
-        result = load_mbr_entries(image_handle);
-    }
-
-load_partition_table_exit:
-    io_close(image_handle);
-    return result;
-}
-
-const partition_entry_t *get_partition_entry(const char *name) {
-    int i;
-
-    for (i = 0; i < list.entry_count; i++) {
-        if (strcmp(name, list.list[i].name) == 0) {
-            return &list.list[i];
-        }
-    }
-    return NULL;
-}
-
-const partition_entry_t *get_partition_entry_by_type(const uuid_t *type_uuid) {
-    int i;
-
-    for (i = 0; i < list.entry_count; i++) {
-        if (guidcmp(type_uuid, &list.list[i].type_guid) == 0) {
-            return &list.list[i];
-        }
-    }
-
-    return NULL;
-}
-
-const partition_entry_t *get_partition_replica_by_type(const uuid_t *type_uuid) {
-    int count = 0;
-    int i;
-
-    for (i = 0; i < list.entry_count; i++) {
-        if (guidcmp(type_uuid, &list.list[i].type_guid) == 0) {
-            if (++count == 2)
-                 return &list.list[i];
-        }
-    }
-
-    return NULL;
-}
-
-const partition_entry_t *get_partition_entry_by_uuid(const uuid_t *part_uuid) {
-    int i;
-
-    for (i = 0; i < list.entry_count; i++) {
-        if (guidcmp(part_uuid, &list.list[i].part_guid) == 0) {
-            return &list.list[i];
-        }
-    }
-
-    return NULL;
-}
-
-const partition_entry_list_t *get_partition_entry_list(void) { return &list; }
-
-void partition_init(unsigned int image_id) { load_partition_table(image_id); }
diff --git a/platform/ext/target/arm/corstone1000/partition/partition.h b/platform/ext/target/arm/corstone1000/partition/partition.h
deleted file mode 100644
index 450cf20a0..000000000
--- a/platform/ext/target/arm/corstone1000/partition/partition.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2016-2022, ARM Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#ifndef PARTITION_H
-#define PARTITION_H
-
-#include <stdint.h>
-
-#include "efi.h"
-#include "uuid.h"
-
-#if !PLAT_PARTITION_MAX_ENTRIES
-#define PLAT_PARTITION_MAX_ENTRIES 16
-#endif /* PLAT_PARTITION_MAX_ENTRIES */
-
-#if !PLAT_PARTITION_BLOCK_SIZE
-#define PLAT_PARTITION_BLOCK_SIZE 512
-#endif /* PLAT_PARTITION_BLOCK_SIZE */
-
-#define LEGACY_PARTITION_BLOCK_SIZE 512
-
-#define DEFAULT_GPT_HEADER_SIZE 92
-
-typedef struct partition_entry {
-    uint64_t start;
-    uint64_t length;
-    char name[EFI_NAMELEN];
-    struct efi_guid part_guid;
-    struct efi_guid type_guid;
-} partition_entry_t;
-
-typedef struct partition_entry_list {
-    partition_entry_t list[PLAT_PARTITION_MAX_ENTRIES];
-    int entry_count;
-} partition_entry_list_t;
-
-int load_partition_table(unsigned int image_id);
-const partition_entry_t *get_partition_entry(const char *name);
-const partition_entry_t *get_partition_entry_by_type(const uuid_t *type_guid);
-const partition_entry_t *get_partition_replica_by_type(const uuid_t *type_uuid);
-const partition_entry_t *get_partition_entry_by_uuid(const uuid_t *part_uuid);
-const partition_entry_list_t *get_partition_entry_list(void);
-void partition_init(unsigned int image_id);
-
-#endif /* PARTITION_H */
diff --git a/platform/ext/target/arm/corstone1000/partition/uuid.h b/platform/ext/target/arm/corstone1000/partition/uuid.h
deleted file mode 100644
index 06fec5a3c..000000000
--- a/platform/ext/target/arm/corstone1000/partition/uuid.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*-
- * Copyright (c) 2002 Marcel Moolenaar
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/*
- * Portions copyright (c) 2014-2020, ARM Limited and Contributors.
- * All rights reserved.
- */
-
-#ifndef UUID_H
-#define UUID_H
-
-#include <stdint.h>
-
-/* Length of a node address (an IEEE 802 address). */
-#define _UUID_NODE_LEN 6
-
-/* Length of UUID string including dashes. */
-#define _UUID_STR_LEN 36
-
-/*
- * See also:
- *      http://www.opengroup.org/dce/info/draft-leach-uuids-guids-01.txt
- *      http://www.opengroup.org/onlinepubs/009629399/apdxa.htm
- *
- * A DCE 1.1 compatible source representation of UUIDs.
- */
-struct uuid {
-    uint8_t time_low[4];
-    uint8_t time_mid[2];
-    uint8_t time_hi_and_version[2];
-    uint8_t clock_seq_hi_and_reserved;
-    uint8_t clock_seq_low;
-    uint8_t node[_UUID_NODE_LEN];
-};
-
-struct efi_guid {
-    uint32_t time_low;
-    uint16_t time_mid;
-    uint16_t time_hi_and_version;
-    uint8_t clock_seq_and_node[8];
-};
-
-union uuid_helper_t {
-    struct uuid uuid_struct;
-    struct efi_guid efi_guid;
-};
-
-/* XXX namespace pollution? */
-typedef struct uuid uuid_t;
-
-#endif /* UUID_H */
diff --git a/platform/ext/target/arm/corstone1000/platform.c b/platform/ext/target/arm/corstone1000/platform.c
index 32fdc55aa..c8157752a 100644
--- a/platform/ext/target/arm/corstone1000/platform.c
+++ b/platform/ext/target/arm/corstone1000/platform.c
@@ -10,90 +10,25 @@
 #include "Driver_Flash.h"
 #include "flash_layout.h"
 
-#include "io_driver.h"
-#include "io_flash.h"
-#include "io_storage.h"
+#include "io_gpt.h"
 
 #include "platform.h"
 
 #define PLAT_LOG_MODULE_NAME    "platform"
 #include "platform_log.h"
 
-typedef struct {
-    uintptr_t dev_handle;
-    uintptr_t image_spec;
-} platform_image_source_t;
-
 extern ARM_DRIVER_FLASH FLASH_DEV_NAME;
 
-static io_dev_connector_t *flash_dev_con;
-static uint8_t local_block_flash[FLASH_SECTOR_SIZE];
-static io_flash_dev_spec_t flash_dev_spec = {
-    .buffer = (uintptr_t)local_block_flash,
-    .bufferlen = FLASH_SECTOR_SIZE,
-    .base_addr = FLASH_BASE_ADDRESS,
-    .flash_driver = (uintptr_t)&FLASH_DEV_NAME,
-};
-static io_block_spec_t flash_spec = {
-    .offset = FLASH_BASE_ADDRESS,
-    .length = FLASH_TOTAL_SIZE
-};
-
-static platform_image_source_t platform_image_source[] = {
-    [PLATFORM_GPT_IMAGE] = {
-        .dev_handle = (uintptr_t)NULL,
-        .image_spec = (uintptr_t)&flash_spec,
-    }
-};
 
 /* Initialize io storage of the platform */
 int32_t plat_io_storage_init(void)
 {
-    int rc = -1;
-    uintptr_t flash_dev_handle = (uintptr_t)NULL;
-    uintptr_t flash_handle = (uintptr_t)NULL;
 
-    rc = register_io_dev_flash((const io_dev_connector_t **) &flash_dev_con);
+    /* The GPT library requires a flash driver in order to do I/O */
+    int rc = register_flash_io_gpt(&FLASH_DEV_NAME);
     if (rc != 0) {
         ERROR("Failed to register io flash rc: %d", rc);
-        return rc;
     }
 
-    rc = io_dev_open(flash_dev_con, (const uintptr_t)&flash_dev_spec, &flash_dev_handle);
-    if (rc != 0) {
-        ERROR("Failed to open io flash dev rc: %d", rc);
-        return rc;
-    }
-
-    VERBOSE("Flash_dev_handle = %p",flash_dev_handle);
-
-    rc = io_open(flash_dev_handle, (const uintptr_t)&flash_spec, &flash_handle);
-    if (rc != 0) {
-        ERROR("Failed to open io flash rc: %d", rc);
-        return rc;
-    }
-
-    VERBOSE("Flash_handle = %p",flash_handle);
-
-    rc = io_close(flash_handle);
-    if (rc != 0) {
-        ERROR("Failed to close io flash rc: %d", rc);
-        return rc;
-    }
-    /* Update the platform image source that uses the flash with dev handles */
-    platform_image_source[PLATFORM_GPT_IMAGE].dev_handle = flash_dev_handle;
-
     return rc;
 }
-
-/* Return an IO device handle and specification which can be used to access
- * an image. This has to be implemented for the GPT parser. */
-int32_t plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle,
-                              uintptr_t *image_spec) {
-    if (image_id >= PLATFORM_IMAGE_COUNT) {
-        return -1;
-    }
-    *dev_handle = platform_image_source[image_id].dev_handle;
-    *image_spec = platform_image_source[image_id].image_spec;
-    return 0;
-}
diff --git a/platform/ext/target/arm/corstone1000/platform.h b/platform/ext/target/arm/corstone1000/platform.h
index 906a8f9ae..96bee50dc 100644
--- a/platform/ext/target/arm/corstone1000/platform.h
+++ b/platform/ext/target/arm/corstone1000/platform.h
@@ -8,22 +8,28 @@
 #ifndef __PLATFORM_H__
 #define __PLATFORM_H__
 
-typedef enum {
-    PLATFORM_GPT_IMAGE = 0,
-    PLATFORM_IMAGE_COUNT,
-}platform_image_id_t;
+#include "efi_guid_structs.h"
 
-#define FWU_METADATA_TYPE_UUID \
-     ((uuid_t){{0xa0, 0x84, 0x7a, 0x8a}, {0x87, 0x83}, {0xf6, 0x40}, 0xab,  0x41, {0xa8, 0xb9, 0xa5, 0xa6, 0x0d, 0x23}})
-#define PRIVATE_METADATA_TYPE_UUID \
-     ((uuid_t){{0xc3, 0x5d, 0xb5, 0xec}, {0xb7, 0x8a}, {0x84, 0x4a}, 0xab,  0x56, {0xeb, 0x0a, 0x99, 0x74, 0xdb, 0x42}})
+#if !PLAT_GPT_MAX_PARTITIONS
+#define PLAT_GPT_MAX_PARTITIONS 16
+#endif /* PLAT_GPT_MAX_PARTITIONS */
+
+#define FWU_METADATA_TYPE_UUID  \
+    MAKE_EFI_GUID(              \
+            0x8A7A84A0,         \
+            0x8387,             \
+            0x40F6,             \
+            0xAB, 0x41,         \
+            0xA8, 0xB9, 0xA5, 0xA6, 0x0D, 0x23)
+#define PRIVATE_METADATA_TYPE_UUID  \
+    MAKE_EFI_GUID(                  \
+            0xECB55DC3,             \
+            0x8AB7,                 \
+            0x4A84,                 \
+            0xAB, 0x56,             \
+            0xEB, 0x0A, 0x99, 0x74, 0xDB, 0x42)
 
 /* Initialize io storage of the platform */
 int32_t plat_io_storage_init(void);
 
-/* Return an IO device handle and specification which can be used to access
- * an image. This has to be implemented for the GPT parser. */
-int32_t plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle,
-                              uintptr_t *image_spec);
-
 #endif /*__PLATFORM_H__*/
diff --git a/platform/ext/target/arm/corstone1000/soft_crc/soft_crc.c b/platform/ext/target/arm/corstone1000/soft_crc/soft_crc.c
deleted file mode 100644
index 85f1e30d9..000000000
--- a/platform/ext/target/arm/corstone1000/soft_crc/soft_crc.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/* Copyright (C) 1986 Gary S. Brown.  You may use this program, or
-   code or tables extracted from it, as desired without restriction.*/
-
-/* First, the polynomial itself and its table of feedback terms.  The  */
-/* polynomial is                                                       */
-/* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */
-/* Note that we take it "backwards" and put the highest-order term in  */
-/* the lowest-order bit.  The X^32 term is "implied"; the LSB is the   */
-/* X^31 term, etc.  The X^0 term (usually shown as "+1") results in    */
-/* the MSB being 1.                                                    */
-
-/* Note that the usual hardware shift register implementation, which   */
-/* is what we're using (we're merely optimizing it by doing eight-bit  */
-/* chunks at a time) shifts bits into the lowest-order term.  In our   */
-/* implementation, that means shifting towards the right.  Why do we   */
-/* do it this way?  Because the calculated CRC must be transmitted in  */
-/* order from highest-order term to lowest-order term.  UARTs transmit */
-/* characters in order from LSB to MSB.  By storing the CRC this way,  */
-/* we hand it to the UART in the order low-byte to high-byte; the UART */
-/* sends each low-bit to hight-bit; and the result is transmission bit */
-/* by bit from highest- to lowest-order term without requiring any bit */
-/* shuffling on our part.  Reception works similarly.                  */
-
-/* The feedback terms table consists of 256, 32-bit entries.  Notes:   */
-/*                                                                     */
-/*  1. The table can be generated at runtime if desired; code to do so */
-/*     is shown later.  It might not be obvious, but the feedback      */
-/*     terms simply represent the results of eight shift/xor opera-    */
-/*     tions for all combinations of data and CRC register values.     */
-/*                                                                     */
-/*  2. The CRC accumulation logic is the same for all CRC polynomials, */
-/*     be they sixteen or thirty-two bits wide.  You simply choose the */
-/*     appropriate table.  Alternatively, because the table can be     */
-/*     generated at runtime, you can start by generating the table for */
-/*     the polynomial in question and use exactly the same "updcrc",   */
-/*     if your application needn't simultaneously handle two CRC       */
-/*     polynomials.  (Note, however, that XMODEM is strange.)          */
-/*                                                                     */
-/*  3. For 16-bit CRCs, the table entries need be only 16 bits wide;   */
-/*     of course, 32-bit entries work OK if the high 16 bits are zero. */
-/*                                                                     */
-/*  4. The values must be right-shifted by eight bits by the "updcrc"  */
-/*     logic; the shift must be unsigned (bring in zeroes).  On some   */
-/*     hardware you could probably optimize the shift in assembler by  */
-/*     using byte-swap instructions.                                   */
-
-/**
- * The code derived from work by Gary S. Brown.
-*/
-
-#include "soft_crc.h"
-
-
-const static uint32_t crc_32_tab[] = { /* CRC polynomial 0xedb88320 */
-0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
-0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
-0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
-0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
-0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
-0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
-0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
-0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
-0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
-0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
-0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
-0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
-0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
-0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
-0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
-0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
-0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
-0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
-0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
-0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
-0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
-0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
-0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
-0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
-0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
-0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
-0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
-0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
-0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
-0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
-0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
-0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
-0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
-0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
-0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
-0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
-0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
-0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
-0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
-0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
-0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
-0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
-0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
-};
-
-#define UPDC32(octet,crc) (crc_32_tab[((crc)\
-     ^ ((uint8_t)octet)) & 0xff] ^ ((crc) >> 8))
-
-static inline uint32_t crc32buf(char *buf, size_t len)
-{
-      register uint32_t oldcrc32;
-
-      oldcrc32 = 0xFFFFFFFF;
-
-      for ( ; len; --len, ++buf)
-      {
-            oldcrc32 = UPDC32(*buf, oldcrc32);
-      }
-
-      return ~oldcrc32;
-}
-
-/* Calculate crc32 */
-uint32_t crc32(const void *buf, size_t len) {
-    return crc32buf(buf, len);
-}
-
diff --git a/platform/ext/target/arm/corstone1000/soft_crc/soft_crc.h b/platform/ext/target/arm/corstone1000/soft_crc/soft_crc.h
deleted file mode 100644
index e5b06075c..000000000
--- a/platform/ext/target/arm/corstone1000/soft_crc/soft_crc.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright (c) 2023, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
-
-#ifndef __SOFT_CRC_H__
-#define __SOFT_CRC_H__
-
-#include <stddef.h>
-#include <stdint.h>
-
-/* Calculate crc32 */
-uint32_t crc32(const void *buf, size_t len);
-
-#endif /* __SOFT_CRC_H__ */
-
