]>
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> | |
13 | #include <asm/spl.h> | |
14 | #include <spl.h> | |
15b505b0 | 15 | #include <asm/imx-common/hab.h> |
887717db TH |
16 | |
17 | #if defined(CONFIG_MX6) | |
f2863ff3 | 18 | /* determine boot device from SRC_SBMR1 (BOOT_CFG[4:1]) or SRC_GPR9 register */ |
887717db TH |
19 | u32 spl_boot_device(void) |
20 | { | |
21 | struct src *psrc = (struct src *)SRC_BASE_ADDR; | |
f2863ff3 NK |
22 | unsigned int gpr10_boot = readl(&psrc->gpr10) & (1 << 28); |
23 | unsigned reg = gpr10_boot ? readl(&psrc->gpr9) : readl(&psrc->sbmr1); | |
40f4839c | 24 | unsigned int bmode = readl(&psrc->sbmr2); |
887717db | 25 | |
40f4839c SB |
26 | /* |
27 | * Check for BMODE if serial downloader is enabled | |
28 | * BOOT_MODE - see IMX6DQRM Table 8-1 | |
29 | */ | |
ac0a93fd | 30 | if (((bmode >> 24) & 0x03) == 0x01) /* Serial Downloader */ |
40f4839c | 31 | return BOOT_DEVICE_UART; |
887717db TH |
32 | /* BOOT_CFG1[7:4] - see IMX6DQRM Table 8-8 */ |
33 | switch ((reg & 0x000000FF) >> 4) { | |
34 | /* EIM: See 8.5.1, Table 8-9 */ | |
35 | case 0x0: | |
36 | /* BOOT_CFG1[3]: NOR/OneNAND Selection */ | |
37 | if ((reg & 0x00000008) >> 3) | |
38 | return BOOT_DEVICE_ONENAND; | |
39 | else | |
40 | return BOOT_DEVICE_NOR; | |
41 | break; | |
ac0a93fd SA |
42 | /* Reserved: Used to force Serial Downloader */ |
43 | case 0x1: | |
44 | return BOOT_DEVICE_UART; | |
887717db TH |
45 | /* SATA: See 8.5.4, Table 8-20 */ |
46 | case 0x2: | |
47 | return BOOT_DEVICE_SATA; | |
48 | /* Serial ROM: See 8.5.5.1, Table 8-22 */ | |
49 | case 0x3: | |
50 | /* BOOT_CFG4[2:0] */ | |
51 | switch ((reg & 0x07000000) >> 24) { | |
52 | case 0x0 ... 0x4: | |
53 | return BOOT_DEVICE_SPI; | |
54 | case 0x5 ... 0x7: | |
55 | return BOOT_DEVICE_I2C; | |
56 | } | |
57 | break; | |
58 | /* SD/eSD: 8.5.3, Table 8-15 */ | |
59 | case 0x4: | |
60 | case 0x5: | |
51efabac | 61 | return BOOT_DEVICE_MMC1; |
887717db TH |
62 | /* MMC/eMMC: 8.5.3 */ |
63 | case 0x6: | |
64 | case 0x7: | |
65 | return BOOT_DEVICE_MMC1; | |
66 | /* NAND Flash: 8.5.2 */ | |
67 | case 0x8 ... 0xf: | |
68 | return BOOT_DEVICE_NAND; | |
69 | } | |
70 | return BOOT_DEVICE_NONE; | |
71 | } | |
72 | #endif | |
73 | ||
74 | #if defined(CONFIG_SPL_MMC_SUPPORT) | |
75 | /* called from spl_mmc to see type of boot mode for storage (RAW or FAT) */ | |
2b1cdafa | 76 | u32 spl_boot_mode(const u32 boot_device) |
887717db TH |
77 | { |
78 | switch (spl_boot_device()) { | |
79 | /* for MMC return either RAW or FAT mode */ | |
80 | case BOOT_DEVICE_MMC1: | |
81 | case BOOT_DEVICE_MMC2: | |
248802d4 | 82 | #if defined(CONFIG_SPL_FAT_SUPPORT) |
205b4f33 | 83 | return MMCSD_MODE_FS; |
248802d4 PA |
84 | #elif defined(CONFIG_SUPPORT_EMMC_BOOT) |
85 | return MMCSD_MODE_EMMCBOOT; | |
887717db TH |
86 | #else |
87 | return MMCSD_MODE_RAW; | |
88 | #endif | |
89 | break; | |
90 | default: | |
91 | puts("spl: ERROR: unsupported device\n"); | |
92 | hang(); | |
93 | } | |
94 | } | |
95 | #endif | |
15b505b0 SE |
96 | |
97 | #if defined(CONFIG_SECURE_BOOT) | |
98 | ||
99 | __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image) | |
100 | { | |
101 | typedef void __noreturn (*image_entry_noargs_t)(void); | |
102 | ||
103 | image_entry_noargs_t image_entry = | |
104 | (image_entry_noargs_t)(unsigned long)spl_image->entry_point; | |
105 | ||
4386feb7 | 106 | debug("image entry point: 0x%lX\n", spl_image->entry_point); |
15b505b0 SE |
107 | |
108 | /* HAB looks for the CSF at the end of the authenticated data therefore, | |
109 | * we need to subtract the size of the CSF from the actual filesize */ | |
110 | if (authenticate_image(spl_image->load_addr, | |
111 | spl_image->size - CONFIG_CSF_SIZE)) { | |
112 | image_entry(); | |
113 | } else { | |
114 | puts("spl: ERROR: image authentication unsuccessful\n"); | |
115 | hang(); | |
116 | } | |
117 | } | |
118 | ||
119 | #endif |