diff mbox

[U-Boot,V3,4/8] omap-common/spl: Add linux boot to SPL

Message ID 1314261196-23197-5-git-send-email-simonschwarzcor@gmail.com
State Superseded
Headers show

Commit Message

Simon Schwarz Aug. 25, 2011, 8:33 a.m. UTC
This adds Linux booting to the SPL

Related CONFIGs:
CONFIG_SPL_OS_BOOT
	Activates/Deactivates the OS booting feature
CONFIG_SPL_OS_BOOT_KEY
	defines the IO-pin number u-boot switch - if pressed u-boot is booted
CONFIG_SYS_SPL_MACHID
	Machine ID of the used board
CONFIG_SYS_NAND_SPL_KERNEL_OFFS
	Offset in NAND of direct boot kernel image to use in SPL
CONFIG_SYS_SPL_ARGS_ADDR
	Address where the kernel boot arguments are expected - this is normaly
	RAM-begin + 0x100

Signed-off-by: Simon Schwarz <simonschwarzcor@gmail.com>
---

V2 changes:
nothing

V3 changes:
nothing
---
 arch/arm/cpu/armv7/omap-common/spl.c |   48 ++++++++++++++++++++++++++++++++-
 include/configs/devkit8000.h         |    7 +++-
 2 files changed, 51 insertions(+), 4 deletions(-)

Comments

Andreas Bießmann Aug. 25, 2011, 11:28 a.m. UTC | #1
Dear Simon,

Am 25.08.2011 10:33, schrieb Simon Schwarz:
> This adds Linux booting to the SPL
> 
> Related CONFIGs:
> CONFIG_SPL_OS_BOOT
> 	Activates/Deactivates the OS booting feature
> CONFIG_SPL_OS_BOOT_KEY
> 	defines the IO-pin number u-boot switch - if pressed u-boot is booted
> CONFIG_SYS_SPL_MACHID
> 	Machine ID of the used board
> CONFIG_SYS_NAND_SPL_KERNEL_OFFS
> 	Offset in NAND of direct boot kernel image to use in SPL
> CONFIG_SYS_SPL_ARGS_ADDR
> 	Address where the kernel boot arguments are expected - this is normaly
> 	RAM-begin + 0x100
> 
> Signed-off-by: Simon Schwarz <simonschwarzcor@gmail.com>
> ---
> 
> V2 changes:
> nothing
> 
> V3 changes:
> nothing
> ---
>  arch/arm/cpu/armv7/omap-common/spl.c |   48 ++++++++++++++++++++++++++++++++-
>  include/configs/devkit8000.h         |    7 +++-
>  2 files changed, 51 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm/cpu/armv7/omap-common/spl.c b/arch/arm/cpu/armv7/omap-common/spl.c
> index c76fea6..9c22c7a 100644
> --- a/arch/arm/cpu/armv7/omap-common/spl.c
> +++ b/arch/arm/cpu/armv7/omap-common/spl.c
> @@ -35,6 +35,7 @@
>  #include <asm/arch/mmc_host_def.h>
>  #include <i2c.h>
>  #include <image.h>
> +#include <asm/omap_gpio.h>
>  
>  DECLARE_GLOBAL_DATA_PTR;
>  
> @@ -63,6 +64,25 @@ void board_init_f(ulong dummy)
>  	relocate_code(CONFIG_SPL_STACK, &gdata, CONFIG_SPL_TEXT_BASE);
>  }
>  
> +#ifdef CONFIG_SPL_OS_BOOT

Is this required? -ffunction-sections and --gc-sections should do he job.

