blob: 01f6f0a1dee0264a66cb432626b8528c4722f1ae [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Tim Harvey887717d2014-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 Harvey887717d2014-06-02 16:13:20 -07007 */
8
9#include <common.h>
Simon Glassdb41d652019-12-28 10:45:07 -070010#include <hang.h>
Simon Glass691d7192020-05-10 11:40:02 -060011#include <init.h>
Simon Glassf7ae49f2020-05-10 11:40:05 -060012#include <log.h>
Simon Glass401d1c42020-10-30 21:38:53 -060013#include <asm/global_data.h>
Tim Harvey887717d2014-06-02 16:13:20 -070014#include <asm/io.h>
15#include <asm/arch/imx-regs.h>
Jagan Tekicba586b2017-02-24 15:45:12 +053016#include <asm/arch/sys_proto.h>
Tim Harvey887717d2014-06-02 16:13:20 -070017#include <asm/spl.h>
18#include <spl.h>
Stefano Babic552a8482017-06-29 10:16:06 +020019#include <asm/mach-imx/hab.h>
Uri Mashiachc5c6f372017-09-24 09:00:24 +030020#include <asm/mach-imx/boot_mode.h>
Fabio Estevam511db3b2017-09-05 20:46:39 -030021#include <g_dnl.h>
Alexandru Gagniucefc4ad0bc2021-01-20 10:46:49 -060022#include <linux/libfdt.h>
Tim Harvey887717d2014-06-02 16:13:20 -070023
Jagan Teki46668df2017-08-28 16:45:47 +053024DECLARE_GLOBAL_DATA_PTR;
25
Peng Fan6c646b32019-08-27 06:25:07 +000026__weak int spl_board_boot_device(enum boot_device boot_dev_spl)
27{
28 return 0;
29}
30
Tim Harvey887717d2014-06-02 16:13:20 -070031#if defined(CONFIG_MX6)
Nikita Kiryanovf2863ff2014-10-29 19:28:33 +020032/* determine boot device from SRC_SBMR1 (BOOT_CFG[4:1]) or SRC_GPR9 register */
Tim Harvey887717d2014-06-02 16:13:20 -070033u32 spl_boot_device(void)
34{
Jagan Teki7b54f5a2017-02-24 15:45:15 +053035 unsigned int bmode = readl(&src_base->sbmr2);
Jagan Tekicba586b2017-02-24 15:45:12 +053036 u32 reg = imx6_src_get_boot_mode();
Tim Harvey887717d2014-06-02 16:13:20 -070037
Stefano Babic40f48392015-12-11 17:30:42 +010038 /*
39 * Check for BMODE if serial downloader is enabled
40 * BOOT_MODE - see IMX6DQRM Table 8-1
41 */
Stefan Agnerac0a93f2016-12-27 17:01:42 +010042 if (((bmode >> 24) & 0x03) == 0x01) /* Serial Downloader */
Stefan Agner962c78b2017-08-15 17:49:43 -070043 return BOOT_DEVICE_BOARD;
Jagan Teki96aac842017-02-24 15:45:14 +053044
Stefan Agnere203dcf2017-09-13 14:29:45 -070045 /*
46 * The above method does not detect that the boot ROM used
47 * serial downloader in case the boot ROM decided to use the
48 * serial downloader as a fall back (primary boot source failed).
49 *
50 * Infer that the boot ROM used the USB serial downloader by
51 * checking whether the USB PHY is currently active... This
52 * assumes that SPL did not (yet) initialize the USB PHY...
53 */
54 if (is_usbotg_phy_active())
55 return BOOT_DEVICE_BOARD;
56
Tim Harvey887717d2014-06-02 16:13:20 -070057 /* BOOT_CFG1[7:4] - see IMX6DQRM Table 8-8 */
Jagan Teki96aac842017-02-24 15:45:14 +053058 switch ((reg & IMX6_BMODE_MASK) >> IMX6_BMODE_SHIFT) {
Tim Harvey887717d2014-06-02 16:13:20 -070059 /* EIM: See 8.5.1, Table 8-9 */
Jagan Teki96aac842017-02-24 15:45:14 +053060 case IMX6_BMODE_EMI:
Tim Harvey887717d2014-06-02 16:13:20 -070061 /* BOOT_CFG1[3]: NOR/OneNAND Selection */
Jagan Teki96aac842017-02-24 15:45:14 +053062 switch ((reg & IMX6_BMODE_EMI_MASK) >> IMX6_BMODE_EMI_SHIFT) {
63 case IMX6_BMODE_ONENAND:
Tim Harvey887717d2014-06-02 16:13:20 -070064 return BOOT_DEVICE_ONENAND;
Jagan Teki96aac842017-02-24 15:45:14 +053065 case IMX6_BMODE_NOR:
Tim Harvey887717d2014-06-02 16:13:20 -070066 return BOOT_DEVICE_NOR;
67 break;
Jagan Teki96aac842017-02-24 15:45:14 +053068 }
Stefan Agnerac0a93f2016-12-27 17:01:42 +010069 /* Reserved: Used to force Serial Downloader */
Stefan Agner3bd16422017-08-15 17:49:42 -070070 case IMX6_BMODE_RESERVED:
Stefan Agner962c78b2017-08-15 17:49:43 -070071 return BOOT_DEVICE_BOARD;
Tim Harvey887717d2014-06-02 16:13:20 -070072 /* SATA: See 8.5.4, Table 8-20 */
Stefan Agner624da532017-08-29 09:10:11 -070073#if !defined(CONFIG_MX6UL) && !defined(CONFIG_MX6ULL)
Jagan Teki96aac842017-02-24 15:45:14 +053074 case IMX6_BMODE_SATA:
Tim Harvey887717d2014-06-02 16:13:20 -070075 return BOOT_DEVICE_SATA;
Stefan Agner624da532017-08-29 09:10:11 -070076#endif
Tim Harvey887717d2014-06-02 16:13:20 -070077 /* Serial ROM: See 8.5.5.1, Table 8-22 */
Jagan Teki96aac842017-02-24 15:45:14 +053078 case IMX6_BMODE_SERIAL_ROM:
Tim Harvey887717d2014-06-02 16:13:20 -070079 /* BOOT_CFG4[2:0] */
Jagan Teki96aac842017-02-24 15:45:14 +053080 switch ((reg & IMX6_BMODE_SERIAL_ROM_MASK) >>
81 IMX6_BMODE_SERIAL_ROM_SHIFT) {
82 case IMX6_BMODE_ECSPI1:
83 case IMX6_BMODE_ECSPI2:
84 case IMX6_BMODE_ECSPI3:
85 case IMX6_BMODE_ECSPI4:
86 case IMX6_BMODE_ECSPI5:
Tim Harvey887717d2014-06-02 16:13:20 -070087 return BOOT_DEVICE_SPI;
Jagan Teki96aac842017-02-24 15:45:14 +053088 case IMX6_BMODE_I2C1:
89 case IMX6_BMODE_I2C2:
90 case IMX6_BMODE_I2C3:
Tim Harvey887717d2014-06-02 16:13:20 -070091 return BOOT_DEVICE_I2C;
92 }
93 break;
94 /* SD/eSD: 8.5.3, Table 8-15 */
Jagan Teki96aac842017-02-24 15:45:14 +053095 case IMX6_BMODE_SD:
96 case IMX6_BMODE_ESD:
Adam Ford63ce94b2019-10-08 07:56:44 -050097 return BOOT_DEVICE_MMC1;
98 /* MMC/eMMC: 8.5.3 */
Jagan Teki96aac842017-02-24 15:45:14 +053099 case IMX6_BMODE_MMC:
100 case IMX6_BMODE_EMMC:
Adam Ford63ce94b2019-10-08 07:56:44 -0500101 return BOOT_DEVICE_MMC1;
Jagan Teki20f14712017-02-24 15:45:13 +0530102 /* NAND Flash: 8.5.2, Table 8-10 */
Eran Matityahuaf104ae2017-12-14 20:20:02 +0200103 case IMX6_BMODE_NAND_MIN ... IMX6_BMODE_NAND_MAX:
Tim Harvey887717d2014-06-02 16:13:20 -0700104 return BOOT_DEVICE_NAND;
Stefan Roesed10d1382019-09-20 18:09:08 +0200105#if defined(CONFIG_MX6UL) || defined(CONFIG_MX6ULL)
106 /* QSPI boot */
107 case IMX6_BMODE_QSPI:
108 return BOOT_DEVICE_SPI;
109#endif
Tim Harvey887717d2014-06-02 16:13:20 -0700110 }
111 return BOOT_DEVICE_NONE;
112}
Fabio Estevam511db3b2017-09-05 20:46:39 -0300113
Peng Fanf5417962018-12-21 06:21:23 +0000114#elif defined(CONFIG_MX7) || defined(CONFIG_IMX8M) || defined(CONFIG_IMX8)
Peng Fancd357ad2018-11-20 10:19:25 +0000115/* Translate iMX7/i.MX8M boot device to the SPL boot device enumeration */
Uri Mashiachc5c6f372017-09-24 09:00:24 +0300116u32 spl_boot_device(void)
117{
Eran Matityahu0fe69ad2018-03-06 16:38:00 +0200118#if defined(CONFIG_MX7)
119 unsigned int bmode = readl(&src_base->sbmr2);
120
121 /*
122 * Check for BMODE if serial downloader is enabled
123 * BOOT_MODE - see IMX7DRM Table 6-24
124 */
125 if (((bmode >> 24) & 0x03) == 0x01) /* Serial Downloader */
126 return BOOT_DEVICE_BOARD;
127
128 /*
129 * The above method does not detect that the boot ROM used
130 * serial downloader in case the boot ROM decided to use the
131 * serial downloader as a fall back (primary boot source failed).
132 *
133 * Infer that the boot ROM used the USB serial downloader by
134 * checking whether the USB PHY is currently active... This
135 * assumes that SPL did not (yet) initialize the USB PHY...
136 */
137 if (is_boot_from_usb())
138 return BOOT_DEVICE_BOARD;
139#endif
140
Uri Mashiachc5c6f372017-09-24 09:00:24 +0300141 enum boot_device boot_device_spl = get_boot_device();
142
Peng Fan7df63972019-12-27 10:27:49 +0800143 if (IS_ENABLED(CONFIG_IMX8MM) || IS_ENABLED(CONFIG_IMX8MN) ||
144 IS_ENABLED(CONFIG_IMX8MP))
Peng Fan6c646b32019-08-27 06:25:07 +0000145 return spl_board_boot_device(boot_device_spl);
146
Uri Mashiachc5c6f372017-09-24 09:00:24 +0300147 switch (boot_device_spl) {
Peng Fan278f2732018-11-20 10:19:29 +0000148#if defined(CONFIG_MX7)
Uri Mashiachc5c6f372017-09-24 09:00:24 +0300149 case SD1_BOOT:
150 case MMC1_BOOT:
Uri Mashiachc5c6f372017-09-24 09:00:24 +0300151 case SD2_BOOT:
152 case MMC2_BOOT:
Eran Matityahue7528a32018-01-03 12:56:24 +0200153 case SD3_BOOT:
154 case MMC3_BOOT:
Eran Matityahucd9f3ff2018-01-03 12:53:08 +0200155 return BOOT_DEVICE_MMC1;
Peng Fanf5417962018-12-21 06:21:23 +0000156#elif defined(CONFIG_IMX8)
157 case MMC1_BOOT:
158 return BOOT_DEVICE_MMC1;
159 case SD2_BOOT:
160 return BOOT_DEVICE_MMC2_2;
161 case SD3_BOOT:
162 return BOOT_DEVICE_MMC1;
163 case FLEXSPI_BOOT:
164 return BOOT_DEVICE_SPI;
Peng Fan278f2732018-11-20 10:19:29 +0000165#elif defined(CONFIG_IMX8M)
166 case SD1_BOOT:
167 case MMC1_BOOT:
168 return BOOT_DEVICE_MMC1;
169 case SD2_BOOT:
170 case MMC2_BOOT:
171 return BOOT_DEVICE_MMC2;
172#endif
Eran Matityahue7528a32018-01-03 12:56:24 +0200173 case NAND_BOOT:
174 return BOOT_DEVICE_NAND;
Uri Mashiachc5c6f372017-09-24 09:00:24 +0300175 case SPI_NOR_BOOT:
176 return BOOT_DEVICE_SPI;
Peng Fand4e84f22018-05-17 15:15:59 +0800177 case QSPI_BOOT:
178 return BOOT_DEVICE_NOR;
Peng Fand7cb10a2018-01-10 13:20:26 +0800179 case USB_BOOT:
180 return BOOT_DEVICE_USB;
Uri Mashiachc5c6f372017-09-24 09:00:24 +0300181 default:
182 return BOOT_DEVICE_NONE;
183 }
184}
Peng Fanf5417962018-12-21 06:21:23 +0000185#endif /* CONFIG_MX7 || CONFIG_IMX8M || CONFIG_IMX8 */
Uri Mashiachc5c6f372017-09-24 09:00:24 +0300186
Jean-Jacques Hiblotf811e972019-01-10 15:44:13 +0100187#ifdef CONFIG_SPL_USB_GADGET
Fabio Estevam511db3b2017-09-05 20:46:39 -0300188int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name)
189{
Maxime Riparda95aee62017-09-07 08:58:08 +0200190 put_unaligned(CONFIG_USB_GADGET_PRODUCT_NUM + 0xfff, &dev->idProduct);
Fabio Estevam511db3b2017-09-05 20:46:39 -0300191
192 return 0;
193}
Peng Fan27c80382020-08-18 18:16:47 +0800194
195#define SDPV_BCD_DEVICE 0x500
196int g_dnl_get_board_bcd_device_number(int gcnum)
197{
198 return SDPV_BCD_DEVICE;
199}
Fabio Estevam511db3b2017-09-05 20:46:39 -0300200#endif
Tim Harvey887717d2014-06-02 16:13:20 -0700201
Simon Glass103c5f12021-08-08 12:20:09 -0600202#if defined(CONFIG_SPL_MMC)
Fabio Estevam03390862018-02-15 12:41:40 -0200203/* called from spl_mmc to see type of boot mode for storage (RAW or FAT) */
Harald Seilere9759062020-04-15 11:33:30 +0200204u32 spl_mmc_boot_mode(const u32 boot_device)
Fabio Estevam03390862018-02-15 12:41:40 -0200205{
Peng Fan9d86dbd2019-10-16 10:24:25 +0000206#if defined(CONFIG_MX7) || defined(CONFIG_IMX8M) || defined(CONFIG_IMX8)
207 switch (get_boot_device()) {
208 /* for MMC return either RAW or FAT mode */
209 case SD1_BOOT:
210 case SD2_BOOT:
211 case SD3_BOOT:
Harald Seilerd81a6892020-04-23 13:07:53 +0200212 if (IS_ENABLED(CONFIG_SPL_FS_FAT))
Harald Seiler5fc5bac2020-04-23 13:07:52 +0200213 return MMCSD_MODE_FS;
214 else
215 return MMCSD_MODE_RAW;
Peng Fan9d86dbd2019-10-16 10:24:25 +0000216 case MMC1_BOOT:
217 case MMC2_BOOT:
218 case MMC3_BOOT:
Harald Seilerd81a6892020-04-23 13:07:53 +0200219 if (IS_ENABLED(CONFIG_SPL_FS_FAT))
Harald Seiler5fc5bac2020-04-23 13:07:52 +0200220 return MMCSD_MODE_FS;
221 else if (IS_ENABLED(CONFIG_SUPPORT_EMMC_BOOT))
222 return MMCSD_MODE_EMMCBOOT;
223 else
224 return MMCSD_MODE_RAW;
Peng Fan9d86dbd2019-10-16 10:24:25 +0000225 default:
226 puts("spl: ERROR: unsupported device\n");
227 hang();
228 }
229#else
Lukasz Majewski772b5572019-09-09 15:32:13 +0200230 switch (boot_device) {
Fabio Estevam03390862018-02-15 12:41:40 -0200231 /* for MMC return either RAW or FAT mode */
232 case BOOT_DEVICE_MMC1:
233 case BOOT_DEVICE_MMC2:
Peng Fanf5417962018-12-21 06:21:23 +0000234 case BOOT_DEVICE_MMC2_2:
Harald Seiler5fc5bac2020-04-23 13:07:52 +0200235 if (IS_ENABLED(CONFIG_SPL_FS_FAT))
236 return MMCSD_MODE_FS;
237 else if (IS_ENABLED(CONFIG_SUPPORT_EMMC_BOOT))
238 return MMCSD_MODE_EMMCBOOT;
239 else
240 return MMCSD_MODE_RAW;
Fabio Estevam03390862018-02-15 12:41:40 -0200241 default:
242 puts("spl: ERROR: unsupported device\n");
243 hang();
244 }
Peng Fan9d86dbd2019-10-16 10:24:25 +0000245#endif
Fabio Estevam03390862018-02-15 12:41:40 -0200246}
247#endif
248
Stefano Babicd714a752019-09-20 08:47:53 +0200249#if defined(CONFIG_IMX_HAB)
Sven Ebenfeld15b505b2016-11-06 16:37:55 +0100250
Bryan O'Donoghuec5800b22018-01-12 12:40:01 +0000251/*
252 * +------------+ 0x0 (DDR_UIMAGE_START) -
253 * | Header | |
254 * +------------+ 0x40 |
255 * | | |
256 * | | |
257 * | | |
258 * | | |
259 * | Image Data | |
260 * . | |
261 * . | > Stuff to be authenticated ----+
262 * . | | |
263 * | | | |
264 * | | | |
265 * +------------+ | |
266 * | | | |
267 * | Fill Data | | |
268 * | | | |
269 * +------------+ Align to ALIGN_SIZE | |
270 * | IVT | | |
271 * +------------+ + IVT_SIZE - |
272 * | | |
273 * | CSF DATA | <---------------------------------------------------------+
274 * | |
275 * +------------+
276 * | |
277 * | Fill Data |
278 * | |
279 * +------------+ + CSF_PAD_SIZE
280 */
281
Sven Ebenfeld15b505b2016-11-06 16:37:55 +0100282__weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
283{
284 typedef void __noreturn (*image_entry_noargs_t)(void);
Bryan O'Donoghuec5800b22018-01-12 12:40:01 +0000285 uint32_t offset;
Sven Ebenfeld15b505b2016-11-06 16:37:55 +0100286
287 image_entry_noargs_t image_entry =
288 (image_entry_noargs_t)(unsigned long)spl_image->entry_point;
289
Tom Rini4386feb2017-01-11 10:45:48 -0500290 debug("image entry point: 0x%lX\n", spl_image->entry_point);
Sven Ebenfeld15b505b2016-11-06 16:37:55 +0100291
Ye Lie246bfc2018-11-17 09:10:25 +0000292 if (spl_image->flags & SPL_FIT_FOUND) {
Sven Ebenfeld15b505b2016-11-06 16:37:55 +0100293 image_entry();
294 } else {
Ye Lie246bfc2018-11-17 09:10:25 +0000295 /*
296 * HAB looks for the CSF at the end of the authenticated
297 * data therefore, we need to subtract the size of the
298 * CSF from the actual filesize
299 */
300 offset = spl_image->size - CONFIG_CSF_SIZE;
301 if (!imx_hab_authenticate_image(spl_image->load_addr,
302 offset + IVT_SIZE +
303 CSF_PAD_SIZE, offset)) {
304 image_entry();
305 } else {
Marek Vasut1e7a69f2020-05-30 20:29:00 +0200306 panic("spl: ERROR: image authentication fail\n");
Ye Lie246bfc2018-11-17 09:10:25 +0000307 }
308 }
309}
310
Ricardo Salveti01fc7e72019-09-02 18:18:52 -0300311#if !defined(CONFIG_SPL_FIT_SIGNATURE)
Ye Lie246bfc2018-11-17 09:10:25 +0000312ulong board_spl_fit_size_align(ulong size)
313{
314 /*
315 * HAB authenticate_image requests the IVT offset is
316 * aligned to 0x1000
317 */
318
319 size = ALIGN(size, 0x1000);
320 size += CONFIG_CSF_SIZE;
321
322 return size;
323}
324
Alexandru Gagniucefc4ad0bc2021-01-20 10:46:49 -0600325void board_spl_fit_post_load(const void *fit)
Ye Lie246bfc2018-11-17 09:10:25 +0000326{
Alexandru Gagniucefc4ad0bc2021-01-20 10:46:49 -0600327 u32 offset = ALIGN(fdt_totalsize(fit), 0x1000);
Ye Lie246bfc2018-11-17 09:10:25 +0000328
Alexandru Gagniucefc4ad0bc2021-01-20 10:46:49 -0600329 if (imx_hab_authenticate_image((uintptr_t)fit,
Ye Lie246bfc2018-11-17 09:10:25 +0000330 offset + IVT_SIZE + CSF_PAD_SIZE,
331 offset)) {
Marek Vasut1e7a69f2020-05-30 20:29:00 +0200332 panic("spl: ERROR: image authentication unsuccessful\n");
Sven Ebenfeld15b505b2016-11-06 16:37:55 +0100333 }
334}
Ricardo Salveti01fc7e72019-09-02 18:18:52 -0300335#endif
Sven Ebenfeld15b505b2016-11-06 16:37:55 +0100336
337#endif
Jagan Teki46668df2017-08-28 16:45:47 +0530338
339#if defined(CONFIG_MX6) && defined(CONFIG_SPL_OS_BOOT)
340int dram_init_banksize(void)
341{
342 gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
343 gd->bd->bi_dram[0].size = imx_ddr_size();
344
345 return 0;
346}
347#endif
Heiko Schocher9de35442021-08-06 06:44:27 +0200348
349/*
350 * read the address where the IVT header must sit
351 * from IVT image header, loaded from SPL into
352 * an malloced buffer and copy the IVT header
353 * to this address
354 */
355void *spl_load_simple_fit_fix_load(const void *fit)
356{
357 struct ivt *ivt;
358 unsigned long new;
359 unsigned long offset;
360 unsigned long size;
361 u8 *tmp = (u8 *)fit;
362
363 offset = ALIGN(fdt_totalsize(fit), 0x1000);
364 size = ALIGN(fdt_totalsize(fit), 4);
365 size = board_spl_fit_size_align(size);
366 tmp += offset;
367 ivt = (struct ivt *)tmp;
368 if (ivt->hdr.magic != IVT_HEADER_MAGIC) {
369 debug("no IVT header found\n");
370 return (void *)fit;
371 }
372 debug("%s: ivt: %p offset: %lx size: %lx\n", __func__, ivt, offset, size);
373 debug("%s: ivt self: %x\n", __func__, ivt->self);
374 new = ivt->self;
375 new -= offset;
376 debug("%s: new %lx\n", __func__, new);
377 memcpy((void *)new, fit, size);
378
379 return (void *)new;
380}