diff options
| -rw-r--r-- | README | 3 | ||||
| -rw-r--r-- | board/technexion/twister/twister.c | 8 | ||||
| -rw-r--r-- | board/technexion/twister/twister.h | 2 | ||||
| -rw-r--r-- | board/timll/devkit8000/devkit8000.c | 8 | ||||
| -rw-r--r-- | board/timll/devkit8000/devkit8000.h | 3 | ||||
| -rw-r--r-- | common/cmd_bootm.c | 167 | ||||
| -rw-r--r-- | common/cmd_nand.c | 2 | ||||
| -rw-r--r-- | common/cmd_spl.c | 12 | ||||
| -rw-r--r-- | common/env_nand.c | 18 | ||||
| -rw-r--r-- | doc/README.falcon | 209 | ||||
| -rw-r--r-- | drivers/mtd/nand/nand_util.c | 19 | ||||
| -rw-r--r-- | include/configs/devkit8000.h | 1 | ||||
| -rw-r--r-- | include/configs/twister.h | 1 | 
13 files changed, 427 insertions, 26 deletions
@@ -842,7 +842,8 @@ The following options need to be configured:  		CONFIG_CMD_I2C		* I2C serial bus support  		CONFIG_CMD_IDE		* IDE harddisk support  		CONFIG_CMD_IMI		  iminfo -		CONFIG_CMD_IMLS		  List all found images +		CONFIG_CMD_IMLS		  List all images found in NOR flash +		CONFIG_CMD_IMLS_NAND	  List all images found in NAND flash  		CONFIG_CMD_IMMAP	* IMMR dump support  		CONFIG_CMD_IMPORTENV	* import an environment  		CONFIG_CMD_INI		* import data from an ini file into the env diff --git a/board/technexion/twister/twister.c b/board/technexion/twister/twister.c index c9eea9b30..fa0ace019 100644 --- a/board/technexion/twister/twister.c +++ b/board/technexion/twister/twister.c @@ -165,10 +165,10 @@ void spl_board_prepare_for_linux(void)  int spl_start_uboot(void)  {  	int val = 0; -	if (!gpio_request(CONFIG_SPL_OS_BOOT_KEY, "U-Boot key")) { -		gpio_direction_input(CONFIG_SPL_OS_BOOT_KEY); -		val = gpio_get_value(CONFIG_SPL_OS_BOOT_KEY); -		gpio_free(CONFIG_SPL_OS_BOOT_KEY); +	if (!gpio_request(SPL_OS_BOOT_KEY, "U-Boot key")) { +		gpio_direction_input(SPL_OS_BOOT_KEY); +		val = gpio_get_value(SPL_OS_BOOT_KEY); +		gpio_free(SPL_OS_BOOT_KEY);  	}  	return val;  } diff --git a/board/technexion/twister/twister.h b/board/technexion/twister/twister.h index a2051c004..cff479c07 100644 --- a/board/technexion/twister/twister.h +++ b/board/technexion/twister/twister.h @@ -38,6 +38,8 @@ const omap3_sysinfo sysinfo = {  #define XR16L2751_UART1_BASE	0x21000000  #define XR16L2751_UART2_BASE	0x23000000 +/* GPIO used to select between U-Boot and kernel */ +#define SPL_OS_BOOT_KEY	55  /*   * IEN  - Input Enable diff --git a/board/timll/devkit8000/devkit8000.c b/board/timll/devkit8000/devkit8000.c index 85685ee7c..b88d9783c 100644 --- a/board/timll/devkit8000/devkit8000.c +++ b/board/timll/devkit8000/devkit8000.c @@ -172,10 +172,10 @@ void spl_board_prepare_for_linux(void)  int spl_start_uboot(void)  {  	int val = 0; -	if (!gpio_request(CONFIG_SPL_OS_BOOT_KEY, "U-Boot key")) { -		gpio_direction_input(CONFIG_SPL_OS_BOOT_KEY); -		val = gpio_get_value(CONFIG_SPL_OS_BOOT_KEY); -		gpio_free(CONFIG_SPL_OS_BOOT_KEY); +	if (!gpio_request(SPL_OS_BOOT_KEY, "U-Boot key")) { +		gpio_direction_input(SPL_OS_BOOT_KEY); +		val = gpio_get_value(SPL_OS_BOOT_KEY); +		gpio_free(SPL_OS_BOOT_KEY);  	}  	return !val;  } diff --git a/board/timll/devkit8000/devkit8000.h b/board/timll/devkit8000/devkit8000.h index aa69e6c96..c1965e270 100644 --- a/board/timll/devkit8000/devkit8000.h +++ b/board/timll/devkit8000/devkit8000.h @@ -32,6 +32,9 @@ const omap3_sysinfo sysinfo = {  	"NAND",  }; +/* GPIO used to select between U-Boot and kernel */ +#define SPL_OS_BOOT_KEY	26 +  /*   * IEN  - Input Enable   * IDIS - Input Disable diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index f0338babe..1312a0db8 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -79,9 +79,15 @@ static int image_info(unsigned long addr);  #include <flash.h>  #include <mtd/cfi_flash.h>  extern flash_info_t flash_info[]; /* info for FLASH chips */ +#endif + +#if defined(CONFIG_CMD_IMLS) || defined(CONFIG_CMD_IMLS_NAND)  static int do_imls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);  #endif +#include <linux/err.h> +#include <nand.h> +  #ifdef CONFIG_SILENT_CONSOLE  static void fixup_silent_linux(void);  #endif @@ -1192,7 +1198,7 @@ U_BOOT_CMD(  /* imls - list all images found in flash */  /*******************************************************************/  #if defined(CONFIG_CMD_IMLS) -static int do_imls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +static int do_imls_nor(void)  {  	flash_info_t *info;  	int i, j; @@ -1241,6 +1247,161 @@ next_sector:		;  		}  next_bank:	;  	} +	return 0; +} +#endif + +#if defined(CONFIG_CMD_IMLS_NAND) +static int nand_imls_legacyimage(nand_info_t *nand, int nand_dev, loff_t off, +		size_t len) +{ +	void *imgdata; +	int ret; + +	imgdata = malloc(len); +	if (!imgdata) { +		printf("May be a Legacy Image at NAND device %d offset %08llX:\n", +				nand_dev, off); +		printf("   Low memory(cannot allocate memory for image)\n"); +		return -ENOMEM; +	} + +	ret = nand_read_skip_bad(nand, off, &len, +			imgdata); +	if (ret < 0 && ret != -EUCLEAN) { +		free(imgdata); +		return ret; +	} + +	if (!image_check_hcrc(imgdata)) { +		free(imgdata); +		return 0; +	} + +	printf("Legacy Image at NAND device %d offset %08llX:\n", +			nand_dev, off); +	image_print_contents(imgdata); + +	puts("   Verifying Checksum ... "); +	if (!image_check_dcrc(imgdata)) +		puts("Bad Data CRC\n"); +	else +		puts("OK\n"); + +	free(imgdata); + +	return 0; +} + +static int nand_imls_fitimage(nand_info_t *nand, int nand_dev, loff_t off, +		size_t len) +{ +	void *imgdata; +	int ret; + +	imgdata = malloc(len); +	if (!imgdata) { +		printf("May be a FIT Image at NAND device %d offset %08llX:\n", +				nand_dev, off); +		printf("   Low memory(cannot allocate memory for image)\n"); +		return -ENOMEM; +	} + +	ret = nand_read_skip_bad(nand, off, &len, +			imgdata); +	if (ret < 0 && ret != -EUCLEAN) { +		free(imgdata); +		return ret; +	} + +	if (!fit_check_format(imgdata)) { +		free(imgdata); +		return 0; +	} + +	printf("FIT Image at NAND device %d offset %08llX:\n", nand_dev, off); + +	fit_print_contents(imgdata); +	free(imgdata); + +	return 0; +} + +static int do_imls_nand(void) +{ +	nand_info_t *nand; +	int nand_dev = nand_curr_device; +	size_t len; +	loff_t off; +	u32 buffer[16]; + +	if (nand_dev < 0 || nand_dev >= CONFIG_SYS_MAX_NAND_DEVICE) { +		puts("\nNo NAND devices available\n"); +		return -ENODEV; +	} + +	printf("\n"); + +	for (nand_dev = 0; nand_dev < CONFIG_SYS_MAX_NAND_DEVICE; nand_dev++) { +		nand = &nand_info[nand_dev]; +		if (!nand->name || !nand->size) +			continue; + +		for (off = 0; off < nand->size; off += nand->erasesize) { +			const image_header_t *header; +			int ret; + +			if (nand_block_isbad(nand, off)) +				continue; + +			len = sizeof(buffer); + +			ret = nand_read(nand, off, &len, (u8 *)buffer); +			if (ret < 0 && ret != -EUCLEAN) { +				printf("NAND read error %d at offset %08llX\n", +						ret, off); +				continue; +			} + +			switch (genimg_get_format(buffer)) { +			case IMAGE_FORMAT_LEGACY: +				header = (const image_header_t *)buffer; + +				len = image_get_image_size(header); +				nand_imls_legacyimage(nand, nand_dev, off, len); +				break; +#if defined(CONFIG_FIT) +			case IMAGE_FORMAT_FIT: +				len = fit_get_size(buffer); +				nand_imls_fitimage(nand, nand_dev, off, len); +				break; +#endif +			} +		} +	} + +	return 0; +} +#endif + +#if defined(CONFIG_CMD_IMLS) || defined(CONFIG_CMD_IMLS_NAND) +static int do_imls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ +	int ret_nor = 0, ret_nand = 0; + +#if defined(CONFIG_CMD_IMLS) +	ret_nor = do_imls_nor(); +#endif + +#if defined(CONFIG_CMD_IMLS_NAND) +	ret_nand = do_imls_nand(); +#endif + +	if (ret_nor) +		return ret_nor; + +	if (ret_nand) +		return ret_nand;  	return (0);  } @@ -1249,8 +1410,8 @@ U_BOOT_CMD(  	imls,	1,		1,	do_imls,  	"list all images found in flash",  	"\n" -	"    - Prints information about all images found at sector\n" -	"      boundaries in flash." +	"    - Prints information about all images found at sector/block\n" +	"      boundaries in nor/nand flash."  );  #endif diff --git a/common/cmd_nand.c b/common/cmd_nand.c index 1568594ca..495610c40 100644 --- a/common/cmd_nand.c +++ b/common/cmd_nand.c @@ -608,7 +608,7 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  		size_t rwsize;  		ulong pagecount = 1;  		int read; -		int raw; +		int raw = 0;  		if (argc < 4)  			goto usage; diff --git a/common/cmd_spl.c b/common/cmd_spl.c index e3c543b46..94b0a1715 100644 --- a/common/cmd_spl.c +++ b/common/cmd_spl.c @@ -184,7 +184,11 @@ static int do_spl(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  U_BOOT_CMD(  	spl, 6 , 1, do_spl, "SPL configuration", -	"export <img=atags|fdt> [kernel_addr] [initrd_addr] " -	"[fdt_addr if <img> = fdt] - export a kernel parameter image\n" -	"\t initrd_img can be set to \"-\" if fdt_addr without initrd img is" -	"used"); +	"export <img=atags|fdt> [kernel_addr] [initrd_addr] [fdt_addr]\n" +	"\timg\t\t\"atags\" or \"fdt\"\n" +	"\tkernel_addr\taddress where a kernel image is stored.\n" +	"\t\t\tkernel is loaded as part of the boot process, but it is not started.\n" +	"\tinitrd_addr\taddress of initial ramdisk\n" +	"\t\t\tcan be set to \"-\" if fdt_addr without initrd_addr is used.\n" +	"\tfdt_addr\tin case of fdt, the address of the device tree.\n" +	); diff --git a/common/env_nand.c b/common/env_nand.c index 22e72a20b..5b69889c0 100644 --- a/common/env_nand.c +++ b/common/env_nand.c @@ -331,6 +331,7 @@ int get_nand_env_oob(nand_info_t *nand, unsigned long *result)  void env_relocate_spec(void)  {  #if !defined(ENV_IS_EMBEDDED) +	int read1_fail = 0, read2_fail = 0;  	int crc1_ok = 0, crc2_ok = 0;  	env_t *ep, *tmp_env1, *tmp_env2; @@ -342,14 +343,19 @@ void env_relocate_spec(void)  		goto done;  	} -	if (readenv(CONFIG_ENV_OFFSET, (u_char *) tmp_env1)) -		puts("No Valid Environment Area found\n"); +	read1_fail = readenv(CONFIG_ENV_OFFSET, (u_char *) tmp_env1); +	read2_fail = readenv(CONFIG_ENV_OFFSET_REDUND, (u_char *) tmp_env2); -	if (readenv(CONFIG_ENV_OFFSET_REDUND, (u_char *) tmp_env2)) -		puts("No Valid Redundant Environment Area found\n"); +	if (read1_fail && read2_fail) +		puts("*** Error - No Valid Environment Area found\n"); +	else if (read1_fail || read2_fail) +		puts("*** Warning - some problems detected " +		     "reading environment; recovered successfully\n"); -	crc1_ok = crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc; -	crc2_ok = crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc; +	crc1_ok = !read1_fail && +		(crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc); +	crc2_ok = !read2_fail && +		(crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc);  	if (!crc1_ok && !crc2_ok) {  		set_default_env("!bad CRC"); diff --git a/doc/README.falcon b/doc/README.falcon new file mode 100644 index 000000000..93e855d20 --- /dev/null +++ b/doc/README.falcon @@ -0,0 +1,209 @@ +U-Boot Falcon Mode +==================== + +Introduction +------------ + +This document provides an overview of how to add support for Falcon Mode +to a board. + +Falcon Mode is introduced to speed up the booting process, allowing +to boot a Linux kernel (or whatever image) without a full blown U-Boot. + +Falcon Mode relies on the SPL framework. In fact, to make booting faster, +U-Boot is split into two parts: the SPL (Secondary Program Loader) and U-Boot +image. In most implementations, SPL is used to start U-Boot when booting from +a mass storage, such as NAND or SD-Card. SPL has now support for other media, +and can generally be seen as a way to start an image performing the minimum +required initialization. SPL mainly initializes the RAM controller, and then +copies U-Boot image into the memory. + +The Falcon Mode extends this way allowing to start the Linux kernel directly +from SPL. A new command is added to U-Boot to prepare the parameters that SPL +must pass to the kernel, using ATAGS or Device Tree. + +In normal mode, these parameters are generated each time before +loading the kernel, passing to Linux the address in memory where +the parameters can be read. +With Falcon Mode, this snapshot can be saved into persistent storage and SPL is +informed to load it before running the kernel. + +To boot the kernel, these steps under a Falcon-aware U-Boot are required: + +1. Boot the board into U-Boot. +Use the "spl export" command to generate the kernel parameters area or the DT. +U-Boot runs as when it boots the kernel, but stops before passing the control +to the kernel. + +2. Save the prepared snapshot into persistent media. +The address where to save it must be configured into board configuration +file (CONFIG_CMD_SPL_NAND_OFS for NAND). + +3. Boot the board into Falcon Mode. SPL will load the kernel and copy +the parameters which are saved in the persistent area to the required address. + +It is required to implement a custom mechanism to select if SPL loads U-Boot +or another image. + +The value of a GPIO is a simple way to operate the selection, as well as +reading a character from the SPL console if CONFIG_SPL_CONSOLE is set. + +Falcon Mode is generally activated by setting CONFIG_SPL_OS_BOOT. This tells +SPL that U-Boot is not the only available image that SPL is able to start. + +Configuration +---------------------------- +CONFIG_CMD_SPL		Enable the "spl export" command. +			The command "spl export" is then available in U-Boot +			mode +CONFIG_SYS_SPL_ARGS_ADDR	Address in RAM where the parameters must be +				copied by SPL. +				In most cases, it is <start_of_ram> + 0x100 + +CONFIG_SYS_NAND_SPL_KERNEL_OFFS	Offset in NAND where the kernel is stored + +CONFIG_CMD_SPL_NAND_OFS	Offset in NAND where the parameters area was saved. + +CONFIG_CMD_SPL_WRITE_SIZE 	Size of the parameters area to be copied + +CONFIG_SPL_OS_BOOT	Activate Falcon Mode. + +Function that a board must implement +------------------------------------ + +void spl_board_prepare_for_linux(void) : optional +	Called from SPL before starting the kernel + +spl_start_uboot() : required +		Returns "0" if SPL should start the kernel, "1" if U-Boot +		must be started. + + +Using spl command +----------------- + +spl - SPL configuration + +Usage: + +spl export <img=atags|fdt> [kernel_addr] [initrd_addr] [fdt_addr ] + +img		: "atags" or "fdt" +kernel_addr	: kernel is loaded as part of the boot process, but it is not started. +		  This is the address where a kernel image is stored. +initrd_addr	: Address of initial ramdisk +		  can be set to "-" if fdt_addr without initrd_addr is used +fdt_addr	: in case of fdt, the address of the device tree. + +The spl export command does not write to a storage media. The user is +responsible to transfer the gathered information (assembled ATAGS list +or prepared FDT) from temporary storage in RAM into persistant storage +after each run of 'spl export'. Unfortunately the position of temporary +storage can not be predicted nor provided at commandline, it depends +highly on your system setup and your provided data (ATAGS or FDT). +However at the end of an succesful 'spl export' run it will print the +RAM address of temporary storage. +Now the user have to save the generated BLOB from that printed address +to the pre-defined address in persistent storage +(CONFIG_CMD_SPL_NAND_OFS in case of NAND). +The following example shows how to prepare the data for Falcon Mode on +twister board with ATAGS BLOB. + +The "spl export" command is prepared to work with ATAGS and FDT. However, +using FDT is at the moment untested. The ppc port (see a3m071 example +later) prepares the fdt blob with the fdt command instead. + + +Usage on the twister board: +-------------------------------- + +Using mtd names with the following (default) configuration +for mtdparts: + +device nand0 <omap2-nand.0>, # parts = 9 + #: name		size		offset		mask_flags + 0: MLO                 0x00080000      0x00000000      0 + 1: u-boot              0x00100000      0x00080000      0 + 2: env1                0x00040000      0x00180000      0 + 3: env2                0x00040000      0x001c0000      0 + 4: kernel              0x00600000      0x00200000      0 + 5: bootparms           0x00040000      0x00800000      0 + 6: splashimg           0x00200000      0x00840000      0 + 7: mini                0x02800000      0x00a40000      0 + 8: rootfs              0x1cdc0000      0x03240000      0 + + +twister => nand read 82000000 kernel + +NAND read: device 0 offset 0x200000, size 0x600000 + 6291456 bytes read: OK + +Now the kernel is in RAM at address 0x82000000 + +twister => spl export atags 0x82000000 +## Booting kernel from Legacy Image at 82000000 ... +   Image Name:   Linux-3.5.0-rc4-14089-gda0b7f4 +   Image Type:   ARM Linux Kernel Image (uncompressed) +   Data Size:    3654808 Bytes = 3.5 MiB +   Load Address: 80008000 +   Entry Point:  80008000 +   Verifying Checksum ... OK +   Loading Kernel Image ... OK +OK +cmdline subcommand not supported +bdt subcommand not supported +Argument image is now in RAM at: 0x80000100 + +The result can be checked at address 0x80000100: + +twister => md 0x80000100 +80000100: 00000005 54410001 00000000 00000000    ......AT........ +80000110: 00000000 00000067 54410009 746f6f72    ....g.....ATroot +80000120: 65642f3d 666e2f76 77722073 73666e20    =/dev/nfs rw nfs + +The parameters generated with this step can be saved into NAND at the offset +0x800000 (value for twister for CONFIG_CMD_SPL_NAND_OFS) + +nand erase.part bootparms +nand write 0x80000100 bootparms 0x4000 + +Now the parameters are stored into the NAND flash at the address +CONFIG_CMD_SPL_NAND_OFS (=0x800000). + +Next time, the board can be started into Falcon Mode moving the +setting the gpio (on twister gpio 55 is used) to kernel mode. + +The kernel is loaded directly by the SPL without passing through U-Boot. + +Example with FDT: a3m071 board +------------------------------- + +To boot the Linux kernel from the SPL, the DT blob (fdt) needs to get +prepard/patched first. U-Boot usually inserts some dynamic values into +the DT binary (blob), e.g. autodetected memory size, MAC addresses, +clocks speeds etc. To generate this patched DT blob, you can use +the following command: + +1. Load fdt blob to SDRAM: +=> tftp 1800000 a3m071/a3m071.dtb + +2. Set bootargs as desired for Linux booting (e.g. flash_mtd): +=> run mtdargs addip2 addtty + +3. Use "fdt" commands to patch the DT blob: +=> fdt addr 1800000 +=> fdt boardsetup +=> fdt chosen + +4. Display patched DT blob (optional): +=> fdt print + +5. Save fdt to NOR flash: +=> erase fc060000 fc07ffff +=> cp.b 1800000 fc060000 10000 +... + + +Falcon Mode was presented at the RMLL 2012. Slides are available at: + +http://schedule2012.rmll.info/IMG/pdf/LSM2012_UbootFalconMode_Babic.pdf diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c index 2ba0c5ef9..ff2d34830 100644 --- a/drivers/mtd/nand/nand_util.c +++ b/drivers/mtd/nand/nand_util.c @@ -237,6 +237,14 @@ int nand_lock(struct mtd_info *mtd, int tight)  	/* select the NAND device */  	chip->select_chip(mtd, 0); +	/* check the Lock Tight Status */ +	chip->cmdfunc(mtd, NAND_CMD_LOCK_STATUS, -1, 0); +	if (chip->read_byte(mtd) & NAND_LOCK_STATUS_TIGHT) { +		printf("nand_lock: Device is locked tight!\n"); +		ret = -1; +		goto out; +	} +  	chip->cmdfunc(mtd,  		      (tight ? NAND_CMD_LOCK_TIGHT : NAND_CMD_LOCK),  		      -1, -1); @@ -249,6 +257,7 @@ int nand_lock(struct mtd_info *mtd, int tight)  		ret = -1;  	} + out:  	/* de-select the NAND device */  	chip->select_chip(mtd, -1);  	return ret; @@ -337,6 +346,15 @@ int nand_unlock(struct mtd_info *mtd, loff_t start, size_t length,  		goto out;  	} +	/* check the Lock Tight Status */ +	page = (int)(start >> chip->page_shift); +	chip->cmdfunc(mtd, NAND_CMD_LOCK_STATUS, -1, page & chip->pagemask); +	if (chip->read_byte(mtd) & NAND_LOCK_STATUS_TIGHT) { +		printf("nand_unlock: Device is locked tight!\n"); +		ret = -1; +		goto out; +	} +  	if ((start & (mtd->erasesize - 1)) != 0) {  		printf("nand_unlock: Start address must be beginning of "  			"nand block!\n"); @@ -358,7 +376,6 @@ int nand_unlock(struct mtd_info *mtd, loff_t start, size_t length,  	length -= mtd->erasesize;  	/* submit address of first page to unlock */ -	page = (int)(start >> chip->page_shift);  	chip->cmdfunc(mtd, NAND_CMD_UNLOCK1, -1, page & chip->pagemask);  	/* submit ADDRESS of LAST page to unlock */ diff --git a/include/configs/devkit8000.h b/include/configs/devkit8000.h index d926f7402..788227d79 100644 --- a/include/configs/devkit8000.h +++ b/include/configs/devkit8000.h @@ -354,7 +354,6 @@  /* SPL OS boot options */  #define CONFIG_SPL_OS_BOOT -#define CONFIG_SPL_OS_BOOT_KEY	26  #define CONFIG_CMD_SPL  #define CONFIG_CMD_SPL_WRITE_SIZE       0x400 /* 1024 byte */ diff --git a/include/configs/twister.h b/include/configs/twister.h index a8524816a..4205a11bc 100644 --- a/include/configs/twister.h +++ b/include/configs/twister.h @@ -58,7 +58,6 @@  #define CONFIG_CMD_SPL_NAND_OFS	(CONFIG_SYS_NAND_SPL_KERNEL_OFFS+\  						0x600000)  #define CONFIG_SPL_OS_BOOT -#define CONFIG_SPL_OS_BOOT_KEY	55  #define CONFIG_SYS_SPL_ARGS_ADDR	(PHYS_SDRAM_1 + 0x100)  #define CONFIG_SPL_BOARD_INIT  |