From 290e6a9ce0d658f43b6c9ee4b8a3508961cd1417 Mon Sep 17 00:00:00 2001 From: Tianling Shen Date: Sun, 6 Oct 2024 22:22:06 +0800 Subject: [PATCH] uboot: fix boot fit image from mtd Signed-off-by: Tianling Shen --- .../board/mediatek/common/boot_helper.c | 24 +++++++++++++++++-- .../board/mediatek/common/mtd_helper.c | 12 +++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/uboot-mtk-20220606/board/mediatek/common/boot_helper.c b/uboot-mtk-20220606/board/mediatek/common/boot_helper.c index 140e44970..ab0ea28a2 100644 --- a/uboot-mtk-20220606/board/mediatek/common/boot_helper.c +++ b/uboot-mtk-20220606/board/mediatek/common/boot_helper.c @@ -144,7 +144,17 @@ int boot_from_mtd(struct mtd_info *mtd, u64 offset) #endif #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: - size = fit_get_size((const void *)data_load_addr); + size = fit_get_totalsize((const void *)data_load_addr); + if (size <= 0x2000) { + /* Load FDT header into memory */ + ret = mtd_read_generic(mtd, offset, (void *)data_load_addr, + mtd->writesize); + if (ret) + return ret; + + /* Read whole FIT image */ + size = fit_get_totalsize((const void *)data_load_addr); + } break; #endif default: @@ -188,7 +198,17 @@ int boot_from_snor(struct spi_flash *snor, u32 offset) #endif #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: - size = fit_get_size((const void *)data_load_addr); + size = fit_get_totalsize((const void *)data_load_addr); + if (size <= 0x2000) { + /* Load FDT header into memory */ + ret = mtd_read_generic(mtd, offset, (void *)data_load_addr, + mtd->writesize); + if (ret) + return ret; + + /* Read whole FIT image */ + size = fit_get_totalsize((const void *)data_load_addr); + } break; #endif default: diff --git a/uboot-mtk-20230718-09eda825/board/mediatek/common/mtd_helper.c b/uboot-mtk-20230718-09eda825/board/mediatek/common/mtd_helper.c index e3636e1b6..6142ad016 100644 --- a/uboot-mtk-20230718-09eda825/board/mediatek/common/mtd_helper.c +++ b/uboot-mtk-20230718-09eda825/board/mediatek/common/mtd_helper.c @@ -495,7 +495,17 @@ int boot_from_mtd(struct mtd_info *mtd, u64 offset) #endif #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: - size = fit_get_size((const void *)data_load_addr); + size = fit_get_totalsize((const void *)data_load_addr); + if (size <= 0x2000) { + /* Load FDT header into memory */ + ret = mtd_read_skip_bad(mtd, offset, size, mtd->size, + NULL, (void *)data_load_addr); + if (ret) + return ret; + + /* Read whole FIT image */ + size = fit_get_totalsize((const void *)data_load_addr); + } break; #endif default: