9
0
Fork 0

ARM OMAP: get barebox partion information from boardcode

The size and offset of the barebox partition in nand and spi nor flash
may vary on different boards. Make it possible to pass this information
over boardfile if needed.

Signed-off-by: Teresa Gámez <t.gamez@phytec.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Teresa Gámez 2013-07-09 11:23:21 +02:00 committed by Sascha Hauer
parent c5c875ab7f
commit ad0a5ec74b
2 changed files with 47 additions and 7 deletions

View File

@ -33,6 +33,22 @@
#define cpu_is_am33xx() (0)
#endif
struct omap_barebox_part {
unsigned int nand_offset;
unsigned int nand_size;
unsigned int nor_offset;
unsigned int nor_size;
};
#ifdef CONFIG_SHELL_NONE
int omap_set_barebox_part(struct omap_barebox_part *part);
#else
static inline int omap_set_barebox_part(struct omap_barebox_part *part)
{
return 0;
}
#endif
extern uint32_t omap_bootinfo[3];
void omap_save_bootinfo(void);

View File

@ -11,6 +11,15 @@
#include <filetype.h>
#include <mach/generic.h>
struct omap_barebox_part *barebox_part;
static struct omap_barebox_part default_part = {
.nand_offset = SZ_128K,
.nand_size = SZ_1M,
.nor_offset = SZ_128K,
.nor_size = SZ_1M,
};
static void *read_image_head(const char *name)
{
void *header = xmalloc(ARM_HEAD_SIZE);
@ -46,14 +55,15 @@ static unsigned int get_image_size(void *head)
return ret;
}
static void *omap_xload_boot_nand(int offset)
static void *omap_xload_boot_nand(int offset, int part_size)
{
int ret;
int size;
void *to, *header;
struct cdev *cdev;
devfs_add_partition("nand0", offset, SZ_1M, DEVFS_PARTITION_FIXED, "x");
devfs_add_partition("nand0", offset, part_size,
DEVFS_PARTITION_FIXED, "x");
dev_add_bb_dev("x", "bbx");
header = read_image_head("bbx");
@ -105,14 +115,15 @@ static void *omap_xload_boot_mmc(void)
return buf;
}
static void *omap_xload_boot_spi(int offset)
static void *omap_xload_boot_spi(int offset, int part_size)
{
int ret;
int size;
void *to, *header;
struct cdev *cdev;
devfs_add_partition("m25p0", offset, SZ_1M, DEVFS_PARTITION_FIXED, "x");
devfs_add_partition("m25p0", offset, part_size,
DEVFS_PARTITION_FIXED, "x");
header = read_image_head("x");
if (header == NULL)
@ -167,6 +178,9 @@ static __noreturn int omap_xload(void)
int (*func)(void *) = NULL;
uint32_t *arg;
if (!barebox_part)
barebox_part = &default_part;
switch (bootsource_get())
{
case BOOTSOURCE_MMC:
@ -183,15 +197,18 @@ static __noreturn int omap_xload(void)
}
case BOOTSOURCE_NAND:
printf("booting from NAND\n");
func = omap_xload_boot_nand(SZ_128K);
func = omap_xload_boot_nand(barebox_part->nand_offset,
barebox_part->nand_size);
break;
case BOOTSOURCE_SPI:
printf("booting from SPI\n");
func = omap_xload_boot_spi(SZ_128K);
func = omap_xload_boot_spi(barebox_part->nor_offset,
barebox_part->nor_size);
break;
default:
printf("unknown boot source. Fall back to nand\n");
func = omap_xload_boot_nand(SZ_128K);
func = omap_xload_boot_nand(barebox_part->nand_offset,
barebox_part->nand_size);
break;
}
@ -208,6 +225,13 @@ static __noreturn int omap_xload(void)
while (1);
}
int omap_set_barebox_part(struct omap_barebox_part *part)
{
barebox_part = part;
return 0;
}
static int omap_set_xload(void)
{
barebox_main = omap_xload;