No subject
I found this one whilst testing versatile-express with a -rc kernel and was considering if this is the correct way to fix this.
[PATCH] atags_to_fdt: take into account root's #size and #cells
PATCH 1/1 atags_to_fdt: take into account root's #size and #cells
When creating entries for /memory, the root #size and #cells must be taken into account otherwise the node will not be recongnized when the OF code scans the nodes.
On some systems, the default is now to be 2 for each of #size and #cells which means that appending a kernrel and having it update from ATAGS does not work properly.
--- arch/arm/boot/compressed/atags_to_fdt.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
arch/arm/boot/compressed/atags_to_fdt.c +21 -1
@@ -1,5 +1,6 @@#include <asm/setup.h> #include <libfdt.h> +#include <linux/of.h> #if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND )#define do_extend_cmdline 1
@@ -95,9 +96,12 @@ static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline)int atags_to_fdt (void *atag_list,void *fdt,int total_space) {struct tag *atag = atag_list; -uint32_t mem_reg_property[2 *NR_BANKS ]; +uint32_t mem_reg_property[2 *2 *NR_BANKS ]; +const __be32 *prop;int memcount =0 ;int ret; +u32 dt_root_size_cells; +u32 dt_root_addr_cells;/* make sure we've got an aligned pointer */ if ((u32 )atag_list &0x3 )
@@ -118,6 +122,17 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space)if (ret <0 )return ret; + dt_root_size_cells =OF_ROOT_NODE_SIZE_CELLS_DEFAULT ; + dt_root_addr_cells =OF_ROOT_NODE_ADDR_CELLS_DEFAULT ; + + prop =getprop (fdt,"/" ,"#size-cells" ,NULL ); +if (prop) + dt_root_size_cells =be32_to_cpup (prop); + + prop =getprop (fdt,"/" ,"#address-cells" ,NULL ); +if (prop) + dt_root_addr_cells =be32_to_cpup (prop); +for_each_tag (atag, atag_list) {if (atag->hdr.tag ==cpu_to_atag32 (ATAG_CMDLINE )) {/* Append the ATAGS command line to the device tree
@@ -137,7 +152,12 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space)continue ;if (!atag32_to_cpu (atag->u.mem.size))continue ; + +for (ret =0 ; ret < dt_root_addr_cells -1 ; ret++) + mem_reg_property[memcount++] =cpu_to_fdt32 (0 ); mem_reg_property[memcount++] =cpu_to_fdt32 (atag32_to_cpu (atag->u.mem.start)); +for (ret =0 ; ret < dt_root_size_cells -1 ; ret++) + mem_reg_property[memcount++] =cpu_to_fdt32 (0 ); mem_reg_property[memcount++] =cpu_to_fdt32 (atag32_to_cpu (atag->u.mem.size)); }else if (atag->hdr.tag ==cpu_to_atag32 (ATAG_INITRD2 )) {uint32_t initrd_start, initrd_size;
Signature · 1 line
1.7.10.4
PATCH 1/1 atags_to_fdt: take into account root's #size and #cells
Dear Ben Dooks,
Quoted 10 lines · Ben Dooks
When creating entries for /memory, the root #size and #cells must be taken into account otherwise the node will not be recongnized when the OF code scans the nodes.
On some systems, the default is now to be 2 for each of #size and #cells which means that appending a kernrel and having it update from ATAGS does not work properly.
--- arch/arm/boot/compressed/atags_to_fdt.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
Isn't this the same
https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/commit/?id=faefd550c45d8d314e8f260f21565320355c947f
which is already in linux-next?
Best regards,
Thomas
Signature · 4 lines
Thomas Petazzoni, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
PATCH 1/1 atags_to_fdt: take into account root's #size and #cells
Quoted 14 lines · Thomas Petazzoni
Dear Ben Dooks,
Quoted 10 lines · Ben Dooks
When creating entries for /memory, the root #size and #cells must be taken into account otherwise the node will not be recongnized when the OF code scans the nodes.
On some systems, the default is now to be 2 for each of #size and #cells which means that appending a kernrel and having it update from ATAGS does not work properly.
--- arch/arm/boot/compressed/atags_to_fdt.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
Quoted 3 lines
Isn't this the same
https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/commit/?id=faefd550c45d8d314e8f260f21565320355c947f
which is already in linux-next?
Ah, it is almost the same although it only takes into account the #size-cells but not the number of them.
Signature · 2 lines
Ben Dooks http://www.codethink.co.uk/ Senior Engineer Codethink - Providing Genius
PATCH 1/1 atags_to_fdt: take into account root's #size and #cells
In reply to Ben DooksQuoted 7 lines · Ben Dooks
When creating entries for /memory, the root #size and #cells must be taken into account otherwise the node will not be recongnized when the OF code scans the nodes.
On some systems, the default is now to be 2 for each of #size and #cells which means that appending a kernrel and having it update from ATAGS does not work properly.
Hi Ben,
There is already a fix for it which is applied in Russell King's git tree, see
http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=7722/1
Regards,
Quoted 61 lines
--- arch/arm/boot/compressed/atags_to_fdt.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)arch/arm/boot/compressed/atags_to_fdt.c +21
-1@@ -1,5 +1,6 @@#include <asm/setup.h> #include <libfdt.h> +#include <linux/of.h> #if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND )#define do_extend_cmdline 1@@ -95,9 +96,12 @@ static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline)int atags_to_fdt (void *atag_list,void *fdt,int total_space) {struct tag *atag = atag_list; -uint32_t mem_reg_property[2 *NR_BANKS ]; +uint32_t mem_reg_property[2 *2 *NR_BANKS ]; +const __be32 *prop;int memcount =0 ;int ret; +u32 dt_root_size_cells; +u32 dt_root_addr_cells;/* make sure we've got an aligned pointer */ if ((u32 )atag_list &0x3 )@@ -118,6 +122,17 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space)if (ret <0 )return ret; + dt_root_size_cells =OF_ROOT_NODE_SIZE_CELLS_DEFAULT ; + dt_root_addr_cells =OF_ROOT_NODE_ADDR_CELLS_DEFAULT ; + + prop =getprop (fdt,"/" ,"#size-cells" ,NULL ); +if (prop) + dt_root_size_cells =be32_to_cpup (prop); + + prop =getprop (fdt,"/" ,"#address-cells" ,NULL ); +if (prop) + dt_root_addr_cells =be32_to_cpup (prop); +for_each_tag (atag, atag_list) {if (atag->hdr.tag ==cpu_to_atag32 (ATAG_CMDLINE )) {/* Append the ATAGS command line to the device tree @@ -137,7 +152,12 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space)continue ;if (!atag32_to_cpu (atag->u.mem.size))continue ; + +for (ret =0 ; ret < dt_root_addr_cells -1 ; ret++) + mem_reg_property[memcount++] =cpu_to_fdt32 (0 ); mem_reg_property[memcount++] =cpu_to_fdt32 (atag32_to_cpu (atag->u.mem.start)); +for (ret =0 ; ret < dt_root_size_cells -1 ; ret++) + mem_reg_property[memcount++] =cpu_to_fdt32 (0 ); mem_reg_property[memcount++] =cpu_to_fdt32 (atag32_to_cpu (atag->u.mem.size)); }else if (atag->hdr.tag ==cpu_to_atag32 (ATAG_INITRD2 )) {uint32_t initrd_start, initrd_size;
Signature · 4 lines
Gregory Clement, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com