133d34646SStefan Roese /* 233d34646SStefan Roese * Copyright (C) 2012 Stefan Roese <sr@denx.de> 333d34646SStefan Roese * 41a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 533d34646SStefan Roese */ 633d34646SStefan Roese 733d34646SStefan Roese #include <common.h> 833d34646SStefan Roese #include <spl.h> 933d34646SStefan Roese 1033d34646SStefan Roese void spl_nor_load_image(void) 1133d34646SStefan Roese { 1233d34646SStefan Roese /* 1333d34646SStefan Roese * Loading of the payload to SDRAM is done with skipping of 1433d34646SStefan Roese * the mkimage header in this SPL NOR driver 1533d34646SStefan Roese */ 1633d34646SStefan Roese spl_image.flags |= SPL_COPY_PAYLOAD_ONLY; 1733d34646SStefan Roese 18*9f9d8704SMasahiro Yamada #ifdef CONFIG_SPL_OS_BOOT 19*9f9d8704SMasahiro Yamada if (!spl_start_uboot()) { 20*9f9d8704SMasahiro Yamada struct image_header *header; 21*9f9d8704SMasahiro Yamada 22*9f9d8704SMasahiro Yamada /* 23*9f9d8704SMasahiro Yamada * Load Linux from its location in NOR flash to its defined 24*9f9d8704SMasahiro Yamada * location in SDRAM 25*9f9d8704SMasahiro Yamada */ 26*9f9d8704SMasahiro Yamada header = (const struct image_header *)CONFIG_SYS_OS_BASE; 27*9f9d8704SMasahiro Yamada 28*9f9d8704SMasahiro Yamada if (image_get_os(header) == IH_OS_LINUX) { 29*9f9d8704SMasahiro Yamada /* happy - was a Linux */ 30*9f9d8704SMasahiro Yamada 31*9f9d8704SMasahiro Yamada spl_parse_image_header(header); 32*9f9d8704SMasahiro Yamada 33*9f9d8704SMasahiro Yamada memcpy((void *)spl_image.load_addr, 34*9f9d8704SMasahiro Yamada (void *)(CONFIG_SYS_OS_BASE + 35*9f9d8704SMasahiro Yamada sizeof(struct image_header)), 36*9f9d8704SMasahiro Yamada spl_image.size); 37*9f9d8704SMasahiro Yamada 38*9f9d8704SMasahiro Yamada /* 39*9f9d8704SMasahiro Yamada * Copy DT blob (fdt) to SDRAM. Passing pointer to 40*9f9d8704SMasahiro Yamada * flash doesn't work (16 KiB should be enough for DT) 41*9f9d8704SMasahiro Yamada */ 42*9f9d8704SMasahiro Yamada memcpy((void *)CONFIG_SYS_SPL_ARGS_ADDR, 43*9f9d8704SMasahiro Yamada (void *)(CONFIG_SYS_FDT_BASE), 44*9f9d8704SMasahiro Yamada (16 << 10)); 45*9f9d8704SMasahiro Yamada 46*9f9d8704SMasahiro Yamada return; 47*9f9d8704SMasahiro Yamada } else { 48*9f9d8704SMasahiro Yamada puts("The Expected Linux image was not found.\n" 49*9f9d8704SMasahiro Yamada "Please check your NOR configuration.\n" 50*9f9d8704SMasahiro Yamada "Trying to start u-boot now...\n"); 51*9f9d8704SMasahiro Yamada } 52*9f9d8704SMasahiro Yamada } 53*9f9d8704SMasahiro Yamada #endif 54*9f9d8704SMasahiro Yamada 5533d34646SStefan Roese /* 5633d34646SStefan Roese * Load real U-Boot from its location in NOR flash to its 5733d34646SStefan Roese * defined location in SDRAM 5833d34646SStefan Roese */ 5933d34646SStefan Roese spl_parse_image_header( 6033d34646SStefan Roese (const struct image_header *)CONFIG_SYS_UBOOT_BASE); 6133d34646SStefan Roese 6233d34646SStefan Roese memcpy((void *)spl_image.load_addr, 63*9f9d8704SMasahiro Yamada (void *)(CONFIG_SYS_UBOOT_BASE + sizeof(struct image_header)), 6433d34646SStefan Roese spl_image.size); 6533d34646SStefan Roese } 66