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