9
0
Fork 0

ARM: OMAP: register OMAP specific barebox bootm handler

The OMAP ROM code passes the boot information via r0 to the
bootloader. Add an OMAP specific barebox handler to pass this
information to the next stage. This allows us to chainload
bootloaders without loosing the information where we booted from.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2013-09-25 12:30:58 +02:00
parent 9d88abf958
commit 5913b71943
3 changed files with 57 additions and 8 deletions

View File

@ -56,6 +56,7 @@ static inline int omap_set_mmc_dev(const char *mmcdev)
extern uint32_t omap_bootinfo[3];
void omap_save_bootinfo(void *data);
void __noreturn omap_start_barebox(void *barebox);
void omap_set_bootmmc_devname(const char *devname);
const char *omap_get_bootmmc_devname(void);

View File

@ -15,12 +15,66 @@
#include <common.h>
#include <bootsource.h>
#include <envfs.h>
#include <boot.h>
#include <init.h>
#include <io.h>
#include <fs.h>
#include <malloc.h>
#include <linux/stat.h>
#include <mach/generic.h>
#include <mach/am33xx-silicon.h>
#include <mach/omap3-silicon.h>
#include <mach/omap4-silicon.h>
static void *omap_sram_start(void)
{
if (cpu_is_am33xx())
return (void *)AM33XX_SRAM0_START;
if (cpu_is_omap34xx())
return (void *)OMAP3_SRAM_BASE;
if (cpu_is_omap4xxx())
return (void *)OMAP44XX_SRAM_BASE;
}
void __noreturn omap_start_barebox(void *barebox)
{
int (*func)(void *) = barebox;
uint32_t *arg;
void *sramadr = omap_sram_start();
arg = (uint32_t *)&omap_bootinfo;
memcpy(sramadr, &omap_bootinfo, sizeof(uint32_t) * 3);
shutdown_barebox();
func(sramadr);
hang();
}
#ifdef CONFIG_BOOTM
static int do_bootm_omap_barebox(struct image_data *data)
{
void (*barebox)(uint32_t);
barebox = read_file(data->os_file, NULL);
if (!barebox)
return -EINVAL;
omap_start_barebox(barebox);
}
static struct image_handler omap_barebox_handler = {
.name = "OMAP barebox",
.bootm = do_bootm_omap_barebox,
.filetype = filetype_arm_barebox,
};
static int omap_bootm_barebox(void)
{
return register_image_handler(&omap_barebox_handler);
}
device_initcall(omap_bootm_barebox);
#endif
const static char *omap_bootmmc_dev;

View File

@ -188,8 +188,7 @@ static void *omap4_xload_boot_usb(void){
*/
static __noreturn int omap_xload(void)
{
int (*func)(void *) = NULL;
uint32_t *arg;
void *func;
if (!barebox_part)
barebox_part = &default_part;
@ -230,12 +229,7 @@ static __noreturn int omap_xload(void)
while (1);
}
arg = (uint32_t *)&omap_bootinfo;
shutdown_barebox();
func(arg);
while (1);
omap_start_barebox(func);
}
int omap_set_barebox_part(struct omap_barebox_part *part)