summaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2022-04-20 08:34:24 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2022-04-21 09:52:56 +0200
commit7814dffc5ed11c7c4f8d82e0aac0d9629b60803d (patch)
tree46abb7bed10672fde913e5e29bac1f0bd23abddb /arch/arm
parent58292a38363c93a7480657d8da1c6c0049d4eb84 (diff)
downloadbarebox-7814dffc5ed11c7c4f8d82e0aac0d9629b60803d.tar.gz
barebox-7814dffc5ed11c7c4f8d82e0aac0d9629b60803d.tar.xz
ARM: omap: xload: read from unpartitioned device
The omap xload code creates a temporary partition where the barebox image is read from. Since 7f9f45b9bf it is no longer allowed to create overlapping partitions which means the temporary partition can no longer be created when the device was partitioned already. Fix this by using the mtd PEB api to read the barebox image from the full device and not from a partition. Fixes: 7f9f45b9bf ("devfs: Do not create overlapping partitions") Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/mach-omap/xload.c86
1 files changed, 33 insertions, 53 deletions
diff --git a/arch/arm/mach-omap/xload.c b/arch/arm/mach-omap/xload.c
index af9abf38b5..d786e6ceb2 100644
--- a/arch/arm/mach-omap/xload.c
+++ b/arch/arm/mach-omap/xload.c
@@ -20,6 +20,7 @@
#include <net.h>
#include <environment.h>
#include <dhcp.h>
+#include <mtd/mtd-peb.h>
struct omap_barebox_part *barebox_part;
@@ -32,29 +33,6 @@ static struct omap_barebox_part default_part = {
.nor_size = SZ_1M,
};
-static void *read_image_head(const char *name)
-{
- void *header = xmalloc(ARM_HEAD_SIZE);
- struct cdev *cdev;
- int ret;
-
- cdev = cdev_open_by_name(name, O_RDONLY);
- if (!cdev) {
- printf("failed to open %s\n", name);
- return NULL;
- }
-
- ret = cdev_read(cdev, header, ARM_HEAD_SIZE, 0, 0);
- cdev_close(cdev);
-
- if (ret != ARM_HEAD_SIZE) {
- printf("failed to read from %s\n", name);
- return NULL;
- }
-
- return header;
-}
-
static unsigned int get_image_size(void *head)
{
unsigned int ret = 0;
@@ -67,57 +45,62 @@ static unsigned int get_image_size(void *head)
return ret;
}
-static void *read_mtd_barebox(const char *partition)
+static void *read_mtd_barebox(const char *part, unsigned int start, unsigned int size)
{
int ret;
- int size;
- void *to, *header;
+ void *to;
struct cdev *cdev;
+ struct mtd_info *mtd;
+ unsigned int ps, pe;
+
+ cdev = cdev_open_by_name(part, O_RDONLY);
+ if (!cdev) {
+ printf("failed to open partition\n");
+ return NULL;
+ }
- header = read_image_head(partition);
- if (header == NULL)
+ mtd = cdev->mtd;
+ if (!mtd)
return NULL;
- size = get_image_size(header);
- if (!size) {
- printf("failed to get image size\n");
+ if (mtd_mod_by_eb(start, mtd) != 0) {
+ printf("Start must be eraseblock aligned\n");
return NULL;
}
to = xmalloc(size);
- cdev = cdev_open_by_name(partition, O_RDONLY);
- if (!cdev) {
- printf("failed to open partition\n");
- return NULL;
+ ps = mtd_div_by_eb(start, mtd);
+ pe = mtd_div_by_eb(start + size, mtd);
+ ret = mtd_peb_read_file(mtd, ps, pe, to, size);
+ if (ret) {
+ printf("Can't read image from %s: %d\n", part, ret);
+ goto err;
}
- ret = cdev_read(cdev, to, size, 0, 0);
- if (ret != size) {
- printf("failed to read from partition\n");
- return NULL;
+ size = get_image_size(to);
+ if (!size) {
+ printf("failed to get image size\n");
+ goto err;
}
return to;
+
+err:
+ free(to);
+ return NULL;
}
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");
+ to = read_mtd_barebox("nand0", part->nand_offset, part->nand_size);
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");
+ to = read_mtd_barebox("nand0", part->nand_bkup_offset,
+ part->nand_bkup_size);
}
return to;
@@ -162,10 +145,7 @@ static void *omap_xload_boot_mmc(void)
static void *omap_xload_boot_spi(struct omap_barebox_part *part)
{
- devfs_add_partition("m25p0", part->nor_offset, part->nor_size,
- DEVFS_PARTITION_FIXED, "x");
-
- return read_mtd_barebox("x");
+ return read_mtd_barebox("m25p0", part->nor_offset, part->nor_size);
}
static void *omap4_xload_boot_usb(void){