u-boot-imx-20231024

-------------------
 
 CI: https://source.denx.de/u-boot/custodians/u-boot-imx/-/pipelines/18211
 
 - Fixes for MC2432 Eeprom
 - i.MX93 ADC
 - Secondary boot mode on i.MX8M
 -----BEGIN PGP SIGNATURE-----
 
 iG0EABECAC0WIQS2TmnA27QKhpKSZe309WXkmmjvpgUCZTd93A8cc2JhYmljQGRl
 bnguZGUACgkQ9PVl5Jpo76bb9gCdEQkNaVg/xSF2FXyFmwSxMDfasfsAmgKWOgPJ
 fcLnp+4ZLv6rBw9mzvCK
 =t171
 -----END PGP SIGNATURE-----

Merge tag 'u-boot-imx-20231024' of https://gitlab.denx.de/u-boot/custodians/u-boot-imx

u-boot-imx-20231024
-------------------

CI: https://source.denx.de/u-boot/custodians/u-boot-imx/-/pipelines/18211

- Fixes for MC2432 Eeprom
- i.MX93 ADC
- Secondary boot mode on i.MX8M
This commit is contained in:
Tom Rini 2023-10-24 09:39:02 -04:00
commit 1b2a3d08c0
17 changed files with 184 additions and 29 deletions

View File

