Merge branch 'for-next/omap'
This commit is contained in:
commit
4daa7a20c9
|
@ -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();
|
||||
|
|
|
@ -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>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -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>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -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>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue