]> git.sur5r.net Git - u-boot/blob - arch/arm/cpu/armv7/omap-common/boot-common.c
Merge branch 'zynq' of git://www.denx.de/git/u-boot-microblaze
[u-boot] / arch / arm / cpu / armv7 / omap-common / boot-common.c
1 /*
2  * boot-common.c
3  *
4  * Common bootmode functions for omap based boards
5  *
6  * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
7  *
8  * SPDX-License-Identifier:     GPL-2.0+
9  */
10
11 #include <common.h>
12 #include <ahci.h>
13 #include <spl.h>
14 #include <asm/omap_common.h>
15 #include <asm/arch/omap.h>
16 #include <asm/arch/mmc_host_def.h>
17 #include <asm/arch/sys_proto.h>
18 #include <watchdog.h>
19 #include <scsi.h>
20 #include <i2c.h>
21
22 DECLARE_GLOBAL_DATA_PTR;
23
24 __weak u32 omap_sys_boot_device(void)
25 {
26         return BOOT_DEVICE_NONE;
27 }
28
29 void save_omap_boot_params(void)
30 {
31         u32 boot_params = *((u32 *)OMAP_SRAM_SCRATCH_BOOT_PARAMS);
32         struct omap_boot_parameters *omap_boot_params;
33         u32 boot_device;
34         u32 boot_mode;
35
36         if ((boot_params < NON_SECURE_SRAM_START) ||
37             (boot_params > NON_SECURE_SRAM_END))
38                 return;
39
40         omap_boot_params = (struct omap_boot_parameters *)boot_params;
41
42         boot_device = omap_boot_params->boot_device;
43         boot_mode = MMCSD_MODE_UNDEFINED;
44
45         /* Boot device */
46
47 #ifdef BOOT_DEVICE_NAND_I2C
48         /*
49          * Re-map NAND&I2C boot-device to the "normal" NAND boot-device.
50          * Otherwise the SPL boot IF can't handle this device correctly.
51          * Somehow booting with Hynix 4GBit NAND H27U4G8 on Siemens
52          * Draco leads to this boot-device passed to SPL from the BootROM.
53          */
54         if (boot_device == BOOT_DEVICE_NAND_I2C)
55                 boot_device = BOOT_DEVICE_NAND;
56 #endif
57 #ifdef BOOT_DEVICE_QSPI_4
58         /*
59          * We get different values for QSPI_1 and QSPI_4 being used, but
60          * don't actually care about this difference.  Rather than
61          * mangle the later code, if we're coming in as QSPI_4 just
62          * change to the QSPI_1 value.
63          */
64         if (boot_device == BOOT_DEVICE_QSPI_4)
65                 boot_device = BOOT_DEVICE_SPI;
66 #endif
67 #if (defined(BOOT_DEVICE_UART) && !defined(CONFIG_SPL_YMODEM_SUPPORT)) || \
68     (defined(BOOT_DEVICE_USB) && !defined(CONFIG_SPL_USB_SUPPORT)) || \
69     (defined(BOOT_DEVICE_USBETH) && !defined(CONFIG_SPL_USBETH_SUPPORT))
70         /*
71          * When booting from peripheral booting, the boot device is not usable
72          * as-is (unless there is support for it), so the boot device is instead
73          * figured out using the SYS_BOOT pins.
74          */
75         switch (boot_device) {
76 #ifdef BOOT_DEVICE_UART
77         case BOOT_DEVICE_UART:
78 #endif
79 #ifdef BOOT_DEVICE_USB
80         case BOOT_DEVICE_USB:
81 #endif
82                 boot_device = omap_sys_boot_device();
83
84                 /* MMC raw mode will fallback to FS mode. */
85                 if ((boot_device >= MMC_BOOT_DEVICES_START) &&
86                     (boot_device <= MMC_BOOT_DEVICES_END))
87                         boot_mode = MMCSD_MODE_RAW;
88
89                 break;
90         }
91 #endif
92
93         gd->arch.omap_boot_device = boot_device;
94
95         /* Boot mode */
96
97 #ifdef CONFIG_OMAP34XX
98         if ((boot_device >= MMC_BOOT_DEVICES_START) &&
99             (boot_device <= MMC_BOOT_DEVICES_END)) {
100                 switch (boot_device) {
101                 case BOOT_DEVICE_MMC1:
102                         boot_mode = MMCSD_MODE_FS;
103                         break;
104                 case BOOT_DEVICE_MMC2:
105                         boot_mode = MMCSD_MODE_RAW;
106                         break;
107                 }
108         }
109 #else
110         /*
111          * If the boot device was dynamically changed and doesn't match what
112          * the bootrom initially booted, we cannot use the boot device
113          * descriptor to figure out the boot mode.
114          */
115         if ((boot_device == omap_boot_params->boot_device) &&
116             (boot_device >= MMC_BOOT_DEVICES_START) &&
117             (boot_device <= MMC_BOOT_DEVICES_END)) {
118                 boot_params = omap_boot_params->boot_device_descriptor;
119                 if ((boot_params < NON_SECURE_SRAM_START) ||
120                     (boot_params > NON_SECURE_SRAM_END))
121                         return;
122
123                 boot_params = *((u32 *)(boot_params + DEVICE_DATA_OFFSET));
124                 if ((boot_params < NON_SECURE_SRAM_START) ||
125                     (boot_params > NON_SECURE_SRAM_END))
126                         return;
127
128                 boot_mode = *((u32 *)(boot_params + BOOT_MODE_OFFSET));
129
130                 if (boot_mode != MMCSD_MODE_FS &&
131                     boot_mode != MMCSD_MODE_RAW)
132 #ifdef CONFIG_SUPPORT_EMMC_BOOT
133                         boot_mode = MMCSD_MODE_EMMCBOOT;
134 #else
135                         boot_mode = MMCSD_MODE_UNDEFINED;
136 #endif
137         }
138 #endif
139
140         gd->arch.omap_boot_mode = boot_mode;
141
142 #if !defined(CONFIG_TI814X) && !defined(CONFIG_TI816X) && \
143     !defined(CONFIG_AM33XX) && !defined(CONFIG_AM43XX)
144
145         /* CH flags */
146
147         gd->arch.omap_ch_flags = omap_boot_params->ch_flags;
148 #endif
149 }
150
151 #ifdef CONFIG_SPL_BUILD
152 u32 spl_boot_device(void)
153 {
154         return gd->arch.omap_boot_device;
155 }
156
157 u32 spl_boot_mode(void)
158 {
159         return gd->arch.omap_boot_mode;
160 }
161
162 void spl_board_init(void)
163 {
164         /*
165          * Save the boot parameters passed from romcode.
166          * We cannot delay the saving further than this,
167          * to prevent overwrites.
168          */
169         save_omap_boot_params();
170
171         /* Prepare console output */
172         preloader_console_init();
173
174 #if defined(CONFIG_SPL_NAND_SUPPORT) || defined(CONFIG_SPL_ONENAND_SUPPORT)
175         gpmc_init();
176 #endif
177 #ifdef CONFIG_SPL_I2C_SUPPORT
178         i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
179 #endif
180 #if defined(CONFIG_AM33XX) && defined(CONFIG_SPL_MUSB_NEW_SUPPORT)
181         arch_misc_init();
182 #endif
183 #if defined(CONFIG_HW_WATCHDOG)
184         hw_watchdog_init();
185 #endif
186 #ifdef CONFIG_AM33XX
187         am33xx_spl_board_init();
188 #endif
189 }
190
191 int board_mmc_init(bd_t *bis)
192 {
193         switch (spl_boot_device()) {
194         case BOOT_DEVICE_MMC1:
195                 omap_mmc_init(0, 0, 0, -1, -1);
196                 break;
197         case BOOT_DEVICE_MMC2:
198         case BOOT_DEVICE_MMC2_2:
199                 omap_mmc_init(1, 0, 0, -1, -1);
200                 break;
201         }
202         return 0;
203 }
204
205 void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
206 {
207         typedef void __noreturn (*image_entry_noargs_t)(u32 *);
208         image_entry_noargs_t image_entry =
209                         (image_entry_noargs_t) spl_image->entry_point;
210
211         u32 boot_params = *((u32 *)OMAP_SRAM_SCRATCH_BOOT_PARAMS);
212
213         debug("image entry point: 0x%X\n", spl_image->entry_point);
214         /* Pass the saved boot_params from rom code */
215         image_entry((u32 *)boot_params);
216 }
217 #endif
218
219 #ifdef CONFIG_SCSI_AHCI_PLAT
220 void arch_preboot_os(void)
221 {
222         ahci_reset((void __iomem *)DWC_AHSATA_BASE);
223 }
224 #endif
225
226 #if defined(CONFIG_USB_FUNCTION_FASTBOOT) && !defined(CONFIG_ENV_IS_NOWHERE)
227 int fb_set_reboot_flag(void)
228 {
229         printf("Setting reboot to fastboot flag ...\n");
230         setenv("dofastboot", "1");
231         saveenv();
232         return 0;
233 }
234 #endif