Re: [RFC] xload: get barebox size from barebox_arm_head
Hi Jan, Looks mostly good. On Mon, Aug 27, 2012 at 12:56:20PM +0200, Jan Weitzel wrote: #include fcntl.h #include mach/xload.h #include sizes.h +#include asm/barebox-arm-head.h -void *omap_xload_boot_nand(int offset, int size) +void *read_image_head(const char *name) +{ + void *header = xmalloc(ARM_HEAD_SIZE); + struct cdev *cdev; + int ret; + + cdev = cdev_open(name, O_RDONLY); + if (!cdev) { + printf(failed to open partition\n); + 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 partition\n); + return NULL; + } + + return header; +} + +unsigned int get_image_size(void *head) +{ + unsigned int ret = 0; + unsigned int *psize = head + HEAD_SIZE_OFFSET; + const char *pmagic = head + HEAD_MAGICWORD_OFFSET; + + if (!head) + return 0; Please drop this check... + + if (!strcmp(pmagic, barebox)) + ret = *psize; + debug(Detected barebox image size %u\n, ret); + + return ret; +} + +void *omap_xload_boot_nand(int offset) { int ret; - void *to = xmalloc(size); + int size; + void *to; struct cdev *cdev; - devfs_add_partition(nand0, offset, size, PARTITION_FIXED, x); + devfs_add_partition(nand0, offset, SZ_1M, PARTITION_FIXED, x); dev_add_bb_dev(x, bbx); + size = get_image_size(read_image_head(bbx)); ...and instead bail out directly here if you are unable to read the image head. If you are unable to read even the head of the image there is no point in trying to continue. Sascha + if (!size) + size = SZ_512K; + + to = xmalloc(size); + cdev = cdev_open(bbx, O_RDONLY); if (!cdev) { printf(failed to open nand\n); @@ -80,7 +127,7 @@ int run_shell(void) printf(unknown boot source. Fall back to nand\n); case OMAP_BOOTSRC_NAND: printf(booting from NAND\n); - func = omap_xload_boot_nand(SZ_128K, SZ_512K); + func = omap_xload_boot_nand(SZ_128K); break; } -- 1.7.0.4 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0| Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917- | ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
Re: [RFC] xload: get barebox size from barebox_arm_head
On Tue, Aug 28, 2012 at 10:41:03AM +0200, Jan Weitzel wrote: Am Dienstag, den 28.08.2012, 08:54 +0200 schrieb Sascha Hauer: Hi Jan, Looks mostly good. Is there a better place than arch/arm/mach-omap/xload.c for the helper functions? Didn't find one for common arm related code. You mean read_image_head and get_image_size? I think it's ok for now to have them in xload.c. Sascha Jan On Mon, Aug 27, 2012 at 12:56:20PM +0200, Jan Weitzel wrote: #include fcntl.h #include mach/xload.h #include sizes.h +#include asm/barebox-arm-head.h -void *omap_xload_boot_nand(int offset, int size) +void *read_image_head(const char *name) +{ + void *header = xmalloc(ARM_HEAD_SIZE); + struct cdev *cdev; + int ret; + + cdev = cdev_open(name, O_RDONLY); + if (!cdev) { + printf(failed to open partition\n); + 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 partition\n); + return NULL; + } + + return header; +} + +unsigned int get_image_size(void *head) +{ + unsigned int ret = 0; + unsigned int *psize = head + HEAD_SIZE_OFFSET; + const char *pmagic = head + HEAD_MAGICWORD_OFFSET; + + if (!head) + return 0; Please drop this check... + + if (!strcmp(pmagic, barebox)) + ret = *psize; + debug(Detected barebox image size %u\n, ret); + + return ret; +} + +void *omap_xload_boot_nand(int offset) { int ret; - void *to = xmalloc(size); + int size; + void *to; struct cdev *cdev; - devfs_add_partition(nand0, offset, size, PARTITION_FIXED, x); + devfs_add_partition(nand0, offset, SZ_1M, PARTITION_FIXED, x); dev_add_bb_dev(x, bbx); + size = get_image_size(read_image_head(bbx)); ...and instead bail out directly here if you are unable to read the image head. If you are unable to read even the head of the image there is no point in trying to continue. Sascha + if (!size) + size = SZ_512K; + + to = xmalloc(size); + cdev = cdev_open(bbx, O_RDONLY); if (!cdev) { printf(failed to open nand\n); @@ -80,7 +127,7 @@ int run_shell(void) printf(unknown boot source. Fall back to nand\n); case OMAP_BOOTSRC_NAND: printf(booting from NAND\n); - func = omap_xload_boot_nand(SZ_128K, SZ_512K); + func = omap_xload_boot_nand(SZ_128K); break; } -- 1.7.0.4 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0| Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917- | ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
[RFC] xload: get barebox size from barebox_arm_head
Add functions to read the barebox_arm_head, check barebox magicword and read out the barebox image size. Create a inital partion of 1Mb to access the barebox image on nand. Fall back to 512 Byte. Where is a good place for the helper functions? arch/arm/lib ? Signed-off-by: Jan Weitzel j.weit...@phytec.de --- arch/arm/include/asm/barebox-arm-head.h |4 ++ arch/arm/mach-omap/include/mach/xload.h |2 +- arch/arm/mach-omap/xload.c | 55 -- 3 files changed, 56 insertions(+), 5 deletions(-) diff --git a/arch/arm/include/asm/barebox-arm-head.h b/arch/arm/include/asm/barebox-arm-head.h index 0dc3074..521bcf6 100644 --- a/arch/arm/include/asm/barebox-arm-head.h +++ b/arch/arm/include/asm/barebox-arm-head.h @@ -1,6 +1,10 @@ #ifndef __ASM_ARM_HEAD_H #define __ASM_ARM_HEAD_H +#define ARM_HEAD_SIZE 0x30 +#define HEAD_MAGICWORD_OFFSET 0x20 +#define HEAD_SIZE_OFFSET 0x2C + static inline void barebox_arm_head(void) { __asm__ __volatile__ ( diff --git a/arch/arm/mach-omap/include/mach/xload.h b/arch/arm/mach-omap/include/mach/xload.h index 844b57f..26f1b68 100644 --- a/arch/arm/mach-omap/include/mach/xload.h +++ b/arch/arm/mach-omap/include/mach/xload.h @@ -1,7 +1,7 @@ #ifndef _MACH_XLOAD_H #define _MACH_XLOAD_H -void *omap_xload_boot_nand(int offset, int size); +void *omap_xload_boot_nand(int offset); void *omap_xload_boot_mmc(void); enum omap_boot_src { diff --git a/arch/arm/mach-omap/xload.c b/arch/arm/mach-omap/xload.c index 9a6b0b4..eff2ea0 100644 --- a/arch/arm/mach-omap/xload.c +++ b/arch/arm/mach-omap/xload.c @@ -7,16 +7,63 @@ #include fcntl.h #include mach/xload.h #include sizes.h +#include asm/barebox-arm-head.h -void *omap_xload_boot_nand(int offset, int size) +void *read_image_head(const char *name) +{ + void *header = xmalloc(ARM_HEAD_SIZE); + struct cdev *cdev; + int ret; + + cdev = cdev_open(name, O_RDONLY); + if (!cdev) { + printf(failed to open partition\n); + 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 partition\n); + return NULL; + } + + return header; +} + +unsigned int get_image_size(void *head) +{ + unsigned int ret = 0; + unsigned int *psize = head + HEAD_SIZE_OFFSET; + const char *pmagic = head + HEAD_MAGICWORD_OFFSET; + + if (!head) + return 0; + + if (!strcmp(pmagic, barebox)) + ret = *psize; + debug(Detected barebox image size %u\n, ret); + + return ret; +} + +void *omap_xload_boot_nand(int offset) { int ret; - void *to = xmalloc(size); + int size; + void *to; struct cdev *cdev; - devfs_add_partition(nand0, offset, size, PARTITION_FIXED, x); + devfs_add_partition(nand0, offset, SZ_1M, PARTITION_FIXED, x); dev_add_bb_dev(x, bbx); + size = get_image_size(read_image_head(bbx)); + if (!size) + size = SZ_512K; + + to = xmalloc(size); + cdev = cdev_open(bbx, O_RDONLY); if (!cdev) { printf(failed to open nand\n); @@ -80,7 +127,7 @@ int run_shell(void) printf(unknown boot source. Fall back to nand\n); case OMAP_BOOTSRC_NAND: printf(booting from NAND\n); - func = omap_xload_boot_nand(SZ_128K, SZ_512K); + func = omap_xload_boot_nand(SZ_128K); break; } -- 1.7.0.4 ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox