]> git.sur5r.net Git - u-boot/blob - arch/arm/imx-common/spl.c
Merge branch 'pmic' of git://git.denx.de/u-boot-mmc
[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                 return BOOT_DEVICE_UART;
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;
42         /* Reserved: Used to force Serial Downloader */
43         case 0x1:
44                 return BOOT_DEVICE_UART;
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:
61                 return BOOT_DEVICE_MMC1;
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) */
76 u32 spl_boot_mode(const u32 boot_device)
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:
82 #if defined(CONFIG_SPL_FAT_SUPPORT)
83                 return MMCSD_MODE_FS;
84 #elif defined(CONFIG_SUPPORT_EMMC_BOOT)
85                 return MMCSD_MODE_EMMCBOOT;
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
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
106         debug("image entry point: 0x%lX\n", spl_image->entry_point);
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