@ -24,6 +24,14 @@
pagesize = <16>; pagesize = <16>;
}; };
&eeprom0wl {
status = "disabled";
};
&eeprom1wl {
status = "disabled";
};
&ethphy0f { /* SMSC LAN8740Ai */ &ethphy0f { /* SMSC LAN8740Ai */
pinctrl-0 = <&pinctrl_ethphy0 &pinctrl_ioexp>; pinctrl-0 = <&pinctrl_ethphy0 &pinctrl_ioexp>;
reset-gpios = <&gpio3 20 GPIO_ACTIVE_LOW>; reset-gpios = <&gpio3 20 GPIO_ACTIVE_LOW>;

View File

@ -392,6 +392,18 @@
reg = <0x53>; 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 { ioexp: gpio@74 {
compatible = "nxp,pca9539"; compatible = "nxp,pca9539";
reg = <0x74>; reg = <0x74>;

View File

@ -8,6 +8,7 @@
compatible = "wdt-reboot"; compatible = "wdt-reboot";
wdt = <&wdog3>; wdt = <&wdog3>;
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
firmware { firmware {
@ -30,19 +31,23 @@
&aips2 { &aips2 {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&aips3 { &aips3 {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&iomuxc { &iomuxc {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&reg_usdhc2_vmmc { &reg_usdhc2_vmmc {
u-boot,off-on-delay-us = <20000>; u-boot,off-on-delay-us = <20000>;
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&pinctrl_reg_usdhc2_vmmc { &pinctrl_reg_usdhc2_vmmc {
@ -51,59 +56,73 @@
&pinctrl_uart1 { &pinctrl_uart1 {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&pinctrl_usdhc2_gpio { &pinctrl_usdhc2_gpio {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&pinctrl_usdhc2 { &pinctrl_usdhc2 {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&gpio1 { &gpio1 {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&gpio2 { &gpio2 {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&gpio3 { &gpio3 {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&gpio4 { &gpio4 {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&lpuart1 { &lpuart1 {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&usdhc1 { &usdhc1 {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&usdhc2 { &usdhc2 {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
fsl,signal-voltage-switch-extra-delay-ms = <8>; fsl,signal-voltage-switch-extra-delay-ms = <8>;
}; };
&lpi2c2 { &lpi2c2 {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&{/soc@0/bus@44000000/i2c@44350000/pmic@25} { &{/soc@0/bus@44000000/i2c@44350000/pmic@25} {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&{/soc@0/bus@44000000/i2c@44350000/pmic@25/regulators} { &{/soc@0/bus@44000000/i2c@44350000/pmic@25/regulators} {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&pinctrl_lpi2c2 { &pinctrl_lpi2c2 {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
}; };
&fec { &fec {
@ -124,6 +143,7 @@
&s4muap { &s4muap {
bootph-pre-ram; bootph-pre-ram;
bootph-some-ram;
status = "okay"; status = "okay";
}; };

View File

@ -71,7 +71,7 @@ config CSF_SIZE
config CMD_BMODE config CMD_BMODE
bool "Support the 'bmode' command" bool "Support the 'bmode' command"
default y default y
depends on ARCH_MX7 || ARCH_MX6 || ARCH_MX5 depends on ARCH_IMX8M || ARCH_MX7 || ARCH_MX6 || ARCH_MX5
help help
This enables the 'bmode' (bootmode) command for forcing This enables the 'bmode' (bootmode) command for forcing
a boot from specific media. a boot from specific media.

View File

@ -83,7 +83,11 @@ static int do_boot_mode(struct cmd_tbl *cmdtp, int flag, int argc,
reset_requested = 0; 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); boot_mode_apply(p->cfg_val);
#endif
if (reset_requested && p->cfg_val) if (reset_requested && p->cfg_val)
do_reset(NULL, 0, 0, NULL); do_reset(NULL, 0, 0, NULL);
return 0; return 0;

View File

@ -276,8 +276,8 @@ unsigned long spl_spi_get_uboot_offs(struct spi_flash *flash)
#endif #endif
#ifdef CONFIG_SPL_MMC #ifdef CONFIG_SPL_MMC
unsigned long spl_mmc_get_uboot_raw_sector(struct mmc *mmc, unsigned long arch_spl_mmc_get_uboot_raw_sector(struct mmc *mmc,
unsigned long raw_sect) unsigned long raw_sect)
{ {
int end; int end;

View File

@ -28,8 +28,10 @@
#include <errno.h> #include <errno.h>
#include <fdt_support.h> #include <fdt_support.h>
#include <fsl_wdog.h> #include <fsl_wdog.h>
#include <fuse.h>
#include <imx_sip.h> #include <imx_sip.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/bitfield.h>
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
@ -648,19 +650,17 @@ struct rom_api *g_rom_api = (struct rom_api *)0x980;
#if defined(CONFIG_IMX8M) #if defined(CONFIG_IMX8M)
#include <spl.h> #include <spl.h>
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_addr = (u32 *)0x9e0;
u32 *rom_log; u32 *rom_log;
u8 event_id; u8 event_id;
int i, part; int i, boot_secondary = 0;
part = default_spl_mmc_emmc_boot_partition(mmc);
/* If the ROM event log pointer is not valid. */ /* If the ROM event log pointer is not valid. */
if (*rom_log_addr < 0x900000 || *rom_log_addr >= 0xb00000 || if (*rom_log_addr < 0x900000 || *rom_log_addr >= 0xb00000 ||
*rom_log_addr & 0x3) *rom_log_addr & 0x3)
return part; return -EINVAL;
/* Parse the ROM event ID version 2 log */ /* Parse the ROM event ID version 2 log */
rom_log = (u32 *)(uintptr_t)(*rom_log_addr); rom_log = (u32 *)(uintptr_t)(*rom_log_addr);
@ -668,7 +668,7 @@ int spl_mmc_emmc_boot_partition(struct mmc *mmc)
event_id = rom_log[i] >> 24; event_id = rom_log[i] >> 24;
switch (event_id) { switch (event_id) {
case 0x00: /* End of list */ case 0x00: /* End of list */
return part; return boot_secondary;
/* Log entries with 1 parameter, skip 1 */ /* Log entries with 1 parameter, skip 1 */
case 0x80: /* Start to perform the device initialization */ case 0x80: /* Start to perform the device initialization */
case 0x81: /* The boot device initialization completes */ case 0x81: /* The boot device initialization completes */
@ -686,26 +686,89 @@ int spl_mmc_emmc_boot_partition(struct mmc *mmc)
continue; continue;
/* Boot from the secondary boot image */ /* Boot from the secondary boot image */
case 0x51: case 0x51:
/* boot_secondary = 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;
continue; continue;
default: default:
continue; 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; return part;
} }
int boot_mode_getprisec(void)
{
return !!imx8m_detect_secondary_image_boot();
}
#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 #endif
bool is_usb_boot(void) bool is_usb_boot(void)

View File

@ -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; return IS_SD(mmc) ? MMCSD_MODE_RAW : MMCSD_MODE_EMMCBOOT;
} }
unsigned long spl_mmc_get_uboot_raw_sector(struct mmc *mmc, unsigned long arch_spl_mmc_get_uboot_raw_sector(struct mmc *mmc,
unsigned long raw_sect) unsigned long raw_sect)
{ {
return IS_SD(mmc) ? 1 : 0; return IS_SD(mmc) ? 1 : 0;
} }

View File

@ -338,8 +338,8 @@ uint32_t sunxi_get_spl_size(void)
* Also U-Boot proper is located at least 32KB after the SPL, but will * Also U-Boot proper is located at least 32KB after the SPL, but will
* immediately follow the SPL if that is bigger than that. * immediately follow the SPL if that is bigger than that.
*/ */
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_sect) unsigned long raw_sect)
{ {
unsigned long spl_size = sunxi_get_spl_size(); unsigned long spl_size = sunxi_get_spl_size();
unsigned long sector; unsigned long sector;

View File

@ -193,7 +193,7 @@ int board_late_init(void)
#ifdef CONFIG_SPL_MMC #ifdef CONFIG_SPL_MMC
#define UBOOT_RAW_SECTOR_OFFSET 0x40 #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) unsigned long raw_sector)
{ {
u32 boot_dev = spl_boot_device(); u32 boot_dev = spl_boot_device();

View File

@ -107,7 +107,7 @@ void board_boot_order(u32 *spl_boot_list)
spl_boot_list[4] = BOOT_DEVICE_NONE; 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(); const u32 boot_dev = spl_boot_device();
int part; int part;

View File

@ -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)) { if (!IS_SD(mmc)) {
switch (EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config)) { switch (EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config)) {

View File

@ -365,10 +365,22 @@ int __weak spl_mmc_boot_partition(const u32 boot_device)
} }
#endif #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 __weak spl_mmc_get_uboot_raw_sector(struct mmc *mmc,
unsigned long raw_sect) 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) int default_spl_mmc_emmc_boot_partition(struct mmc *mmc)

View File

@ -81,6 +81,7 @@ CONFIG_NET_RANDOM_ETHADDR=y
CONFIG_SPL_DM=y CONFIG_SPL_DM=y
CONFIG_REGMAP=y CONFIG_REGMAP=y
CONFIG_SYSCON=y CONFIG_SYSCON=y
CONFIG_ADC=y
CONFIG_ADC_IMX93=y CONFIG_ADC_IMX93=y
CONFIG_SPL_CLK_IMX93=y CONFIG_SPL_CLK_IMX93=y
CONFIG_CLK_IMX93=y CONFIG_CLK_IMX93=y

View File

@ -66,6 +66,7 @@ config STM32_ADC
config ADC_IMX93 config ADC_IMX93
bool "Enable NXP IMX93 ADC driver" bool "Enable NXP IMX93 ADC driver"
depends on ADC
help help
This enables basic driver for NXP IMX93 ADC. This enables basic driver for NXP IMX93 ADC.
It provides: It provides:

View File

@ -227,6 +227,13 @@ static const struct i2c_eeprom_drv_data atmel24c32_data = {
.offset_len = 2, .offset_len = 2,
}; };
static const struct i2c_eeprom_drv_data atmel24c32d_wlp_data = {
.size = 32,
.pagesize = 32,
.addr_offset_mask = 0,
.offset_len = 2,
};
static const struct i2c_eeprom_drv_data atmel24c64_data = { static const struct i2c_eeprom_drv_data atmel24c64_data = {
.size = 8192, .size = 8192,
.pagesize = 32, .pagesize = 32,
@ -266,6 +273,7 @@ static const struct udevice_id i2c_eeprom_std_ids[] = {
{ .compatible = "atmel,24c16a", (ulong)&atmel24c16a_data }, { .compatible = "atmel,24c16a", (ulong)&atmel24c16a_data },
{ .compatible = "atmel,24mac402", (ulong)&atmel24mac402_data }, { .compatible = "atmel,24mac402", (ulong)&atmel24mac402_data },
{ .compatible = "atmel,24c32", (ulong)&atmel24c32_data }, { .compatible = "atmel,24c32", (ulong)&atmel24c32_data },
{ .compatible = "atmel,24c32d-wl", (ulong)&atmel24c32d_wlp_data },
{ .compatible = "atmel,24c64", (ulong)&atmel24c64_data }, { .compatible = "atmel,24c64", (ulong)&atmel24c64_data },
{ .compatible = "atmel,24c128", (ulong)&atmel24c128_data }, { .compatible = "atmel,24c128", (ulong)&atmel24c128_data },
{ .compatible = "atmel,24c256", (ulong)&atmel24c256_data }, { .compatible = "atmel,24c256", (ulong)&atmel24c256_data },

View File

@ -496,6 +496,32 @@ int spl_mmc_emmc_boot_partition(struct mmc *mmc);
void spl_set_bd(void); 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 * spl_mmc_get_uboot_raw_sector() - Provide raw sector of the start of U-Boot
* *