[PATCH v2] arm: mach-k3: am62a7: Provide a way to obtain boot device for non SPLs

Andrew Davis afd at ti.com
Thu Oct 31 17:35:41 CET 2024


On 10/31/24 11:21 AM, Garrett Giordano wrote:
> Introduce get_boot_device() to obtain the booting device. Make it also
> available for non SPL builds so u-boot can also know the device it
> is booting from.
> 
> Signed-off-by: Garrett Giordano <ggiordano at phytec.com>
> Reviewed-by: Bryan Brattlof <bb at ti.com>
> ---

Seems similar enough to what has been done already for AM64x, might
be good at some point to just do this for all the K3 SoCs. I wonder how
much of the contents of these functions are common across them all..

For now, LGTM,

Reviewed-by: Andrew Davis <afd at ti.com>

>   v2:
>     - Drop duplicate CONFIG_SOC_K3_AM62A7 entry from arch/arm/mach-k3/Makefile
> 
>   arch/arm/mach-k3/am62ax/Makefile      |   1 +
>   arch/arm/mach-k3/am62ax/am62a7_init.c |  97 +----------------------
>   arch/arm/mach-k3/am62ax/boot.c        | 106 ++++++++++++++++++++++++++
>   3 files changed, 108 insertions(+), 96 deletions(-)
>   create mode 100644 arch/arm/mach-k3/am62ax/boot.c
> 
> diff --git a/arch/arm/mach-k3/am62ax/Makefile b/arch/arm/mach-k3/am62ax/Makefile
> index e2ef88196f8..4e35e0c844d 100644
> --- a/arch/arm/mach-k3/am62ax/Makefile
> +++ b/arch/arm/mach-k3/am62ax/Makefile
> @@ -5,3 +5,4 @@
> 
>   obj-$(CONFIG_OF_SYSTEM_SETUP) += am62a7_fdt.o
>   obj-$(CONFIG_XPL_BUILD) += am62a7_init.o
> +obj-y += boot.o
> diff --git a/arch/arm/mach-k3/am62ax/am62a7_init.c b/arch/arm/mach-k3/am62ax/am62a7_init.c
> index 0f62f39075b..5c0d3ee6869 100644
> --- a/arch/arm/mach-k3/am62ax/am62a7_init.c
> +++ b/arch/arm/mach-k3/am62ax/am62a7_init.c
> @@ -171,102 +171,7 @@ void board_init_f(ulong dummy)
>   	debug("am62a_init: %s done\n", __func__);
>   }
> 
> -static u32 __get_backup_bootmedia(u32 devstat)
> -{
> -	u32 bkup_bootmode = (devstat & MAIN_DEVSTAT_BACKUP_BOOTMODE_MASK) >>
> -				MAIN_DEVSTAT_BACKUP_BOOTMODE_SHIFT;
> -	u32 bkup_bootmode_cfg =
> -			(devstat & MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_MASK) >>
> -				MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_SHIFT;
> -
> -	switch (bkup_bootmode) {
> -	case BACKUP_BOOT_DEVICE_UART:
> -		return BOOT_DEVICE_UART;
> -
> -	case BACKUP_BOOT_DEVICE_USB:
> -		return BOOT_DEVICE_USB;
> -
> -	case BACKUP_BOOT_DEVICE_ETHERNET:
> -		return BOOT_DEVICE_ETHERNET;
> -
> -	case BACKUP_BOOT_DEVICE_MMC:
> -		if (bkup_bootmode_cfg)
> -			return BOOT_DEVICE_MMC2;
> -		return BOOT_DEVICE_MMC1;
> -
> -	case BACKUP_BOOT_DEVICE_SPI:
> -		return BOOT_DEVICE_SPI;
> -
> -	case BACKUP_BOOT_DEVICE_I2C:
> -		return BOOT_DEVICE_I2C;
> -
> -	case BACKUP_BOOT_DEVICE_DFU:
> -		if (bkup_bootmode_cfg & MAIN_DEVSTAT_BACKUP_USB_MODE_MASK)
> -			return BOOT_DEVICE_USB;
> -		return BOOT_DEVICE_DFU;
> -	};
> -
> -	return BOOT_DEVICE_RAM;
> -}
> -
> -static u32 __get_primary_bootmedia(u32 devstat)
> -{
> -	u32 bootmode = (devstat & MAIN_DEVSTAT_PRIMARY_BOOTMODE_MASK) >>
> -				MAIN_DEVSTAT_PRIMARY_BOOTMODE_SHIFT;
> -	u32 bootmode_cfg = (devstat & MAIN_DEVSTAT_PRIMARY_BOOTMODE_CFG_MASK) >>
> -				MAIN_DEVSTAT_PRIMARY_BOOTMODE_CFG_SHIFT;
> -
> -	switch (bootmode) {
> -	case BOOT_DEVICE_OSPI:
> -		fallthrough;
> -	case BOOT_DEVICE_QSPI:
> -		fallthrough;
> -	case BOOT_DEVICE_XSPI:
> -		fallthrough;
> -	case BOOT_DEVICE_SPI:
> -		return BOOT_DEVICE_SPI;
> -
> -	case BOOT_DEVICE_ETHERNET_RGMII:
> -		fallthrough;
> -	case BOOT_DEVICE_ETHERNET_RMII:
> -		return BOOT_DEVICE_ETHERNET;
> -
> -	case BOOT_DEVICE_EMMC:
> -		return BOOT_DEVICE_MMC1;
> -
> -	case BOOT_DEVICE_SPI_NAND:
> -		return BOOT_DEVICE_SPINAND;
> -
> -	case BOOT_DEVICE_MMC:
> -		if ((bootmode_cfg & MAIN_DEVSTAT_PRIMARY_MMC_PORT_MASK) >>
> -				MAIN_DEVSTAT_PRIMARY_MMC_PORT_SHIFT)
> -			return BOOT_DEVICE_MMC2;
> -		return BOOT_DEVICE_MMC1;
> -
> -	case BOOT_DEVICE_DFU:
> -		if ((bootmode_cfg & MAIN_DEVSTAT_PRIMARY_USB_MODE_MASK) >>
> -		    MAIN_DEVSTAT_PRIMARY_USB_MODE_SHIFT)
> -			return BOOT_DEVICE_USB;
> -		return BOOT_DEVICE_DFU;
> -
> -	case BOOT_DEVICE_NOBOOT:
> -		return BOOT_DEVICE_RAM;
> -	}
> -
> -	return bootmode;
> -}
> -
>   u32 spl_boot_device(void)
>   {
> -	u32 devstat = readl(CTRLMMR_MAIN_DEVSTAT);
> -	u32 bootmedia;
> -
> -	if (bootindex == K3_PRIMARY_BOOTMODE)
> -		bootmedia = __get_primary_bootmedia(devstat);
> -	else
> -		bootmedia = __get_backup_bootmedia(devstat);
> -
> -	debug("am62a_init: %s: devstat = 0x%x bootmedia = 0x%x bootindex = %d\n",
> -	       __func__, devstat, bootmedia, bootindex);
> -	return bootmedia;
> +	return get_boot_device();
>   }
> diff --git a/arch/arm/mach-k3/am62ax/boot.c b/arch/arm/mach-k3/am62ax/boot.c
> new file mode 100644
> index 00000000000..af7fce1e5e9
> --- /dev/null
> +++ b/arch/arm/mach-k3/am62ax/boot.c
> @@ -0,0 +1,106 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +#include <asm/io.h>
> +#include <asm/arch/hardware.h>
> +#include <asm/arch/am62a_spl.h>
> +
> +static u32 __get_backup_bootmedia(u32 devstat)
> +{
> +	u32 bkup_bootmode = (devstat & MAIN_DEVSTAT_BACKUP_BOOTMODE_MASK) >>
> +				MAIN_DEVSTAT_BACKUP_BOOTMODE_SHIFT;
> +	u32 bkup_bootmode_cfg =
> +			(devstat & MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_MASK) >>
> +				MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_SHIFT;
> +
> +	switch (bkup_bootmode) {
> +	case BACKUP_BOOT_DEVICE_UART:
> +		return BOOT_DEVICE_UART;
> +
> +	case BACKUP_BOOT_DEVICE_USB:
> +		return BOOT_DEVICE_USB;
> +
> +	case BACKUP_BOOT_DEVICE_ETHERNET:
> +		return BOOT_DEVICE_ETHERNET;
> +
> +	case BACKUP_BOOT_DEVICE_MMC:
> +		if (bkup_bootmode_cfg)
> +			return BOOT_DEVICE_MMC2;
> +		return BOOT_DEVICE_MMC1;
> +
> +	case BACKUP_BOOT_DEVICE_SPI:
> +		return BOOT_DEVICE_SPI;
> +
> +	case BACKUP_BOOT_DEVICE_I2C:
> +		return BOOT_DEVICE_I2C;
> +
> +	case BACKUP_BOOT_DEVICE_DFU:
> +		if (bkup_bootmode_cfg & MAIN_DEVSTAT_BACKUP_USB_MODE_MASK)
> +			return BOOT_DEVICE_USB;
> +		return BOOT_DEVICE_DFU;
> +	};
> +
> +	return BOOT_DEVICE_RAM;
> +}
> +
> +static u32 __get_primary_bootmedia(u32 devstat)
> +{
> +	u32 bootmode = (devstat & MAIN_DEVSTAT_PRIMARY_BOOTMODE_MASK) >>
> +				MAIN_DEVSTAT_PRIMARY_BOOTMODE_SHIFT;
> +	u32 bootmode_cfg = (devstat & MAIN_DEVSTAT_PRIMARY_BOOTMODE_CFG_MASK) >>
> +				MAIN_DEVSTAT_PRIMARY_BOOTMODE_CFG_SHIFT;
> +
> +	switch (bootmode) {
> +	case BOOT_DEVICE_OSPI:
> +		fallthrough;
> +	case BOOT_DEVICE_QSPI:
> +		fallthrough;
> +	case BOOT_DEVICE_XSPI:
> +		fallthrough;
> +	case BOOT_DEVICE_SPI:
> +		return BOOT_DEVICE_SPI;
> +
> +	case BOOT_DEVICE_ETHERNET_RGMII:
> +		fallthrough;
> +	case BOOT_DEVICE_ETHERNET_RMII:
> +		return BOOT_DEVICE_ETHERNET;
> +
> +	case BOOT_DEVICE_EMMC:
> +		return BOOT_DEVICE_MMC1;
> +
> +	case BOOT_DEVICE_SPI_NAND:
> +		return BOOT_DEVICE_SPINAND;
> +
> +	case BOOT_DEVICE_MMC:
> +		if ((bootmode_cfg & MAIN_DEVSTAT_PRIMARY_MMC_PORT_MASK) >>
> +				MAIN_DEVSTAT_PRIMARY_MMC_PORT_SHIFT)
> +			return BOOT_DEVICE_MMC2;
> +		return BOOT_DEVICE_MMC1;
> +
> +	case BOOT_DEVICE_DFU:
> +		if ((bootmode_cfg & MAIN_DEVSTAT_PRIMARY_USB_MODE_MASK) >>
> +		    MAIN_DEVSTAT_PRIMARY_USB_MODE_SHIFT)
> +			return BOOT_DEVICE_USB;
> +		return BOOT_DEVICE_DFU;
> +
> +	case BOOT_DEVICE_NOBOOT:
> +		return BOOT_DEVICE_RAM;
> +	}
> +
> +	return bootmode;
> +}
> +
> +u32 get_boot_device(void)
> +{
> +	u32 devstat = readl(CTRLMMR_MAIN_DEVSTAT);
> +	u32 bootmode = *(u32 *)(K3_BOOT_PARAM_TABLE_INDEX_OCRAM);
> +	u32 bootmedia;
> +
> +	if (bootmode == K3_PRIMARY_BOOTMODE)
> +		bootmedia = __get_primary_bootmedia(devstat);
> +	else
> +		bootmedia = __get_backup_bootmedia(devstat);
> +
> +	debug("%s: devstat = 0x%x bootmedia = 0x%x bootmode = %d\n",
> +	      __func__, devstat, bootmedia, bootmode);
> +
> +	return bootmedia;
> +}
> --
> 2.25.1
> 


More information about the U-Boot mailing list