[U-Boot-Users] [PATCH] fdt: add common memory fixup function

Add the function fdt_memory() to fixup the /memory node of the fdt with the memory values detected by U-Boot (taken from bd->bi_memstart and bd->bi_memsize).
The new function is called for all boards which define CONFIG_OF_LIBFDT.
This patch removes already existing board specific memory fixup routines for boards wich have CONFIG_OF_LIBFDT defined and switches them to the new routine. Boards wich use the CONIFG_OF_FLAT_TREE method are not touched.
Signed-off-by: Martin Krause martin.krause@tqs.de --- Since no one raised his hand - here is the patch :)
Best Regards, Martin Krause
board/cds/common/ft_board.c | 9 --------- board/cm5200/cm5200.c | 22 ++------------------- board/mpc7448hpc2/mpc7448hpc2.c | 9 --------- board/mpc8540ads/mpc8540ads.c | 9 --------- board/mpc8568mds/ft_board.c | 7 ------- board/sbc8349/sbc8349.c | 9 --------- board/sbc8641d/sbc8641d.c | 9 --------- common/cmd_bootm.c | 10 ++++++++++ common/fdt_support.c | 41 +++++++++++++++++++++++++++++++++++++++ include/fdt_support.h | 1 + 10 files changed, 54 insertions(+), 72 deletions(-)
diff --git a/board/cds/common/ft_board.c b/board/cds/common/ft_board.c index 9d97905..be0e824 100644 --- a/board/cds/common/ft_board.c +++ b/board/cds/common/ft_board.c @@ -56,20 +56,11 @@ static void cds_pci_fixup(void *blob) void ft_board_setup(void *blob, bd_t *bd) { - u32 *p; - int len; - #ifdef CONFIG_PCI ft_pci_setup(blob, bd); #endif ft_cpu_setup(blob, bd);
- p = ft_get_prop(blob, "/memory/reg", &len); - if (p != NULL) { - *p++ = cpu_to_be32(bd->bi_memstart); - *p = cpu_to_be32(bd->bi_memsize); - } - cds_pci_fixup(blob); } #endif diff --git a/board/cm5200/cm5200.c b/board/cm5200/cm5200.c index e2ab5b8..b2a64c7 100644 --- a/board/cm5200/cm5200.c +++ b/board/cm5200/cm5200.c @@ -256,14 +256,13 @@ static void compose_hostname(hw_id_t hw_id, char *buf)
#if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) /* - * Update 'model' and 'memory' properties in the blob according to the module - * that we are running on. + * Update 'model' property in the blob according to the module that we are + * running on. */ static void ft_blob_update(void *blob, bd_t *bd) { int len, ret, nodeoffset = 0; char module_name[MODULE_NAME_MAXLEN] = {0}; - ulong memory_data[2] = {0};
compose_module_name(hw_id, module_name); len = strlen(module_name) + 1; @@ -272,23 +271,6 @@ static void ft_blob_update(void *blob, bd_t *bd) if (ret < 0) printf("ft_blob_update(): cannot set /model property err:%s\n", fdt_strerror(ret)); - - memory_data[0] = cpu_to_be32(bd->bi_memstart); - memory_data[1] = cpu_to_be32(bd->bi_memsize); - - nodeoffset = fdt_find_node_by_path (blob, "/memory"); - if (nodeoffset >= 0) { - ret = fdt_setprop(blob, nodeoffset, "reg", memory_data, - sizeof(memory_data)); - if (ret < 0) - printf("ft_blob_update): cannot set /memory/reg " - "property err:%s\n", fdt_strerror(ret)); - } - else { - /* memory node is required in dts */ - printf("ft_blob_update(): cannot find /memory node " - "err:%s\n", fdt_strerror(nodeoffset)); - } } #endif /* defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) */
diff --git a/board/mpc7448hpc2/mpc7448hpc2.c b/board/mpc7448hpc2/mpc7448hpc2.c index 81846eb..68b2222 100644 --- a/board/mpc7448hpc2/mpc7448hpc2.c +++ b/board/mpc7448hpc2/mpc7448hpc2.c @@ -93,15 +93,6 @@ long int initdram (int board_type) void ft_board_setup (void *blob, bd_t *bd) { - u32 *p; - int len; - ft_cpu_setup (blob, bd); - - p = ft_get_prop (blob, "/memory/reg", &len); - if (p != NULL) { - *p++ = cpu_to_be32 (bd->bi_memstart); - *p = cpu_to_be32 (bd->bi_memsize); - } } #endif diff --git a/board/mpc8540ads/mpc8540ads.c b/board/mpc8540ads/mpc8540ads.c index 914e51a..1171e14 100644 --- a/board/mpc8540ads/mpc8540ads.c +++ b/board/mpc8540ads/mpc8540ads.c @@ -335,18 +335,9 @@ pci_init_board(void) void ft_board_setup(void *blob, bd_t *bd) { - u32 *p; - int len; - #ifdef CONFIG_PCI ft_pci_setup(blob, bd); #endif ft_cpu_setup(blob, bd); - - p = ft_get_prop(blob, "/memory/reg", &len); - if (p != NULL) { - *p++ = cpu_to_be32(bd->bi_memstart); - *p = cpu_to_be32(bd->bi_memsize); - } } #endif diff --git a/board/mpc8568mds/ft_board.c b/board/mpc8568mds/ft_board.c index 36815cc..1f79b22 100644 --- a/board/mpc8568mds/ft_board.c +++ b/board/mpc8568mds/ft_board.c @@ -30,16 +30,9 @@ extern void ft_cpu_setup(void *blob, bd_t *bd); void ft_board_setup(void *blob, bd_t *bd) { - u32 *p; - int len; #ifdef CONFIG_PCI ft_pci_setup(blob, bd); #endif ft_cpu_setup(blob, bd); - p = ft_get_prop(blob, "/memory/reg", &len); - if (p != NULL) { - *p++ = cpu_to_be32(bd->bi_memstart); - *p = cpu_to_be32(bd->bi_memsize); - } } #endif /* CONFIG_OF_FLAT_TREE && CONFIG_OF_BOARD_SETUP */ diff --git a/board/sbc8349/sbc8349.c b/board/sbc8349/sbc8349.c index 86166ea..ec9c15d 100644 --- a/board/sbc8349/sbc8349.c +++ b/board/sbc8349/sbc8349.c @@ -565,18 +565,9 @@ U_BOOT_CMD( void ft_board_setup(void *blob, bd_t *bd) { - u32 *p; - int len; - #ifdef CONFIG_PCI ft_pci_setup(blob, bd); #endif ft_cpu_setup(blob, bd); - - p = ft_get_prop(blob, "/memory/reg", &len); - if (p != NULL) { - *p++ = cpu_to_be32(bd->bi_memstart); - *p = cpu_to_be32(bd->bi_memsize); - } } #endif diff --git a/board/sbc8641d/sbc8641d.c b/board/sbc8641d/sbc8641d.c index 7adc42f..3f8b008 100644 --- a/board/sbc8641d/sbc8641d.c +++ b/board/sbc8641d/sbc8641d.c @@ -344,16 +344,7 @@ void pci_init_board(void) #if defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP) void ft_board_setup (void *blob, bd_t * bd) { - u32 *p; - int len; - ft_cpu_setup (blob, bd); - - p = ft_get_prop (blob, "/memory/reg", &len); - if (p != NULL) { - *p++ = cpu_to_be32 (bd->bi_memstart); - *p = cpu_to_be32 (bd->bi_memsize); - } } #endif
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index d816349..3381c07 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -992,6 +992,16 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag, do_reset (cmdtp, flag, argc, argv); } #endif + /* + * Add the "/memory" node if it does not exist, and do a fixup + * of the "reg" property with values detected by U-Boot + * (taken from bd->bi_memstart and bd->bi_memsize). + */ + if (fdt_memory(of_flat_tree) < 0) { + puts ("ERROR: /memory node create failed - " + "must RESET the board to recover.\n"); + do_reset (cmdtp, flag, argc, argv); + } #ifdef CONFIG_OF_BOARD_SETUP /* Call the board-specific fixup routine */ ft_board_setup(of_flat_tree, gd->bd); diff --git a/common/fdt_support.c b/common/fdt_support.c index 175d59e..ee434d6 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -348,4 +348,45 @@ int fdt_bd_t(void *fdt) } #endif /* ifdef CONFIG_OF_HAS_BD_T */
+/********************************************************************/ + +int fdt_memory(void *fdt) +{ + int nodeoffset; + int err; + u32 tmp[2]; + bd_t *bd = gd->bd; + + err = fdt_check_header(fdt); + if (err < 0) { + printf("fdt_memory: %s\n", fdt_strerror(err)); + return err; + } + /* update, or add and update /memory node */ + nodeoffset = fdt_find_node_by_path(fdt, "/memory"); + if (nodeoffset < 0) { + nodeoffset = fdt_add_subnode(fdt, 0, "memory"); + if (nodeoffset < 0) + printf("WARNING could not create /memory: %s.\n", + fdt_strerror(nodeoffset)); + return nodeoffset; + } + err = fdt_setprop(fdt, nodeoffset, "device_type", "memory", + sizeof("memory")); + if (err < 0) { + printf("WARNING: could not set %s %s.\n", + "device_type", fdt_strerror(err)); + return err; + } + tmp[0] = cpu_to_be32(bd->bi_memstart); + tmp[1] = cpu_to_be32(bd->bi_memsize); + err = fdt_setprop(fdt, nodeoffset, "reg", tmp, sizeof(tmp)); + if (err < 0) { + printf("WARNING: could not set %s %s.\n", + "reg", fdt_strerror(err)); + return err; + } + return 0; +} + #endif /* CONFIG_OF_LIBFDT */ diff --git a/include/fdt_support.h b/include/fdt_support.h index 60fa423..eca2186 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -29,6 +29,7 @@ #include <fdt.h>
int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force); +int fdt_memory(void *fdt);
#ifdef CONFIG_OF_HAS_UBOOT_ENV int fdt_env(void *fdt);

