SPL: Add XIP booting support

Enable support for XIP (execute in place) of U-Boot or kernel image. There is
no need to copy image from flash to ram if flash supports execute in place.

Signed-off-by: Vikas Manocha <vikas.manocha@st.com>
Reviewed-by: Alexandru Gagniuc <alex.g@adaptrum.com>
This commit is contained in:
Vikas Manocha 2017-05-28 12:55:11 -07:00 committed by Tom Rini
parent b97476965b
commit c6d9e9dbc3
4 changed files with 39 additions and 0 deletions

View File

@ -29,6 +29,7 @@ enum {
BOOT_DEVICE_I2C,
BOOT_DEVICE_BOARD,
BOOT_DEVICE_DFU,
BOOT_DEVICE_XIP,
BOOT_DEVICE_NONE
};
#endif

View File

@ -437,6 +437,15 @@ config SPL_NOR_SUPPORT
a memory-mapped device makes it very easy to access. Loading from
NOR is typically achieved with just a memcpy().
config SPL_XIP_SUPPORT
bool "Support XIP"
depends on SPL
help
Enable support for execute in place of U-Boot or kernel image. There
is no need to copy image from flash to ram if flash supports execute
in place. Its very useful in systems having enough flash but not
enough ram to load the image.
config SPL_ONENAND_SUPPORT
bool "Support OneNAND flash"
help

View File

@ -12,6 +12,7 @@ ifdef CONFIG_SPL_BUILD
obj-$(CONFIG_SPL_FRAMEWORK) += spl.o
obj-$(CONFIG_SPL_LOAD_FIT) += spl_fit.o
obj-$(CONFIG_SPL_NOR_SUPPORT) += spl_nor.o
obj-$(CONFIG_SPL_XIP_SUPPORT) += spl_xip.o
obj-$(CONFIG_SPL_YMODEM_SUPPORT) += spl_ymodem.o
ifndef CONFIG_SPL_UBI
obj-$(CONFIG_SPL_NAND_SUPPORT) += spl_nand.o

28
common/spl/spl_xip.c Normal file
View File

@ -0,0 +1,28 @@
/*
* Copyright (C) 2017 Vikas Manocha <vikas.manocha@st.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <spl.h>
static int spl_xip(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev)
{
#ifdef CONFIG_SPL_OS_BOOT
if (!spl_start_uboot()) {
spl_image->arg = (void *)CONFIG_SYS_FDT_BASE;
spl_image->name = "Linux";
spl_image->os = IH_OS_LINUX;
spl_image->load_addr = CONFIG_SYS_LOAD_ADDR;
spl_image->entry_point = CONFIG_SYS_LOAD_ADDR;
debug("spl: payload xipImage, load addr: 0x%lx\n",
spl_image->load_addr);
return 0;
}
#endif
return(spl_parse_image_header(spl_image, (const struct image_header *)
CONFIG_SYS_UBOOT_BASE));
}
SPL_LOAD_IMAGE_METHOD("XIP", 0, BOOT_DEVICE_XIP, spl_xip);