]>
Commit | Line | Data |
---|---|---|
32b11273 CR |
1 | /* |
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 | * | |
1a459660 | 9 | * SPDX-License-Identifier: GPL-2.0+ |
32b11273 CR |
10 | */ |
11 | ||
12 | #include <common.h> | |
13 | #include <spi_flash.h> | |
a4cc1c48 | 14 | #include <spl.h> |
32b11273 | 15 | |
fa1a73fa TR |
16 | #ifdef CONFIG_SPL_OS_BOOT |
17 | /* | |
18 | * Load the kernel, check for a valid header we can parse, and if found load | |
19 | * the kernel and then device tree. | |
20 | */ | |
21 | static int spi_load_image_os(struct spi_flash *flash, | |
22 | struct image_header *header) | |
23 | { | |
24 | /* Read for a header, parse or error out. */ | |
25 | spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS, 0x40, | |
26 | (void *)header); | |
27 | ||
28 | if (image_get_magic(header) != IH_MAGIC) | |
29 | return -1; | |
30 | ||
31 | spl_parse_image_header(header); | |
32 | ||
33 | spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS, | |
34 | spl_image.size, (void *)spl_image.load_addr); | |
35 | ||
36 | /* Read device tree. */ | |
37 | spi_flash_read(flash, CONFIG_SYS_SPI_ARGS_OFFS, | |
38 | CONFIG_SYS_SPI_ARGS_SIZE, | |
39 | (void *)CONFIG_SYS_SPL_ARGS_ADDR); | |
40 | ||
41 | return 0; | |
42 | } | |
43 | #endif | |
44 | ||
32b11273 CR |
45 | /* |
46 | * The main entry for SPI booting. It's necessary that SDRAM is already | |
47 | * configured and available since this code loads the main U-Boot image | |
48 | * from SPI into SDRAM and starts it from there. | |
49 | */ | |
a4cc1c48 | 50 | void spl_spi_load_image(void) |
32b11273 CR |
51 | { |
52 | struct spi_flash *flash; | |
a4cc1c48 | 53 | struct image_header *header; |
32b11273 CR |
54 | |
55 | /* | |
56 | * Load U-Boot image from SPI flash into RAM | |
57 | */ | |
58 | ||
88e34e5f NK |
59 | flash = spi_flash_probe(CONFIG_SF_DEFAULT_BUS, |
60 | CONFIG_SF_DEFAULT_CS, | |
61 | CONFIG_SF_DEFAULT_SPEED, | |
62 | CONFIG_SF_DEFAULT_MODE); | |
32b11273 | 63 | if (!flash) { |
a4cc1c48 | 64 | puts("SPI probe failed.\n"); |
32b11273 CR |
65 | hang(); |
66 | } | |
67 | ||
a4cc1c48 TR |
68 | /* use CONFIG_SYS_TEXT_BASE as temporary storage area */ |
69 | header = (struct image_header *)(CONFIG_SYS_TEXT_BASE); | |
32b11273 | 70 | |
fa1a73fa TR |
71 | #ifdef CONFIG_SPL_OS_BOOT |
72 | if (spl_start_uboot() || spi_load_image_os(flash, header)) | |
73 | #endif | |
74 | { | |
75 | /* Load u-boot, mkimage header is 64 bytes. */ | |
76 | spi_flash_read(flash, CONFIG_SYS_SPI_U_BOOT_OFFS, 0x40, | |
77 | (void *)header); | |
78 | spl_parse_image_header(header); | |
79 | spi_flash_read(flash, CONFIG_SYS_SPI_U_BOOT_OFFS, | |
80 | spl_image.size, (void *)spl_image.load_addr); | |
81 | } | |
32b11273 | 82 | } |