Message ID | 20200516153501.5889-1-faiz_abbas@ti.com |
---|---|
State | New |
Headers | show |
Series | arm: mach-k3: j721e_init: Add support for backup boot modes | expand |
On 16/05/20 9:05 pm, Faiz Abbas wrote: > From: Andreas Dannenberg <dannenberg at ti.com> > > When the boot of J721E devices using the primary bootmode (configured > via device pins) fails a boot using the configured backup bootmode is > attempted. To take advantage of the backup boot mode feature go ahead > and add support to the J721E init code to determine whether the ROM code > performed the boot using the primary or backup boot mode, and if booted > from the backup boot mode, decode the bootmode settings into the > appropriate U-Boot mode accordingly so that the boot can proceed. > > Signed-off-by: Andreas Dannenberg <dannenberg at ti.com> > Signed-off-by: Faiz Abbas <faiz_abbas at ti.com> > --- > .../arm/mach-k3/include/mach/j721e_hardware.h | 2 ++ > arch/arm/mach-k3/include/mach/j721e_spl.h | 12 +++++++ > arch/arm/mach-k3/j721e_init.c | 35 +++++++++++++++++-- > 3 files changed, 47 insertions(+), 2 deletions(-) > > diff --git a/arch/arm/mach-k3/include/mach/j721e_hardware.h b/arch/arm/mach-k3/include/mach/j721e_hardware.h > index ead136ed63..2efa911a9a 100644 > --- a/arch/arm/mach-k3/include/mach/j721e_hardware.h > +++ b/arch/arm/mach-k3/include/mach/j721e_hardware.h > @@ -18,6 +18,8 @@ > #define MAIN_DEVSTAT_BKUP_BOOTMODE_SHIFT 1 > #define MAIN_DEVSTAT_PRIM_BOOTMODE_MMC_PORT_MASK BIT(6) > #define MAIN_DEVSTAT_PRIM_BOOTMODE_PORT_SHIFT 6 > +#define MAIN_DEVSTAT_BKUP_MMC_PORT_MASK BIT(7) > +#define MAIN_DEVSTAT_BKUP_MMC_PORT_SHIFT 7 > > #define WKUP_CTRL_MMR0_BASE 0x43000000 > #define MCU_CTRL_MMR0_BASE 0x40f00000 > diff --git a/arch/arm/mach-k3/include/mach/j721e_spl.h b/arch/arm/mach-k3/include/mach/j721e_spl.h > index 475278bd04..1cabc01dc4 100644 > --- a/arch/arm/mach-k3/include/mach/j721e_spl.h > +++ b/arch/arm/mach-k3/include/mach/j721e_spl.h > @@ -25,7 +25,19 @@ > #define BOOT_DEVICE_MMC2_2 0x16 > #define BOOT_DEVICE_RAM 0x17 > > +/* Backup boot modes with MCU Only = 0 */ > +#define BACKUP_BOOT_DEVICE_RAM 0x0 > +#define BACKUP_BOOT_DEVICE_USB 0x1 Please use BACKUP_BOOT_DEVICE_DFU instead like how BOOT_DEVICE_DFU is used for primary boot mode. BOOT_DEVICE_USB is usually used with host mode so using that for DFU would be confusing. BTW, for my information, have you verified all backup boot media? Regards Vignesh > +#define BACKUP_BOOT_DEVICE_UART 0x3 > +#define BACKUP_BOOT_DEVICE_ETHERNET 0x4 > +#define BACKUP_BOOT_DEVICE_MMC2 0x5 > +#define BACKUP_BOOT_DEVICE_SPI 0x6 > +#define BACKUP_BOOT_DEVICE_I2C 0x7 > + > #define BOOT_MODE_B_SHIFT 4 > #define BOOT_MODE_B_MASK BIT(4) > > +#define K3_PRIMARY_BOOTMODE 0x0 > +#define K3_BACKUP_BOOTMODE 0x1 > + > #endif > diff --git a/arch/arm/mach-k3/j721e_init.c b/arch/arm/mach-k3/j721e_init.c > index 71fc20c30b..18a3c1c052 100644 > --- a/arch/arm/mach-k3/j721e_init.c > +++ b/arch/arm/mach-k3/j721e_init.c > @@ -235,6 +235,35 @@ u32 spl_mmc_boot_mode(const u32 boot_device) > } > } > > +static u32 __get_backup_bootmedia(u32 main_devstat) > +{ > + u32 bkup_boot = (main_devstat & MAIN_DEVSTAT_BKUP_BOOTMODE_MASK) >> > + MAIN_DEVSTAT_BKUP_BOOTMODE_SHIFT; > + > + switch (bkup_boot) { > + case BACKUP_BOOT_DEVICE_USB: > + return BOOT_DEVICE_DFU; > + case BACKUP_BOOT_DEVICE_UART: > + return BOOT_DEVICE_UART; > + case BACKUP_BOOT_DEVICE_ETHERNET: > + return BOOT_DEVICE_ETHERNET; > + case BACKUP_BOOT_DEVICE_MMC2: > + { > + u32 port = (main_devstat & MAIN_DEVSTAT_BKUP_MMC_PORT_MASK) >> > + MAIN_DEVSTAT_BKUP_MMC_PORT_SHIFT; > + if (port == 0x0) > + return BOOT_DEVICE_MMC1; > + return BOOT_DEVICE_MMC2; > + } > + case BACKUP_BOOT_DEVICE_SPI: > + return BOOT_DEVICE_SPI; > + case BACKUP_BOOT_DEVICE_I2C: > + return BOOT_DEVICE_I2C; > + } > + > + return BOOT_DEVICE_RAM; > +} > + > static u32 __get_primary_bootmedia(u32 main_devstat, u32 wkup_devstat) > { > > @@ -271,8 +300,10 @@ u32 spl_boot_device(void) > /* MAIN CTRL MMR can only be read if MCU ONLY is 0 */ > main_devstat = readl(CTRLMMR_MAIN_DEVSTAT); > > - /* ToDo: Add support for backup boot media */ > - return __get_primary_bootmedia(main_devstat, wkup_devstat); > + if (bootindex == K3_PRIMARY_BOOTMODE) > + return __get_primary_bootmedia(main_devstat, wkup_devstat); > + else > + return __get_backup_bootmedia(main_devstat); > } > #endif > >
diff --git a/arch/arm/mach-k3/include/mach/j721e_hardware.h b/arch/arm/mach-k3/include/mach/j721e_hardware.h index ead136ed63..2efa911a9a 100644 --- a/arch/arm/mach-k3/include/mach/j721e_hardware.h +++ b/arch/arm/mach-k3/include/mach/j721e_hardware.h @@ -18,6 +18,8 @@ #define MAIN_DEVSTAT_BKUP_BOOTMODE_SHIFT 1 #define MAIN_DEVSTAT_PRIM_BOOTMODE_MMC_PORT_MASK BIT(6) #define MAIN_DEVSTAT_PRIM_BOOTMODE_PORT_SHIFT 6 +#define MAIN_DEVSTAT_BKUP_MMC_PORT_MASK BIT(7) +#define MAIN_DEVSTAT_BKUP_MMC_PORT_SHIFT 7 #define WKUP_CTRL_MMR0_BASE 0x43000000 #define MCU_CTRL_MMR0_BASE 0x40f00000 diff --git a/arch/arm/mach-k3/include/mach/j721e_spl.h b/arch/arm/mach-k3/include/mach/j721e_spl.h index 475278bd04..1cabc01dc4 100644 --- a/arch/arm/mach-k3/include/mach/j721e_spl.h +++ b/arch/arm/mach-k3/include/mach/j721e_spl.h @@ -25,7 +25,19 @@ #define BOOT_DEVICE_MMC2_2 0x16 #define BOOT_DEVICE_RAM 0x17 +/* Backup boot modes with MCU Only = 0 */ +#define BACKUP_BOOT_DEVICE_RAM 0x0 +#define BACKUP_BOOT_DEVICE_USB 0x1 +#define BACKUP_BOOT_DEVICE_UART 0x3 +#define BACKUP_BOOT_DEVICE_ETHERNET 0x4 +#define BACKUP_BOOT_DEVICE_MMC2 0x5 +#define BACKUP_BOOT_DEVICE_SPI 0x6 +#define BACKUP_BOOT_DEVICE_I2C 0x7 + #define BOOT_MODE_B_SHIFT 4 #define BOOT_MODE_B_MASK BIT(4) +#define K3_PRIMARY_BOOTMODE 0x0 +#define K3_BACKUP_BOOTMODE 0x1 + #endif diff --git a/arch/arm/mach-k3/j721e_init.c b/arch/arm/mach-k3/j721e_init.c index 71fc20c30b..18a3c1c052 100644 --- a/arch/arm/mach-k3/j721e_init.c +++ b/arch/arm/mach-k3/j721e_init.c @@ -235,6 +235,35 @@ u32 spl_mmc_boot_mode(const u32 boot_device) } } +static u32 __get_backup_bootmedia(u32 main_devstat) +{ + u32 bkup_boot = (main_devstat & MAIN_DEVSTAT_BKUP_BOOTMODE_MASK) >> + MAIN_DEVSTAT_BKUP_BOOTMODE_SHIFT; + + switch (bkup_boot) { + case BACKUP_BOOT_DEVICE_USB: + return BOOT_DEVICE_DFU; + case BACKUP_BOOT_DEVICE_UART: + return BOOT_DEVICE_UART; + case BACKUP_BOOT_DEVICE_ETHERNET: + return BOOT_DEVICE_ETHERNET; + case BACKUP_BOOT_DEVICE_MMC2: + { + u32 port = (main_devstat & MAIN_DEVSTAT_BKUP_MMC_PORT_MASK) >> + MAIN_DEVSTAT_BKUP_MMC_PORT_SHIFT; + if (port == 0x0) + return BOOT_DEVICE_MMC1; + return BOOT_DEVICE_MMC2; + } + case BACKUP_BOOT_DEVICE_SPI: + return BOOT_DEVICE_SPI; + case BACKUP_BOOT_DEVICE_I2C: + return BOOT_DEVICE_I2C; + } + + return BOOT_DEVICE_RAM; +} + static u32 __get_primary_bootmedia(u32 main_devstat, u32 wkup_devstat) { @@ -271,8 +300,10 @@ u32 spl_boot_device(void) /* MAIN CTRL MMR can only be read if MCU ONLY is 0 */ main_devstat = readl(CTRLMMR_MAIN_DEVSTAT); - /* ToDo: Add support for backup boot media */ - return __get_primary_bootmedia(main_devstat, wkup_devstat); + if (bootindex == K3_PRIMARY_BOOTMODE) + return __get_primary_bootmedia(main_devstat, wkup_devstat); + else + return __get_backup_bootmedia(main_devstat); } #endif