* [PATCH 0/2] DeviceTree: add support for initrd in the DT @ 2013-02-10 16:58 Vicente Bergas 2013-02-10 16:58 ` [PATCH 1/2] " Vicente Bergas 2013-02-10 16:58 ` [PATCH 2/2] ArchosG9: boot linux kernel with DT Vicente Bergas 0 siblings, 2 replies; 4+ messages in thread From: Vicente Bergas @ 2013-02-10 16:58 UTC (permalink / raw) To: barebox; +Cc: Vicente Bergas Following Jean-Christophe's recommendation the patch has been splitted in two, supressed extra spaces and substituted a ==NULL for a !. Regarding to the questions: I'm not checking the return value of fdt_initrd because in case of error 1) fdt_initrd will print a message to inform the user. 2) it's not a blocking error (from the bootloader point-of-view), so we can still try to boot. fdt_setprop gets a buffer of data that must be in BigEndian order to be standard compliant. It's defined to be BigEndian probably because it comes from PowerPC. I've also tested it before submitting and it works fine. Thank you for your comments. Regards, Vicente. Vicente Bergas (2): DeviceTree: add support for initrd in the DT ArchosG9: boot linux kernel with DT arch/arm/boards/archosg9/env/config | 1 + arch/arm/configs/archosg9_defconfig | 4 ++ arch/arm/configs/archosg9_xload_defconfig | 1 + arch/arm/lib/armlinux.c | 2 + common/oftree.c | 66 +++++++++++++++++++++++++++++++ include/of.h | 1 + 6 files changed, 75 insertions(+) -- 1.8.1.3 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/2] DeviceTree: add support for initrd in the DT 2013-02-10 16:58 [PATCH 0/2] DeviceTree: add support for initrd in the DT Vicente Bergas @ 2013-02-10 16:58 ` Vicente Bergas 2013-02-11 9:55 ` Sascha Hauer 2013-02-10 16:58 ` [PATCH 2/2] ArchosG9: boot linux kernel with DT Vicente Bergas 1 sibling, 1 reply; 4+ messages in thread From: Vicente Bergas @ 2013-02-10 16:58 UTC (permalink / raw) To: barebox; +Cc: Vicente Bergas Add the initrd start and end address to the DT, code comes from u-boot. Signed-off-by: Vicente Bergas <vicencb@gmail.com> --- arch/arm/lib/armlinux.c | 2 ++ common/oftree.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ include/of.h | 1 + 3 files changed, 69 insertions(+) diff --git a/arch/arm/lib/armlinux.c b/arch/arm/lib/armlinux.c index 40a63ea..8052ca4 100644 --- a/arch/arm/lib/armlinux.c +++ b/arch/arm/lib/armlinux.c @@ -266,6 +266,8 @@ void start_linux(void *adr, int swap, unsigned long initrd_address, if (oftree) { printf("booting Linux kernel with devicetree\n"); + fdt_initrd(oftree, initrd_address, + initrd_address+initrd_size, 1); params = oftree; } else { setup_tags(initrd_address, initrd_size, swap); diff --git a/common/oftree.c b/common/oftree.c index 0df5209..7c118d2 100644 --- a/common/oftree.c +++ b/common/oftree.c @@ -246,6 +246,72 @@ int fdt_get_path_or_create(struct fdt_header *fdt, const char *path) return nodeoffset; } +int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force) +{ + int nodeoffset; + int err, j, total; + u32 tmp; + const char *path; + uint64_t addr, size; + + /* Find the "chosen" node */ + nodeoffset = fdt_path_offset(fdt, "/chosen"); + + /* If there is no "chosen" node in the blob return */ + if (nodeoffset < 0) { + printf("fdt_initrd: %s\n", fdt_strerror(nodeoffset)); + return nodeoffset; + } + + /* just return if initrd_start/end aren't valid */ + if ((initrd_start == 0) || (initrd_end == 0)) + return 0; + + total = fdt_num_mem_rsv(fdt); + + /* + * Look for an existing entry and update it. If we don't find + * the entry, we will j be the next available slot. + */ + for (j = 0; j < total; j++) { + err = fdt_get_mem_rsv(fdt, j, &addr, &size); + if (addr == initrd_start) { + fdt_del_mem_rsv(fdt, j); + break; + } + } + + err = fdt_add_mem_rsv(fdt, initrd_start, initrd_end - initrd_start); + if (err < 0) { + printf("fdt_initrd: %s\n", fdt_strerror(err)); + return err; + } + + path = fdt_getprop(fdt, nodeoffset, "linux,initrd-start", NULL); + if (!path || force) { + tmp = __cpu_to_be32(initrd_start); + err = fdt_setprop(fdt, nodeoffset, + "linux,initrd-start", &tmp, sizeof(tmp)); + if (err < 0) { + printf("WARNING: " + "could not set linux,initrd-start %s.\n", + fdt_strerror(err)); + return err; + } + tmp = __cpu_to_be32(initrd_end); + err = fdt_setprop(fdt, nodeoffset, + "linux,initrd-end", &tmp, sizeof(tmp)); + if (err < 0) { + printf("WARNING: could not set linux,initrd-end %s.\n", + fdt_strerror(err)); + + return err; + } + } + + return 0; +} + static int of_fixup_bootargs(struct fdt_header *fdt) { int nodeoffset; diff --git a/include/of.h b/include/of.h index d3a310f..dcb4c4b 100644 --- a/include/of.h +++ b/include/of.h @@ -18,6 +18,7 @@ void do_fixup_by_path(struct fdt_header *fdt, const char *path, const char *prop void do_fixup_by_path_u32(struct fdt_header *fdt, const char *path, const char *prop, u32 val, int create); int fdt_get_path_or_create(struct fdt_header *fdt, const char *path); +int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force); #define OF_BAD_ADDR ((u64)-1) -- 1.8.1.3 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] DeviceTree: add support for initrd in the DT 2013-02-10 16:58 ` [PATCH 1/2] " Vicente Bergas @ 2013-02-11 9:55 ` Sascha Hauer 0 siblings, 0 replies; 4+ messages in thread From: Sascha Hauer @ 2013-02-11 9:55 UTC (permalink / raw) To: Vicente Bergas; +Cc: barebox On Sun, Feb 10, 2013 at 05:58:56PM +0100, Vicente Bergas wrote: > Add the initrd start and end address to the DT, code comes from u-boot. > > Signed-off-by: Vicente Bergas <vicencb@gmail.com> > --- > arch/arm/lib/armlinux.c | 2 ++ > common/oftree.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ > include/of.h | 1 + > 3 files changed, 69 insertions(+) > > diff --git a/arch/arm/lib/armlinux.c b/arch/arm/lib/armlinux.c > index 40a63ea..8052ca4 100644 > --- a/arch/arm/lib/armlinux.c > +++ b/arch/arm/lib/armlinux.c > @@ -266,6 +266,8 @@ void start_linux(void *adr, int swap, unsigned long initrd_address, > > if (oftree) { > printf("booting Linux kernel with devicetree\n"); > + fdt_initrd(oftree, initrd_address, > + initrd_address+initrd_size, 1); Does this compile with CONFIG_FDT disabled? You probably have to provide a static inline function for this case. Nitpick: Please add spaces left and right from operators. Sascha > params = oftree; > } else { > setup_tags(initrd_address, initrd_size, swap); > diff --git a/common/oftree.c b/common/oftree.c > index 0df5209..7c118d2 100644 > --- a/common/oftree.c > +++ b/common/oftree.c > @@ -246,6 +246,72 @@ int fdt_get_path_or_create(struct fdt_header *fdt, const char *path) > return nodeoffset; > } > > +int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force) > +{ > + int nodeoffset; > + int err, j, total; > + u32 tmp; > + const char *path; > + uint64_t addr, size; > + > + /* Find the "chosen" node */ > + nodeoffset = fdt_path_offset(fdt, "/chosen"); > + > + /* If there is no "chosen" node in the blob return */ > + if (nodeoffset < 0) { > + printf("fdt_initrd: %s\n", fdt_strerror(nodeoffset)); > + return nodeoffset; > + } > + > + /* just return if initrd_start/end aren't valid */ > + if ((initrd_start == 0) || (initrd_end == 0)) > + return 0; > + > + total = fdt_num_mem_rsv(fdt); > + > + /* > + * Look for an existing entry and update it. If we don't find > + * the entry, we will j be the next available slot. > + */ > + for (j = 0; j < total; j++) { > + err = fdt_get_mem_rsv(fdt, j, &addr, &size); > + if (addr == initrd_start) { > + fdt_del_mem_rsv(fdt, j); > + break; > + } > + } > + > + err = fdt_add_mem_rsv(fdt, initrd_start, initrd_end - initrd_start); > + if (err < 0) { > + printf("fdt_initrd: %s\n", fdt_strerror(err)); > + return err; > + } > + > + path = fdt_getprop(fdt, nodeoffset, "linux,initrd-start", NULL); > + if (!path || force) { > + tmp = __cpu_to_be32(initrd_start); > + err = fdt_setprop(fdt, nodeoffset, > + "linux,initrd-start", &tmp, sizeof(tmp)); > + if (err < 0) { > + printf("WARNING: " > + "could not set linux,initrd-start %s.\n", > + fdt_strerror(err)); > + return err; > + } > + tmp = __cpu_to_be32(initrd_end); > + err = fdt_setprop(fdt, nodeoffset, > + "linux,initrd-end", &tmp, sizeof(tmp)); > + if (err < 0) { > + printf("WARNING: could not set linux,initrd-end %s.\n", > + fdt_strerror(err)); > + > + return err; > + } > + } > + > + return 0; > +} > + > static int of_fixup_bootargs(struct fdt_header *fdt) > { > int nodeoffset; > diff --git a/include/of.h b/include/of.h > index d3a310f..dcb4c4b 100644 > --- a/include/of.h > +++ b/include/of.h > @@ -18,6 +18,7 @@ void do_fixup_by_path(struct fdt_header *fdt, const char *path, const char *prop > void do_fixup_by_path_u32(struct fdt_header *fdt, const char *path, const char *prop, > u32 val, int create); > int fdt_get_path_or_create(struct fdt_header *fdt, const char *path); > +int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force); > > #define OF_BAD_ADDR ((u64)-1) > > -- > 1.8.1.3 > > > _______________________________________________ > 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-5555 | _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 2/2] ArchosG9: boot linux kernel with DT 2013-02-10 16:58 [PATCH 0/2] DeviceTree: add support for initrd in the DT Vicente Bergas 2013-02-10 16:58 ` [PATCH 1/2] " Vicente Bergas @ 2013-02-10 16:58 ` Vicente Bergas 1 sibling, 0 replies; 4+ messages in thread From: Vicente Bergas @ 2013-02-10 16:58 UTC (permalink / raw) To: barebox; +Cc: Vicente Bergas Provide a device tree to the OS. Signed-off-by: Vicente Bergas <vicencb@gmail.com> --- arch/arm/boards/archosg9/env/config | 1 + arch/arm/configs/archosg9_defconfig | 4 ++++ arch/arm/configs/archosg9_xload_defconfig | 1 + 3 files changed, 6 insertions(+) diff --git a/arch/arm/boards/archosg9/env/config b/arch/arm/boards/archosg9/env/config index 8f3edb0..60467f6 100644 --- a/arch/arm/boards/archosg9/env/config +++ b/arch/arm/boards/archosg9/env/config @@ -1,3 +1,4 @@ global.bootm.image="${TARGET_ROOT}/boot/zImage" global.bootm.initrd="${TARGET_ROOT}/boot/initrd" +global.bootm.oftree="${TARGET_ROOT}/boot/omap4-archosg9.dtb" global.linux.bootargs.base="console=ttyO0,115200n8 root=/dev/ram0" diff --git a/arch/arm/configs/archosg9_defconfig b/arch/arm/configs/archosg9_defconfig index 9a051da..337a7b7 100644 --- a/arch/arm/configs/archosg9_defconfig +++ b/arch/arm/configs/archosg9_defconfig @@ -45,6 +45,9 @@ CONFIG_CMD_BOOTM_OFTREE_UIMAGE=y CONFIG_CMD_BOOTM_AIMAGE=y CONFIG_CMD_RESET=y CONFIG_CMD_GO=y +CONFIG_CMD_OFTREE=y +CONFIG_CMD_OF_PROPERTY=y +CONFIG_CMD_OF_NODE=y CONFIG_CMD_TIMEOUT=y CONFIG_CMD_PARTITION=y CONFIG_CMD_MAGICVAR=y @@ -68,3 +71,4 @@ CONFIG_FS_FAT=y CONFIG_FS_FAT_WRITE=y CONFIG_FS_FAT_LFN=y CONFIG_FS_OMAP4_USBBOOT=y +CONFIG_OFDEVICE=y diff --git a/arch/arm/configs/archosg9_xload_defconfig b/arch/arm/configs/archosg9_xload_defconfig index 83743fa..b25778a 100644 --- a/arch/arm/configs/archosg9_xload_defconfig +++ b/arch/arm/configs/archosg9_xload_defconfig @@ -21,4 +21,5 @@ CONFIG_DRIVER_SERIAL_OMAP4_USBBOOT=y # CONFIG_SPI is not set # CONFIG_FS_RAMFS is not set # CONFIG_FS_DEVFS is not set +CONFIG_FS_FAT=y CONFIG_FS_OMAP4_USBBOOT=y -- 1.8.1.3 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2013-02-11 9:56 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2013-02-10 16:58 [PATCH 0/2] DeviceTree: add support for initrd in the DT Vicente Bergas 2013-02-10 16:58 ` [PATCH 1/2] " Vicente Bergas 2013-02-11 9:55 ` Sascha Hauer 2013-02-10 16:58 ` [PATCH 2/2] ArchosG9: boot linux kernel with DT Vicente Bergas
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox