1 /* 2 * Copyright (C) 2011 OMICRON electronics GmbH 3 * 4 * based on drivers/mtd/nand/raw/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 * In DM mode: defaults speed and mode will be 82 * taken from DT when available 83 */ 84 85 flash = spi_flash_probe(CONFIG_SF_DEFAULT_BUS, 86 CONFIG_SF_DEFAULT_CS, 87 CONFIG_SF_DEFAULT_SPEED, 88 CONFIG_SF_DEFAULT_MODE); 89 if (!flash) { 90 puts("SPI probe failed.\n"); 91 return -ENODEV; 92 } 93 94 /* use CONFIG_SYS_TEXT_BASE as temporary storage area */ 95 header = (struct image_header *)(CONFIG_SYS_TEXT_BASE); 96 97 #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA) 98 payload_offs = fdtdec_get_config_int(gd->fdt_blob, 99 "u-boot,spl-payload-offset", 100 payload_offs); 101 #endif 102 103 #ifdef CONFIG_SPL_OS_BOOT 104 if (spl_start_uboot() || spi_load_image_os(spl_image, flash, header)) 105 #endif 106 { 107 /* Load u-boot, mkimage header is 64 bytes. */ 108 err = spi_flash_read(flash, payload_offs, 0x40, 109 (void *)header); 110 if (err) { 111 debug("%s: Failed to read from SPI flash (err=%d)\n", 112 __func__, err); 113 return err; 114 } 115 116 #ifdef CONFIG_SPL_FIT_IMAGE_MULTIPLE 117 if ((IS_ENABLED(CONFIG_SPL_LOAD_FIT) && 118 image_get_magic(header) == FDT_MAGIC) || 119 CONFIG_SPL_FIT_IMAGE_MULTIPLE > 1) { 120 #else 121 if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) && 122 image_get_magic(header) == FDT_MAGIC) { 123 #endif 124 struct spl_load_info load; 125 126 debug("Found FIT\n"); 127 load.dev = flash; 128 load.priv = NULL; 129 load.filename = NULL; 130 load.bl_len = 1; 131 load.read = spl_spi_fit_read; 132 err = spl_load_simple_fit(spl_image, &load, 133 payload_offs, 134 header); 135 } else { 136 err = spl_parse_image_header(spl_image, header); 137 if (err) 138 return err; 139 err = spi_flash_read(flash, payload_offs, 140 spl_image->size, 141 (void *)spl_image->load_addr); 142 } 143 } 144 145 return err; 146 } 147 /* Use priorty 1 so that boards can override this */ 148 SPL_LOAD_IMAGE_METHOD("SPI", 1, BOOT_DEVICE_SPI, spl_spi_load_image); 149