9
0
Fork 0

Merge branch 'for-next/omap'

This commit is contained in:
Sascha Hauer 2016-07-11 07:58:34 +02:00
commit 4daa7a20c9
8 changed files with 137 additions and 107 deletions

View File

@ -47,6 +47,8 @@ coredevice_initcall(physom_coredevice_init);
static struct omap_barebox_part physom_barebox_part = {
.nand_offset = SZ_512K,
.nand_size = SZ_512K,
.nand_bkup_offset = SZ_1M,
.nand_bkup_size = SZ_512K,
.nor_offset = SZ_128K,
.nor_size = SZ_512K,
};
@ -58,6 +60,11 @@ static char *xloadslots[] = {
"/dev/nand0.xload_backup3.bb"
};
static char *nandslots[] = {
"/dev/nand0.barebox.bb",
"/dev/nand0.barebox_backup.bb",
};
static int physom_devices_init(void)
{
if (!of_machine_is_compatible("phytec,am335x-som"))
@ -103,7 +110,8 @@ static int physom_devices_init(void)
am33xx_bbu_spi_nor_register_handler("spi", "/dev/m25p0.barebox");
am33xx_bbu_nand_xloadslots_register_handler("MLO.nand",
xloadslots, ARRAY_SIZE(xloadslots));
am33xx_bbu_nand_register_handler("nand", "/dev/nand0.barebox.bb");
am33xx_bbu_nand_slots_register_handler("nand", nandslots,
ARRAY_SIZE(nandslots));
if (IS_ENABLED(CONFIG_SHELL_NONE))
return am33xx_of_register_bootdevice();

View File

@ -206,23 +206,32 @@
};
partition@100000 {
label = "bareboxenv";
reg = <0x100000 0x40000>;
};
partition@140000 {
label = "oftree";
reg = <0x140000 0x40000>;
label = "barebox_backup";
reg = <0x100000 0x80000>;
};
partition@180000 {
label = "kernel";
reg = <0x180000 0x800000>;
label = "bareboxenv";
reg = <0x180000 0x40000>;
};
partition@980000 {
partition@1C0000 {
label = "oftree";
reg = <0x1C0000 0x40000>;
};
partition@200000 {
label = "kernel";
reg = <0x200000 0x800000>;
};
partition@A00000 {
label = "root";
reg = <0x980000 0x0>;
/*
* Size 0x0 extends partition to
* end of nand flash.
*/
reg = <0xA00000 0x0>;
};
};
};

View File

@ -290,27 +290,32 @@
};
partition@100000 {
label = "bareboxenv";
reg = <0x100000 0x40000>;
};
partition@140000 {
label = "oftree";
reg = <0x140000 0x40000>;
label = "barebox_backup";
reg = <0x100000 0x80000>;
};
partition@180000 {
label = "kernel";
reg = <0x180000 0x800000>;
label = "bareboxenv";
reg = <0x180000 0x40000>;
};
partition@980000 {
partition@1C0000 {
label = "oftree";
reg = <0x1C0000 0x40000>;
};
partition@200000 {
label = "kernel";
reg = <0x200000 0x800000>;
};
partition@A00000 {
label = "root";
/*
* Size 0x0 extends partition to
* end of nand flash.
*/
reg = <0x980000 0x0>;
reg = <0xA00000 0x0>;
};
};
};

View File

@ -304,23 +304,32 @@
};
partition@100000 {
label = "bareboxenv";
reg = <0x100000 0x40000>;
};
partition@140000 {
label = "oftree";
reg = <0x140000 0x40000>;
label = "barebox_backup";
reg = <0x100000 0x80000>;
};
partition@180000 {
label = "kernel";
reg = <0x180000 0x800000>;
label = "bareboxenv";
reg = <0x180000 0x40000>;
};
partition@980000 {
partition@1C0000 {
label = "oftree";
reg = <0x1C0000 0x40000>;
};
partition@200000 {
label = "kernel";
reg = <0x200000 0x800000>;
};
partition@A00000 {
label = "root";
reg = <0x980000 0x0>;
/*
* Size 0x0 extends partition to
* end of nand flash.
*/
reg = <0xA00000 0x0>;
};
};
};

View File

