* [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
* [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
* 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
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