On Oct 26, 2007, at 3:49 AM, Martin Krause wrote:
Add the function fdt_memory() to fixup the /memory node of the fdt with the memory values detected by U-Boot (taken from bd->bi_memstart and bd->bi_memsize).
The new function is called for all boards which define CONFIG_OF_LIBFDT.
This patch removes already existing board specific memory fixup routines for boards wich have CONFIG_OF_LIBFDT defined and switches them to the new routine. Boards wich use the CONIFG_OF_FLAT_TREE method are not touched.
Signed-off-by: Martin Krause martin.krause@tqs.de
Since no one raised his hand - here is the patch :)
Best Regards, Martin Krause
board/cds/common/ft_board.c | 9 --------- board/cm5200/cm5200.c | 22 ++------------------- board/mpc7448hpc2/mpc7448hpc2.c | 9 --------- board/mpc8540ads/mpc8540ads.c | 9 --------- board/mpc8568mds/ft_board.c | 7 ------- board/sbc8349/sbc8349.c | 9 --------- board/sbc8641d/sbc8641d.c | 9 --------- common/cmd_bootm.c | 10 ++++++++++ common/fdt_support.c | 41 ++++++++++++++++++++++++++++ +++++++++++ include/fdt_support.h | 1 + 10 files changed, 54 insertions(+), 72 deletions(-)
Not all the boards you touched used libfdt today (mpc7448hpc2, mpc8540ads, sbc8349, sbc8641d)
- k

