blob: be4da0f7023a164b45435aee0aecd41dc894bc73 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Tim Harvey354a7e32014-06-02 16:13:20 -07002/*
3 * Copyright (C) 2014 Gateworks Corporation
4 * Copyright (C) 2011-2012 Freescale Semiconductor, Inc.
5 *
6 * Author: Tim Harvey <tharvey@gateworks.com>
Tim Harvey354a7e32014-06-02 16:13:20 -07007 */
8
9#include <common.h>
Simon Glassf11478f2019-12-28 10:45:07 -070010#include <hang.h>
Simon Glass97589732020-05-10 11:40:02 -060011#include <init.h>
Simon Glass0f2af882020-05-10 11:40:05 -060012#include <log.h>
Simon Glass3ba929a2020-10-30 21:38:53 -060013#include <asm/global_data.h>
Tim Harvey354a7e32014-06-02 16:13:20 -070014#include <asm/io.h>
15#include <asm/arch/imx-regs.h>
Jagan Tekie5f970b2017-02-24 15:45:12 +053016#include <asm/arch/sys_proto.h>
Tim Harvey354a7e32014-06-02 16:13:20 -070017#include <asm/spl.h>
18#include <spl.h>
Stefano Babic33731bc2017-06-29 10:16:06 +020019#include <asm/mach-imx/hab.h>
Uri Mashiach5dd46892017-09-24 09:00:24 +030020#include <asm/mach-imx/boot_mode.h>
Fabio Estevama0e462b2017-09-05 20:46:39 -030021#include <g_dnl.h>
Tim Harvey354a7e32014-06-02 16:13:20 -070022
Jagan Teki7bb61bb2017-08-28 16:45:47 +053023DECLARE_GLOBAL_DATA_PTR;
24
Peng Fancffe7322019-08-27 06:25:07 +000025__weak int spl_board_boot_device(enum boot_device boot_dev_spl)
26{
27 return 0;
28}
29
Tim Harvey354a7e32014-06-02 16:13:20 -070030#if defined(CONFIG_MX6)
Nikita Kiryanov9fba8422014-10-29 19:28:33 +020031/* determine boot device from SRC_SBMR1 (BOOT_CFG[4:1]) or SRC_GPR9 register */
Tim Harvey354a7e32014-06-02 16:13:20 -070032u32 spl_boot_device(void)
33{
Jagan Tekic981a942017-02-24 15:45:15 +053034 unsigned int bmode = readl(&src_base->sbmr2);
Jagan Tekie5f970b2017-02-24 15:45:12 +053035 u32 reg = imx6_src_get_boot_mode();
Tim Harvey354a7e32014-06-02 16:13:20 -070036
Stefano Babic587e72e2015-12-11 17:30:42 +010037 /*
38 * Check for BMODE if serial downloader is enabled
39 * BOOT_MODE - see IMX6DQRM Table 8-1
40 */
Stefan Agner15390962016-12-27 17:01:42 +010041 if (((bmode >> 24) & 0x03) == 0x01) /* Serial Downloader */
Stefan Agnera0a50ce2017-08-15 17:49:43 -070042 return BOOT_DEVICE_BOARD;
Jagan Teki32a71142017-02-24 15:45:14 +053043
Stefan Agner47f547e2017-09-13 14:29:45 -070044 /*
45 * The above method does not detect that the boot ROM used
46 * serial downloader in case the boot ROM decided to use the
47 * serial downloader as a fall back (primary boot source failed).
48 *
49 * Infer that the boot ROM used the USB serial downloader by
50 * checking whether the USB PHY is currently active... This
51 * assumes that SPL did not (yet) initialize the USB PHY...
52 */
53 if (is_usbotg_phy_active())
54 return BOOT_DEVICE_BOARD;
55
Tim Harvey354a7e32014-06-02 16:13:20 -070056 /* BOOT_CFG1[7:4] - see IMX6DQRM Table 8-8 */
Jagan Teki32a71142017-02-24 15:45:14 +053057 switch ((reg & IMX6_BMODE_MASK) >> IMX6_BMODE_SHIFT) {
Tim Harvey354a7e32014-06-02 16:13:20 -070058 /* EIM: See 8.5.1, Table 8-9 */
Jagan Teki32a71142017-02-24 15:45:14 +053059 case IMX6_BMODE_EMI:
Tim Harvey354a7e32014-06-02 16:13:20 -070060 /* BOOT_CFG1[3]: NOR/OneNAND Selection */
Jagan Teki32a71142017-02-24 15:45:14 +053061 switch ((reg & IMX6_BMODE_EMI_MASK) >> IMX6_BMODE_EMI_SHIFT) {
62 case IMX6_BMODE_ONENAND:
Tim Harvey354a7e32014-06-02 16:13:20 -070063 return BOOT_DEVICE_ONENAND;
Jagan Teki32a71142017-02-24 15:45:14 +053064 case IMX6_BMODE_NOR:
Tim Harvey354a7e32014-06-02 16:13:20 -070065 return BOOT_DEVICE_NOR;
66 break;
Jagan Teki32a71142017-02-24 15:45:14 +053067 }
Stefan Agner15390962016-12-27 17:01:42 +010068 /* Reserved: Used to force Serial Downloader */
Stefan Agner53456f52017-08-15 17:49:42 -070069 case IMX6_BMODE_RESERVED:
Stefan Agnera0a50ce2017-08-15 17:49:43 -070070 return BOOT_DEVICE_BOARD;
Tim Harvey354a7e32014-06-02 16:13:20 -070071 /* SATA: See 8.5.4, Table 8-20 */
Stefan Agner34da4732017-08-29 09:10:11 -070072#if !defined(CONFIG_MX6UL) && !defined(CONFIG_MX6ULL)
Jagan Teki32a71142017-02-24 15:45:14 +053073 case IMX6_BMODE_SATA:
Tim Harvey354a7e32014-06-02 16:13:20 -070074 return BOOT_DEVICE_SATA;
Stefan Agner34da4732017-08-29 09:10:11 -070075#endif
Tim Harvey354a7e32014-06-02 16:13:20 -070076 /* Serial ROM: See 8.5.5.1, Table 8-22 */
Jagan Teki32a71142017-02-24 15:45:14 +053077 case IMX6_BMODE_SERIAL_ROM:
Tim Harvey354a7e32014-06-02 16:13:20 -070078 /* BOOT_CFG4[2:0] */
Jagan Teki32a71142017-02-24 15:45:14 +053079 switch ((reg & IMX6_BMODE_SERIAL_ROM_MASK) >>
80 IMX6_BMODE_SERIAL_ROM_SHIFT) {
81 case IMX6_BMODE_ECSPI1:
82 case IMX6_BMODE_ECSPI2:
83 case IMX6_BMODE_ECSPI3:
84 case IMX6_BMODE_ECSPI4:
85 case IMX6_BMODE_ECSPI5:
Tim Harvey354a7e32014-06-02 16:13:20 -070086 return BOOT_DEVICE_SPI;
Jagan Teki32a71142017-02-24 15:45:14 +053087 case IMX6_BMODE_I2C1:
88 case IMX6_BMODE_I2C2:
89 case IMX6_BMODE_I2C3:
Tim Harvey354a7e32014-06-02 16:13:20 -070090 return BOOT_DEVICE_I2C;
91 }
92 break;
93 /* SD/eSD: 8.5.3, Table 8-15 */
Jagan Teki32a71142017-02-24 15:45:14 +053094 case IMX6_BMODE_SD:
95 case IMX6_BMODE_ESD:
Adam Forda2a91e22019-10-08 07:56:44 -050096 return BOOT_DEVICE_MMC1;
97 /* MMC/eMMC: 8.5.3 */
Jagan Teki32a71142017-02-24 15:45:14 +053098 case IMX6_BMODE_MMC:
99 case IMX6_BMODE_EMMC:
Adam Forda2a91e22019-10-08 07:56:44 -0500100 return BOOT_DEVICE_MMC1;
Jagan Teki4191b222017-02-24 15:45:13 +0530101 /* NAND Flash: 8.5.2, Table 8-10 */
Eran Matityahu5fa7ca62017-12-14 20:20:02 +0200102 case IMX6_BMODE_NAND_MIN ... IMX6_BMODE_NAND_MAX:
Tim Harvey354a7e32014-06-02 16:13:20 -0700103 return BOOT_DEVICE_NAND;
Stefan Roesefe41e322019-09-20 18:09:08 +0200104#if defined(CONFIG_MX6UL) || defined(CONFIG_MX6ULL)
105 /* QSPI boot */
106 case IMX6_BMODE_QSPI:
107 return BOOT_DEVICE_SPI;
108#endif
Tim Harvey354a7e32014-06-02 16:13:20 -0700109 }
110 return BOOT_DEVICE_NONE;
111}
Fabio Estevama0e462b2017-09-05 20:46:39 -0300112
Peng Fan9d5bc072018-12-21 06:21:23 +0000113#elif defined(CONFIG_MX7) || defined(CONFIG_IMX8M) || defined(CONFIG_IMX8)
Peng Fan39945c12018-11-20 10:19:25 +0000114/* Translate iMX7/i.MX8M boot device to the SPL boot device enumeration */
Uri Mashiach5dd46892017-09-24 09:00:24 +0300115u32 spl_boot_device(void)
116{
Eran Matityahu52fef1c2018-03-06 16:38:00 +0200117#if defined(CONFIG_MX7)
118 unsigned int bmode = readl(&src_base->sbmr2);
119
120 /*
121 * Check for BMODE if serial downloader is enabled
122 * BOOT_MODE - see IMX7DRM Table 6-24
123 */
124 if (((bmode >> 24) & 0x03) == 0x01) /* Serial Downloader */
125 return BOOT_DEVICE_BOARD;
126
127 /*
128 * The above method does not detect that the boot ROM used
129 * serial downloader in case the boot ROM decided to use the
130 * serial downloader as a fall back (primary boot source failed).
131 *
132 * Infer that the boot ROM used the USB serial downloader by
133 * checking whether the USB PHY is currently active... This
134 * assumes that SPL did not (yet) initialize the USB PHY...
135 */
136 if (is_boot_from_usb())
137 return BOOT_DEVICE_BOARD;
138#endif
139
Uri Mashiach5dd46892017-09-24 09:00:24 +0300140 enum boot_device boot_device_spl = get_boot_device();
141
Peng Fane7997ef2019-12-27 10:27:49 +0800142 if (IS_ENABLED(CONFIG_IMX8MM) || IS_ENABLED(CONFIG_IMX8MN) ||
143 IS_ENABLED(CONFIG_IMX8MP))
Peng Fancffe7322019-08-27 06:25:07 +0000144 return spl_board_boot_device(boot_device_spl);
145
Uri Mashiach5dd46892017-09-24 09:00:24 +0300146 switch (boot_device_spl) {
Peng Fan30f17ec2018-11-20 10:19:29 +0000147#if defined(CONFIG_MX7)
Uri Mashiach5dd46892017-09-24 09:00:24 +0300148 case SD1_BOOT:
149 case MMC1_BOOT:
Uri Mashiach5dd46892017-09-24 09:00:24 +0300150 case SD2_BOOT:
151 case MMC2_BOOT:
Eran Matityahu3d7aa682018-01-03 12:56:24 +0200152 case SD3_BOOT:
153 case MMC3_BOOT:
Eran Matityahu73596552018-01-03 12:53:08 +0200154 return BOOT_DEVICE_MMC1;
Peng Fan9d5bc072018-12-21 06:21:23 +0000155#elif defined(CONFIG_IMX8)
156 case MMC1_BOOT:
157 return BOOT_DEVICE_MMC1;
158 case SD2_BOOT:
159 return BOOT_DEVICE_MMC2_2;
160 case SD3_BOOT:
161 return BOOT_DEVICE_MMC1;
162 case FLEXSPI_BOOT:
163 return BOOT_DEVICE_SPI;
Peng Fan30f17ec2018-11-20 10:19:29 +0000164#elif defined(CONFIG_IMX8M)
165 case SD1_BOOT:
166 case MMC1_BOOT:
167 return BOOT_DEVICE_MMC1;
168 case SD2_BOOT:
169 case MMC2_BOOT:
170 return BOOT_DEVICE_MMC2;
171#endif
Eran Matityahu3d7aa682018-01-03 12:56:24 +0200172 case NAND_BOOT:
173 return BOOT_DEVICE_NAND;
Uri Mashiach5dd46892017-09-24 09:00:24 +0300174 case SPI_NOR_BOOT:
175 return BOOT_DEVICE_SPI;
Peng Fan037f91c2018-05-17 15:15:59 +0800176 case QSPI_BOOT:
177 return BOOT_DEVICE_NOR;
Peng Fan58f19b42018-01-10 13:20:26 +0800178 case USB_BOOT:
179 return BOOT_DEVICE_USB;
Uri Mashiach5dd46892017-09-24 09:00:24 +0300180 default:
181 return BOOT_DEVICE_NONE;
182 }
183}
Peng Fan9d5bc072018-12-21 06:21:23 +0000184#endif /* CONFIG_MX7 || CONFIG_IMX8M || CONFIG_IMX8 */
Uri Mashiach5dd46892017-09-24 09:00:24 +0300185
Jean-Jacques Hiblot6a228522019-01-10 15:44:13 +0100186#ifdef CONFIG_SPL_USB_GADGET
Fabio Estevama0e462b2017-09-05 20:46:39 -0300187int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name)
188{
Maxime Ripard7f78b9d2017-09-07 08:58:08 +0200189 put_unaligned(CONFIG_USB_GADGET_PRODUCT_NUM + 0xfff, &dev->idProduct);
Fabio Estevama0e462b2017-09-05 20:46:39 -0300190
191 return 0;
192}
Peng Fan8f97c262020-08-18 18:16:47 +0800193
194#define SDPV_BCD_DEVICE 0x500
195int g_dnl_get_board_bcd_device_number(int gcnum)
196{
197 return SDPV_BCD_DEVICE;
198}
Fabio Estevama0e462b2017-09-05 20:46:39 -0300199#endif
Tim Harvey354a7e32014-06-02 16:13:20 -0700200
Fabio Estevam550b52e2018-02-15 12:41:40 -0200201#if defined(CONFIG_SPL_MMC_SUPPORT)
202/* called from spl_mmc to see type of boot mode for storage (RAW or FAT) */
Harald Seiler0bf7ab12020-04-15 11:33:30 +0200203u32 spl_mmc_boot_mode(const u32 boot_device)
Fabio Estevam550b52e2018-02-15 12:41:40 -0200204{
Peng Fan1dd4cc32019-10-16 10:24:25 +0000205#if defined(CONFIG_MX7) || defined(CONFIG_IMX8M) || defined(CONFIG_IMX8)
206 switch (get_boot_device()) {
207 /* for MMC return either RAW or FAT mode */
208 case SD1_BOOT:
209 case SD2_BOOT:
210 case SD3_BOOT:
Harald Seilerfbbb3182020-04-23 13:07:53 +0200211 if (IS_ENABLED(CONFIG_SPL_FS_FAT))
Harald Seiler51526812020-04-23 13:07:52 +0200212 return MMCSD_MODE_FS;
213 else
214 return MMCSD_MODE_RAW;
Peng Fan1dd4cc32019-10-16 10:24:25 +0000215 case MMC1_BOOT:
216 case MMC2_BOOT:
217 case MMC3_BOOT:
Harald Seilerfbbb3182020-04-23 13:07:53 +0200218 if (IS_ENABLED(CONFIG_SPL_FS_FAT))
Harald Seiler51526812020-04-23 13:07:52 +0200219 return MMCSD_MODE_FS;
220 else if (IS_ENABLED(CONFIG_SUPPORT_EMMC_BOOT))
221 return MMCSD_MODE_EMMCBOOT;
222 else
223 return MMCSD_MODE_RAW;
Peng Fan1dd4cc32019-10-16 10:24:25 +0000224 default:
225 puts("spl: ERROR: unsupported device\n");
226 hang();
227 }
228#else
Anatolij Gustschin62499ff2020-04-23 13:07:49 +0200229 switch (boot_device) {
Fabio Estevam550b52e2018-02-15 12:41:40 -0200230 /* for MMC return either RAW or FAT mode */
231 case BOOT_DEVICE_MMC1:
232 case BOOT_DEVICE_MMC2:
Peng Fan9d5bc072018-12-21 06:21:23 +0000233 case BOOT_DEVICE_MMC2_2:
Harald Seiler51526812020-04-23 13:07:52 +0200234 if (IS_ENABLED(CONFIG_SPL_FS_FAT))
235 return MMCSD_MODE_FS;
236 else if (IS_ENABLED(CONFIG_SUPPORT_EMMC_BOOT))
237 return MMCSD_MODE_EMMCBOOT;
238 else
239 return MMCSD_MODE_RAW;
Fabio Estevam550b52e2018-02-15 12:41:40 -0200240 default:
241 puts("spl: ERROR: unsupported device\n");
242 hang();
243 }
Peng Fan1dd4cc32019-10-16 10:24:25 +0000244#endif
Fabio Estevam550b52e2018-02-15 12:41:40 -0200245}
246#endif
247
Stefano Babicf8b509b2019-09-20 08:47:53 +0200248#if defined(CONFIG_IMX_HAB)
Sven Ebenfeldeba5e332016-11-06 16:37:55 +0100249
Bryan O'Donoghue88919962018-01-12 12:40:01 +0000250/*
251 * +------------+ 0x0 (DDR_UIMAGE_START) -
252 * | Header | |
253 * +------------+ 0x40 |
254 * | | |
255 * | | |
256 * | | |
257 * | | |
258 * | Image Data | |
259 * . | |
260 * . | > Stuff to be authenticated ----+
261 * . | | |
262 * | | | |
263 * | | | |
264 * +------------+ | |
265 * | | | |
266 * | Fill Data | | |
267 * | | | |
268 * +------------+ Align to ALIGN_SIZE | |
269 * | IVT | | |
270 * +------------+ + IVT_SIZE - |
271 * | | |
272 * | CSF DATA | <---------------------------------------------------------+
273 * | |
274 * +------------+
275 * | |
276 * | Fill Data |
277 * | |
278 * +------------+ + CSF_PAD_SIZE
279 */
280
Sven Ebenfeldeba5e332016-11-06 16:37:55 +0100281__weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
282{
283 typedef void __noreturn (*image_entry_noargs_t)(void);
Bryan O'Donoghue88919962018-01-12 12:40:01 +0000284 uint32_t offset;
Sven Ebenfeldeba5e332016-11-06 16:37:55 +0100285
286 image_entry_noargs_t image_entry =
287 (image_entry_noargs_t)(unsigned long)spl_image->entry_point;
288
Tom Rinif1c2fc02017-01-11 10:45:48 -0500289 debug("image entry point: 0x%lX\n", spl_image->entry_point);
Sven Ebenfeldeba5e332016-11-06 16:37:55 +0100290
Ye Li9d5b0f42018-11-17 09:10:25 +0000291 if (spl_image->flags & SPL_FIT_FOUND) {
Sven Ebenfeldeba5e332016-11-06 16:37:55 +0100292 image_entry();
293 } else {
Ye Li9d5b0f42018-11-17 09:10:25 +0000294 /*
295 * HAB looks for the CSF at the end of the authenticated
296 * data therefore, we need to subtract the size of the
297 * CSF from the actual filesize
298 */
299 offset = spl_image->size - CONFIG_CSF_SIZE;
300 if (!imx_hab_authenticate_image(spl_image->load_addr,
301 offset + IVT_SIZE +
302 CSF_PAD_SIZE, offset)) {
303 image_entry();
304 } else {
Marek Vasut579fd512020-05-30 20:29:00 +0200305 panic("spl: ERROR: image authentication fail\n");
Ye Li9d5b0f42018-11-17 09:10:25 +0000306 }
307 }
308}
309
Ricardo Salvetid7d649c2019-09-02 18:18:52 -0300310#if !defined(CONFIG_SPL_FIT_SIGNATURE)
Ye Li9d5b0f42018-11-17 09:10:25 +0000311ulong board_spl_fit_size_align(ulong size)
312{
313 /*
314 * HAB authenticate_image requests the IVT offset is
315 * aligned to 0x1000
316 */
317
318 size = ALIGN(size, 0x1000);
319 size += CONFIG_CSF_SIZE;
320
321 return size;
322}
323
324void board_spl_fit_post_load(ulong load_addr, size_t length)
325{
326 u32 offset = length - CONFIG_CSF_SIZE;
327
328 if (imx_hab_authenticate_image(load_addr,
329 offset + IVT_SIZE + CSF_PAD_SIZE,
330 offset)) {
Marek Vasut579fd512020-05-30 20:29:00 +0200331 panic("spl: ERROR: image authentication unsuccessful\n");
Sven Ebenfeldeba5e332016-11-06 16:37:55 +0100332 }
333}
Ricardo Salvetid7d649c2019-09-02 18:18:52 -0300334#endif
Sven Ebenfeldeba5e332016-11-06 16:37:55 +0100335
Jagan Teki7bb61bb2017-08-28 16:45:47 +0530336#endif
337
338#if defined(CONFIG_MX6) && defined(CONFIG_SPL_OS_BOOT)
339int dram_init_banksize(void)
340{
341 gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
342 gd->bd->bi_dram[0].size = imx_ddr_size();
343
344 return 0;
345}
Sven Ebenfeldeba5e332016-11-06 16:37:55 +0100346#endif