diff mbox series

arm: mach-k3: j721e_init: Add support for backup boot modes

Message ID 20200516153501.5889-1-faiz_abbas@ti.com
State Accepted
Commit 7bf82cc1f8ac4c85f6eb1b7e37e302792fa954aa
Delegated to: Lokesh Vutla
Headers show
Series arm: mach-k3: j721e_init: Add support for backup boot modes | expand

Commit Message

Faiz Abbas May 16, 2020, 3:35 p.m. UTC
From: Andreas Dannenberg <dannenberg@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@ti.com>
Signed-off-by: Faiz Abbas <faiz_abbas@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(-)

Comments

Raghavendra, Vignesh May 22, 2020, 9:04 a.m. UTC | #1
On 16/05/20 9:05 pm, Faiz Abbas wrote:
> From: Andreas Dannenberg <dannenberg@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@ti.com>
> Signed-off-by: Faiz Abbas <faiz_abbas@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 mbox series

Patch

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