// SPDX-License-Identifier: GPL-2.0+ #include #include #include 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); }