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 10*548b3ee7SSimon Glass static int spl_nor_load_image(struct spl_boot_device *bootdev) 1133d34646SStefan Roese { 127e0f2267SMarek Vasut int ret; 1333d34646SStefan Roese /* 1433d34646SStefan Roese * Loading of the payload to SDRAM is done with skipping of 1533d34646SStefan Roese * the mkimage header in this SPL NOR driver 1633d34646SStefan Roese */ 1733d34646SStefan Roese spl_image.flags |= SPL_COPY_PAYLOAD_ONLY; 1833d34646SStefan Roese 199f9d8704SMasahiro Yamada #ifdef CONFIG_SPL_OS_BOOT 209f9d8704SMasahiro Yamada if (!spl_start_uboot()) { 21b9ea0c3aSHeiko Schocher const struct image_header *header; 229f9d8704SMasahiro Yamada 239f9d8704SMasahiro Yamada /* 249f9d8704SMasahiro Yamada * Load Linux from its location in NOR flash to its defined 259f9d8704SMasahiro Yamada * location in SDRAM 269f9d8704SMasahiro Yamada */ 279f9d8704SMasahiro Yamada header = (const struct image_header *)CONFIG_SYS_OS_BASE; 289f9d8704SMasahiro Yamada 299f9d8704SMasahiro Yamada if (image_get_os(header) == IH_OS_LINUX) { 309f9d8704SMasahiro Yamada /* happy - was a Linux */ 319f9d8704SMasahiro Yamada 3271316c1dSSimon Glass ret = spl_parse_image_header(&spl_image, header); 337e0f2267SMarek Vasut if (ret) 347e0f2267SMarek Vasut return ret; 359f9d8704SMasahiro Yamada 369f9d8704SMasahiro Yamada memcpy((void *)spl_image.load_addr, 379f9d8704SMasahiro Yamada (void *)(CONFIG_SYS_OS_BASE + 389f9d8704SMasahiro Yamada sizeof(struct image_header)), 399f9d8704SMasahiro Yamada spl_image.size); 409f9d8704SMasahiro Yamada 419f9d8704SMasahiro Yamada /* 429f9d8704SMasahiro Yamada * Copy DT blob (fdt) to SDRAM. Passing pointer to 435aa79f26SMike Looijmans * flash doesn't work 449f9d8704SMasahiro Yamada */ 459f9d8704SMasahiro Yamada memcpy((void *)CONFIG_SYS_SPL_ARGS_ADDR, 469f9d8704SMasahiro Yamada (void *)(CONFIG_SYS_FDT_BASE), 475aa79f26SMike Looijmans CONFIG_SYS_FDT_SIZE); 489f9d8704SMasahiro Yamada 4936afd451SNikita Kiryanov return 0; 509f9d8704SMasahiro Yamada } else { 519f9d8704SMasahiro Yamada puts("The Expected Linux image was not found.\n" 529f9d8704SMasahiro Yamada "Please check your NOR configuration.\n" 539f9d8704SMasahiro Yamada "Trying to start u-boot now...\n"); 549f9d8704SMasahiro Yamada } 559f9d8704SMasahiro Yamada } 569f9d8704SMasahiro Yamada #endif 579f9d8704SMasahiro Yamada 5833d34646SStefan Roese /* 5933d34646SStefan Roese * Load real U-Boot from its location in NOR flash to its 6033d34646SStefan Roese * defined location in SDRAM 6133d34646SStefan Roese */ 6271316c1dSSimon Glass ret = spl_parse_image_header(&spl_image, 6333d34646SStefan Roese (const struct image_header *)CONFIG_SYS_UBOOT_BASE); 647e0f2267SMarek Vasut if (ret) 657e0f2267SMarek Vasut return ret; 6633d34646SStefan Roese 6770e6428dSMasahiro Yamada memcpy((void *)(unsigned long)spl_image.load_addr, 689f9d8704SMasahiro Yamada (void *)(CONFIG_SYS_UBOOT_BASE + sizeof(struct image_header)), 6933d34646SStefan Roese spl_image.size); 7036afd451SNikita Kiryanov 7136afd451SNikita Kiryanov return 0; 7233d34646SStefan Roese } 73*548b3ee7SSimon Glass SPL_LOAD_IMAGE_METHOD(0, BOOT_DEVICE_NOR, spl_nor_load_image); 74