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 189f9d8704SMasahiro Yamada #ifdef CONFIG_SPL_OS_BOOT 199f9d8704SMasahiro Yamada if (!spl_start_uboot()) { 20*b9ea0c3aSHeiko Schocher const struct image_header *header; 219f9d8704SMasahiro Yamada 229f9d8704SMasahiro Yamada /* 239f9d8704SMasahiro Yamada * Load Linux from its location in NOR flash to its defined 249f9d8704SMasahiro Yamada * location in SDRAM 259f9d8704SMasahiro Yamada */ 269f9d8704SMasahiro Yamada header = (const struct image_header *)CONFIG_SYS_OS_BASE; 279f9d8704SMasahiro Yamada 289f9d8704SMasahiro Yamada if (image_get_os(header) == IH_OS_LINUX) { 299f9d8704SMasahiro Yamada /* happy - was a Linux */ 309f9d8704SMasahiro Yamada 319f9d8704SMasahiro Yamada spl_parse_image_header(header); 329f9d8704SMasahiro Yamada 339f9d8704SMasahiro Yamada memcpy((void *)spl_image.load_addr, 349f9d8704SMasahiro Yamada (void *)(CONFIG_SYS_OS_BASE + 359f9d8704SMasahiro Yamada sizeof(struct image_header)), 369f9d8704SMasahiro Yamada spl_image.size); 379f9d8704SMasahiro Yamada 389f9d8704SMasahiro Yamada /* 399f9d8704SMasahiro Yamada * Copy DT blob (fdt) to SDRAM. Passing pointer to 409f9d8704SMasahiro Yamada * flash doesn't work (16 KiB should be enough for DT) 419f9d8704SMasahiro Yamada */ 429f9d8704SMasahiro Yamada memcpy((void *)CONFIG_SYS_SPL_ARGS_ADDR, 439f9d8704SMasahiro Yamada (void *)(CONFIG_SYS_FDT_BASE), 449f9d8704SMasahiro Yamada (16 << 10)); 459f9d8704SMasahiro Yamada 469f9d8704SMasahiro Yamada return; 479f9d8704SMasahiro Yamada } else { 489f9d8704SMasahiro Yamada puts("The Expected Linux image was not found.\n" 499f9d8704SMasahiro Yamada "Please check your NOR configuration.\n" 509f9d8704SMasahiro Yamada "Trying to start u-boot now...\n"); 519f9d8704SMasahiro Yamada } 529f9d8704SMasahiro Yamada } 539f9d8704SMasahiro Yamada #endif 549f9d8704SMasahiro 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, 639f9d8704SMasahiro Yamada (void *)(CONFIG_SYS_UBOOT_BASE + sizeof(struct image_header)), 6433d34646SStefan Roese spl_image.size); 6533d34646SStefan Roese } 66