summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2016-07-11 07:58:34 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2016-07-11 07:58:34 +0200
commit4daa7a20c949e45ab9a93fd6ca7cb63bcebfb2ca (patch)
treeeb73a7176813ed9649694fde24eb73ecfe30aaf4 /arch
parent202cda9475558213cf799206caf0130d45164d7f (diff)
parent53bad16e009d4951ef48f7d0f6971a22e6aa3887 (diff)
downloadbarebox-4daa7a20c949e45ab9a93fd6ca7cb63bcebfb2ca.tar.gz
barebox-4daa7a20c949e45ab9a93fd6ca7cb63bcebfb2ca.tar.xz
Merge branch 'for-next/omap'
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/boards/phytec-som-am335x/board.c10
-rw-r--r--arch/arm/dts/am335x-phytec-phycard-som.dtsi23
-rw-r--r--arch/arm/dts/am335x-phytec-phycore-som.dtsi19
-rw-r--r--arch/arm/dts/am335x-phytec-phyflex-som.dtsi23
-rw-r--r--arch/arm/mach-omap/am33xx_bbu_nand.c50
-rw-r--r--arch/arm/mach-omap/include/mach/bbu.h7
-rw-r--r--arch/arm/mach-omap/include/mach/generic.h2
-rw-r--r--arch/arm/mach-omap/xload.c86
8 files changed, 125 insertions, 95 deletions
diff --git a/arch/arm/boards/phytec-som-am335x/board.c b/arch/arm/boards/phytec-som-am335x/board.c
index 7a878415f8..7f62453d93 100644
--- a/arch/arm/boards/phytec-som-am335x/board.c
+++ b/arch/arm/boards/phytec-som-am335x/board.c
@@ -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();
diff --git a/arch/arm/dts/am335x-phytec-phycard-som.dtsi b/arch/arm/dts/am335x-phytec-phycard-som.dtsi
index f052f0cc3a..3dd9cade43 100644
--- a/arch/arm/dts/am335x-phytec-phycard-som.dtsi
+++ b/arch/arm/dts/am335x-phytec-phycard-som.dtsi
@@ -206,23 +206,32 @@
};
partition@100000 {
+ label = "barebox_backup";
+ reg = <0x100000 0x80000>;
+ };
+
+ partition@180000 {
label = "bareboxenv";
- reg = <0x100000 0x40000>;
+ reg = <0x180000 0x40000>;
};
- partition@140000 {
+ partition@1C0000 {
label = "oftree";
- reg = <0x140000 0x40000>;
+ reg = <0x1C0000 0x40000>;
};
- partition@180000 {
+ partition@200000 {
label = "kernel";
- reg = <0x180000 0x800000>;
+ reg = <0x200000 0x800000>;
};
- partition@980000 {
+ partition@A00000 {
label = "root";
- reg = <0x980000 0x0>;
+ /*
+ * Size 0x0 extends partition to
+ * end of nand flash.
+ */
+ reg = <0xA00000 0x0>;
};
};
};
diff --git a/arch/arm/dts/am335x-phytec-phycore-som.dtsi b/arch/arm/dts/am335x-phytec-phycore-som.dtsi
index e48d545e64..0fc3c96baa 100644
--- a/arch/arm/dts/am335x-phytec-phycore-som.dtsi
+++ b/arch/arm/dts/am335x-phytec-phycore-som.dtsi
@@ -290,27 +290,32 @@
};
partition@100000 {
+ label = "barebox_backup";
+ reg = <0x100000 0x80000>;
+ };
+
+ partition@180000 {
label = "bareboxenv";
- reg = <0x100000 0x40000>;
+ reg = <0x180000 0x40000>;
};
- partition@140000 {
+ partition@1C0000 {
label = "oftree";
- reg = <0x140000 0x40000>;
+ reg = <0x1C0000 0x40000>;
};
- partition@180000 {
+ partition@200000 {
label = "kernel";
- reg = <0x180000 0x800000>;
+ reg = <0x200000 0x800000>;
};
- partition@980000 {
+ partition@A00000 {
label = "root";
/*
* Size 0x0 extends partition to
* end of nand flash.
*/
- reg = <0x980000 0x0>;
+ reg = <0xA00000 0x0>;
};
};
};
diff --git a/arch/arm/dts/am335x-phytec-phyflex-som.dtsi b/arch/arm/dts/am335x-phytec-phyflex-som.dtsi
index 6561625686..db78cb10fd 100644
--- a/arch/arm/dts/am335x-phytec-phyflex-som.dtsi
+++ b/arch/arm/dts/am335x-phytec-phyflex-som.dtsi
@@ -304,23 +304,32 @@
};
partition@100000 {
+ label = "barebox_backup";
+ reg = <0x100000 0x80000>;
+ };
+
+ partition@180000 {
label = "bareboxenv";
- reg = <0x100000 0x40000>;
+ reg = <0x180000 0x40000>;
};
- partition@140000 {
+ partition@1C0000 {
label = "oftree";
- reg = <0x140000 0x40000>;
+ reg = <0x1C0000 0x40000>;
};
- partition@180000 {
+ partition@200000 {
label = "kernel";
- reg = <0x180000 0x800000>;
+ reg = <0x200000 0x800000>;
};
- partition@980000 {
+ partition@A00000 {
label = "root";
- reg = <0x980000 0x0>;
+ /*
+ * Size 0x0 extends partition to
+ * end of nand flash.
+ */
+ reg = <0xA00000 0x0>;
};
};
};
diff --git a/arch/arm/mach-omap/am33xx_bbu_nand.c b/arch/arm/mach-omap/am33xx_bbu_nand.c
index 25f0e79ee6..7785d40f1f 100644
--- a/arch/arm/mach-omap/am33xx_bbu_nand.c
+++ b/arch/arm/mach-omap/am33xx_bbu_nand.c
@@ -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;
diff --git a/arch/arm/mach-omap/include/mach/bbu.h b/arch/arm/mach-omap/include/mach/bbu.h
index 7c5dcbde53..c8b0a55acb 100644
--- a/arch/arm/mach-omap/include/mach/bbu.h
+++ b/arch/arm/mach-omap/include/mach/bbu.h
@@ -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;
}
diff --git a/arch/arm/mach-omap/include/mach/generic.h b/arch/arm/mach-omap/include/mach/generic.h
index a2a48cc6af..fe194b3921 100644
--- a/arch/arm/mach-omap/include/mach/generic.h
+++ b/arch/arm/mach-omap/include/mach/generic.h
@@ -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;
};
diff --git a/arch/arm/mach-omap/xload.c b/arch/arm/mach-omap/xload.c
index 77938190e1..14a631ebfc 100644
--- a/arch/arm/mach-omap/xload.c
+++ b/arch/arm/mach-omap/xload.c
@@ -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;
}