The current boot flow is broken if both the FlexSPI image and the HAB
support is enabled. The HAB/CST tool need to take the additional FlexSPI
IVT header into account which is added in between the first IVT header
and the barebox pbl code.

Signed-off-by: Marco Felsch <m.fel...@pengutronix.de>
---
 include/mach/imx/imx-header.h | 1 +
 scripts/imx/imx-image.c       | 9 +++++----
 scripts/imx/imx.c             | 6 +++++-
 3 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/include/mach/imx/imx-header.h b/include/mach/imx/imx-header.h
index b11b57c37227..0ad3485eb261 100644
--- a/include/mach/imx/imx-header.h
+++ b/include/mach/imx/imx-header.h
@@ -7,6 +7,7 @@
 
 #define HEADER_LEN 0x1000      /* length of the blank area + IVT + DCD */
 #define CSF_LEN 0x2000         /* length of the CSF (needed for HAB) */
+#define FLEXSPI_HEADER_LEN     HEADER_LEN
 
 #define DEK_BLOB_HEADER 8      /* length of DEK blob header */
 #define DEK_BLOB_KEY 32                /* length of DEK blob AES-256 key */
diff --git a/scripts/imx/imx-image.c b/scripts/imx/imx-image.c
index ecb16187de17..01da4cc36467 100644
--- a/scripts/imx/imx-image.c
+++ b/scripts/imx/imx-image.c
@@ -408,8 +408,6 @@ static size_t add_flexspi_fcfb_header(const struct 
config_data *data, void *buf)
        return sizeof(nor_conf);
 }
 
-#define FLEXSPI_HEADER_LEN     HEADER_LEN
-
 static size_t
 add_flexspi_header(const struct config_data *data, void **_buf, size_t 
*header_len)
 {
@@ -812,8 +810,11 @@ static int hab_sign(struct config_data *data)
                 * For i.MX8 insert the CSF data into the reserved CSF area
                 * right behind the PBL
                 */
-               offset = roundup(data->header_gap + data->pbl_code_size +
-                                HEADER_LEN, 0x1000);
+               offset = data->header_gap + data->pbl_code_size + HEADER_LEN;
+               if (flexspi_image(data))
+                       offset += FLEXSPI_HEADER_LEN;
+
+               offset = roundup(offset, 0x1000);
                if (data->signed_hdmi_firmware_file)
                        offset += PLUGIN_HDMI_SIZE;
 
diff --git a/scripts/imx/imx.c b/scripts/imx/imx.c
index 32488455b7a8..b3c13510af84 100644
--- a/scripts/imx/imx.c
+++ b/scripts/imx/imx.c
@@ -332,6 +332,7 @@ static int do_hab_blocks(struct config_data *data, int 
argc, char *argv[])
        int i;
        uint32_t signed_size = data->load_size;
        uint32_t offset = data->image_ivt_offset;
+       unsigned int hdrlen = HEADER_LEN;
 
        if (!data->csf)
                return -EINVAL;
@@ -347,8 +348,11 @@ static int do_hab_blocks(struct config_data *data, int 
argc, char *argv[])
         * Ensure we only sign the PBL for i.MX8MQ
         */
        if (data->pbl_code_size && cpu_is_mx8m(data)) {
+               if (flexspi_image(data))
+                       hdrlen += FLEXSPI_HEADER_LEN;
+
                offset += data->header_gap;
-               signed_size = roundup(data->pbl_code_size + HEADER_LEN, 0x1000);
+               signed_size = roundup(data->pbl_code_size + hdrlen, 0x1000);
                if (data->signed_hdmi_firmware_file)
                        offset += PLUGIN_HDMI_SIZE;
        }
-- 
2.39.2


Reply via email to