aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/mach-imx
diff options
context:
space:
mode:
authorFedor Ross2023-10-16 18:16:14 +0200
committerStefano Babic2023-10-17 23:55:10 +0200
commit71c2faeca74cfc1ad7e14c15105fe7c54c89aa96 (patch)
tree5361ad25b01d4b35964017abb7e58d1a9d8dcdd7 /arch/arm/mach-imx
parent6c97153b04da053d255e09ea78a417c49fe7c70a (diff)
ARM: imx: Use correct U-Boot offset in case of secondary boot from eMMC
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 <fedor.ross@ifm.com> Signed-off-by: Marek Vasut <marex@denx.de>
Diffstat (limited to 'arch/arm/mach-imx')
-rw-r--r--arch/arm/mach-imx/imx8m/soc.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/arch/arm/mach-imx/imx8m/soc.c b/arch/arm/mach-imx/imx8m/soc.c
index 7bfba4febcf..ce67b439e87 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;