> +/* Return the value of the U-boot key
> + *
> + * RETURN
> + * 0 if not pressed
> + * positiv if pressed
> + */
> +int spl_uboot_key(void)
> +{
> +	int val = 0;
> +	if (!omap_request_gpio(CONFIG_SPL_OS_BOOT_KEY)) {
> +		omap_set_gpio_direction(CONFIG_SPL_OS_BOOT_KEY, 1);
> +		val = omap_get_gpio_datain(CONFIG_SPL_OS_BOOT_KEY);
> +		omap_free_gpio(CONFIG_SPL_OS_BOOT_KEY);
> +	}
> +	return !val;
> +}
> +#endif  /* CONFIG_SPL_OS_BOOT */
> +
>  void spl_parse_image_header(const struct image_header *header)
>  {
>  	u32 header_size = sizeof(struct image_header);
> @@ -90,7 +110,25 @@ void spl_parse_image_header(const struct image_header *header)
>  	}
>  }
>  
> -static void jump_to_image_no_args(void)
> +#ifdef CONFIG_SPL_OS_BOOT

here too.

> +/* This function jumps to an image with argument. Normally an FDT or ATAGS
> + * image.
> + * arg: Pointer to paramter image in RAM
> + */
> +void jump_to_image_linux(void *arg)
> +{
> +	debug("Entering kernel arg pointer: 0x%X\n", arg);
> +	typedef void (*image_entry_arg_t)(int, int, void *)
> +		__attribute__ ((noreturn));
> +	image_entry_arg_t image_entry =
> +		(image_entry_arg_t) spl_image.entry_point;
> +	/* cleanup_before_linux(); */ /*write SPL function for that*/
> +	image_entry(0, CONFIG_SYS_SPL_MACHID, arg);

the MACHID is saved in gd->bd, couldn't this be used here?
BTW: You missed setting CONFIG_SYS_SPL_MACHID in your board
configuration header in this patch. Where is it done?

> +}
> +void jump_to_image_linux(void *) __attribute__ ((noreturn));
> +#endif
> +
> +void jump_to_image_no_args(void)
>  {
>  	typedef void (*image_entry_noargs_t)(void)__attribute__ ((noreturn));
>  	image_entry_noargs_t image_entry =
> @@ -99,8 +137,8 @@ static void jump_to_image_no_args(void)
>  	debug("image entry point: 0x%X\n", spl_image.entry_point);
>  	image_entry();
>  }
> -
>  void jump_to_image_no_args(void) __attribute__ ((noreturn));
> +
>  void board_init_r(gd_t *id, ulong dummy)
>  {
>  	u32 boot_device;
> @@ -134,6 +172,12 @@ void board_init_r(gd_t *id, ulong dummy)
>  		debug("Jumping to U-Boot\n");
>  		jump_to_image_no_args();
>  		break;
> +#ifdef CONFIG_SPL_OS_BOOT
> +	case IH_OS_LINUX:
> +		debug("Jumping to Linux\n");
> +		jump_to_image_linux((void *)CONFIG_SYS_SPL_ARGS_ADDR);
> +		break;
> +#endif
>  	default:
>  		puts("Unsupported OS image.. Jumping nevertheless..\n");
>  		jump_to_image_no_args();
> diff --git a/include/configs/devkit8000.h b/include/configs/devkit8000.h
> index 4d0573c..3897ab4 100644
> --- a/include/configs/devkit8000.h
> +++ b/include/configs/devkit8000.h
> @@ -38,7 +38,7 @@
>  #define CONFIG_OMAP3430		1	/* which is in a 3430 */
>  #define CONFIG_OMAP3_DEVKIT8000	1	/* working with DevKit8000 */
>  
> -#define	CONFIG_SYS_TEXT_BASE	0x80008000
> +#define	CONFIG_SYS_TEXT_BASE	0x80100000
>  
>  #define CONFIG_SDRC	/* The chip has SDRC controller */
>  
> @@ -328,7 +328,7 @@
>  #define CONFIG_SPL_MAX_SIZE		0xB400  /* 45 K */
>  #define CONFIG_SPL_STACK		LOW_LEVEL_SRAM_STACK
>  
> -#define CONFIG_SPL_BSS_START_ADDR	0x80000000 /*CONFIG_SYS_SDRAM_BASE*/
> +#define CONFIG_SPL_BSS_START_ADDR	0x80000500 /* leave space for bootargs*/
>  #define CONFIG_SPL_BSS_MAX_SIZE		0x80000
>  
>  /* NAND boot config */
> @@ -358,6 +358,9 @@
>  #define CONFIG_CMD_SAVEBP_WRITE_SIZE	0x400 /* 1024 byte */
>  #define CONFIG_CMD_SAVEBP_NAND_OFS	(CONFIG_SYS_NAND_SPL_KERNEL_OFFS+\
>  						0x400000)
> +#define CONFIG_SPL_OS_BOOT
> +#define CONFIG_SPL_OS_BOOT_KEY	26
> +#define CONFIG_SYS_SPL_MACHID	MACH_TYPE_DEVKIT8000
>  #define CONFIG_SYS_NAND_SPL_KERNEL_OFFS	0x280000
>  #define CONFIG_SYS_SPL_ARGS_ADDR	(PHYS_SDRAM_1 + 0x100)
>  #endif /* __CONFIG_H */
Simon Schwarz Aug. 26, 2011, 10:17 a.m. UTC | #2
On 08/25/2011 01:28 PM, Andreas Bießmann wrote:
> Dear Simon,
>
> Am 25.08.2011 10:33, schrieb Simon Schwarz:
>> This adds Linux booting to the SPL
>>
>> Related CONFIGs:
>> CONFIG_SPL_OS_BOOT
>> 	Activates/Deactivates the OS booting feature
>> CONFIG_SPL_OS_BOOT_KEY
>> 	defines the IO-pin number u-boot switch - if pressed u-boot is booted
>> CONFIG_SYS_SPL_MACHID
>> 	Machine ID of the used board
>> CONFIG_SYS_NAND_SPL_KERNEL_OFFS
>> 	Offset in NAND of direct boot kernel image to use in SPL
>> CONFIG_SYS_SPL_ARGS_ADDR
>> 	Address where the kernel boot arguments are expected - this is normaly
>> 	RAM-begin + 0x100
>>
>> Signed-off-by: Simon Schwarz<simonschwarzcor@gmail.com>
>> ---
>>
>> V2 changes:
>> nothing
>>
>> V3 changes:
>> nothing
>> ---
>>   arch/arm/cpu/armv7/omap-common/spl.c |   48 ++++++++++++++++++++++++++++++++-
>>   include/configs/devkit8000.h         |    7 +++-
>>   2 files changed, 51 insertions(+), 4 deletions(-)
>>
>> diff --git a/arch/arm/cpu/armv7/omap-common/spl.c b/arch/arm/cpu/armv7/omap-common/spl.c
>> index c76fea6..9c22c7a 100644
>> --- a/arch/arm/cpu/armv7/omap-common/spl.c
>> +++ b/arch/arm/cpu/armv7/omap-common/spl.c
>> @@ -35,6 +35,7 @@
>>   #include<asm/arch/mmc_host_def.h>
>>   #include<i2c.h>
>>   #include<image.h>
>> +#include<asm/omap_gpio.h>
>>
>>   DECLARE_GLOBAL_DATA_PTR;
>>
>> @@ -63,6 +64,25 @@ void board_init_f(ulong dummy)
>>   	relocate_code(CONFIG_SPL_STACK,&gdata, CONFIG_SPL_TEXT_BASE);
>>   }
>>
>> +#ifdef CONFIG_SPL_OS_BOOT
>
> Is this required? -ffunction-sections and --gc-sections should do he job.
>

