]>
Commit | Line | Data |
---|---|---|
887717db TH |
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> | |
cba586b4 | 13 | #include <asm/arch/sys_proto.h> |
887717db TH |
14 | #include <asm/spl.h> |
15 | #include <spl.h> | |
552a848e | 16 | #include <asm/mach-imx/hab.h> |
887717db | 17 | |
46668df5 JT |
18 | DECLARE_GLOBAL_DATA_PTR; |
19 | ||
887717db | 20 | #if defined(CONFIG_MX6) |
f2863ff3 | 21 | /* determine boot device from SRC_SBMR1 (BOOT_CFG[4:1]) or SRC_GPR9 register */ |
887717db TH |
22 | u32 spl_boot_device(void) |
23 | { | |
7b54f5a8 | 24 | unsigned int bmode = readl(&src_base->sbmr2); |
cba586b4 | 25 | u32 reg = imx6_src_get_boot_mode(); |
887717db | 26 | |
40f4839c SB |
27 | /* |
28 | * Check for BMODE if serial downloader is enabled | |
29 | * BOOT_MODE - see IMX6DQRM Table 8-1 | |
30 | */ | |
ac0a93fd | 31 | if (((bmode >> 24) & 0x03) == 0x01) /* Serial Downloader */ |
962c78b1 | 32 | return BOOT_DEVICE_BOARD; |
96aac843 | 33 | |
887717db | 34 | /* BOOT_CFG1[7:4] - see IMX6DQRM Table 8-8 */ |
96aac843 | 35 | switch ((reg & IMX6_BMODE_MASK) >> IMX6_BMODE_SHIFT) { |
887717db | 36 | /* EIM: See 8.5.1, Table 8-9 */ |
96aac843 | 37 | case IMX6_BMODE_EMI: |
887717db | 38 | /* BOOT_CFG1[3]: NOR/OneNAND Selection */ |
96aac843 JT |
39 | switch ((reg & IMX6_BMODE_EMI_MASK) >> IMX6_BMODE_EMI_SHIFT) { |
40 | case IMX6_BMODE_ONENAND: | |
887717db | 41 | return BOOT_DEVICE_ONENAND; |
96aac843 | 42 | case IMX6_BMODE_NOR: |
887717db TH |
43 | return BOOT_DEVICE_NOR; |
44 | break; | |
96aac843 | 45 | } |
ac0a93fd | 46 | /* Reserved: Used to force Serial Downloader */ |
3bd1642d | 47 | case IMX6_BMODE_RESERVED: |
962c78b1 | 48 | return BOOT_DEVICE_BOARD; |
887717db | 49 | /* SATA: See 8.5.4, Table 8-20 */ |
624da53c | 50 | #if !defined(CONFIG_MX6UL) && !defined(CONFIG_MX6ULL) |
96aac843 | 51 | case IMX6_BMODE_SATA: |
887717db | 52 | return BOOT_DEVICE_SATA; |
624da53c | 53 | #endif |
887717db | 54 | /* Serial ROM: See 8.5.5.1, Table 8-22 */ |
96aac843 | 55 | case IMX6_BMODE_SERIAL_ROM: |
887717db | 56 | /* BOOT_CFG4[2:0] */ |
96aac843 JT |
57 | switch ((reg & IMX6_BMODE_SERIAL_ROM_MASK) >> |
58 | IMX6_BMODE_SERIAL_ROM_SHIFT) { | |
59 | case IMX6_BMODE_ECSPI1: | |
60 | case IMX6_BMODE_ECSPI2: | |
61 | case IMX6_BMODE_ECSPI3: | |
62 | case IMX6_BMODE_ECSPI4: | |
63 | case IMX6_BMODE_ECSPI5: | |
887717db | 64 | return BOOT_DEVICE_SPI; |
96aac843 JT |
65 | case IMX6_BMODE_I2C1: |
66 | case IMX6_BMODE_I2C2: | |
67 | case IMX6_BMODE_I2C3: | |
887717db TH |
68 | return BOOT_DEVICE_I2C; |
69 | } | |
70 | break; | |
71 | /* SD/eSD: 8.5.3, Table 8-15 */ | |
96aac843 JT |
72 | case IMX6_BMODE_SD: |
73 | case IMX6_BMODE_ESD: | |
51efabac | 74 | return BOOT_DEVICE_MMC1; |
887717db | 75 | /* MMC/eMMC: 8.5.3 */ |
96aac843 JT |
76 | case IMX6_BMODE_MMC: |
77 | case IMX6_BMODE_EMMC: | |
887717db | 78 | return BOOT_DEVICE_MMC1; |
20f14714 | 79 | /* NAND Flash: 8.5.2, Table 8-10 */ |
96aac843 | 80 | case IMX6_BMODE_NAND: |
887717db TH |
81 | return BOOT_DEVICE_NAND; |
82 | } | |
83 | return BOOT_DEVICE_NONE; | |
84 | } | |
85 | #endif | |
86 | ||
87 | #if defined(CONFIG_SPL_MMC_SUPPORT) | |
88 | /* called from spl_mmc to see type of boot mode for storage (RAW or FAT) */ | |
2b1cdafa | 89 | u32 spl_boot_mode(const u32 boot_device) |
887717db TH |
90 | { |
91 | switch (spl_boot_device()) { | |
92 | /* for MMC return either RAW or FAT mode */ | |
93 | case BOOT_DEVICE_MMC1: | |
94 | case BOOT_DEVICE_MMC2: | |
248802d4 | 95 | #if defined(CONFIG_SPL_FAT_SUPPORT) |
205b4f33 | 96 | return MMCSD_MODE_FS; |
248802d4 PA |
97 | #elif defined(CONFIG_SUPPORT_EMMC_BOOT) |
98 | return MMCSD_MODE_EMMCBOOT; | |
887717db TH |
99 | #else |
100 | return MMCSD_MODE_RAW; | |
101 | #endif | |
102 | break; | |
103 | default: | |
104 | puts("spl: ERROR: unsupported device\n"); | |
105 | hang(); | |
106 | } | |
107 | } | |
108 | #endif | |
15b505b0 SE |
109 | |
110 | #if defined(CONFIG_SECURE_BOOT) | |
111 | ||
112 | __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image) | |
113 | { | |
114 | typedef void __noreturn (*image_entry_noargs_t)(void); | |
115 | ||
116 | image_entry_noargs_t image_entry = | |
117 | (image_entry_noargs_t)(unsigned long)spl_image->entry_point; | |
118 | ||
4386feb7 | 119 | debug("image entry point: 0x%lX\n", spl_image->entry_point); |
15b505b0 SE |
120 | |
121 | /* HAB looks for the CSF at the end of the authenticated data therefore, | |
122 | * we need to subtract the size of the CSF from the actual filesize */ | |
123 | if (authenticate_image(spl_image->load_addr, | |
124 | spl_image->size - CONFIG_CSF_SIZE)) { | |
125 | image_entry(); | |
126 | } else { | |
127 | puts("spl: ERROR: image authentication unsuccessful\n"); | |
128 | hang(); | |
129 | } | |
130 | } | |
131 | ||
132 | #endif | |
46668df5 JT |
133 | |
134 | #if defined(CONFIG_MX6) && defined(CONFIG_SPL_OS_BOOT) | |
135 | int dram_init_banksize(void) | |
136 | { | |
137 | gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE; | |
138 | gd->bd->bi_dram[0].size = imx_ddr_size(); | |
139 | ||
140 | return 0; | |
141 | } | |
142 | #endif |