1552a848eSStefano Babic /* 2552a848eSStefano Babic * Copyright (C) 2014 Gateworks Corporation 3552a848eSStefano Babic * Copyright (C) 2011-2012 Freescale Semiconductor, Inc. 4552a848eSStefano Babic * 5552a848eSStefano Babic * Author: Tim Harvey <tharvey@gateworks.com> 6552a848eSStefano Babic * 7552a848eSStefano Babic * SPDX-License-Identifier: GPL-2.0+ 8552a848eSStefano Babic */ 9552a848eSStefano Babic 10552a848eSStefano Babic #include <common.h> 11552a848eSStefano Babic #include <asm/io.h> 12552a848eSStefano Babic #include <asm/arch/imx-regs.h> 13552a848eSStefano Babic #include <asm/arch/sys_proto.h> 14552a848eSStefano Babic #include <asm/spl.h> 15552a848eSStefano Babic #include <spl.h> 16552a848eSStefano Babic #include <asm/mach-imx/hab.h> 17552a848eSStefano Babic 18552a848eSStefano Babic #if defined(CONFIG_MX6) 19552a848eSStefano Babic /* determine boot device from SRC_SBMR1 (BOOT_CFG[4:1]) or SRC_GPR9 register */ 20552a848eSStefano Babic u32 spl_boot_device(void) 21552a848eSStefano Babic { 22552a848eSStefano Babic unsigned int bmode = readl(&src_base->sbmr2); 23552a848eSStefano Babic u32 reg = imx6_src_get_boot_mode(); 24552a848eSStefano Babic 25552a848eSStefano Babic /* 26552a848eSStefano Babic * Check for BMODE if serial downloader is enabled 27552a848eSStefano Babic * BOOT_MODE - see IMX6DQRM Table 8-1 28552a848eSStefano Babic */ 29552a848eSStefano Babic if (((bmode >> 24) & 0x03) == 0x01) /* Serial Downloader */ 30552a848eSStefano Babic return BOOT_DEVICE_UART; 31552a848eSStefano Babic 32552a848eSStefano Babic /* BOOT_CFG1[7:4] - see IMX6DQRM Table 8-8 */ 33552a848eSStefano Babic switch ((reg & IMX6_BMODE_MASK) >> IMX6_BMODE_SHIFT) { 34552a848eSStefano Babic /* EIM: See 8.5.1, Table 8-9 */ 35552a848eSStefano Babic case IMX6_BMODE_EMI: 36552a848eSStefano Babic /* BOOT_CFG1[3]: NOR/OneNAND Selection */ 37552a848eSStefano Babic switch ((reg & IMX6_BMODE_EMI_MASK) >> IMX6_BMODE_EMI_SHIFT) { 38552a848eSStefano Babic case IMX6_BMODE_ONENAND: 39552a848eSStefano Babic return BOOT_DEVICE_ONENAND; 40552a848eSStefano Babic case IMX6_BMODE_NOR: 41552a848eSStefano Babic return BOOT_DEVICE_NOR; 42552a848eSStefano Babic break; 43552a848eSStefano Babic } 44552a848eSStefano Babic /* Reserved: Used to force Serial Downloader */ 45*3bd1642dSStefan Agner case IMX6_BMODE_RESERVED: 46552a848eSStefano Babic return BOOT_DEVICE_UART; 47552a848eSStefano Babic /* SATA: See 8.5.4, Table 8-20 */ 48552a848eSStefano Babic case IMX6_BMODE_SATA: 49552a848eSStefano Babic return BOOT_DEVICE_SATA; 50552a848eSStefano Babic /* Serial ROM: See 8.5.5.1, Table 8-22 */ 51552a848eSStefano Babic case IMX6_BMODE_SERIAL_ROM: 52552a848eSStefano Babic /* BOOT_CFG4[2:0] */ 53552a848eSStefano Babic switch ((reg & IMX6_BMODE_SERIAL_ROM_MASK) >> 54552a848eSStefano Babic IMX6_BMODE_SERIAL_ROM_SHIFT) { 55552a848eSStefano Babic case IMX6_BMODE_ECSPI1: 56552a848eSStefano Babic case IMX6_BMODE_ECSPI2: 57552a848eSStefano Babic case IMX6_BMODE_ECSPI3: 58552a848eSStefano Babic case IMX6_BMODE_ECSPI4: 59552a848eSStefano Babic case IMX6_BMODE_ECSPI5: 60552a848eSStefano Babic return BOOT_DEVICE_SPI; 61552a848eSStefano Babic case IMX6_BMODE_I2C1: 62552a848eSStefano Babic case IMX6_BMODE_I2C2: 63552a848eSStefano Babic case IMX6_BMODE_I2C3: 64552a848eSStefano Babic return BOOT_DEVICE_I2C; 65552a848eSStefano Babic } 66552a848eSStefano Babic break; 67552a848eSStefano Babic /* SD/eSD: 8.5.3, Table 8-15 */ 68552a848eSStefano Babic case IMX6_BMODE_SD: 69552a848eSStefano Babic case IMX6_BMODE_ESD: 70552a848eSStefano Babic return BOOT_DEVICE_MMC1; 71552a848eSStefano Babic /* MMC/eMMC: 8.5.3 */ 72552a848eSStefano Babic case IMX6_BMODE_MMC: 73552a848eSStefano Babic case IMX6_BMODE_EMMC: 74552a848eSStefano Babic return BOOT_DEVICE_MMC1; 75552a848eSStefano Babic /* NAND Flash: 8.5.2, Table 8-10 */ 76552a848eSStefano Babic case IMX6_BMODE_NAND: 77552a848eSStefano Babic return BOOT_DEVICE_NAND; 78552a848eSStefano Babic } 79552a848eSStefano Babic return BOOT_DEVICE_NONE; 80552a848eSStefano Babic } 81552a848eSStefano Babic #endif 82552a848eSStefano Babic 83552a848eSStefano Babic #if defined(CONFIG_SPL_MMC_SUPPORT) 84552a848eSStefano Babic /* called from spl_mmc to see type of boot mode for storage (RAW or FAT) */ 85552a848eSStefano Babic u32 spl_boot_mode(const u32 boot_device) 86552a848eSStefano Babic { 87552a848eSStefano Babic switch (spl_boot_device()) { 88552a848eSStefano Babic /* for MMC return either RAW or FAT mode */ 89552a848eSStefano Babic case BOOT_DEVICE_MMC1: 90552a848eSStefano Babic case BOOT_DEVICE_MMC2: 91552a848eSStefano Babic #if defined(CONFIG_SPL_FAT_SUPPORT) 92552a848eSStefano Babic return MMCSD_MODE_FS; 93552a848eSStefano Babic #elif defined(CONFIG_SUPPORT_EMMC_BOOT) 94552a848eSStefano Babic return MMCSD_MODE_EMMCBOOT; 95552a848eSStefano Babic #else 96552a848eSStefano Babic return MMCSD_MODE_RAW; 97552a848eSStefano Babic #endif 98552a848eSStefano Babic break; 99552a848eSStefano Babic default: 100552a848eSStefano Babic puts("spl: ERROR: unsupported device\n"); 101552a848eSStefano Babic hang(); 102552a848eSStefano Babic } 103552a848eSStefano Babic } 104552a848eSStefano Babic #endif 105552a848eSStefano Babic 106552a848eSStefano Babic #if defined(CONFIG_SECURE_BOOT) 107552a848eSStefano Babic 108552a848eSStefano Babic __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image) 109552a848eSStefano Babic { 110552a848eSStefano Babic typedef void __noreturn (*image_entry_noargs_t)(void); 111552a848eSStefano Babic 112552a848eSStefano Babic image_entry_noargs_t image_entry = 113552a848eSStefano Babic (image_entry_noargs_t)(unsigned long)spl_image->entry_point; 114552a848eSStefano Babic 115552a848eSStefano Babic debug("image entry point: 0x%lX\n", spl_image->entry_point); 116552a848eSStefano Babic 117552a848eSStefano Babic /* HAB looks for the CSF at the end of the authenticated data therefore, 118552a848eSStefano Babic * we need to subtract the size of the CSF from the actual filesize */ 119552a848eSStefano Babic if (authenticate_image(spl_image->load_addr, 120552a848eSStefano Babic spl_image->size - CONFIG_CSF_SIZE)) { 121552a848eSStefano Babic image_entry(); 122552a848eSStefano Babic } else { 123552a848eSStefano Babic puts("spl: ERROR: image authentication unsuccessful\n"); 124552a848eSStefano Babic hang(); 125552a848eSStefano Babic } 126552a848eSStefano Babic } 127552a848eSStefano Babic 128552a848eSStefano Babic #endif 129