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: Dominik Haller <[email protected]> --- arch/arm/mach-k3/j721s2/Makefile | 1 + arch/arm/mach-k3/j721s2/boot.c | 76 +++++++++++++++++++++++++++ arch/arm/mach-k3/j721s2/j721s2_init.c | 68 +----------------------- 3 files changed, 78 insertions(+), 67 deletions(-) create mode 100644 arch/arm/mach-k3/j721s2/boot.c diff --git a/arch/arm/mach-k3/j721s2/Makefile b/arch/arm/mach-k3/j721s2/Makefile index 051ef1b11d8c..3193b3e37001 100644 --- a/arch/arm/mach-k3/j721s2/Makefile +++ b/arch/arm/mach-k3/j721s2/Makefile @@ -5,3 +5,4 @@ obj-$(CONFIG_OF_SYSTEM_SETUP) += j721s2_fdt.o obj-$(CONFIG_XPL_BUILD) += j721s2_init.o +obj-y += boot.o diff --git a/arch/arm/mach-k3/j721s2/boot.c b/arch/arm/mach-k3/j721s2/boot.c new file mode 100644 index 000000000000..28dc2f97b246 --- /dev/null +++ b/arch/arm/mach-k3/j721s2/boot.c @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: GPL-2.0+ +#include <asm/io.h> +#include <asm/arch/hardware.h> +#include <asm/arch/j721s2_spl.h> + +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) +{ + u32 bootmode = (wkup_devstat & WKUP_DEVSTAT_PRIMARY_BOOTMODE_MASK) >> + WKUP_DEVSTAT_PRIMARY_BOOTMODE_SHIFT; + + bootmode |= (main_devstat & MAIN_DEVSTAT_BOOT_MODE_B_MASK) << + BOOT_MODE_B_SHIFT; + + if (bootmode == BOOT_DEVICE_OSPI || bootmode == BOOT_DEVICE_QSPI || + bootmode == BOOT_DEVICE_XSPI) + bootmode = BOOT_DEVICE_SPI; + + if (bootmode == BOOT_DEVICE_MMC2) { + u32 port = (main_devstat & + MAIN_DEVSTAT_PRIM_BOOTMODE_MMC_PORT_MASK) >> + MAIN_DEVSTAT_PRIM_BOOTMODE_PORT_SHIFT; + if (port == 0x0) + bootmode = BOOT_DEVICE_MMC1; + } + + return bootmode; +} + +u32 get_boot_device(void) +{ + u32 wkup_devstat = readl(CTRLMMR_WKUP_DEVSTAT); + u32 main_devstat; + u32 bootindex = *(u32 *)(CONFIG_SYS_K3_BOOT_PARAM_TABLE_INDEX); + + if (wkup_devstat & WKUP_DEVSTAT_MCU_ONLY_MASK) { + printf("ERROR: MCU only boot is not yet supported\n"); + return BOOT_DEVICE_RAM; + } + + /* MAIN CTRL MMR can only be read if MCU ONLY is 0 */ + main_devstat = readl(CTRLMMR_MAIN_DEVSTAT); + + if (bootindex == K3_PRIMARY_BOOTMODE) + return __get_primary_bootmedia(main_devstat, wkup_devstat); + else + return __get_backup_bootmedia(main_devstat); +} diff --git a/arch/arm/mach-k3/j721s2/j721s2_init.c b/arch/arm/mach-k3/j721s2/j721s2_init.c index eee3d0440ac3..b5453d8895d4 100644 --- a/arch/arm/mach-k3/j721s2/j721s2_init.c +++ b/arch/arm/mach-k3/j721s2/j721s2_init.c @@ -361,73 +361,7 @@ u32 spl_mmc_boot_mode(struct mmc *mmc, 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) -{ - u32 bootmode = (wkup_devstat & WKUP_DEVSTAT_PRIMARY_BOOTMODE_MASK) >> - WKUP_DEVSTAT_PRIMARY_BOOTMODE_SHIFT; - - bootmode |= (main_devstat & MAIN_DEVSTAT_BOOT_MODE_B_MASK) << - BOOT_MODE_B_SHIFT; - - if (bootmode == BOOT_DEVICE_OSPI || bootmode == BOOT_DEVICE_QSPI || - bootmode == BOOT_DEVICE_XSPI) - bootmode = BOOT_DEVICE_SPI; - - if (bootmode == BOOT_DEVICE_MMC2) { - u32 port = (main_devstat & - MAIN_DEVSTAT_PRIM_BOOTMODE_MMC_PORT_MASK) >> - MAIN_DEVSTAT_PRIM_BOOTMODE_PORT_SHIFT; - if (port == 0x0) - bootmode = BOOT_DEVICE_MMC1; - } - - return bootmode; -} - u32 spl_boot_device(void) { - u32 wkup_devstat = readl(CTRLMMR_WKUP_DEVSTAT); - u32 main_devstat; - - if (wkup_devstat & WKUP_DEVSTAT_MCU_ONLY_MASK) { - printf("ERROR: MCU only boot is not yet supported\n"); - return BOOT_DEVICE_RAM; - } - - /* MAIN CTRL MMR can only be read if MCU ONLY is 0 */ - main_devstat = readl(CTRLMMR_MAIN_DEVSTAT); - - if (bootindex == K3_PRIMARY_BOOTMODE) - return __get_primary_bootmedia(main_devstat, wkup_devstat); - else - return __get_backup_bootmedia(main_devstat); + return get_boot_device(); } -- 2.43.0

