Message ID | 1314261196-23197-5-git-send-email-simonschwarzcor@gmail.com |
---|---|
State | Superseded |
Headers | show |
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 */
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
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
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
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 --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 */
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(-)