Kumar Gala wrote on Friday, October 26, 2007 11:55 AM:
On Oct 26, 2007, at 3:49 AM, Martin Krause wrote:
Add the function fdt_memory() to fixup the /memory node of the fdt with the memory values detected by U-Boot (taken from bd->bi_memstart and bd->bi_memsize).
The new function is called for all boards which define CONFIG_OF_LIBFDT.
This patch removes already existing board specific memory fixup routines for boards wich have CONFIG_OF_LIBFDT defined and switches them to the new routine. Boards wich use the CONIFG_OF_FLAT_TREE method are not touched.
Signed-off-by: Martin Krause martin.krause@tqs.de --- Since no one raised his hand - here is the patch :)
Best Regards, Martin Krause
board/cds/common/ft_board.c | 9 --------- board/cm5200/cm5200.c | 22 ++------------------- board/mpc7448hpc2/mpc7448hpc2.c | 9 --------- board/mpc8540ads/mpc8540ads.c | 9 --------- board/mpc8568mds/ft_board.c | 7 ------- board/sbc8349/sbc8349.c | 9 --------- board/sbc8641d/sbc8641d.c | 9 --------- common/cmd_bootm.c | 10 ++++++++++ common/fdt_support.c | 41 ++++++++++++++++++++++++++++ +++++++++++ include/fdt_support.h | 1 + 10 files changed, 54 insertions(+), 72 deletions(-)
Not all the boards you touched used libfdt today (mpc7448hpc2, mpc8540ads, sbc8349, sbc8641d)
Ups, you are right! The flow of patching carried me away ... I'll redo the patch. Sorry for the noise!
Best Regards, Martin Krause

