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*2a2ee2acSSimon Glass static int spl_nor_load_image(struct spl_image_info *spl_image, 11*2a2ee2acSSimon Glass struct spl_boot_device *bootdev) 1233d34646SStefan Roese { 137e0f2267SMarek Vasut int ret; 1433d34646SStefan Roese /* 1533d34646SStefan Roese * Loading of the payload to SDRAM is done with skipping of 1633d34646SStefan Roese * the mkimage header in this SPL NOR driver 1733d34646SStefan Roese */ 18*2a2ee2acSSimon Glass spl_image->flags |= SPL_COPY_PAYLOAD_ONLY; 1933d34646SStefan Roese 209f9d8704SMasahiro Yamada #ifdef CONFIG_SPL_OS_BOOT 219f9d8704SMasahiro Yamada if (!spl_start_uboot()) { 22b9ea0c3aSHeiko Schocher const struct image_header *header; 239f9d8704SMasahiro Yamada 249f9d8704SMasahiro Yamada /* 259f9d8704SMasahiro Yamada * Load Linux from its location in NOR flash to its defined 269f9d8704SMasahiro Yamada * location in SDRAM 279f9d8704SMasahiro Yamada */ 289f9d8704SMasahiro Yamada header = (const struct image_header *)CONFIG_SYS_OS_BASE; 299f9d8704SMasahiro Yamada 309f9d8704SMasahiro Yamada if (image_get_os(header) == IH_OS_LINUX) { 319f9d8704SMasahiro Yamada /* happy - was a Linux */ 329f9d8704SMasahiro Yamada 33*2a2ee2acSSimon Glass ret = spl_parse_image_header(spl_image, header); 347e0f2267SMarek Vasut if (ret) 357e0f2267SMarek Vasut return ret; 369f9d8704SMasahiro Yamada 37*2a2ee2acSSimon Glass memcpy((void *)spl_image->load_addr, 389f9d8704SMasahiro Yamada (void *)(CONFIG_SYS_OS_BASE + 399f9d8704SMasahiro Yamada sizeof(struct image_header)), 40*2a2ee2acSSimon Glass spl_image->size); 419f9d8704SMasahiro Yamada 429f9d8704SMasahiro Yamada /* 439f9d8704SMasahiro Yamada * Copy DT blob (fdt) to SDRAM. Passing pointer to 445aa79f26SMike Looijmans * flash doesn't work 459f9d8704SMasahiro Yamada */ 469f9d8704SMasahiro Yamada memcpy((void *)CONFIG_SYS_SPL_ARGS_ADDR, 479f9d8704SMasahiro Yamada (void *)(CONFIG_SYS_FDT_BASE), 485aa79f26SMike Looijmans CONFIG_SYS_FDT_SIZE); 499f9d8704SMasahiro Yamada 5036afd451SNikita Kiryanov return 0; 519f9d8704SMasahiro Yamada } else { 529f9d8704SMasahiro Yamada puts("The Expected Linux image was not found.\n" 539f9d8704SMasahiro Yamada "Please check your NOR configuration.\n" 549f9d8704SMasahiro Yamada "Trying to start u-boot now...\n"); 559f9d8704SMasahiro Yamada } 569f9d8704SMasahiro Yamada } 579f9d8704SMasahiro Yamada #endif 589f9d8704SMasahiro Yamada 5933d34646SStefan Roese /* 6033d34646SStefan Roese * Load real U-Boot from its location in NOR flash to its 6133d34646SStefan Roese * defined location in SDRAM 6233d34646SStefan Roese */ 63*2a2ee2acSSimon Glass ret = spl_parse_image_header(spl_image, 6433d34646SStefan Roese (const struct image_header *)CONFIG_SYS_UBOOT_BASE); 657e0f2267SMarek Vasut if (ret) 667e0f2267SMarek Vasut return ret; 6733d34646SStefan Roese 68*2a2ee2acSSimon Glass memcpy((void *)(unsigned long)spl_image->load_addr, 699f9d8704SMasahiro Yamada (void *)(CONFIG_SYS_UBOOT_BASE + sizeof(struct image_header)), 70*2a2ee2acSSimon Glass spl_image->size); 7136afd451SNikita Kiryanov 7236afd451SNikita Kiryanov return 0; 7333d34646SStefan Roese } 74548b3ee7SSimon Glass SPL_LOAD_IMAGE_METHOD(0, BOOT_DEVICE_NOR, spl_nor_load_image); 75