* [PATCH 0/4] allow DTB to be appended to the ARM zImage with ATAG conversion
@ 2011-06-21 5:09 Nicolas Pitre
2011-06-21 5:09 ` [PATCH 1/4] ARM: zImage: ensure it is always a multiple of 64 bits in size Nicolas Pitre
` (4 more replies)
0 siblings, 5 replies; 12+ messages in thread
From: Nicolas Pitre @ 2011-06-21 5:09 UTC (permalink / raw)
To: linux-arm-kernel
Yet another resend, this time with a patch to convert some ATAGs and
fold them into the appended DTB. Additional ATAgs and their corresponding
DTB representation is still up for discussion. In particular,
ATAG_REVISION and ATAG_SERIAL were mentioned as missing but there is
no direct DT equivalent for them. One suggestion was to fold them into
the kernel cmdline string. Anything else?
Testing would also be appreciated.
[PATCH 1/4] ARM: zImage: ensure it is always a multiple of 64 bits in size
[PATCH 2/4] ARM: zImage: Allow the appending of a device tree binary
[PATCH 3/4] ARM: zImage: make sure appended DTB doesn't get overwritten by kernel .bss
[PATCH 4/4] ARM: zImage: allow supplementing appended DTB with traditional ATAG data
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 1/4] ARM: zImage: ensure it is always a multiple of 64 bits in size
2011-06-21 5:09 [PATCH 0/4] allow DTB to be appended to the ARM zImage with ATAG conversion Nicolas Pitre
@ 2011-06-21 5:09 ` Nicolas Pitre
2011-06-21 5:09 ` [PATCH 2/4] ARM: zImage: Allow the appending of a device tree binary Nicolas Pitre
` (3 subsequent siblings)
4 siblings, 0 replies; 12+ messages in thread
From: Nicolas Pitre @ 2011-06-21 5:09 UTC (permalink / raw)
To: linux-arm-kernel
From: Nicolas Pitre <nicolas.pitre@linaro.org>
This is needed for proper alignment when the DTB appending feature
is used.
Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Acked-by: Tony Lindgren <tony@atomide.com>
---
arch/arm/boot/compressed/vmlinux.lds.in | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/arch/arm/boot/compressed/vmlinux.lds.in b/arch/arm/boot/compressed/vmlinux.lds.in
index ea80abe..6c02db1 100644
--- a/arch/arm/boot/compressed/vmlinux.lds.in
+++ b/arch/arm/boot/compressed/vmlinux.lds.in
@@ -47,6 +47,9 @@ SECTIONS
.got : { *(.got) }
_got_end = .;
.got.plt : { *(.got.plt) }
+
+ /* ensure the zImage file size is always a multiple of 64 bits */
+ .pad : { BYTE(0); . = ALIGN(8); }
_edata = .;
. = BSS_START;
--
1.7.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 2/4] ARM: zImage: Allow the appending of a device tree binary
2011-06-21 5:09 [PATCH 0/4] allow DTB to be appended to the ARM zImage with ATAG conversion Nicolas Pitre
2011-06-21 5:09 ` [PATCH 1/4] ARM: zImage: ensure it is always a multiple of 64 bits in size Nicolas Pitre
@ 2011-06-21 5:09 ` Nicolas Pitre
2011-06-21 5:09 ` [PATCH 3/4] ARM: zImage: make sure appended DTB doesn't get overwritten by kernel .bss Nicolas Pitre
` (2 subsequent siblings)
4 siblings, 0 replies; 12+ messages in thread
From: Nicolas Pitre @ 2011-06-21 5:09 UTC (permalink / raw)
To: linux-arm-kernel
From: John Bonesio <bones@secretlab.ca>
This patch provides the ability to boot using a device tree that is appended
to the raw binary zImage (e.g. cat zImage <filename>.dtb > zImage_w_dtb).
Signed-off-by: John Bonesio <bones@secretlab.ca>
[nico: adjusted to latest zImage changes plus additional cleanups]
Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Acked-by: Grant Likely <grant.likely@secretlab.ca>
Acked-by: Tony Lindgren <tony@atomide.com>
---
arch/arm/Kconfig | 8 ++++
arch/arm/boot/compressed/head.S | 70 +++++++++++++++++++++++++++++++++++++--
2 files changed, 75 insertions(+), 3 deletions(-)
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 9adc278..66b7d1e 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1727,6 +1727,14 @@ config ZBOOT_ROM_MMCIF
which in turn loads the rest the kernel image to RAM using the
MMCIF hardware block.
+config ARM_APPENDED_DTB
+ bool "Use appended device tree blob to zImage"
+ depends on OF && !ZBOOT_ROM
+ help
+ With this option, the boot code will look for a device tree binary
+ (dtb) appended to zImage
+ (e.g. cat zImage <filename>.dtb > zImage_w_dtb).
+
config CMDLINE
string "Default kernel command string"
default ""
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
index f9da419..b791b5e 100644
--- a/arch/arm/boot/compressed/head.S
+++ b/arch/arm/boot/compressed/head.S
@@ -216,6 +216,59 @@ restart: adr r0, LC0
mov r10, r6
#endif
+ mov r5, #0 @ init dtb size to 0
+#ifdef CONFIG_ARM_APPENDED_DTB
+/*
+ * r0 = delta
+ * r2 = BSS start
+ * r3 = BSS end
+ * r4 = final kernel address
+ * r5 = appended dtb size (still unknown)
+ * r6 = _edata
+ * r7 = architecture ID
+ * r8 = atags/device tree pointer
+ * r9 = size of decompressed image
+ * r10 = end of this image, including bss/stack/malloc space if non XIP
+ * r11 = GOT start
+ * r12 = GOT end
+ * sp = stack pointer
+ *
+ * if there are device trees (dtb) appended to zImage, advance r10 so that the
+ * dtb data will get relocated along with the kernel if necessary.
+ */
+
+ ldr lr, [r6, #0]
+#ifndef __ARMEB__
+ ldr r1, =0xedfe0dd0 @ sig is 0xd00dfeed big endian
+#else
+ ldr r1, =0xd00dfeed
+#endif
+ cmp lr, r1
+ bne dtb_check_done @ not found
+
+ mov r8, r6 @ use the appended device tree
+
+ /* Get the dtb's size */
+ ldr r5, [r6, #4]
+#ifndef __ARMEB__
+ /* convert r5 (dtb size) to little endian */
+ eor r1, r5, r5, ror #16
+ bic r1, r1, #0x00ff0000
+ mov r5, r5, ror #8
+ eor r5, r5, r1, lsr #8
+#endif
+
+ /* preserve 64-bit alignment */
+ add r5, r5, #7
+ bic r5, r5, #7
+
+ /* relocate some pointers past the appended dtb */
+ add r6, r6, r5
+ add r10, r10, r5
+ add sp, sp, r5
+dtb_check_done:
+#endif
+
/*
* Check to see if we will overwrite ourselves.
* r4 = final kernel address
@@ -285,14 +338,16 @@ wont_overwrite:
* r2 = BSS start
* r3 = BSS end
* r4 = kernel execution address
+ * r5 = appended dtb size (0 if not present)
* r7 = architecture ID
* r8 = atags pointer
* r11 = GOT start
* r12 = GOT end
* sp = stack pointer
*/
- teq r0, #0
+ orrs r1, r0, r5
beq not_relocated
+
add r11, r11, r0
add r12, r12, r0
@@ -307,12 +362,21 @@ wont_overwrite:
/*
* Relocate all entries in the GOT table.
+ * Bump bss entries to _edata + dtb size
*/
1: ldr r1, [r11, #0] @ relocate entries in the GOT
- add r1, r1, r0 @ table. This fixes up the
- str r1, [r11], #4 @ C references.
+ add r1, r1, r0 @ This fixes up C references
+ cmp r1, r2 @ if entry >= bss_start &&
+ cmphs r3, r1 @ bss_end > entry
+ addhi r1, r1, r5 @ entry += dtb size
+ str r1, [r11], #4 @ next entry
cmp r11, r12
blo 1b
+
+ /* bump our bss pointers too */
+ add r2, r2, r5
+ add r3, r3, r5
+
#else
/*
--
1.7.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 3/4] ARM: zImage: make sure appended DTB doesn't get overwritten by kernel .bss
2011-06-21 5:09 [PATCH 0/4] allow DTB to be appended to the ARM zImage with ATAG conversion Nicolas Pitre
2011-06-21 5:09 ` [PATCH 1/4] ARM: zImage: ensure it is always a multiple of 64 bits in size Nicolas Pitre
2011-06-21 5:09 ` [PATCH 2/4] ARM: zImage: Allow the appending of a device tree binary Nicolas Pitre
@ 2011-06-21 5:09 ` Nicolas Pitre
2011-06-21 5:09 ` [PATCH 4/4] ARM: zImage: allow supplementing appended DTB with traditional ATAG data Nicolas Pitre
2011-06-21 21:59 ` [PATCH 0/4] allow DTB to be appended to the ARM zImage with ATAG conversion David Brown
4 siblings, 0 replies; 12+ messages in thread
From: Nicolas Pitre @ 2011-06-21 5:09 UTC (permalink / raw)
To: linux-arm-kernel
From: Nicolas Pitre <nicolas.pitre@linaro.org>
The appended DTB gets relocated with the decompressor code to get out
of the way of the decompressed kernel. However the kernel's .bss section
may be larger than the relocated code and data, and then the DTB gets
overwritten. Let's make sure the relocation takes care of moving zImage
far enough so no such conflict with .bss occurs.
Thanks to Tony Lindgren <tony@atomide.com> for figuring out this issue.
While at it, let's clean up the code a bit so that the wont_overwrite
symbol is used while determining if a conflict exists, making the above
change more precise as well as eliminating some ARM/THUMB alternates.
Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Acked-by: Tony Lindgren <tony@atomide.com>
---
arch/arm/boot/compressed/Makefile | 3 +++
arch/arm/boot/compressed/head.S | 19 +++++++++++++++----
2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
index 23aad07..48bead9 100644
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -98,6 +98,9 @@ endif
ccflags-y := -fpic -fno-builtin
asflags-y := -Wa,-march=all
+# Supply kernel BSS size to the decompressor via a linker symbol.
+KBSS_SZ = $(shell size $(obj)/../../../../vmlinux | awk 'END{print $$3}')
+LDFLAGS_vmlinux = --defsym _kernel_bss_size=$(KBSS_SZ)
# Supply ZRELADDR to the decompressor via a linker symbol.
ifneq ($(CONFIG_AUTO_ZRELADDR),y)
LDFLAGS_vmlinux += --defsym zreladdr=$(ZRELADDR)
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
index b791b5e..d4f8db2 100644
--- a/arch/arm/boot/compressed/head.S
+++ b/arch/arm/boot/compressed/head.S
@@ -248,6 +248,18 @@ restart: adr r0, LC0
mov r8, r6 @ use the appended device tree
+ /*
+ * Make sure that the DTB doesn't end up in the final
+ * kernel's .bss area. To do so, we adjust the decompressed
+ * kernel size to compensate if that .bss size is larger
+ * than the relocated code.
+ */
+ ldr r5, =_kernel_bss_size
+ adr r1, wont_overwrite
+ sub r1, r6, r1
+ subs r1, r5, r1
+ addhi r9, r9, r1
+
/* Get the dtb's size */
ldr r5, [r6, #4]
#ifndef __ARMEB__
@@ -276,15 +288,14 @@ dtb_check_done:
* r10 = end of this image, including bss/stack/malloc space if non XIP
* We basically want:
* r4 - 16k page directory >= r10 -> OK
- * r4 + image length <= current position (pc) -> OK
+ * r4 + image length <= address of wont_overwrite -> OK
*/
add r10, r10, #16384
cmp r4, r10
bhs wont_overwrite
add r10, r4, r9
- ARM( cmp r10, pc )
- THUMB( mov lr, pc )
- THUMB( cmp r10, lr )
+ adr r9, wont_overwrite
+ cmp r10, r9
bls wont_overwrite
/*
--
1.7.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 4/4] ARM: zImage: allow supplementing appended DTB with traditional ATAG data
2011-06-21 5:09 [PATCH 0/4] allow DTB to be appended to the ARM zImage with ATAG conversion Nicolas Pitre
` (2 preceding siblings ...)
2011-06-21 5:09 ` [PATCH 3/4] ARM: zImage: make sure appended DTB doesn't get overwritten by kernel .bss Nicolas Pitre
@ 2011-06-21 5:09 ` Nicolas Pitre
2011-06-21 7:00 ` Shawn Guo
2011-06-21 22:58 ` David Brown
2011-06-21 21:59 ` [PATCH 0/4] allow DTB to be appended to the ARM zImage with ATAG conversion David Brown
4 siblings, 2 replies; 12+ messages in thread
From: Nicolas Pitre @ 2011-06-21 5:09 UTC (permalink / raw)
To: linux-arm-kernel
From: Nicolas Pitre <nicolas.pitre@linaro.org>
Some old bootloaders can't be updated to a device tree capable one,
yet they provide ATAGs with memory configuration, the ramdisk address,
the kernel cmdline string, etc. To allow a device tree enabled
kernel to be used with such bootloaders, it is necessary to convert those
ATAGs into FDT properties and fold them into the DTB appended to zImage.
Currently the following ATAGs are converted:
ATAG_CMDLINE
ATAG_MEM (up to 8 memory regions)
ATAG_INITRD2
If the corresponding information already exists in the appended DTB, it
is replaced, otherwise the required node is created to hold it.
The code looks for ATAGs at the location pointed by the value of r2 upon
entry into the zImage code. If no ATAGs are found there, an attempt at
finding ATAGs at the typical 0x100 offset from start of RAM is made.
Otherwise the DTB is left unchanged.
Thisstarted from an older patch from John Bonesio <bones@secretlab.ca>,
with contributions from David Brown <davidb@codeaurora.org>.
Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
---
arch/arm/Kconfig | 11 ++++
arch/arm/boot/compressed/.gitignore | 9 +++
arch/arm/boot/compressed/Makefile | 23 ++++++-
arch/arm/boot/compressed/atags_to_fdt.c | 97 +++++++++++++++++++++++++++++++
arch/arm/boot/compressed/head.S | 32 ++++++++++
arch/arm/boot/compressed/libfdt_env.h | 15 +++++
arch/arm/boot/compressed/misc.c | 52 ++++++++++++++++
7 files changed, 236 insertions(+), 3 deletions(-)
create mode 100644 arch/arm/boot/compressed/atags_to_fdt.c
create mode 100644 arch/arm/boot/compressed/libfdt_env.h
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 66b7d1e..166bd2a 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1735,6 +1735,17 @@ config ARM_APPENDED_DTB
(dtb) appended to zImage
(e.g. cat zImage <filename>.dtb > zImage_w_dtb).
+config ARM_ATAG_DTB_COMPAT
+ bool "Supplement the appended DTB with traditional ATAG information"
+ depends on ARM_APPENDED_DTB
+ help
+ Some old bootloaders can't be updated to a DTB capable one, yet
+ they provide ATAGs with memory configuration, the ramdisk address,
+ the kernel cmdline string, etc. To allow a device tree enabled
+ kernel to be used with such bootloaders, this option allows
+ zImage to extract the information from the ATAG list and store it
+ at run time into the appended DTB.
+
config CMDLINE
string "Default kernel command string"
default ""
diff --git a/arch/arm/boot/compressed/.gitignore b/arch/arm/boot/compressed/.gitignore
index c602896..e0936a1 100644
--- a/arch/arm/boot/compressed/.gitignore
+++ b/arch/arm/boot/compressed/.gitignore
@@ -5,3 +5,12 @@ piggy.lzo
piggy.lzma
vmlinux
vmlinux.lds
+
+# borrowed libfdt files
+fdt.c
+fdt.h
+fdt_ro.c
+fdt_rw.c
+fdt_wip.c
+libfdt.h
+libfdt_internal.h
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
index 48bead9..4b94995 100644
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -83,19 +83,36 @@ suffix_$(CONFIG_KERNEL_GZIP) = gzip
suffix_$(CONFIG_KERNEL_LZO) = lzo
suffix_$(CONFIG_KERNEL_LZMA) = lzma
+# libfdt files for the ATAG compatibility mode
+
+libfdt := fdt_rw.c fdt_ro.c fdt_wip.c fdt.c
+libfdt_hdrs := fdt.h libfdt.h libfdt_internal.h
+
+libfdt_objs := $(addsuffix .o, $(basename $(libfdt)))
+
+$(addprefix $(obj)/,$(libfdt) $(libfdt_hdrs)): $(obj)/%: $(srctree)/scripts/dtc/libfdt/%
+ $(call if_changed,shipped)
+
+$(addprefix $(obj)/,$(libfdt_objs) atags_to_fdt.o): \
+ $(addprefix $(obj)/,$(libfdt_hdrs))
+
+ifeq ($(CONFIG_ARM_ATAG_DTB_COMPAT),y)
+OBJS += $(libfdt_objs) atags_to_fdt.o
+endif
+
targets := vmlinux vmlinux.lds \
piggy.$(suffix_y) piggy.$(suffix_y).o \
font.o font.c head.o misc.o $(OBJS)
# Make sure files are removed during clean
-extra-y += piggy.gzip piggy.lzo piggy.lzma lib1funcs.S
+extra-y += piggy.gzip piggy.lzo piggy.lzma lib1funcs.S $(libfdt) $(libfdt_hdrs)
ifeq ($(CONFIG_FUNCTION_TRACER),y)
ORIG_CFLAGS := $(KBUILD_CFLAGS)
KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
endif
-ccflags-y := -fpic -fno-builtin
+ccflags-y := -fpic -fno-builtin -I$(src)
asflags-y := -Wa,-march=all
# Supply kernel BSS size to the decompressor via a linker symbol.
@@ -118,7 +135,7 @@ LDFLAGS_vmlinux += -X
LDFLAGS_vmlinux += -T
# For __aeabi_uidivmod
-lib1funcs = $(obj)/lib1funcs.o
+lib1funcs = $(obj)/lib1funcs.o $(obj)/../../lib/lib.a
$(obj)/lib1funcs.S: $(srctree)/arch/$(SRCARCH)/lib/lib1funcs.S FORCE
$(call cmd,shipped)
diff --git a/arch/arm/boot/compressed/atags_to_fdt.c b/arch/arm/boot/compressed/atags_to_fdt.c
new file mode 100644
index 0000000..d79afd7
--- /dev/null
+++ b/arch/arm/boot/compressed/atags_to_fdt.c
@@ -0,0 +1,97 @@
+#include <asm/setup.h>
+#include <libfdt.h>
+
+static int node_offset(void *fdt, const char *node_path)
+{
+ int offset = fdt_path_offset(fdt, node_path);
+ if (offset == -FDT_ERR_NOTFOUND)
+ offset = fdt_add_subnode(fdt, 0, node_path);
+ return offset;
+}
+
+static int setprop(void *fdt, const char *node_path, const char *property,
+ uint32_t *val_array, int size)
+{
+ int offset = node_offset(fdt, node_path);
+ if (offset < 0)
+ return offset;
+ return fdt_setprop(fdt, offset, property, val_array, size);
+}
+
+static int setprop_string(void *fdt, const char *node_path,
+ const char *property, const char *string)
+{
+ int offset = node_offset(fdt, node_path);
+ if (offset < 0)
+ return offset;
+ return fdt_setprop_string(fdt, offset, property, string);
+}
+
+static int setprop_cell(void *fdt, const char *node_path,
+ const char *property, uint32_t val)
+{
+ int offset = node_offset(fdt, node_path);
+ if (offset < 0)
+ return offset;
+ return fdt_setprop_cell(fdt, offset, property, val);
+}
+
+/*
+ * Convert and fold provided ATAGs into the provided FDT.
+ *
+ * REturn values:
+ * = 0 -> pretend success
+ * = 1 -> bad ATAG (may retry with another possible ATAG pointer)
+ * < 0 -> error from libfdt
+ */
+int atags_to_fdt(void *atag_list, void *fdt, int total_space)
+{
+ struct tag *atag = atag_list;
+ uint32_t mem_reg_property[16];
+ int memcount = 0;
+ int ret;
+
+ /* make sure we've got an aligned pointer */
+ if ((u32)atag_list & 0x3)
+ return 1;
+
+ /* if we get a DTB here we're done already */
+ if (*(u32 *)atag_list == fdt32_to_cpu(FDT_MAGIC))
+ return 0;
+
+ /* validate the ATAG */
+ if (atag->hdr.tag != ATAG_CORE ||
+ (atag->hdr.size != tag_size(tag_core) &&
+ atag->hdr.size != 2))
+ return 1;
+
+ /* let's give it all the room it could need */
+ ret = fdt_open_into(fdt, fdt, total_space);
+ if (ret < 0)
+ return ret;
+
+ for_each_tag(atag, atag_list) {
+ if (atag->hdr.tag == ATAG_CMDLINE) {
+ setprop_string(fdt, "/chosen", "bootargs",
+ atag->u.cmdline.cmdline);
+ } else if (atag->hdr.tag == ATAG_MEM) {
+ if (memcount >= sizeof(mem_reg_property)/sizeof(uint32_t))
+ continue;
+ mem_reg_property[memcount++] = cpu_to_fdt32(atag->u.mem.start);
+ mem_reg_property[memcount++] = cpu_to_fdt32(atag->u.mem.size);
+ } else if (atag->hdr.tag == ATAG_INITRD2) {
+ uint32_t initrd_start, initrd_size;
+ initrd_start = atag->u.initrd.start;
+ initrd_size = atag->u.initrd.size;
+ setprop_cell(fdt, "/chosen", "linux,initrd-start",
+ initrd_start);
+ setprop_cell(fdt, "/chosen", "linux,initrd-end",
+ initrd_start + initrd_size);
+ }
+ }
+
+ if (memcount)
+ setprop(fdt, "/memory", "reg", mem_reg_property, 4*memcount);
+
+ return fdt_pack(fdt);
+}
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
index d4f8db2..6ca94d1 100644
--- a/arch/arm/boot/compressed/head.S
+++ b/arch/arm/boot/compressed/head.S
@@ -246,6 +246,38 @@ restart: adr r0, LC0
cmp lr, r1
bne dtb_check_done @ not found
+#ifdef CONFIG_ARM_ATAG_DTB_COMPAT
+ /*
+ * OK... Let's do some funky business here.
+ * If we do have a DTB appended to zImage, and we do have
+ * an ATAG list around, we want the later to be translated
+ * and folded into the former here. To be on the safe side,
+ * let's temporarily move the stack away into the malloc
+ * area. No GOT fixup has occurred yet, but none of the
+ * code we're about to call uses any global variable.
+ */
+ add sp, sp, #0x10000
+ stmfd sp!, {r0-r3, ip, lr}
+ mov r0, r8
+ mov r1, r6
+ sub r2, sp, r6
+ bl atags_to_fdt
+
+ /*
+ * If returned value is 1, there is no ATAG at the location
+ * pointed by r8. Try the typical 0x100 offset from start
+ * of RAM and hope for the best.
+ */
+ cmp r0, #1
+ sub r0, r4, #(TEXT_OFFSET - 0x100)
+ mov r1, r6
+ sub r2, sp, r6
+ blne atags_to_fdt
+
+ ldmfd sp!, {r0-r3, ip, lr}
+ sub sp, sp, #0x10000
+#endif
+
mov r8, r6 @ use the appended device tree
/*
diff --git a/arch/arm/boot/compressed/libfdt_env.h b/arch/arm/boot/compressed/libfdt_env.h
new file mode 100644
index 0000000..1f4e718
--- /dev/null
+++ b/arch/arm/boot/compressed/libfdt_env.h
@@ -0,0 +1,15 @@
+#ifndef _ARM_LIBFDT_ENV_H
+#define _ARM_LIBFDT_ENV_H
+
+#include <linux/types.h>
+#include <linux/string.h>
+#include <asm/byteorder.h>
+
+#define fdt16_to_cpu(x) be16_to_cpu(x)
+#define cpu_to_fdt16(x) cpu_to_be16(x)
+#define fdt32_to_cpu(x) be32_to_cpu(x)
+#define cpu_to_fdt32(x) cpu_to_be32(x)
+#define fdt64_to_cpu(x) be64_to_cpu(x)
+#define cpu_to_fdt64(x) cpu_to_be64(x)
+
+#endif
diff --git a/arch/arm/boot/compressed/misc.c b/arch/arm/boot/compressed/misc.c
index 832d372..535b14e 100644
--- a/arch/arm/boot/compressed/misc.c
+++ b/arch/arm/boot/compressed/misc.c
@@ -136,6 +136,58 @@ void *memcpy(void *__dest, __const void *__src, size_t __n)
return __dest;
}
+void *memmove(void *__dest, __const void *__src, size_t __n)
+{
+ unsigned char *d = __dest;
+ const unsigned char *s = __src;
+
+ if (__dest == __src)
+ return __dest;
+
+ if (__dest < __src)
+ return memcpy(__dest, __src, __n);
+
+ while (--__n >= 0)
+ d[__n] = s[__n];
+
+ return __dest;
+}
+
+size_t strlen(const char *s)
+{
+ const char *sc;
+
+ for (sc = s; *sc != '\0'; ++sc)
+ /* nothing */;
+ return sc - s;
+}
+
+int memcmp(const void *cs, const void *ct, size_t count)
+{
+ const unsigned char *su1, *su2;
+ int res = 0;
+
+ for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
+ if ((res = *su1 - *su2) != 0)
+ break;
+ return res;
+}
+
+int strcmp(const char *cs, const char *ct)
+{
+ unsigned char c1, c2;
+
+ while (1) {
+ c1 = *cs++;
+ c2 = *ct++;
+ if (c1 != c2)
+ return c1 < c2 ? -1 : 1;
+ if (!c1)
+ break;
+ }
+ return 0;
+}
+
/*
* gzip declarations
*/
--
1.7.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 4/4] ARM: zImage: allow supplementing appended DTB with traditional ATAG data
2011-06-21 5:09 ` [PATCH 4/4] ARM: zImage: allow supplementing appended DTB with traditional ATAG data Nicolas Pitre
@ 2011-06-21 7:00 ` Shawn Guo
2011-06-21 17:32 ` David Brown
2011-06-21 22:58 ` David Brown
1 sibling, 1 reply; 12+ messages in thread
From: Shawn Guo @ 2011-06-21 7:00 UTC (permalink / raw)
To: linux-arm-kernel
On Tue, Jun 21, 2011 at 01:09:15AM -0400, Nicolas Pitre wrote:
> From: Nicolas Pitre <nicolas.pitre@linaro.org>
>
> Some old bootloaders can't be updated to a device tree capable one,
> yet they provide ATAGs with memory configuration, the ramdisk address,
> the kernel cmdline string, etc. To allow a device tree enabled
> kernel to be used with such bootloaders, it is necessary to convert those
> ATAGs into FDT properties and fold them into the DTB appended to zImage.
>
> Currently the following ATAGs are converted:
>
> ATAG_CMDLINE
> ATAG_MEM (up to 8 memory regions)
> ATAG_INITRD2
>
> If the corresponding information already exists in the appended DTB, it
> is replaced, otherwise the required node is created to hold it.
>
> The code looks for ATAGs at the location pointed by the value of r2 upon
> entry into the zImage code. If no ATAGs are found there, an attempt at
> finding ATAGs at the typical 0x100 offset from start of RAM is made.
> Otherwise the DTB is left unchanged.
>
> Thisstarted from an older patch from John Bonesio <bones@secretlab.ca>,
> with contributions from David Brown <davidb@codeaurora.org>.
>
> Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
> ---
With this patch applied, I saw nothing coming from kernel on imx51
babbage serial port.
--
Regards,
Shawn
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 4/4] ARM: zImage: allow supplementing appended DTB with traditional ATAG data
2011-06-21 7:00 ` Shawn Guo
@ 2011-06-21 17:32 ` David Brown
0 siblings, 0 replies; 12+ messages in thread
From: David Brown @ 2011-06-21 17:32 UTC (permalink / raw)
To: linux-arm-kernel
On Tue, Jun 21 2011, Shawn Guo wrote:
> On Tue, Jun 21, 2011 at 01:09:15AM -0400, Nicolas Pitre wrote:
>> From: Nicolas Pitre <nicolas.pitre@linaro.org>
>>
>> Some old bootloaders can't be updated to a device tree capable one,
>> yet they provide ATAGs with memory configuration, the ramdisk address,
>> the kernel cmdline string, etc. To allow a device tree enabled
>> kernel to be used with such bootloaders, it is necessary to convert those
>> ATAGs into FDT properties and fold them into the DTB appended to zImage.
>>
>> Currently the following ATAGs are converted:
>>
>> ATAG_CMDLINE
>> ATAG_MEM (up to 8 memory regions)
>> ATAG_INITRD2
>>
>> If the corresponding information already exists in the appended DTB, it
>> is replaced, otherwise the required node is created to hold it.
>>
>> The code looks for ATAGs at the location pointed by the value of r2 upon
>> entry into the zImage code. If no ATAGs are found there, an attempt at
>> finding ATAGs at the typical 0x100 offset from start of RAM is made.
>> Otherwise the DTB is left unchanged.
>>
>> Thisstarted from an older patch from John Bonesio <bones@secretlab.ca>,
>> with contributions from David Brown <davidb@codeaurora.org>.
>>
>> Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
>> ---
>
> With this patch applied, I saw nothing coming from kernel on imx51
> babbage serial port.
Can you try seeing if it works with padding in the DTB that you are
using? Right now, I'm using something like:
/ {
...
memory {
reg = <0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>;
};
chosen {
bootargs = " "; /* Enough for arg */
linux,initrd-start = <0>;
linux,initrd-end = <0>;
};
};
I get problems if the fdt code tries to expand the tree, even if I add
padding when running the dtc (I've tried -p 1024).
Hopefully, I'll get some time today to try and figure out what is going
on.
David
--
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 0/4] allow DTB to be appended to the ARM zImage with ATAG conversion
2011-06-21 5:09 [PATCH 0/4] allow DTB to be appended to the ARM zImage with ATAG conversion Nicolas Pitre
` (3 preceding siblings ...)
2011-06-21 5:09 ` [PATCH 4/4] ARM: zImage: allow supplementing appended DTB with traditional ATAG data Nicolas Pitre
@ 2011-06-21 21:59 ` David Brown
4 siblings, 0 replies; 12+ messages in thread
From: David Brown @ 2011-06-21 21:59 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Jun 20 2011, Nicolas Pitre wrote:
> Yet another resend, this time with a patch to convert some ATAGs and
> fold them into the appended DTB. Additional ATAgs and their corresponding
> DTB representation is still up for discussion. In particular,
> ATAG_REVISION and ATAG_SERIAL were mentioned as missing but there is
> no direct DT equivalent for them. One suggestion was to fold them into
> the kernel cmdline string. Anything else?
>
> Testing would also be appreciated.
>
> [PATCH 1/4] ARM: zImage: ensure it is always a multiple of 64 bits in size
> [PATCH 2/4] ARM: zImage: Allow the appending of a device tree binary
> [PATCH 3/4] ARM: zImage: make sure appended DTB doesn't get overwritten by kernel .bss
> [PATCH 4/4] ARM: zImage: allow supplementing appended DTB with traditional ATAG data
The first three appear to be in Grant's devicetree/arm branch (as far as
I can tell), so I've tested the last one.
I get the same behavior on MSM8660, this works as long as the DTB has
the attributes with enough padding in them to hold the values written.
If the fdt code tries expanding the tree (I create the DTB sith -p
1024), then my device goes off in the weeds somewhere. I'm trying to
track this down, it seems to be failing in a memmove, even though that
memmove appears valid to me. I'm still investigating that.
Otherwise, it looks good.
David
--
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 4/4] ARM: zImage: allow supplementing appended DTB with traditional ATAG data
2011-06-21 5:09 ` [PATCH 4/4] ARM: zImage: allow supplementing appended DTB with traditional ATAG data Nicolas Pitre
2011-06-21 7:00 ` Shawn Guo
@ 2011-06-21 22:58 ` David Brown
2011-06-21 23:13 ` David Brown
1 sibling, 1 reply; 12+ messages in thread
From: David Brown @ 2011-06-21 22:58 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Jun 20 2011, Nicolas Pitre wrote:
> +void *memmove(void *__dest, __const void *__src, size_t __n)
> +{
> + unsigned char *d = __dest;
> + const unsigned char *s = __src;
> +
> + if (__dest == __src)
> + return __dest;
> +
> + if (__dest < __src)
> + return memcpy(__dest, __src, __n);
> +
> + while (--__n >= 0)
> + d[__n] = s[__n];
> +
> + return __dest;
> +}
Ahh, found it. size_t is unsigned, so the while loop never terminates.
Something like:
for (; __n; __n--)
d[__n] = s[__n];
makes that work for me.
This allows me to not need to pad or have any of the chosen attributes.
I do need to have a memory attribute, however, and I'll see if I can
figure out what is happening there.
Fun debugging when the loop overwrites the code itself, but it keeps
working because it is in the cache.
David
--
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 4/4] ARM: zImage: allow supplementing appended DTB with traditional ATAG data
2011-06-21 22:58 ` David Brown
@ 2011-06-21 23:13 ` David Brown
2011-06-21 23:22 ` Warner Losh
2011-06-21 23:35 ` Nicolas Pitre
0 siblings, 2 replies; 12+ messages in thread
From: David Brown @ 2011-06-21 23:13 UTC (permalink / raw)
To: linux-arm-kernel
On Tue, Jun 21 2011, David Brown wrote:
> On Mon, Jun 20 2011, Nicolas Pitre wrote:
>
>> +void *memmove(void *__dest, __const void *__src, size_t __n)
>> +{
>> + unsigned char *d = __dest;
>> + const unsigned char *s = __src;
>> +
>> + if (__dest == __src)
>> + return __dest;
>> +
>> + if (__dest < __src)
>> + return memcpy(__dest, __src, __n);
>> +
>> + while (--__n >= 0)
>> + d[__n] = s[__n];
>> +
>> + return __dest;
>> +}
>
> Ahh, found it. size_t is unsigned, so the while loop never terminates.
> Something like:
>
> for (; __n; __n--)
> d[__n] = s[__n];
Ugh. How about if I don't replace a broken version with a different
broken version.
while (__n) {
__n--;
d[__n] = s[__n];
}
Now, I don't need any extra fields in my DTB, and it correctly inserts
the ATAG values.
David
--
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 4/4] ARM: zImage: allow supplementing appended DTB with traditional ATAG data
2011-06-21 23:13 ` David Brown
@ 2011-06-21 23:22 ` Warner Losh
2011-06-21 23:35 ` Nicolas Pitre
1 sibling, 0 replies; 12+ messages in thread
From: Warner Losh @ 2011-06-21 23:22 UTC (permalink / raw)
To: linux-arm-kernel
On Jun 21, 2011, at 5:13 PM, David Brown wrote:
> On Tue, Jun 21 2011, David Brown wrote:
>
>> On Mon, Jun 20 2011, Nicolas Pitre wrote:
>>
>>> +void *memmove(void *__dest, __const void *__src, size_t __n)
>>> +{
>>> + unsigned char *d = __dest;
>>> + const unsigned char *s = __src;
>>> +
>>> + if (__dest == __src)
>>> + return __dest;
>>> +
>>> + if (__dest < __src)
>>> + return memcpy(__dest, __src, __n);
>>> +
>>> + while (--__n >= 0)
>>> + d[__n] = s[__n];
>>> +
>>> + return __dest;
>>> +}
>>
>> Ahh, found it. size_t is unsigned, so the while loop never terminates.
>> Something like:
>>
>> for (; __n; __n--)
>> d[__n] = s[__n];
>
> Ugh. How about if I don't replace a broken version with a different
> broken version.
>
> while (__n) {
> __n--;
> d[__n] = s[__n];
> }
>
> Now, I don't need any extra fields in my DTB, and it correctly inserts
> the ATAG values.
while (__n--)
d[__n] = s[__n];
does the same thing, and is more readable (and does the same thing as the original while())
Warner
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 4/4] ARM: zImage: allow supplementing appended DTB with traditional ATAG data
2011-06-21 23:13 ` David Brown
2011-06-21 23:22 ` Warner Losh
@ 2011-06-21 23:35 ` Nicolas Pitre
1 sibling, 0 replies; 12+ messages in thread
From: Nicolas Pitre @ 2011-06-21 23:35 UTC (permalink / raw)
To: linux-arm-kernel
On Tue, 21 Jun 2011, David Brown wrote:
> On Tue, Jun 21 2011, David Brown wrote:
>
> > On Mon, Jun 20 2011, Nicolas Pitre wrote:
> >
> >> +void *memmove(void *__dest, __const void *__src, size_t __n)
> >> +{
> >> + unsigned char *d = __dest;
> >> + const unsigned char *s = __src;
> >> +
> >> + if (__dest == __src)
> >> + return __dest;
> >> +
> >> + if (__dest < __src)
> >> + return memcpy(__dest, __src, __n);
> >> +
> >> + while (--__n >= 0)
> >> + d[__n] = s[__n];
> >> +
> >> + return __dest;
> >> +}
> >
> > Ahh, found it. size_t is unsigned, so the while loop never terminates.
> > Something like:
> >
> > for (; __n; __n--)
> > d[__n] = s[__n];
>
> Ugh. How about if I don't replace a broken version with a different
> broken version.
Blah. I'll try to fetch the generic version in lib/string.c instead of
duplicating that stuff.
Thanks for investigating. I only was able to compile-test the thing so
far. ;-)
Nicolas
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2011-06-21 23:35 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-21 5:09 [PATCH 0/4] allow DTB to be appended to the ARM zImage with ATAG conversion Nicolas Pitre
2011-06-21 5:09 ` [PATCH 1/4] ARM: zImage: ensure it is always a multiple of 64 bits in size Nicolas Pitre
2011-06-21 5:09 ` [PATCH 2/4] ARM: zImage: Allow the appending of a device tree binary Nicolas Pitre
2011-06-21 5:09 ` [PATCH 3/4] ARM: zImage: make sure appended DTB doesn't get overwritten by kernel .bss Nicolas Pitre
2011-06-21 5:09 ` [PATCH 4/4] ARM: zImage: allow supplementing appended DTB with traditional ATAG data Nicolas Pitre
2011-06-21 7:00 ` Shawn Guo
2011-06-21 17:32 ` David Brown
2011-06-21 22:58 ` David Brown
2011-06-21 23:13 ` David Brown
2011-06-21 23:22 ` Warner Losh
2011-06-21 23:35 ` Nicolas Pitre
2011-06-21 21:59 ` [PATCH 0/4] allow DTB to be appended to the ARM zImage with ATAG conversion David Brown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox