Merge git://git.denx.de/u-boot-x86
[oweals/u-boot.git] / common / spl / spl_spi.c
index df460467298843b1f107c091620124e09c37e7ed..9b74473377f36e4d88eb066d9e2b4d4a6bf6bdbf 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * Copyright (C) 2011 OMICRON electronics GmbH
  *
- * based on drivers/mtd/nand/nand_spl_load.c
+ * based on drivers/mtd/nand/raw/nand_spl_load.c
  *
  * Copyright (C) 2011
  * Heiko Schocher, DENX Software Engineering, hs@denx.de.
@@ -28,7 +28,7 @@ static int spi_load_image_os(struct spl_image_info *spl_image,
        int err;
 
        /* Read for a header, parse or error out. */
-       spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS, 0x40,
+       spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS, sizeof(*header),
                       (void *)header);
 
        if (image_get_magic(header) != IH_MAGIC)
@@ -77,6 +77,8 @@ static int spl_spi_load_image(struct spl_image_info *spl_image,
 
        /*
         * Load U-Boot image from SPI flash into RAM
+        * In DM mode: defaults speed and mode will be
+        * taken from DT when available
         */
 
        flash = spi_flash_probe(CONFIG_SF_DEFAULT_BUS,
@@ -88,8 +90,7 @@ static int spl_spi_load_image(struct spl_image_info *spl_image,
                return -ENODEV;
        }
 
-       /* use CONFIG_SYS_TEXT_BASE as temporary storage area */
-       header = (struct image_header *)(CONFIG_SYS_TEXT_BASE);
+       header = spl_get_load_buffer(-sizeof(*header), sizeof(*header));
 
 #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
        payload_offs = fdtdec_get_config_int(gd->fdt_blob,
@@ -102,7 +103,7 @@ static int spl_spi_load_image(struct spl_image_info *spl_image,
 #endif
        {
                /* Load u-boot, mkimage header is 64 bytes. */
-               err = spi_flash_read(flash, payload_offs, 0x40,
+               err = spi_flash_read(flash, payload_offs, sizeof(*header),
                                     (void *)header);
                if (err) {
                        debug("%s: Failed to read from SPI flash (err=%d)\n",
@@ -110,8 +111,17 @@ static int spl_spi_load_image(struct spl_image_info *spl_image,
                        return err;
                }
 
-               if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
-                       image_get_magic(header) == FDT_MAGIC) {
+               if (IS_ENABLED(CONFIG_SPL_LOAD_FIT_FULL) &&
+                   image_get_magic(header) == FDT_MAGIC) {
+                       err = spi_flash_read(flash, payload_offs,
+                                            roundup(fdt_totalsize(header), 4),
+                                            (void *)CONFIG_SYS_LOAD_ADDR);
+                       if (err)
+                               return err;
+                       err = spl_parse_image_header(spl_image,
+                                       (struct image_header *)CONFIG_SYS_LOAD_ADDR);
+               } else if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
+                          image_get_magic(header) == FDT_MAGIC) {
                        struct spl_load_info load;
 
                        debug("Found FIT\n");