true. Will change

>> +/* Return the value of the U-boot key
>> + *
>> + * RETURN
>> + * 0 if not pressed
>> + * positiv if pressed
>> + */
>> +int spl_uboot_key(void)
>> +{
>> +	int val = 0;
>> +	if (!omap_request_gpio(CONFIG_SPL_OS_BOOT_KEY)) {
>> +		omap_set_gpio_direction(CONFIG_SPL_OS_BOOT_KEY, 1);
>> +		val = omap_get_gpio_datain(CONFIG_SPL_OS_BOOT_KEY);
>> +		omap_free_gpio(CONFIG_SPL_OS_BOOT_KEY);
>> +	}
>> +	return !val;
>> +}
>> +#endif  /* CONFIG_SPL_OS_BOOT */
>> +
>>   void spl_parse_image_header(const struct image_header *header)
>>   {
>>   	u32 header_size = sizeof(struct image_header);
>> @@ -90,7 +110,25 @@ void spl_parse_image_header(const struct image_header *header)
>>   	}
>>   }
>>
>> -static void jump_to_image_no_args(void)
>> +#ifdef CONFIG_SPL_OS_BOOT
>
> here too.
>
too.

>> +/* This function jumps to an image with argument. Normally an FDT or ATAGS
>> + * image.
>> + * arg: Pointer to paramter image in RAM
>> + */
>> +void jump_to_image_linux(void *arg)
>> +{
>> +	debug("Entering kernel arg pointer: 0x%X\n", arg);
>> +	typedef void (*image_entry_arg_t)(int, int, void *)
>> +		__attribute__ ((noreturn));
>> +	image_entry_arg_t image_entry =
>> +		(image_entry_arg_t) spl_image.entry_point;
>> +	/* cleanup_before_linux(); */ /*write SPL function for that*/
>> +	image_entry(0, CONFIG_SYS_SPL_MACHID, arg);
>
> the MACHID is saved in gd->bd, couldn't this be used here?
> BTW: You missed setting CONFIG_SYS_SPL_MACHID in your board
> configuration header in this patch. Where is it done?
>

In SPL gd is not fully initialized.

CONFIG_SYS_SPL_MACHID is set see below in include/configs/devkit8000.h

>> +}
>> +void jump_to_image_linux(void *) __attribute__ ((noreturn));
>> +#endif
>> +
>> +void jump_to_image_no_args(void)
>>   {
>>   	typedef void (*image_entry_noargs_t)(void)__attribute__ ((noreturn));
>>   	image_entry_noargs_t image_entry =
>> @@ -99,8 +137,8 @@ static void jump_to_image_no_args(void)
>>   	debug("image entry point: 0x%X\n", spl_image.entry_point);
>>   	image_entry();
>>   }
>> -
>>   void jump_to_image_no_args(void) __attribute__ ((noreturn));
>> +
>>   void board_init_r(gd_t *id, ulong dummy)
>>   {
>>   	u32 boot_device;
>> @@ -134,6 +172,12 @@ void board_init_r(gd_t *id, ulong dummy)
>>   		debug("Jumping to U-Boot\n");
>>   		jump_to_image_no_args();
>>   		break;
>> +#ifdef CONFIG_SPL_OS_BOOT
>> +	case IH_OS_LINUX:
>> +		debug("Jumping to Linux\n");
>> +		jump_to_image_linux((void *)CONFIG_SYS_SPL_ARGS_ADDR);
>> +		break;
>> +#endif
>>   	default:
>>   		puts("Unsupported OS image.. Jumping nevertheless..\n");
>>   		jump_to_image_no_args();
>> diff --git a/include/configs/devkit8000.h b/include/configs/devkit8000.h
>> index 4d0573c..3897ab4 100644
>> --- a/include/configs/devkit8000.h
>> +++ b/include/configs/devkit8000.h
>> @@ -38,7 +38,7 @@
>>   #define CONFIG_OMAP3430		1	/* which is in a 3430 */
>>   #define CONFIG_OMAP3_DEVKIT8000	1	/* working with DevKit8000 */
>>
>> -#define	CONFIG_SYS_TEXT_BASE	0x80008000
>> +#define	CONFIG_SYS_TEXT_BASE	0x80100000
>>
>>   #define CONFIG_SDRC	/* The chip has SDRC controller */
>>
>> @@ -328,7 +328,7 @@
>>   #define CONFIG_SPL_MAX_SIZE		0xB400  /* 45 K */
>>   #define CONFIG_SPL_STACK		LOW_LEVEL_SRAM_STACK
>>
>> -#define CONFIG_SPL_BSS_START_ADDR	0x80000000 /*CONFIG_SYS_SDRAM_BASE*/
>> +#define CONFIG_SPL_BSS_START_ADDR	0x80000500 /* leave space for bootargs*/
>>   #define CONFIG_SPL_BSS_MAX_SIZE		0x80000
>>
>>   /* NAND boot config */
>> @@ -358,6 +358,9 @@
>>   #define CONFIG_CMD_SAVEBP_WRITE_SIZE	0x400 /* 1024 byte */
>>   #define CONFIG_CMD_SAVEBP_NAND_OFS	(CONFIG_SYS_NAND_SPL_KERNEL_OFFS+\
>>   						0x400000)
>> +#define CONFIG_SPL_OS_BOOT
>> +#define CONFIG_SPL_OS_BOOT_KEY	26
>> +#define CONFIG_SYS_SPL_MACHID	MACH_TYPE_DEVKIT8000
>>   #define CONFIG_SYS_NAND_SPL_KERNEL_OFFS	0x280000
>>   #define CONFIG_SYS_SPL_ARGS_ADDR	(PHYS_SDRAM_1 + 0x100)
>>   #endif /* __CONFIG_H */
>

