diff --git a/arch/arm/cpu/armv7/mx7ulp/soc.c b/arch/arm/cpu/armv7/mx7ulp/soc.c index 4051e4c0021ab0a407c14368034822b90fa2990b..c004cb87e78778c2b62d0d22877271255e2d2b1b 100644 --- a/arch/arm/cpu/armv7/mx7ulp/soc.c +++ b/arch/arm/cpu/armv7/mx7ulp/soc.c @@ -11,9 +11,7 @@ #include <asm/arch/sys_proto.h> #include <dm.h> #include <asm/imx-common/hab.h> -#ifdef CONFIG_FSL_FASTBOOT #include <asm/imx-common/boot_mode.h> -#endif #include <fdt_support.h> struct lpuart_serial_platdata { @@ -360,8 +358,7 @@ int mmc_get_env_dev(void) #ifdef CONFIG_OF_SYSTEM_SETUP int ft_system_setup(void *blob, bd_t *bd) { -#if !defined(CONFIG_FSL_FASTBOOT) && defined(is_boot_from_usb) - if (is_boot_from_usb()) { + if (get_boot_device() == USB_BOOT) { int rc; int nodeoff = fdt_path_offset(blob, "/ahb-bridge0@40000000/usdhc@40370000"); if (nodeoff < 0) @@ -389,28 +386,37 @@ add: } } } -#endif return 0; } #endif - -#ifdef CONFIG_FSL_FASTBOOT enum boot_device get_boot_device(void) { - bool type; - u32 bt1_cfg = 0; - enum boot_device boot_dev = UNKNOWN_BOOT; + struct bootrom_sw_info **p = + (struct bootrom_sw_info **)ROM_SW_INFO_ADDR; - bt1_cfg = readl(CMC1_RBASE + 0x40); - type = (bt1_cfg >> 8) & 0x1; + enum boot_device boot_dev = SD1_BOOT; + u8 boot_type = (*p)->boot_dev_type; + u8 boot_instance = (*p)->boot_dev_instance; + + switch (boot_type) { + case BOOT_TYPE_SD: + boot_dev = boot_instance + SD1_BOOT; + break; + case BOOT_TYPE_MMC: + boot_dev = boot_instance + MMC1_BOOT; + break; + case BOOT_TYPE_USB: + boot_dev = USB_BOOT; + break; + default: + break; + } - if (type) - boot_dev = SD1_BOOT; - else - boot_dev = MMC1_BOOT; return boot_dev; } + +#ifdef CONFIG_FSL_FASTBOOT #ifdef CONFIG_SERIAL_TAG void get_board_serial(struct tag_serialnr *serialnr) { diff --git a/arch/arm/include/asm/arch-mx7ulp/imx-regs.h b/arch/arm/include/asm/arch-mx7ulp/imx-regs.h index f2bf50b0c3dbb23464601b855c8da10ad82d2272..ecd07d3d4a0d252e19123c2aa95e513c028051bd 100644 --- a/arch/arm/include/asm/arch-mx7ulp/imx-regs.h +++ b/arch/arm/include/asm/arch-mx7ulp/imx-regs.h @@ -10,6 +10,8 @@ #include <linux/sizes.h> +#define ROM_SW_INFO_ADDR 0x000001E8 + #define CAAM_SEC_SRAM_BASE (0x26000000) #define CAAM_SEC_SRAM_SIZE (SZ_32K) #define CAAM_SEC_SRAM_END (CAAM_SEC_SRAM_BASE + CAAM_SEC_SRAM_SIZE - 1) @@ -1205,6 +1207,23 @@ struct lpuart_fsl { #define is_boot_from_usb(void) (!(readl(USB_PHY0_BASE_ADDR) & (1<<20))) #define disconnect_from_pc(void) writel(0x0, USBOTG0_RBASE + 0x140) +/* Boot device type */ +#define BOOT_TYPE_SD 0x1 +#define BOOT_TYPE_MMC 0x2 +#define BOOT_TYPE_USB 0xf + +struct bootrom_sw_info { + u8 reserved_1; + u8 boot_dev_instance; + u8 boot_dev_type; + u8 reserved_2; + u32 core_freq; + u32 axi_freq; + u32 ddr_freq; + u32 rom_tick_freq; + u32 reserved_3[3]; +}; + #endif #endif /* _MX7ULP_REGS_H_*/ diff --git a/arch/arm/include/asm/imx-common/boot_mode.h b/arch/arm/include/asm/imx-common/boot_mode.h index df768585c26d8b8b8a18d953b5f19e98d5a37974..980cadcbae405e3f1121b060ce0614ee1854f2a1 100644 --- a/arch/arm/include/asm/imx-common/boot_mode.h +++ b/arch/arm/include/asm/imx-common/boot_mode.h @@ -2,6 +2,7 @@ * Copyright (C) 2012 Boundary Devices Inc. * * Copyright (C) 2015-2016 Freescale Semiconductor, Inc. + * Copyright 2017 NXP * * SPDX-License-Identifier: GPL-2.0+ */ @@ -28,6 +29,7 @@ enum boot_device { MMC4_BOOT, NAND_BOOT, QSPI_BOOT, + USB_BOOT, UNKNOWN_BOOT, BOOT_DEV_NUM = UNKNOWN_BOOT, };