@ -62,21 +62,15 @@ static int write_image(const char *devfile, const void *image, size_t size)
}
/*
* This handler updates all given xload slots in nand with an image.
* Upate given nand partitions with an image
*/
static int nand_xloadslots_update_handler(struct bbu_handler *handler,
struct bbu_data *data)
static int nand_slot_update_handler(struct bbu_handler *handler,
struct bbu_data *data)
{
int ret = 0;
int ret, i;
struct nand_bbu_handler *nh;
const void *image = data->image;
size_t size = data->len;
struct nand_bbu_handler *nh;
int i = 0;
if (file_detect_type(image, size) != filetype_ch_image) {
pr_err("%s is not a valid ch-image\n", data->imagefile);
return -EINVAL;
}
nh = container_of(handler, struct nand_bbu_handler, bbu_handler);
@ -100,6 +94,23 @@ static int nand_xloadslots_update_handler(struct bbu_handler *handler,
return 0;
}
/*
* This handler updates all given xload slots in nand with an image.
*/
static int nand_xloadslots_update_handler(struct bbu_handler *handler,
struct bbu_data *data)
{
const void *image = data->image;
size_t size = data->len;
if (file_detect_type(image, size) != filetype_ch_image) {
pr_err("%s is not a valid ch-image\n", data->imagefile);
return -EINVAL;
}
return nand_slot_update_handler(handler, data);
}
int am33xx_bbu_nand_xloadslots_register_handler(const char *name,
char **devicefile,
int num_devicefiles)
@ -124,32 +135,27 @@ int am33xx_bbu_nand_xloadslots_register_handler(const char *name,
static int nand_update_handler(struct bbu_handler *handler,
struct bbu_data *data)
{
int ret = 0;
const void *image = data->image;
size_t size = data->len;
struct nand_bbu_handler *nh;
if (file_detect_type(image, size) != filetype_arm_barebox) {
pr_err("%s is not a valid barebox image\n", data->imagefile);
return -EINVAL;
}
nh = container_of(handler, struct nand_bbu_handler, bbu_handler);
ret = bbu_confirm(data);
if (ret != 0)
return ret;
return write_image(data->devicefile, image, size);
return nand_slot_update_handler(handler, data);
}
int am33xx_bbu_nand_register_handler(const char *name, char *devicefile)
int am33xx_bbu_nand_slots_register_handler(const char *name, char **devicefile,
int num_devicefiles)
{
struct nand_bbu_handler *handler;
int ret;
handler = xzalloc(sizeof(*handler));
handler->bbu_handler.devicefile = devicefile;
handler->devicefile = devicefile;
handler->num_devicefiles = num_devicefiles;
handler->bbu_handler.devicefile = devicefile[0];
handler->bbu_handler.handler = nand_update_handler;
handler->bbu_handler.name = name;

View File

@ -21,7 +21,8 @@ static inline int am33xx_bbu_spi_nor_register_handler(const char *name, char *de
int am33xx_bbu_nand_xloadslots_register_handler(const char *name,
char **devicefile,
int num_devicefiles);
int am33xx_bbu_nand_register_handler(const char *name, char *devicefile);
int am33xx_bbu_nand_slots_register_handler(const char *name, char **devicefile,
int num_devicefiles);
#else
static inline int am33xx_bbu_nand_xloadslots_register_handler(const char *name,
char **devicefile,
@ -30,7 +31,9 @@ static inline int am33xx_bbu_nand_xloadslots_register_handler(const char *name,
return 0;
}
static inline int am33xx_bbu_nand_register_handler(const char *name, char *devicefile)
static inline int am33xx_bbu_nand_slots_register_handler(const char *name,
char **devicefile,
int num_devicefiles)
{
return 0;
}

View File

@ -55,6 +55,8 @@ extern unsigned int __omap_cpu_type;
struct omap_barebox_part {
unsigned int nand_offset;
unsigned int nand_size;
unsigned int nand_bkup_offset;
unsigned int nand_bkup_size;
unsigned int nor_offset;
unsigned int nor_size;
};

View File

@ -24,6 +24,8 @@ struct omap_barebox_part *barebox_part;
static struct omap_barebox_part default_part = {
.nand_offset = SZ_128K,
.nand_size = SZ_1M,
.nand_bkup_offset = 0,
.nand_bkup_size = 0,
.nor_offset = SZ_128K,
.nor_size = SZ_1M,
};
@ -36,7 +38,7 @@ static void *read_image_head(const char *name)
cdev = cdev_open(name, O_RDONLY);
if (!cdev) {
printf("failed to open partition\n");
printf("failed to open %s\n", name);
return NULL;
}
@ -44,7 +46,7 @@ static void *read_image_head(const char *name)
cdev_close(cdev);
if (ret != ARM_HEAD_SIZE) {
printf("failed to read from partition\n");
printf("failed to read from %s\n", name);
return NULL;
}
@ -63,18 +65,14 @@ static unsigned int get_image_size(void *head)
return ret;
}
static void *omap_xload_boot_nand(int offset, int part_size)
static void *read_mtd_barebox(const char *partition)
{
int ret;
int size;
void *to, *header;
struct cdev *cdev;
devfs_add_partition("nand0", offset, part_size,
DEVFS_PARTITION_FIXED, "x");
dev_add_bb_dev("x", "bbx");
header = read_image_head("bbx");
header = read_image_head(partition);
if (header == NULL)
return NULL;
@ -86,21 +84,43 @@ static void *omap_xload_boot_nand(int offset, int part_size)
to = xmalloc(size);
cdev = cdev_open("bbx", O_RDONLY);
cdev = cdev_open(partition, O_RDONLY);
if (!cdev) {
printf("failed to open nand\n");
printf("failed to open partition\n");
return NULL;
}
ret = cdev_read(cdev, to, size, 0, 0);
if (ret != size) {
printf("failed to read from nand\n");
printf("failed to read from partition\n");
return NULL;
}
return to;
}
static void *omap_xload_boot_nand(struct omap_barebox_part *part)
{
void *to;
devfs_add_partition("nand0", part->nand_offset, part->nand_size,
DEVFS_PARTITION_FIXED, "x");
dev_add_bb_dev("x", "bbx");
to = read_mtd_barebox("bbx");
if (to == NULL && part->nand_bkup_size != 0) {
printf("trying to load image from backup partition.\n");
devfs_add_partition("nand0", part->nand_bkup_offset,
part->nand_bkup_size,
DEVFS_PARTITION_FIXED, "x_bkup");
dev_add_bb_dev("x_bkup", "bbx_bkup");
to = read_mtd_barebox("bbx_bkup");
}
return to;
}
static void *omap_xload_boot_mmc(void)
{
int ret;
@ -138,41 +158,12 @@ static void *omap_xload_boot_mmc(void)
return buf;
}
static void *omap_xload_boot_spi(int offset, int part_size)
static void *omap_xload_boot_spi(struct omap_barebox_part *part)
{
int ret;
int size;
void *to, *header;
struct cdev *cdev;
devfs_add_partition("m25p0", offset, part_size,
devfs_add_partition("m25p0", part->nor_offset, part->nor_size,
DEVFS_PARTITION_FIXED, "x");
header = read_image_head("x");
if (header == NULL)
return NULL;
size = get_image_size(header);
if (!size) {
printf("failed to get image size\n");
return NULL;
}
to = xmalloc(size);
cdev = cdev_open("x", O_RDONLY);
if (!cdev) {
printf("failed to open spi flash\n");
return NULL;
}
ret = cdev_read(cdev, to, size, 0, 0);
if (ret != size) {
printf("failed to read from spi flash\n");
return NULL;
}
return to;
return read_mtd_barebox("x");
}
static void *omap4_xload_boot_usb(void){
@ -323,13 +314,11 @@ static __noreturn int omap_xload(void)
break;
case BOOTSOURCE_NAND:
printf("booting from NAND\n");
func = omap_xload_boot_nand(barebox_part->nand_offset,
barebox_part->nand_size);
func = omap_xload_boot_nand(barebox_part);
break;
case BOOTSOURCE_SPI:
printf("booting from SPI\n");
func = omap_xload_boot_spi(barebox_part->nor_offset,
barebox_part->nor_size);
func = omap_xload_boot_spi(barebox_part);
break;
case BOOTSOURCE_SERIAL:
if (IS_ENABLED(CONFIG_OMAP_SERIALBOOT)) {
@ -347,8 +336,7 @@ static __noreturn int omap_xload(void)
}
default:
printf("unknown boot source. Fall back to nand\n");
func = omap_xload_boot_nand(barebox_part->nand_offset,
barebox_part->nand_size);
func = omap_xload_boot_nand(barebox_part);
break;
}