blob: 2e0c871219bd05ac31c63a80ba793e1dc1255899 [file] [log] [blame]
Christian Riesch23f16a82011-12-09 09:47:35 +00001/*
2 * Copyright (C) 2011 OMICRON electronics GmbH
3 *
4 * based on drivers/mtd/nand/nand_spl_load.c
5 *
6 * Copyright (C) 2011
7 * Heiko Schocher, DENX Software Engineering, hs@denx.de.
8 *
Wolfgang Denkd79de1d2013-07-08 09:37:19 +02009 * SPDX-License-Identifier: GPL-2.0+
Christian Riesch23f16a82011-12-09 09:47:35 +000010 */
11
12#include <common.h>
Simon Glassd34b4562014-10-13 23:42:04 -060013#include <spi.h>
Christian Riesch23f16a82011-12-09 09:47:35 +000014#include <spi_flash.h>
Tom Rini1e2abf92012-08-14 14:34:10 -070015#include <spl.h>
Christian Riesch23f16a82011-12-09 09:47:35 +000016
Tom Rinid4cdb7a2014-04-03 07:52:55 -040017#ifdef CONFIG_SPL_OS_BOOT
18/*
19 * Load the kernel, check for a valid header we can parse, and if found load
20 * the kernel and then device tree.
21 */
22static int spi_load_image_os(struct spi_flash *flash,
23 struct image_header *header)
24{
25 /* Read for a header, parse or error out. */
26 spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS, 0x40,
27 (void *)header);
28
29 if (image_get_magic(header) != IH_MAGIC)
30 return -1;
31
32 spl_parse_image_header(header);
33
34 spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS,
35 spl_image.size, (void *)spl_image.load_addr);
36
37 /* Read device tree. */
38 spi_flash_read(flash, CONFIG_SYS_SPI_ARGS_OFFS,
39 CONFIG_SYS_SPI_ARGS_SIZE,
40 (void *)CONFIG_SYS_SPL_ARGS_ADDR);
41
42 return 0;
43}
44#endif
45
Christian Riesch23f16a82011-12-09 09:47:35 +000046/*
47 * The main entry for SPI booting. It's necessary that SDRAM is already
48 * configured and available since this code loads the main U-Boot image
49 * from SPI into SDRAM and starts it from there.
50 */
Tom Rini1e2abf92012-08-14 14:34:10 -070051void spl_spi_load_image(void)
Christian Riesch23f16a82011-12-09 09:47:35 +000052{
53 struct spi_flash *flash;
Tom Rini1e2abf92012-08-14 14:34:10 -070054 struct image_header *header;
Christian Riesch23f16a82011-12-09 09:47:35 +000055
56 /*
57 * Load U-Boot image from SPI flash into RAM
58 */
59
Nikita Kiryanov6c6ccdf2014-08-20 15:08:48 +030060 flash = spi_flash_probe(CONFIG_SF_DEFAULT_BUS,
61 CONFIG_SF_DEFAULT_CS,
62 CONFIG_SF_DEFAULT_SPEED,
63 CONFIG_SF_DEFAULT_MODE);
Christian Riesch23f16a82011-12-09 09:47:35 +000064 if (!flash) {
Tom Rini1e2abf92012-08-14 14:34:10 -070065 puts("SPI probe failed.\n");
Christian Riesch23f16a82011-12-09 09:47:35 +000066 hang();
67 }
68
Tom Rini1e2abf92012-08-14 14:34:10 -070069 /* use CONFIG_SYS_TEXT_BASE as temporary storage area */
70 header = (struct image_header *)(CONFIG_SYS_TEXT_BASE);
Christian Riesch23f16a82011-12-09 09:47:35 +000071
Tom Rinid4cdb7a2014-04-03 07:52:55 -040072#ifdef CONFIG_SPL_OS_BOOT
73 if (spl_start_uboot() || spi_load_image_os(flash, header))
74#endif
75 {
76 /* Load u-boot, mkimage header is 64 bytes. */
77 spi_flash_read(flash, CONFIG_SYS_SPI_U_BOOT_OFFS, 0x40,
78 (void *)header);
79 spl_parse_image_header(header);
80 spi_flash_read(flash, CONFIG_SYS_SPI_U_BOOT_OFFS,
81 spl_image.size, (void *)spl_image.load_addr);
82 }
Christian Riesch23f16a82011-12-09 09:47:35 +000083}