Infineon: Add cyw20829 platform, shared slot feature, json memory map, psoc6 xip

Based in 1.8.0 release of MCUBoot library

This commit adds CYW20829 Infineon platform support with following capabilities:
1. Overwrite and swap upgrade mode support
2. Multi-image with up to 4 images
3. Hardware security counter is supported for CYW20829 platform

Add XIP support for PSOC6 platform - place BOOT slot in external memory and execute it in place using SMIF in XIP mode

and some new features for Infineon devices.

1. Shared upgrade slot feature - use one shared area for upgrade slots of multiple images
2. Memory map defined using JSON file - define memory regions for bootloader and user app in conventional way using JSON file
diff --git a/boot/zephyr/boot_serial_extensions.c b/boot/zephyr/boot_serial_extensions.c
new file mode 100644
index 0000000..49bb4ea
--- /dev/null
+++ b/boot/zephyr/boot_serial_extensions.c
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2021 Nordic Semiconductor ASA
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include <zephyr.h>
+#include <drivers/flash.h>
+#include <mgmt/mcumgr/zephyr_groups.h>
+
+#include <flash_map_backend/flash_map_backend.h>
+#include <sysflash/sysflash.h>
+
+#include "bootutil/bootutil_log.h"
+#include "../boot_serial/src/boot_serial_priv.h"
+#include "../boot_serial/src/cbor_encode.h"
+
+#include "bootutil/image.h"
+#include "bootutil/bootutil_public.h"
+#include "bootutil/boot_hooks.h"
+
+MCUBOOT_LOG_MODULE_DECLARE(mcuboot);
+
+#ifdef CONFIG_BOOT_MGMT_CUSTOM_STORAGE_ERASE
+static int bs_custom_storage_erase(cbor_state_t *cs)
+{
+    int rc;
+
+    const struct flash_area *fa;
+
+    rc = flash_area_open(FLASH_AREA_ID(storage), &fa);
+
+    if (rc < 0) {
+        LOG_ERR("failed to open flash area");
+    } else {
+        rc = flash_area_erase(fa, 0, FLASH_AREA_SIZE(storage));
+        if (rc < 0) {
+            LOG_ERR("failed to erase flash area");
+        }
+        flash_area_close(fa);
+    }
+    if (rc == 0) {
+        rc = MGMT_ERR_OK;
+    } else {
+        rc = MGMT_ERR_EUNKNOWN;
+    }
+
+    map_start_encode(cs, 10);
+    tstrx_put(cs, "rc");
+    uintx32_put(cs, rc);
+    map_end_encode(cs, 10);
+
+    return rc;
+}
+#endif
+
+#ifdef MCUBOOT_MGMT_CUSTOM_IMG_LIST
+static int custom_img_status(int image_index, uint32_t slot,char *buffer,
+                        ssize_t len)
+{
+    uint32_t area_id;
+    struct flash_area const *fap;
+    struct image_header hdr;
+    int rc;
+    int img_install_stat;
+
+    rc = BOOT_HOOK_CALL(boot_img_install_stat_hook, BOOT_HOOK_REGULAR,
+                        image_index, slot, &img_install_stat);
+    if (rc == BOOT_HOOK_REGULAR)
+    {
+        img_install_stat = 0;
+    }
+
+    rc = BOOT_HOOK_CALL(boot_read_image_header_hook, BOOT_HOOK_REGULAR,
+                        image_index, slot, &hdr);
+    if (rc == BOOT_HOOK_REGULAR)
+    {
+        area_id = flash_area_id_from_multi_image_slot(image_index, slot);
+
+        rc = flash_area_open(area_id, &fap);
+        if (rc) {
+            return rc;
+        }
+
+        rc = flash_area_read(fap, 0, &hdr, sizeof(hdr));
+
+        flash_area_close(fap);
+    }
+
+    if (rc == 0) {
+        if (hdr.ih_magic == IMAGE_MAGIC) {
+            snprintf(buffer, len, "ver=%d.%d.%d.%d,install_stat=%d",
+                    hdr.ih_ver.iv_major,
+                    hdr.ih_ver.iv_minor,
+                    hdr.ih_ver.iv_revision,
+                    hdr.ih_ver.iv_build_num,
+                    img_install_stat);
+        } else {
+            rc = 1;
+        }
+    }
+
+    return rc;
+}
+
+static int bs_custom_img_list(cbor_state_t *cs)
+{
+    int rc = 0;
+    char tmpbuf[64];	/* Buffer should fit version and flags */
+
+    map_start_encode(cs, 10);
+
+    for (int img = 0; img < MCUBOOT_IMAGE_NUMBER; img++) {
+        for (int slot = 0; slot < 2; slot++) {
+            rc = custom_img_status(img, slot, tmpbuf, sizeof(tmpbuf));
+
+            intx32_put(cs, img * 2 + slot + 1);
+            if (rc == 0) {
+                tstrx_put_term(cs, tmpbuf);
+            } else {
+                tstrx_put_term(cs, "");
+            }
+        }
+    }
+
+    tstrx_put(cs, "rc");
+    uintx32_put(cs, MGMT_ERR_OK);
+    map_end_encode(cs, 10);
+
+    return rc;
+}
+
+#ifndef ZEPHYR_MGMT_GRP_BASIC_CMD_IMAGE_LIST
+    #define ZEPHYR_MGMT_GRP_BASIC_CMD_IMAGE_LIST 1
+#endif
+#endif /*MCUBOOT_MGMT_CUSTOM_IMG_LIST*/
+
+int bs_peruser_system_specific(const struct nmgr_hdr *hdr, const char *buffer,
+                               int len, cbor_state_t *cs)
+{
+    int mgmt_rc = MGMT_ERR_ENOTSUP;
+
+    if (hdr->nh_group == ZEPHYR_MGMT_GRP_BASE) {
+        if (hdr->nh_op == NMGR_OP_WRITE) {
+#ifdef CONFIG_BOOT_MGMT_CUSTOM_STORAGE_ERASE
+            if (hdr->nh_id == ZEPHYR_MGMT_GRP_BASIC_CMD_ERASE_STORAGE) {
+                mgmt_rc = bs_custom_storage_erase(cs);
+            }
+#endif
+        } else if (hdr->nh_op == NMGR_OP_READ) {
+#ifdef MCUBOOT_MGMT_CUSTOM_IMG_LIST
+            if (hdr->nh_id == ZEPHYR_MGMT_GRP_BASIC_CMD_IMAGE_LIST) {
+                mgmt_rc = bs_custom_img_list(cs);
+            }
+#endif
+        }
+    }
+
+    if (mgmt_rc == MGMT_ERR_ENOTSUP) {
+        map_start_encode(cs, 10);
+        tstrx_put(cs, "rc");
+        uintx32_put(cs, mgmt_rc);
+        map_end_encode(cs, 10);
+    }
+
+    return MGMT_ERR_OK;
+}