[PATCH 2/5] arm: preserve ATAGS in /chosen/atags in the Device Tree

Thomas Petazzoni thomas.petazzoni at free-electrons.com
Wed Jun 5 02:40:06 EDT 2013

Some platforms have custom ATAGS that are too specific to be parsed by
generic code in atags_to_fdt.c, but that would nonetheless be
useful. For example, Marvell bootloaders pass a custom ATAG that
contain the MAC address for the various network interfaces of the

This commit makes a small addition to the atags_to_fdt logic that
consists in storing the ATAGS contents in the /chosen/atags node of
the Device Tree. Some platform-specific can then later make use of
this data to parse some custom ATAGs.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
 arch/arm/boot/compressed/atags_to_fdt.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/arch/arm/boot/compressed/atags_to_fdt.c b/arch/arm/boot/compressed/atags_to_fdt.c
index aabc02a..8b2ae61 100644
--- a/arch/arm/boot/compressed/atags_to_fdt.c
+++ b/arch/arm/boot/compressed/atags_to_fdt.c
@@ -98,6 +98,7 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space)
 	uint32_t mem_reg_property[2 * NR_BANKS];
 	int memcount = 0;
 	int ret;
+	int atagssize = 0;
 	/* make sure we've got an aligned pointer */
 	if ((u32)atag_list & 0x3)
@@ -119,6 +120,7 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space)
 		return ret;
 	for_each_tag(atag, atag_list) {
+		atagssize += atag->hdr.size * 4;
 		if (atag->hdr.tag == ATAG_CMDLINE) {
 			/* Append the ATAGS command line to the device tree
 			 * command line.
@@ -153,5 +155,9 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space)
 	if (memcount)
 		setprop(fdt, "/memory", "reg", mem_reg_property, 4*memcount);
+	if (atagssize)
+		setprop(fdt, "/chosen", "atags", atag_list,
+			atagssize);
 	return fdt_pack(fdt);

More information about the linux-arm-kernel mailing list