Regards, thx for reviewing
Simon
Andreas Bießmann Aug. 26, 2011, 10:45 a.m. UTC | #3
Dear Simon

Am 26.08.2011 12:17, schrieb Simon Schwarz:
> On 08/25/2011 01:28 PM, Andreas Bießmann wrote:
>> Dear Simon,

<snip>

>>> +/* This function jumps to an image with argument. Normally an FDT or
>>> ATAGS
>>> + * image.
>>> + * arg: Pointer to paramter image in RAM
>>> + */
>>> +void jump_to_image_linux(void *arg)
>>> +{
>>> +    debug("Entering kernel arg pointer: 0x%X\n", arg);
>>> +    typedef void (*image_entry_arg_t)(int, int, void *)
>>> +        __attribute__ ((noreturn));
>>> +    image_entry_arg_t image_entry =
>>> +        (image_entry_arg_t) spl_image.entry_point;
>>> +    /* cleanup_before_linux(); */ /*write SPL function for that*/
>>> +    image_entry(0, CONFIG_SYS_SPL_MACHID, arg);
>>
>> the MACHID is saved in gd->bd, couldn't this be used here?
>> BTW: You missed setting CONFIG_SYS_SPL_MACHID in your board
>> configuration header in this patch. Where is it done?
>>
> 
> In SPL gd is not fully initialized.

I see ... but how about using existing CONFIG_MACH_TYPE then?

> CONFIG_SYS_SPL_MACHID is set see below in include/configs/devkit8000.h

Sorry for the noise, did not see it.

regards

Andreas Bießmann
Simon Schwarz Aug. 26, 2011, 11:22 a.m. UTC | #4
Dear Andreas,

On 08/26/2011 12:45 PM, Andreas Bießmann wrote:
> Dear Simon
>
> Am 26.08.2011 12:17, schrieb Simon Schwarz:
>> On 08/25/2011 01:28 PM, Andreas Bießmann wrote:
>>> Dear Simon,
>
> <snip>
>
>>>> +/* This function jumps to an image with argument. Normally an FDT or
>>>> ATAGS
>>>> + * image.
>>>> + * arg: Pointer to paramter image in RAM
>>>> + */
>>>> +void jump_to_image_linux(void *arg)
>>>> +{
>>>> +    debug("Entering kernel arg pointer: 0x%X\n", arg);
>>>> +    typedef void (*image_entry_arg_t)(int, int, void *)
>>>> +        __attribute__ ((noreturn));
>>>> +    image_entry_arg_t image_entry =
>>>> +        (image_entry_arg_t) spl_image.entry_point;
>>>> +    /* cleanup_before_linux(); */ /*write SPL function for that*/
>>>> +    image_entry(0, CONFIG_SYS_SPL_MACHID, arg);
>>>
>>> the MACHID is saved in gd->bd, couldn't this be used here?
>>> BTW: You missed setting CONFIG_SYS_SPL_MACHID in your board
>>> configuration header in this patch. Where is it done?
>>>
>>
>> In SPL gd is not fully initialized.
>
> I see ... but how about using existing CONFIG_MACH_TYPE then?
>

done.

>> CONFIG_SYS_SPL_MACHID is set see below in include/configs/devkit8000.h
>
> Sorry for the noise, did not see it.
>
> regards
>
> Andreas Bießmann
>

regards
Simon
Simon Schwarz Aug. 26, 2011, 4:40 p.m. UTC | #5
On 08/26/2011 01:22 PM, Simon Schwarz wrote:
> Dear Andreas,
>
> On 08/26/2011 12:45 PM, Andreas Bießmann wrote:
>> Dear Simon
>>
>> Am 26.08.2011 12:17, schrieb Simon Schwarz:
>>> On 08/25/2011 01:28 PM, Andreas Bießmann wrote:
>>>> Dear Simon,
>>
>> <snip>
>>
>>>>> +/* This function jumps to an image with argument. Normally an FDT or
>>>>> ATAGS
>>>>> + * image.
>>>>> + * arg: Pointer to paramter image in RAM
>>>>> + */
>>>>> +void jump_to_image_linux(void *arg)
>>>>> +{
>>>>> + debug("Entering kernel arg pointer: 0x%X\n", arg);
>>>>> + typedef void (*image_entry_arg_t)(int, int, void *)
>>>>> + __attribute__ ((noreturn));
>>>>> + image_entry_arg_t image_entry =
>>>>> + (image_entry_arg_t) spl_image.entry_point;
>>>>> + /* cleanup_before_linux(); */ /*write SPL function for that*/
>>>>> + image_entry(0, CONFIG_SYS_SPL_MACHID, arg);
>>>>
>>>> the MACHID is saved in gd->bd, couldn't this be used here?
>>>> BTW: You missed setting CONFIG_SYS_SPL_MACHID in your board
>>>> configuration header in this patch. Where is it done?
>>>>
>>>
>>> In SPL gd is not fully initialized.
>>
>> I see ... but how about using existing CONFIG_MACH_TYPE then?
>>
>
> done.
>
I correct myself: not done.

If I use CONFIG_MACH_TYPE u-boot doesn't boot any more. This seems to be 
a bug in handling this define.

Any ideas on this?

Regards
Simon
diff mbox

Patch

diff --git a/arch/arm/cpu/armv7/omap-common/spl.c b/arch/arm/cpu/armv7/omap-common/spl.c
index c76fea6..9c22c7a 100644
--- a/arch/arm/cpu/armv7/omap-common/spl.c
+++ b/arch/arm/cpu/armv7/omap-common/spl.c
@@ -35,6 +35,7 @@ 
 #include <asm/arch/mmc_host_def.h>
 #include <i2c.h>
 #include <image.h>
+#include <asm/omap_gpio.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -63,6 +64,25 @@  void board_init_f(ulong dummy)
 	relocate_code(CONFIG_SPL_STACK, &gdata, CONFIG_SPL_TEXT_BASE);
 }
 
+#ifdef CONFIG_SPL_OS_BOOT
+/* Return the value of the U-boot key
+ *
+ * RETURN
+ * 0 if not pressed
+ * positiv if pressed
+ */
+int spl_uboot_key(void)
+{
+	int val = 0;
+	if (!omap_request_gpio(CONFIG_SPL_OS_BOOT_KEY)) {
+		omap_set_gpio_direction(CONFIG_SPL_OS_BOOT_KEY, 1);
+		val = omap_get_gpio_datain(CONFIG_SPL_OS_BOOT_KEY);
+		omap_free_gpio(CONFIG_SPL_OS_BOOT_KEY);
+	}
+	return !val;
+}
+#endif  /* CONFIG_SPL_OS_BOOT */
+
 void spl_parse_image_header(const struct image_header *header)
 {
 	u32 header_size = sizeof(struct image_header);
@@ -90,7 +110,25 @@  void spl_parse_image_header(const struct image_header *header)
 	}
 }
 
-static void jump_to_image_no_args(void)
+#ifdef CONFIG_SPL_OS_BOOT
+/* This function jumps to an image with argument. Normally an FDT or ATAGS
+ * image.
+ * arg: Pointer to paramter image in RAM
+ */
+void jump_to_image_linux(void *arg)
+{
+	debug("Entering kernel arg pointer: 0x%X\n", arg);
+	typedef void (*image_entry_arg_t)(int, int, void *)
+		__attribute__ ((noreturn));
+	image_entry_arg_t image_entry =
+		(image_entry_arg_t) spl_image.entry_point;
+	/* cleanup_before_linux(); */ /*write SPL function for that*/
+	image_entry(0, CONFIG_SYS_SPL_MACHID, arg);
+}
+void jump_to_image_linux(void *) __attribute__ ((noreturn));
+#endif
+
+void jump_to_image_no_args(void)
 {
 	typedef void (*image_entry_noargs_t)(void)__attribute__ ((noreturn));
 	image_entry_noargs_t image_entry =
@@ -99,8 +137,8 @@  static void jump_to_image_no_args(void)
 	debug("image entry point: 0x%X\n", spl_image.entry_point);
 	image_entry();
 }
-
 void jump_to_image_no_args(void) __attribute__ ((noreturn));
+
 void board_init_r(gd_t *id, ulong dummy)
 {
 	u32 boot_device;
@@ -134,6 +172,12 @@  void board_init_r(gd_t *id, ulong dummy)
 		debug("Jumping to U-Boot\n");
 		jump_to_image_no_args();
 		break;
+#ifdef CONFIG_SPL_OS_BOOT
+	case IH_OS_LINUX:
+		debug("Jumping to Linux\n");
+		jump_to_image_linux((void *)CONFIG_SYS_SPL_ARGS_ADDR);
+		break;
+#endif
 	default:
 		puts("Unsupported OS image.. Jumping nevertheless..\n");
 		jump_to_image_no_args();
diff --git a/include/configs/devkit8000.h b/include/configs/devkit8000.h
index 4d0573c..3897ab4 100644
--- a/include/configs/devkit8000.h
+++ b/include/configs/devkit8000.h
@@ -38,7 +38,7 @@ 
 #define CONFIG_OMAP3430		1	/* which is in a 3430 */
 #define CONFIG_OMAP3_DEVKIT8000	1	/* working with DevKit8000 */
 
-#define	CONFIG_SYS_TEXT_BASE	0x80008000
+#define	CONFIG_SYS_TEXT_BASE	0x80100000
 
 #define CONFIG_SDRC	/* The chip has SDRC controller */
 
@@ -328,7 +328,7 @@ 
 #define CONFIG_SPL_MAX_SIZE		0xB400  /* 45 K */
 #define CONFIG_SPL_STACK		LOW_LEVEL_SRAM_STACK
 
-#define CONFIG_SPL_BSS_START_ADDR	0x80000000 /*CONFIG_SYS_SDRAM_BASE*/
+#define CONFIG_SPL_BSS_START_ADDR	0x80000500 /* leave space for bootargs*/
 #define CONFIG_SPL_BSS_MAX_SIZE		0x80000
 
 /* NAND boot config */
@@ -358,6 +358,9 @@ 
 #define CONFIG_CMD_SAVEBP_WRITE_SIZE	0x400 /* 1024 byte */
 #define CONFIG_CMD_SAVEBP_NAND_OFS	(CONFIG_SYS_NAND_SPL_KERNEL_OFFS+\
 						0x400000)
+#define CONFIG_SPL_OS_BOOT
+#define CONFIG_SPL_OS_BOOT_KEY	26
+#define CONFIG_SYS_SPL_MACHID	MACH_TYPE_DEVKIT8000
 #define CONFIG_SYS_NAND_SPL_KERNEL_OFFS	0x280000
 #define CONFIG_SYS_SPL_ARGS_ADDR	(PHYS_SDRAM_1 + 0x100)
 #endif /* __CONFIG_H */