Martin Krause wrote:
Add the function fdt_memory() to fixup the /memory node of the fdt with the memory values detected by U-Boot (taken from bd->bi_memstart and bd->bi_memsize).
The new function is called for all boards which define CONFIG_OF_LIBFDT.
This patch removes already existing board specific memory fixup routines for boards wich have CONFIG_OF_LIBFDT defined and switches them to the new routine. Boards wich use the CONIFG_OF_FLAT_TREE method are not touched.
Signed-off-by: Martin Krause martin.krause@tqs.de
Since no one raised his hand - here is the patch :)
Best Regards, Martin Krause
Thanks, into the "in" basket it goes...
gvb

Jerry Van Baren wrote on Friday, October 26, 2007 1:14 PM:
Martin Krause wrote:
Add the function fdt_memory() to fixup the /memory node of the fdt with the memory values detected by U-Boot (taken from bd->bi_memstart and bd->bi_memsize).
The new function is called for all boards which define CONFIG_OF_LIBFDT.
This patch removes already existing board specific memory fixup routines for boards wich have CONFIG_OF_LIBFDT defined and switches them to the new routine. Boards wich use the CONIFG_OF_FLAT_TREE method are not touched.
Signed-off-by: Martin Krause martin.krause@tqs.de --- Since no one raised his hand - here is the patch :)
Best Regards, Martin Krause
Thanks, into the "in" basket it goes...
Ah, please wait, I'm working on an update. I missed some boards already doing a board specific fixup (and instead cought some boards not using libfdt yet ...).
Best Regards, Martin Krause

Martin Krause wrote:
Jerry Van Baren wrote on Friday, October 26, 2007 1:14 PM:
Martin Krause wrote:
Add the function fdt_memory() to fixup the /memory node of the fdt with the memory values detected by U-Boot (taken from bd->bi_memstart and bd->bi_memsize).
The new function is called for all boards which define CONFIG_OF_LIBFDT.
This patch removes already existing board specific memory fixup routines for boards wich have CONFIG_OF_LIBFDT defined and switches them to the new routine. Boards wich use the CONIFG_OF_FLAT_TREE method are not touched.
Signed-off-by: Martin Krause martin.krause@tqs.de --- Since no one raised his hand - here is the patch :)
Best Regards, Martin Krause
Thanks, into the "in" basket it goes...
Ah, please wait, I'm working on an update. I missed some boards already doing a board specific fixup (and instead cought some boards not using libfdt yet ...).
Best Regards, Martin Krause
Yeah, I fell into the "ack before reading the whole thread" trap. ;-)
gvb
participants (4)
-
Jerry Van Baren
-
Kumar Gala
-
Martin Krause
-
Martin Krause