From: Fedor Ross <[email protected]> In case of a secondary image boot from the user area of an eMMC device, the correct offset must be calculated. The offset is fused in the fuse IMG_CNTN_SET1_OFFSET of the i.MX8M Nano and Plus. The calculation of the offset is described in the reference manual (IMX8MNRM Rev. 2, 07/2022 and IMX8MPRM Rev. 1, 06/2021):
The fuse IMG_CNTN_SET1_OFFSET (0x490[22:19]) is defined as follows: * Secondary boot is disabled if fuse value is bigger than 10, n = fuse value bigger than 10. * n == 0: Offset = 4MB * n == 2: Offset = 1MB * Others & n <= 10 : Offset = 1MB*2^n Signed-off-by: Fedor Ross <[email protected]> Signed-off-by: Marek Vasut <[email protected]> --- Cc: "NXP i.MX U-Boot Team" <[email protected]> Cc: "Ying-Chun Liu (PaulLiu)" <[email protected]> Cc: Andre Przywara <[email protected]> Cc: Chanho Park <[email protected]> Cc: Elena Popa <[email protected]> Cc: Fabio Estevam <[email protected]> Cc: Fedor Ross <[email protected]> Cc: Heinrich Schuchardt <[email protected]> Cc: Hugo Villeneuve <[email protected]> Cc: Jagan Teki <[email protected]> Cc: Kever Yang <[email protected]> Cc: Manoj Sai <[email protected]> Cc: Michal Simek <[email protected]> Cc: Neil Armstrong <[email protected]> Cc: Peng Fan <[email protected]> Cc: Qu Wenruo <[email protected]> Cc: Roger Quadros <[email protected]> Cc: Simon Glass <[email protected]> Cc: Stefan Roese <[email protected]> Cc: Stefano Babic <[email protected]> Cc: Tim Harvey <[email protected]> --- V2: Use arch_spl_mmc_get_uboot_raw_sector() --- arch/arm/mach-imx/imx8m/soc.c | 39 +++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/arch/arm/mach-imx/imx8m/soc.c b/arch/arm/mach-imx/imx8m/soc.c index 930ee5f59f9..d33ac06cab4 100644 --- a/arch/arm/mach-imx/imx8m/soc.c +++ b/arch/arm/mach-imx/imx8m/soc.c @@ -28,8 +28,10 @@ #include <errno.h> #include <fdt_support.h> #include <fsl_wdog.h> +#include <fuse.h> #include <imx_sip.h> #include <linux/bitops.h> +#include <linux/bitfield.h> DECLARE_GLOBAL_DATA_PTR; @@ -727,6 +729,43 @@ int spl_mmc_emmc_boot_partition(struct mmc *mmc) } #endif +#if defined(CONFIG_IMX8MN) || defined(CONFIG_IMX8MP) +#define IMG_CNTN_SET1_OFFSET GENMASK(22, 19) +unsigned long arch_spl_mmc_get_uboot_raw_sector(struct mmc *mmc, + unsigned long raw_sect) +{ + u32 val, offset; + + if (fuse_read(2, 1, &val)) { + debug("Error reading fuse!\n"); + return raw_sect; + } + + val = FIELD_GET(IMG_CNTN_SET1_OFFSET, val); + if (val > 10) { + debug("Secondary image boot disabled!\n"); + return raw_sect; + } + + if (val == 0) + offset = SZ_4M; + else if (val == 1) + offset = SZ_2M; + else if (val == 2) + offset = SZ_1M; + else /* flash.bin offset = 1 MiB * 2^n */ + offset = SZ_1M << val; + + offset /= 512; + offset -= CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET; + + if (imx8m_detect_secondary_image_boot()) + raw_sect += offset; + + return raw_sect; +} +#endif + bool is_usb_boot(void) { return get_boot_device() == USB_BOOT; -- 2.42.0

