From 718dc3442d5908f4a32e6a588d3373872ef87782 Mon Sep 17 00:00:00 2001 From: Ye Li Date: Wed, 31 May 2017 03:23:38 -0500 Subject: [PATCH] MLK-14991-1 imx8: Add support to get boot device For i.MX8QM and QXP, ROM provides rom info structure for passing boot device and other boot information. Use it to implement the common function get_boot_device. Signed-off-by: Ye Li --- arch/arm/cpu/armv8/imx8/cpu.c | 39 ++++++++++++++++++++- arch/arm/include/asm/arch-imx8/imx-regs.h | 2 ++ arch/arm/include/asm/arch-imx8/sys_proto.h | 32 +++++++++++++++++ arch/arm/include/asm/imx-common/boot_mode.h | 1 + 4 files changed, 73 insertions(+), 1 deletion(-) diff --git a/arch/arm/cpu/armv8/imx8/cpu.c b/arch/arm/cpu/armv8/imx8/cpu.c index 503e00ac01..6a926b059d 100644 --- a/arch/arm/cpu/armv8/imx8/cpu.c +++ b/arch/arm/cpu/armv8/imx8/cpu.c @@ -9,12 +9,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include DECLARE_GLOBAL_DATA_PTR; @@ -289,7 +291,7 @@ int init_i2c_power(unsigned i2c_num) #define FUSE_MAC0_WORD0 452 #define FUSE_MAC0_WORD1 453 #define FUSE_MAC1_WORD0 454 -#define FUSE_MAC1_WORD1 455 +#define FUSE_MAC1_WORD1 455 void imx_get_mac_from_fuse(int dev_id, unsigned char *mac) { sc_err_t err; @@ -584,3 +586,38 @@ void arch_preboot_os(void) imx8_config_smmu_sid(dev_sids, ARRAY_SIZE(dev_sids)); } #endif + +enum boot_device get_boot_device(void) +{ + struct rom_sw_info_t **p = + (struct rom_sw_info_t **)ROM_SW_INFO_ADDR; + + enum boot_device boot_dev = SD1_BOOT; + uint8_t boot_type = (*p)->boot_dev_info.dev_type; + uint8_t boot_instance = (*p)->boot_dev_info.instance; + + switch (boot_type) { + case FLASH_TYPE_SD: + boot_dev = boot_instance + SD1_BOOT; + break; + case FLASH_TYPE_MMC: + boot_dev = boot_instance + MMC1_BOOT; + break; + case FLASH_TYPE_NAND: + boot_dev = NAND_BOOT; + break; + case FLASH_TYPE_FLEXSPINOR: + boot_dev = QSPI_BOOT; + break; + case BT_DEV_TYPE_SATA_DISK: + boot_dev = SATA_BOOT; + break; + case BT_DEV_TYPE_USB: + boot_dev = USB_BOOT; + break; + default: + break; + } + + return boot_dev; +} diff --git a/arch/arm/include/asm/arch-imx8/imx-regs.h b/arch/arm/include/asm/arch-imx8/imx-regs.h index 4166e9512e..376bf00739 100644 --- a/arch/arm/include/asm/arch-imx8/imx-regs.h +++ b/arch/arm/include/asm/arch-imx8/imx-regs.h @@ -32,4 +32,6 @@ #define LPUART_BASE SCU_LPUART_BASE #endif +#define ROM_SW_INFO_ADDR 0x00000890 + #endif /* __ASM_ARCH_IMX_REGS_H__ */ diff --git a/arch/arm/include/asm/arch-imx8/sys_proto.h b/arch/arm/include/asm/arch-imx8/sys_proto.h index a5dbb47a80..aee459263c 100644 --- a/arch/arm/include/asm/arch-imx8/sys_proto.h +++ b/arch/arm/include/asm/arch-imx8/sys_proto.h @@ -5,6 +5,38 @@ */ #include +#include + +enum boot_dev_type { + FLASH_TYPE_SD = 1, + FLASH_TYPE_MMC = 2, + FLASH_TYPE_NAND = 3, + FLASH_TYPE_FLEXSPINOR = 4, + FLASH_TYPE_WEIM = 5, + FLASH_TYPE_EEPROM = 6, + BT_DEV_TYPE_SATA_DISK = 7, + + BT_DEV_TYPE_CAN = 0xC, + BT_DEV_TYPE_UART = 0xD, + BT_DEV_TYPE_USB = 0xE, + BT_DEV_TYPE_MEM_DEV = 0xF +}; + +struct boot_dev_info_t { + uint8_t bt_type; + uint8_t instance; + uint8_t dev_type; + uint8_t rsvd2; +}; + +struct rom_sw_info_t { + struct boot_dev_info_t boot_dev_info; + uint32_t core_freq; + uint32_t axi_freq; + uint32_t ddr_freq; + uint32_t rom_tick_freq; + uint32_t rsvd[3]; +}; int init_qspi_power(void); int init_usb_power(void); diff --git a/arch/arm/include/asm/imx-common/boot_mode.h b/arch/arm/include/asm/imx-common/boot_mode.h index 95991910d7..2c77233a4a 100644 --- a/arch/arm/include/asm/imx-common/boot_mode.h +++ b/arch/arm/include/asm/imx-common/boot_mode.h @@ -30,6 +30,7 @@ enum boot_device { MMC4_BOOT, NAND_BOOT, QSPI_BOOT, + FLEXSPI_BOOT, USB_BOOT, UNKNOWN_BOOT, BOOT_DEV_NUM = UNKNOWN_BOOT, -- 2.17.1