1 /* 2 * Copyright (C) 2014 Gateworks Corporation 3 * Copyright (C) 2011-2012 Freescale Semiconductor, Inc. 4 * 5 * Author: Tim Harvey <tharvey@gateworks.com> 6 * 7 * SPDX-License-Identifier: GPL-2.0+ 8 */ 9 10 #include <common.h> 11 #include <asm/io.h> 12 #include <asm/arch/imx-regs.h> 13 #include <asm/arch/sys_proto.h> 14 #include <asm/spl.h> 15 #include <spl.h> 16 #include <asm/mach-imx/hab.h> 17 18 #if defined(CONFIG_MX6) 19 /* determine boot device from SRC_SBMR1 (BOOT_CFG[4:1]) or SRC_GPR9 register */ 20 u32 spl_boot_device(void) 21 { 22 unsigned int bmode = readl(&src_base->sbmr2); 23 u32 reg = imx6_src_get_boot_mode(); 24 25 /* 26 * Check for BMODE if serial downloader is enabled 27 * BOOT_MODE - see IMX6DQRM Table 8-1 28 */ 29 if (((bmode >> 24) & 0x03) == 0x01) /* Serial Downloader */ 30 return BOOT_DEVICE_UART; 31 32 /* BOOT_CFG1[7:4] - see IMX6DQRM Table 8-8 */ 33 switch ((reg & IMX6_BMODE_MASK) >> IMX6_BMODE_SHIFT) { 34 /* EIM: See 8.5.1, Table 8-9 */ 35 case IMX6_BMODE_EMI: 36 /* BOOT_CFG1[3]: NOR/OneNAND Selection */ 37 switch ((reg & IMX6_BMODE_EMI_MASK) >> IMX6_BMODE_EMI_SHIFT) { 38 case IMX6_BMODE_ONENAND: 39 return BOOT_DEVICE_ONENAND; 40 case IMX6_BMODE_NOR: 41 return BOOT_DEVICE_NOR; 42 break; 43 } 44 /* Reserved: Used to force Serial Downloader */ 45 case IMX6_BMODE_UART: 46 return BOOT_DEVICE_UART; 47 /* SATA: See 8.5.4, Table 8-20 */ 48 case IMX6_BMODE_SATA: 49 return BOOT_DEVICE_SATA; 50 /* Serial ROM: See 8.5.5.1, Table 8-22 */ 51 case IMX6_BMODE_SERIAL_ROM: 52 /* BOOT_CFG4[2:0] */ 53 switch ((reg & IMX6_BMODE_SERIAL_ROM_MASK) >> 54 IMX6_BMODE_SERIAL_ROM_SHIFT) { 55 case IMX6_BMODE_ECSPI1: 56 case IMX6_BMODE_ECSPI2: 57 case IMX6_BMODE_ECSPI3: 58 case IMX6_BMODE_ECSPI4: 59 case IMX6_BMODE_ECSPI5: 60 return BOOT_DEVICE_SPI; 61 case IMX6_BMODE_I2C1: 62 case IMX6_BMODE_I2C2: 63 case IMX6_BMODE_I2C3: 64 return BOOT_DEVICE_I2C; 65 } 66 break; 67 /* SD/eSD: 8.5.3, Table 8-15 */ 68 case IMX6_BMODE_SD: 69 case IMX6_BMODE_ESD: 70 return BOOT_DEVICE_MMC1; 71 /* MMC/eMMC: 8.5.3 */ 72 case IMX6_BMODE_MMC: 73 case IMX6_BMODE_EMMC: 74 return BOOT_DEVICE_MMC1; 75 /* NAND Flash: 8.5.2, Table 8-10 */ 76 case IMX6_BMODE_NAND: 77 return BOOT_DEVICE_NAND; 78 } 79 return BOOT_DEVICE_NONE; 80 } 81 #endif 82 83 #if defined(CONFIG_SPL_MMC_SUPPORT) 84 /* called from spl_mmc to see type of boot mode for storage (RAW or FAT) */ 85 u32 spl_boot_mode(const u32 boot_device) 86 { 87 switch (spl_boot_device()) { 88 /* for MMC return either RAW or FAT mode */ 89 case BOOT_DEVICE_MMC1: 90 case BOOT_DEVICE_MMC2: 91 #if defined(CONFIG_SPL_FAT_SUPPORT) 92 return MMCSD_MODE_FS; 93 #elif defined(CONFIG_SUPPORT_EMMC_BOOT) 94 return MMCSD_MODE_EMMCBOOT; 95 #else 96 return MMCSD_MODE_RAW; 97 #endif 98 break; 99 default: 100 puts("spl: ERROR: unsupported device\n"); 101 hang(); 102 } 103 } 104 #endif 105 106 #if defined(CONFIG_SECURE_BOOT) 107 108 __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image) 109 { 110 typedef void __noreturn (*image_entry_noargs_t)(void); 111 112 image_entry_noargs_t image_entry = 113 (image_entry_noargs_t)(unsigned long)spl_image->entry_point; 114 115 debug("image entry point: 0x%lX\n", spl_image->entry_point); 116 117 /* HAB looks for the CSF at the end of the authenticated data therefore, 118 * we need to subtract the size of the CSF from the actual filesize */ 119 if (authenticate_image(spl_image->load_addr, 120 spl_image->size - CONFIG_CSF_SIZE)) { 121 image_entry(); 122 } else { 123 puts("spl: ERROR: image authentication unsuccessful\n"); 124 hang(); 125 } 126 } 127 128 #endif 129