Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> --- arch/arm/mach-omap/xload.c | 86 +++++++++++++++----------------------- drivers/mtd/peb.c | 32 ++++++++++++++ include/mtd/mtd-peb.h | 2 + 3 files changed, 67 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){ diff --git a/drivers/mtd/peb.c b/drivers/mtd/peb.c index 6c61e0734c..ac6b232e37 100644 --- a/drivers/mtd/peb.c +++ b/drivers/mtd/peb.c @@ -508,6 +508,38 @@ out: return ret; } +int mtd_peb_read_file(struct mtd_info *mtd, unsigned int peb_start, + unsigned int peb_last, void *buf, size_t len) +{ + int ret, pnum; + + pnum = peb_start; + + while (len) { + size_t now = min_t(size_t, mtd->erasesize, len); + + if (pnum > peb_last) + return -EIO; + + if (mtd_peb_is_bad(mtd, pnum)) { + pnum++; + continue; + } + + ret = mtd_peb_read(mtd, buf, pnum, 0, now); + if (ret) + goto out; + + len -= now; + pnum++; + buf += now; + } + + ret = 0; +out: + return ret; +} + /** * mtd_peb_erase - erase a physical eraseblock. * @mtd: mtd device diff --git a/include/mtd/mtd-peb.h b/include/mtd/mtd-peb.h index cfcc0be611..cf8d8ff8da 100644 --- a/include/mtd/mtd-peb.h +++ b/include/mtd/mtd-peb.h @@ -23,6 +23,8 @@ int mtd_num_pebs(struct mtd_info *mtd); int mtd_peb_create_bitflips(struct mtd_info *mtd, int pnum, int offset, int len, int num_bitflips, int random, int info); +int mtd_peb_read_file(struct mtd_info *mtd, unsigned int peb_start, + unsigned int peb_last, void *buf, size_t len); int mtd_peb_write_file(struct mtd_info *mtd, int peb_start, int max_pebs, const void *buf, size_t len); -- 2.30.2 -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox