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 * 9 * SPDX-License-Identifier: GPL-2.0+ 10 */ 11 12 #include <common.h> 13 #include <spi.h> 14 #include <spi_flash.h> 15 #include <errno.h> 16 #include <spl.h> 17 18 DECLARE_GLOBAL_DATA_PTR; 19 20 #ifdef CONFIG_SPL_OS_BOOT 21 /* 22 * Load the kernel, check for a valid header we can parse, and if found load 23 * the kernel and then device tree. 24 */ 25 static int spi_load_image_os(struct spl_image_info *spl_image, 26 struct spi_flash *flash, 27 struct image_header *header) 28 { 29 int err; 30 31 /* Read for a header, parse or error out. */ 32 spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS, 0x40, 33 (void *)header); 34 35 if (image_get_magic(header) != IH_MAGIC) 36 return -1; 37 38 err = spl_parse_image_header(spl_image, header); 39 if (err) 40 return err; 41 42 spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS, 43 spl_image->size, (void *)spl_image->load_addr); 44 45 /* Read device tree. */ 46 spi_flash_read(flash, CONFIG_SYS_SPI_ARGS_OFFS, 47 CONFIG_SYS_SPI_ARGS_SIZE, 48 (void *)CONFIG_SYS_SPL_ARGS_ADDR); 49 50 return 0; 51 } 52 #endif 53 54 static ulong spl_spi_fit_read(struct spl_load_info *load, ulong sector, 55 ulong count, void *buf) 56 { 57 struct spi_flash *flash = load->dev; 58 ulong ret; 59 60 ret = spi_flash_read(flash, sector, count, buf); 61 if (!ret) 62 return count; 63 else 64 return 0; 65 } 66 /* 67 * The main entry for SPI booting. It's necessary that SDRAM is already 68 * configured and available since this code loads the main U-Boot image 69 * from SPI into SDRAM and starts it from there. 70 */ 71 static int spl_spi_load_image(struct spl_image_info *spl_image, 72 struct spl_boot_device *bootdev) 73 { 74 int err = 0; 75 unsigned payload_offs = CONFIG_SYS_SPI_U_BOOT_OFFS; 76 struct spi_flash *flash; 77 struct image_header *header; 78 79 /* 80 * Load U-Boot image from SPI flash into RAM 81 */ 82 83 flash = spi_flash_probe(CONFIG_SF_DEFAULT_BUS, 84 CONFIG_SF_DEFAULT_CS, 85 CONFIG_SF_DEFAULT_SPEED, 86 CONFIG_SF_DEFAULT_MODE); 87 if (!flash) { 88 puts("SPI probe failed.\n"); 89 return -ENODEV; 90 } 91 92 /* use CONFIG_SYS_TEXT_BASE as temporary storage area */ 93 header = (struct image_header *)(CONFIG_SYS_TEXT_BASE); 94 95 #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA) 96 payload_offs = fdtdec_get_config_int(gd->fdt_blob, 97 "u-boot,spl-payload-offset", 98 payload_offs); 99 #endif 100 101 #ifdef CONFIG_SPL_OS_BOOT 102 if (spl_start_uboot() || spi_load_image_os(spl_image, flash, header)) 103 #endif 104 { 105 /* Load u-boot, mkimage header is 64 bytes. */ 106 err = spi_flash_read(flash, payload_offs, 0x40, 107 (void *)header); 108 if (err) { 109 debug("%s: Failed to read from SPI flash (err=%d)\n", 110 __func__, err); 111 return err; 112 } 113 114 if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) && 115 image_get_magic(header) == FDT_MAGIC) { 116 struct spl_load_info load; 117 118 debug("Found FIT\n"); 119 load.dev = flash; 120 load.priv = NULL; 121 load.filename = NULL; 122 load.bl_len = 1; 123 load.read = spl_spi_fit_read; 124 err = spl_load_simple_fit(spl_image, &load, 125 payload_offs, 126 header); 127 } else { 128 err = spl_parse_image_header(spl_image, header); 129 if (err) 130 return err; 131 err = spi_flash_read(flash, payload_offs, 132 spl_image->size, 133 (void *)spl_image->load_addr); 134 } 135 } 136 137 return err; 138 } 139 /* Use priorty 1 so that boards can override this */ 140 SPL_LOAD_IMAGE_METHOD("SPI", 1, BOOT_DEVICE_SPI, spl_spi_load_image); 141