From fb2bdc4efcb99fab62051274ad2330aef07360f6 Mon Sep 17 00:00:00 2001 From: Sébastien Szymanski Date: Wed, 4 Oct 2023 11:08:09 +0200 Subject: arm: dts: imx93-11x11-evk: add bootph-some-ram property i.MX93 11x11 EVK fails to boot: U-Boot SPL 2023.10-00558-g65b9b3462bec-dirty (Oct 03 2023 - 17:40:10 +0200) SOC: 0xa0009300 LC: 0x40010 M33 prepare ok Normal Boot Trying to boot from BOOTROM Boot Stage: Primary boot image offset 0x8000, pagesize 0x200, ivt offset 0x0 Load image from 0x44400 by ROM_API NOTICE: BL31: v2.8(release):android-13.0.0_2.0.0-0-ge4b2dbfa52f5 NOTICE: BL31: Built : 17:52:46, Sep 28 2023 That's because commit 9e644284ab81 ("dm: core: Report bootph-pre-ram/sram node as pre-reloc after relocation"): "[This] changes behavior of what nodes are bound in the U-Boot proper pre-relocation phase. Change to bootph-all or add bootph-some-ram prop to restore prior behavior." Fix this by adding bootph-some-ram prop as suggested by the commit above. Fixes: 9e644284ab81 ("dm: core: Report bootph-pre-ram/sram node as pre-reloc after relocation") Signed-off-by: Sébastien Szymanski Reviewed-by: Fabio Estevam --- arch/arm/dts/imx93-11x11-evk-u-boot.dtsi | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'arch/arm') diff --git a/arch/arm/dts/imx93-11x11-evk-u-boot.dtsi b/arch/arm/dts/imx93-11x11-evk-u-boot.dtsi index 93b4d91e4c3..a9dffa5a71e 100644 --- a/arch/arm/dts/imx93-11x11-evk-u-boot.dtsi +++ b/arch/arm/dts/imx93-11x11-evk-u-boot.dtsi @@ -8,6 +8,7 @@ compatible = "wdt-reboot"; wdt = <&wdog3>; bootph-pre-ram; + bootph-some-ram; }; firmware { @@ -30,19 +31,23 @@ &aips2 { bootph-pre-ram; + bootph-some-ram; }; &aips3 { bootph-pre-ram; + bootph-some-ram; }; &iomuxc { bootph-pre-ram; + bootph-some-ram; }; ®_usdhc2_vmmc { u-boot,off-on-delay-us = <20000>; bootph-pre-ram; + bootph-some-ram; }; &pinctrl_reg_usdhc2_vmmc { @@ -51,59 +56,73 @@ &pinctrl_uart1 { bootph-pre-ram; + bootph-some-ram; }; &pinctrl_usdhc2_gpio { bootph-pre-ram; + bootph-some-ram; }; &pinctrl_usdhc2 { bootph-pre-ram; + bootph-some-ram; }; &gpio1 { bootph-pre-ram; + bootph-some-ram; }; &gpio2 { bootph-pre-ram; + bootph-some-ram; }; &gpio3 { bootph-pre-ram; + bootph-some-ram; }; &gpio4 { bootph-pre-ram; + bootph-some-ram; }; &lpuart1 { bootph-pre-ram; + bootph-some-ram; }; &usdhc1 { bootph-pre-ram; + bootph-some-ram; }; &usdhc2 { bootph-pre-ram; + bootph-some-ram; fsl,signal-voltage-switch-extra-delay-ms = <8>; }; &lpi2c2 { bootph-pre-ram; + bootph-some-ram; }; &{/soc@0/bus@44000000/i2c@44350000/pmic@25} { bootph-pre-ram; + bootph-some-ram; }; &{/soc@0/bus@44000000/i2c@44350000/pmic@25/regulators} { bootph-pre-ram; + bootph-some-ram; }; &pinctrl_lpi2c2 { bootph-pre-ram; + bootph-some-ram; }; &fec { @@ -124,6 +143,7 @@ &s4muap { bootph-pre-ram; + bootph-some-ram; status = "okay"; }; -- cgit v1.2.3 From e936db953600aba0986743f12229d8b7ebff92ae Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Mon, 16 Oct 2023 18:16:12 +0200 Subject: spl: mmc: Introduce proper layering for spl_mmc_get_uboot_raw_sector() Introduce two new weak functions, arch_spl_mmc_get_uboot_raw_sector() and board_spl_mmc_get_uboot_raw_sector(), each of which can be overridden at a matching level, that is arch/ and board/ , in addition to the existing weak function spl_mmc_get_uboot_raw_sector(). This way, architecture code can define a default architecture specific implementation of arch_spl_mmc_get_uboot_raw_sector(), while the board code can override that using board_spl_mmc_get_uboot_raw_sector() which takes precedence over the architecture code. In some sort of unlikely special case where code has to take precedence over board code too, the spl_mmc_get_uboot_raw_sector() is still left out to be a weak function, but it should be unlikely that this is ever needed to be overridden. Signed-off-by: Marek Vasut --- arch/arm/mach-imx/image-container.c | 4 ++-- arch/arm/mach-mvebu/spl.c | 4 ++-- arch/arm/mach-sunxi/board.c | 4 ++-- .../advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c | 2 +- board/data_modul/imx8mp_edm_sbc/spl.c | 2 +- board/gateworks/venice/spl.c | 2 +- common/spl/spl_mmc.c | 14 +++++++++++- include/spl.h | 26 ++++++++++++++++++++++ 8 files changed, 48 insertions(+), 10 deletions(-) (limited to 'arch/arm') diff --git a/arch/arm/mach-imx/image-container.c b/arch/arm/mach-imx/image-container.c index 5f188ab32d1..0285bbdaf20 100644 --- a/arch/arm/mach-imx/image-container.c +++ b/arch/arm/mach-imx/image-container.c @@ -276,8 +276,8 @@ unsigned long spl_spi_get_uboot_offs(struct spi_flash *flash) #endif #ifdef CONFIG_SPL_MMC -unsigned long spl_mmc_get_uboot_raw_sector(struct mmc *mmc, - unsigned long raw_sect) +unsigned long arch_spl_mmc_get_uboot_raw_sector(struct mmc *mmc, + unsigned long raw_sect) { int end; diff --git a/arch/arm/mach-mvebu/spl.c b/arch/arm/mach-mvebu/spl.c index 379daa88a4d..eaaa68a8564 100644 --- a/arch/arm/mach-mvebu/spl.c +++ b/arch/arm/mach-mvebu/spl.c @@ -123,8 +123,8 @@ u32 spl_mmc_boot_mode(struct mmc *mmc, const u32 boot_device) { return IS_SD(mmc) ? MMCSD_MODE_RAW : MMCSD_MODE_EMMCBOOT; } -unsigned long spl_mmc_get_uboot_raw_sector(struct mmc *mmc, - unsigned long raw_sect) +unsigned long arch_spl_mmc_get_uboot_raw_sector(struct mmc *mmc, + unsigned long raw_sect) { return IS_SD(mmc) ? 1 : 0; } diff --git a/arch/arm/mach-sunxi/board.c b/arch/arm/mach-sunxi/board.c index 78597ad932c..61a4245c499 100644 --- a/arch/arm/mach-sunxi/board.c +++ b/arch/arm/mach-sunxi/board.c @@ -323,8 +323,8 @@ uint32_t sunxi_get_spl_size(void) * Also U-Boot proper is located at least 32KB after the SPL, but will * immediately follow the SPL if that is bigger than that. */ -unsigned long spl_mmc_get_uboot_raw_sector(struct mmc *mmc, - unsigned long raw_sect) +unsigned long board_spl_mmc_get_uboot_raw_sector(struct mmc *mmc, + unsigned long raw_sect) { unsigned long spl_size = sunxi_get_spl_size(); unsigned long sector; diff --git a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c index b79a2380aa5..d87fe3606f6 100644 --- a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c +++ b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c @@ -193,7 +193,7 @@ int board_late_init(void) #ifdef CONFIG_SPL_MMC #define UBOOT_RAW_SECTOR_OFFSET 0x40 -unsigned long spl_mmc_get_uboot_raw_sector(struct mmc *mmc, +unsigned long board_spl_mmc_get_uboot_raw_sector(struct mmc *mmc, unsigned long raw_sector) { u32 boot_dev = spl_boot_device(); diff --git a/board/data_modul/imx8mp_edm_sbc/spl.c b/board/data_modul/imx8mp_edm_sbc/spl.c index 2fdd95a730c..cfc4b65e0f9 100644 --- a/board/data_modul/imx8mp_edm_sbc/spl.c +++ b/board/data_modul/imx8mp_edm_sbc/spl.c @@ -107,7 +107,7 @@ void board_boot_order(u32 *spl_boot_list) spl_boot_list[4] = BOOT_DEVICE_NONE; } -unsigned long spl_mmc_get_uboot_raw_sector(struct mmc *mmc, unsigned long sect) +unsigned long board_spl_mmc_get_uboot_raw_sector(struct mmc *mmc, unsigned long sect) { const u32 boot_dev = spl_boot_device(); int part; diff --git a/board/gateworks/venice/spl.c b/board/gateworks/venice/spl.c index 31a23504175..b0a315ba953 100644 --- a/board/gateworks/venice/spl.c +++ b/board/gateworks/venice/spl.c @@ -346,7 +346,7 @@ int spl_board_boot_device(enum boot_device boot_dev_spl) } } -unsigned long spl_mmc_get_uboot_raw_sector(struct mmc *mmc, unsigned long raw_sect) +unsigned long board_spl_mmc_get_uboot_raw_sector(struct mmc *mmc, unsigned long raw_sect) { if (!IS_SD(mmc)) { switch (EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config)) { diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c index 0ab85d2168c..612b11ef5b9 100644 --- a/common/spl/spl_mmc.c +++ b/common/spl/spl_mmc.c @@ -361,10 +361,22 @@ int __weak spl_mmc_boot_partition(const u32 boot_device) } #endif +unsigned long __weak arch_spl_mmc_get_uboot_raw_sector(struct mmc *mmc, + unsigned long raw_sect) +{ + return raw_sect; +} + +unsigned long __weak board_spl_mmc_get_uboot_raw_sector(struct mmc *mmc, + unsigned long raw_sect) +{ + return arch_spl_mmc_get_uboot_raw_sector(mmc, raw_sect); +} + unsigned long __weak spl_mmc_get_uboot_raw_sector(struct mmc *mmc, unsigned long raw_sect) { - return raw_sect; + return board_spl_mmc_get_uboot_raw_sector(mmc, raw_sect); } int default_spl_mmc_emmc_boot_partition(struct mmc *mmc) diff --git a/include/spl.h b/include/spl.h index 1d416b4c929..1241f091237 100644 --- a/include/spl.h +++ b/include/spl.h @@ -486,6 +486,32 @@ int spl_mmc_emmc_boot_partition(struct mmc *mmc); void spl_set_bd(void); +/** + * spl_mmc_get_uboot_raw_sector() - Provide raw sector of the start of U-Boot (architecture override) + * + * This is a weak function which by default will provide the raw sector that is + * where the start of the U-Boot image has been written to. + * + * @mmc: struct mmc that describes the devie where U-Boot resides + * @raw_sect: The raw sector number where U-Boot is by default. + * Return: The raw sector location that U-Boot resides at + */ +unsigned long arch_spl_mmc_get_uboot_raw_sector(struct mmc *mmc, + unsigned long raw_sect); + +/** + * spl_mmc_get_uboot_raw_sector() - Provide raw sector of the start of U-Boot (board override) + * + * This is a weak function which by default will provide the raw sector that is + * where the start of the U-Boot image has been written to. + * + * @mmc: struct mmc that describes the devie where U-Boot resides + * @raw_sect: The raw sector number where U-Boot is by default. + * Return: The raw sector location that U-Boot resides at + */ +unsigned long board_spl_mmc_get_uboot_raw_sector(struct mmc *mmc, + unsigned long raw_sect); + /** * spl_mmc_get_uboot_raw_sector() - Provide raw sector of the start of U-Boot * -- cgit v1.2.3 From 6c97153b04da053d255e09ea78a417c49fe7c70a Mon Sep 17 00:00:00 2001 From: Fedor Ross Date: Mon, 16 Oct 2023 18:16:13 +0200 Subject: ARM: imx: Factor out parsing of ROM log Factor out parsing of ROM log in function spl_mmc_emmc_boot_partition(). This can be helpful to detect a secondary image boot without fiddling around with MMC partitions. This way for example, U-Boot is able to detect a secondary image boot and can enter some fallback scenario like starting a recovery mode. Signed-off-by: Fedor Ross Signed-off-by: Marek Vasut --- arch/arm/mach-imx/imx8m/soc.c | 55 +++++++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 18 deletions(-) (limited to 'arch/arm') diff --git a/arch/arm/mach-imx/imx8m/soc.c b/arch/arm/mach-imx/imx8m/soc.c index 5de4d11a761..7bfba4febcf 100644 --- a/arch/arm/mach-imx/imx8m/soc.c +++ b/arch/arm/mach-imx/imx8m/soc.c @@ -648,19 +648,17 @@ struct rom_api *g_rom_api = (struct rom_api *)0x980; #if defined(CONFIG_IMX8M) #include -int spl_mmc_emmc_boot_partition(struct mmc *mmc) +int imx8m_detect_secondary_image_boot(void) { u32 *rom_log_addr = (u32 *)0x9e0; u32 *rom_log; u8 event_id; - int i, part; - - part = default_spl_mmc_emmc_boot_partition(mmc); + int i, boot_secondary = 0; /* If the ROM event log pointer is not valid. */ if (*rom_log_addr < 0x900000 || *rom_log_addr >= 0xb00000 || *rom_log_addr & 0x3) - return part; + return -EINVAL; /* Parse the ROM event ID version 2 log */ rom_log = (u32 *)(uintptr_t)(*rom_log_addr); @@ -668,7 +666,7 @@ int spl_mmc_emmc_boot_partition(struct mmc *mmc) event_id = rom_log[i] >> 24; switch (event_id) { case 0x00: /* End of list */ - return part; + return boot_secondary; /* Log entries with 1 parameter, skip 1 */ case 0x80: /* Start to perform the device initialization */ case 0x81: /* The boot device initialization completes */ @@ -686,24 +684,45 @@ int spl_mmc_emmc_boot_partition(struct mmc *mmc) continue; /* Boot from the secondary boot image */ case 0x51: - /* - * Swap the eMMC boot partitions in case there was a - * fallback event (i.e. primary image was corrupted - * and that corruption was recognized by the BootROM), - * so the SPL loads the rest of the U-Boot from the - * correct eMMC boot partition, since the BootROM - * leaves the boot partition set to the corrupted one. - */ - if (part == 1) - part = 2; - else if (part == 2) - part = 1; + boot_secondary = 1; continue; default: continue; } } + return boot_secondary; +} + +int spl_mmc_emmc_boot_partition(struct mmc *mmc) +{ + int part, ret; + + part = default_spl_mmc_emmc_boot_partition(mmc); + if (part == 0) + return part; + + ret = imx8m_detect_secondary_image_boot(); + if (ret < 0) { + printf("Could not get boot partition! Using %d\n", part); + return part; + } + + if (ret == 1) { + /* + * Swap the eMMC boot partitions in case there was a + * fallback event (i.e. primary image was corrupted + * and that corruption was recognized by the BootROM), + * so the SPL loads the rest of the U-Boot from the + * correct eMMC boot partition, since the BootROM + * leaves the boot partition set to the corrupted one. + */ + if (part == 1) + part = 2; + else if (part == 2) + part = 1; + } + return part; } #endif -- cgit v1.2.3 From 71c2faeca74cfc1ad7e14c15105fe7c54c89aa96 Mon Sep 17 00:00:00 2001 From: Fedor Ross Date: Mon, 16 Oct 2023 18:16:14 +0200 Subject: 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 Signed-off-by: Marek Vasut --- arch/arm/mach-imx/imx8m/soc.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'arch/arm') 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 #include #include +#include #include #include +#include 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; -- cgit v1.2.3 From a41c9ddb30913fc581c0395916d127788936763c Mon Sep 17 00:00:00 2001 From: Fedor Ross Date: Mon, 16 Oct 2023 18:16:15 +0200 Subject: ARM: imx: Add support for detecting primary/secondary bmode on MX8M Implement the 'getprisec' subcommand of 'bmode' command for i.MX8M by reading out the ROM log events. This event is set by the BootROM if it switched to the secondary copy due to primary copy being corrupted. Signed-off-by: Fedor Ross Signed-off-by: Marek Vasut --- arch/arm/mach-imx/Kconfig | 2 +- arch/arm/mach-imx/cmd_bmode.c | 4 ++++ arch/arm/mach-imx/imx8m/soc.c | 5 +++++ 3 files changed, 10 insertions(+), 1 deletion(-) (limited to 'arch/arm') diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index 266bb20df9d..44e1e1628ba 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig @@ -71,7 +71,7 @@ config CSF_SIZE config CMD_BMODE bool "Support the 'bmode' command" default y - depends on ARCH_MX7 || ARCH_MX6 || ARCH_MX5 + depends on ARCH_IMX8M || ARCH_MX7 || ARCH_MX6 || ARCH_MX5 help This enables the 'bmode' (bootmode) command for forcing a boot from specific media. diff --git a/arch/arm/mach-imx/cmd_bmode.c b/arch/arm/mach-imx/cmd_bmode.c index cb317499d54..5b2f4686230 100644 --- a/arch/arm/mach-imx/cmd_bmode.c +++ b/arch/arm/mach-imx/cmd_bmode.c @@ -83,7 +83,11 @@ static int do_boot_mode(struct cmd_tbl *cmdtp, int flag, int argc, reset_requested = 0; } +/* No longer applicable to i.MX8M */ +#if IS_ENABLED(CONFIG_MX53) || IS_ENABLED(CONFIG_MX6) || IS_ENABLED(CONFIG_MX7) boot_mode_apply(p->cfg_val); +#endif + if (reset_requested && p->cfg_val) do_reset(NULL, 0, 0, NULL); return 0; diff --git a/arch/arm/mach-imx/imx8m/soc.c b/arch/arm/mach-imx/imx8m/soc.c index ce67b439e87..39802d6a796 100644 --- a/arch/arm/mach-imx/imx8m/soc.c +++ b/arch/arm/mach-imx/imx8m/soc.c @@ -727,6 +727,11 @@ int spl_mmc_emmc_boot_partition(struct mmc *mmc) return part; } + +int boot_mode_getprisec(void) +{ + return !!imx8m_detect_secondary_image_boot(); +} #endif #if defined(CONFIG_IMX8MN) || defined(CONFIG_IMX8MP) -- cgit v1.2.3 From 2f96064d0cf78e21a668ad907d41d63e56f9f7bb Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Mon, 16 Oct 2023 02:05:25 +0200 Subject: arm64: dts: imx8mp: Describe M24C32-D write-lockable page in DH i.MX8MP DHCOM DT The i.MX8MP DHCOM SoM production rev.200 is populated with M24C32-D EEPROMs which have Additional Write lockable page at separate I2C address. Describe the page in DT to make it available. Disable the additional page in rev.100 SoM DTO as those devices contain EEPROM without an Additional Write lockable page. Signed-off-by: Marek Vasut --- arch/arm/dts/imx8mp-dhcom-som-overlay-rev100.dts | 8 ++++++++ arch/arm/dts/imx8mp-dhcom-som.dtsi | 12 ++++++++++++ 2 files changed, 20 insertions(+) (limited to 'arch/arm') diff --git a/arch/arm/dts/imx8mp-dhcom-som-overlay-rev100.dts b/arch/arm/dts/imx8mp-dhcom-som-overlay-rev100.dts index 5d9a00c9429..0e5d329b149 100644 --- a/arch/arm/dts/imx8mp-dhcom-som-overlay-rev100.dts +++ b/arch/arm/dts/imx8mp-dhcom-som-overlay-rev100.dts @@ -24,6 +24,14 @@ pagesize = <16>; }; +&eeprom0wl { + status = "disabled"; +}; + +&eeprom1wl { + status = "disabled"; +}; + ðphy0f { /* SMSC LAN8740Ai */ pinctrl-0 = <&pinctrl_ethphy0 &pinctrl_ioexp>; reset-gpios = <&gpio3 20 GPIO_ACTIVE_LOW>; diff --git a/arch/arm/dts/imx8mp-dhcom-som.dtsi b/arch/arm/dts/imx8mp-dhcom-som.dtsi index ea2a567447a..b504d36818b 100644 --- a/arch/arm/dts/imx8mp-dhcom-som.dtsi +++ b/arch/arm/dts/imx8mp-dhcom-som.dtsi @@ -392,6 +392,18 @@ reg = <0x53>; }; + eeprom0wl: eeprom@58 { + compatible = "atmel,24c32d-wl"; /* M24C32-D WL page of 0x50 */ + pagesize = <32>; + reg = <0x58>; + }; + + eeprom1wl: eeprom@5b { + compatible = "atmel,24c32d-wl"; /* M24C32-D WL page of 0x53 */ + pagesize = <32>; + reg = <0x5b>; + }; + ioexp: gpio@74 { compatible = "nxp,pca9539"; reg = <0x74>; -- cgit v1.2.3