1*fdf8529aSYing Zhang /* 2*fdf8529aSYing Zhang * Copyright 2013 Freescale Semiconductor, Inc. 3*fdf8529aSYing Zhang * 4*fdf8529aSYing Zhang * This program is free software; you can redistribute it and/or 5*fdf8529aSYing Zhang * modify it under the terms of the GNU General Public License as 6*fdf8529aSYing Zhang * published by the Free Software Foundation; either version 2 of 7*fdf8529aSYing Zhang * the License, or (at your option) any later version. 8*fdf8529aSYing Zhang * 9*fdf8529aSYing Zhang * This program is distributed in the hope that it will be useful, 10*fdf8529aSYing Zhang * but WITHOUT ANY WARRANTY; without even the implied warranty of 11*fdf8529aSYing Zhang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12*fdf8529aSYing Zhang * 13*fdf8529aSYing Zhang * GNU General Public License for more details. 14*fdf8529aSYing Zhang * 15*fdf8529aSYing Zhang * You should have received a copy of the GNU General Public License 16*fdf8529aSYing Zhang * along with this program; if not, write to the Free Software 17*fdf8529aSYing Zhang * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 18*fdf8529aSYing Zhang * MA 02111-1307 USA 19*fdf8529aSYing Zhang * 20*fdf8529aSYing Zhang */ 21*fdf8529aSYing Zhang 22*fdf8529aSYing Zhang #include <common.h> 23*fdf8529aSYing Zhang #include <spi_flash.h> 24*fdf8529aSYing Zhang #include <malloc.h> 25*fdf8529aSYing Zhang 26*fdf8529aSYing Zhang #define ESPI_BOOT_IMAGE_SIZE 0x48 27*fdf8529aSYing Zhang #define ESPI_BOOT_IMAGE_ADDR 0x50 28*fdf8529aSYing Zhang #define CONFIG_CFG_DATA_SECTOR 0 29*fdf8529aSYing Zhang 30*fdf8529aSYing Zhang /* 31*fdf8529aSYing Zhang * The main entry for SPI booting. It's necessary that SDRAM is already 32*fdf8529aSYing Zhang * configured and available since this code loads the main U-Boot image 33*fdf8529aSYing Zhang * from SPI into SDRAM and starts it from there. 34*fdf8529aSYing Zhang */ 35*fdf8529aSYing Zhang void spi_boot(void) 36*fdf8529aSYing Zhang { 37*fdf8529aSYing Zhang void (*uboot)(void) __noreturn; 38*fdf8529aSYing Zhang u32 offset, code_len; 39*fdf8529aSYing Zhang unsigned char *buf = NULL; 40*fdf8529aSYing Zhang struct spi_flash *flash; 41*fdf8529aSYing Zhang 42*fdf8529aSYing Zhang flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS, 43*fdf8529aSYing Zhang CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE); 44*fdf8529aSYing Zhang if (flash == NULL) { 45*fdf8529aSYing Zhang puts("\nspi_flash_probe failed"); 46*fdf8529aSYing Zhang hang(); 47*fdf8529aSYing Zhang } 48*fdf8529aSYing Zhang 49*fdf8529aSYing Zhang /* 50*fdf8529aSYing Zhang * Load U-Boot image from SPI flash into RAM 51*fdf8529aSYing Zhang */ 52*fdf8529aSYing Zhang buf = malloc(flash->page_size); 53*fdf8529aSYing Zhang if (buf == NULL) { 54*fdf8529aSYing Zhang puts("\nmalloc failed"); 55*fdf8529aSYing Zhang hang(); 56*fdf8529aSYing Zhang } 57*fdf8529aSYing Zhang memset(buf, 0, flash->page_size); 58*fdf8529aSYing Zhang 59*fdf8529aSYing Zhang spi_flash_read(flash, CONFIG_CFG_DATA_SECTOR, 60*fdf8529aSYing Zhang flash->page_size, (void *)buf); 61*fdf8529aSYing Zhang offset = *(u32 *)(buf + ESPI_BOOT_IMAGE_ADDR); 62*fdf8529aSYing Zhang /* Skip spl code */ 63*fdf8529aSYing Zhang offset += CONFIG_SYS_SPI_FLASH_U_BOOT_OFFS; 64*fdf8529aSYing Zhang /* Get the code size from offset 0x48 */ 65*fdf8529aSYing Zhang code_len = *(u32 *)(buf + ESPI_BOOT_IMAGE_SIZE); 66*fdf8529aSYing Zhang /* Skip spl code */ 67*fdf8529aSYing Zhang code_len = code_len - CONFIG_SPL_MAX_SIZE; 68*fdf8529aSYing Zhang /* copy code to DDR */ 69*fdf8529aSYing Zhang spi_flash_read(flash, offset, code_len, 70*fdf8529aSYing Zhang (void *)CONFIG_SYS_SPI_FLASH_U_BOOT_DST); 71*fdf8529aSYing Zhang /* 72*fdf8529aSYing Zhang * Jump to U-Boot image 73*fdf8529aSYing Zhang */ 74*fdf8529aSYing Zhang flush_cache(CONFIG_SYS_SPI_FLASH_U_BOOT_DST, code_len); 75*fdf8529aSYing Zhang uboot = (void *)CONFIG_SYS_SPI_FLASH_U_BOOT_START; 76*fdf8529aSYing Zhang (*uboot)(); 77*fdf8529aSYing Zhang } 78