[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 --- Updated patch. Please ignore all former versions.
Best Regards, Martin Krause
board/cds/common/ft_board.c | 9 --------- board/cm5200/cm5200.c | 22 ++-------------------- common/cmd_bootm.c | 10 ++++++++++ common/fdt_support.c | 41 +++++++++++++++++++++++++++++++++++++++++ cpu/mpc83xx/cpu.c | 17 ----------------- include/fdt_support.h | 1 + 6 files changed, 54 insertions(+), 46 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/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/cpu/mpc83xx/cpu.c b/cpu/mpc83xx/cpu.c index e634f0a..51b63e6 100644 --- a/cpu/mpc83xx/cpu.c +++ b/cpu/mpc83xx/cpu.c @@ -526,7 +526,6 @@ ft_cpu_setup(void *blob, bd_t *bd) int nodeoffset; int err; int j; - int tmp[2];
for (j = 0; j < (sizeof(fixup_props) / sizeof(fixup_props[0])); j++) { nodeoffset = fdt_find_node_by_path(blob, fixup_props[j].node); @@ -542,22 +541,6 @@ ft_cpu_setup(void *blob, bd_t *bd) fixup_props[j].node, fdt_strerror(nodeoffset)); } } - - /* update, or add and update /memory node */ - nodeoffset = fdt_find_node_by_path(blob, "/memory"); - if (nodeoffset < 0) { - nodeoffset = fdt_add_subnode(blob, 0, "memory"); - if (nodeoffset < 0) - debug("failed to add /memory node: %s\n", - fdt_strerror(nodeoffset)); - } - if (nodeoffset >= 0) { - fdt_setprop(blob, nodeoffset, "device_type", - "memory", sizeof("memory")); - tmp[0] = cpu_to_be32(bd->bi_memstart); - tmp[1] = cpu_to_be32(bd->bi_memsize); - fdt_setprop(blob, nodeoffset, "reg", tmp, sizeof(tmp)); - } } #elif defined(CONFIG_OF_FLAT_TREE) void 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);

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);
Was thinking about this some more and realized I don't like fdt_memory() getting called via bootm w/o the board code have control.
I think Kim suggest we have a CONFIG_OF_MEMORY_FIXUP that this call is wrapped around. But leave fdt_memory() available. I want it such that the board code/config is in control of what fixups gets called for it.
There are cases in which we don't want fdt_memory() called as it stands.
- k

Hi Kumar,
sorry for the late response. I've been very busy the last days ...
Kumar Gala wrote on Tuesday, November 20, 2007 9:34 PM:
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);
Was thinking about this some more and realized I don't like fdt_memory() getting called via bootm w/o the board code have control.
I think Kim suggest we have a CONFIG_OF_MEMORY_FIXUP that this call is wrapped around. But leave fdt_memory() available. I want it such that the board code/config is in control of what fixups gets called for it.
That's funny. My first patch wrapped the fixup in CONFIG_OF_MEMORY_FIXUP and it was you, who suggested to drop this ;-). AFAIR Kim suggested to wrap it in the existing OF_LIBFDT instead - what I did then. But I have no objections, if you put CONFIG_OF_MEMORY_FIXUP in place again.
Best Regards, Martin Krause

Was thinking about this some more and realized I don't like fdt_memory() getting called via bootm w/o the board code have control.
I think Kim suggest we have a CONFIG_OF_MEMORY_FIXUP that this call is wrapped around. But leave fdt_memory() available. I want it such that the board code/config is in control of what fixups gets called for it.
That's funny. My first patch wrapped the fixup in CONFIG_OF_MEMORY_FIXUP and it was you, who suggested to drop this ;-). AFAIR Kim suggested to wrap it in the existing OF_LIBFDT instead - what I did then. But I have no objections, if you put CONFIG_OF_MEMORY_FIXUP in place again.
Yeah, I know. I realized later that we should leave it to board code to decide what it wants in such cases. The reason for that is if you can envision having multiple device trees in multiprocessor system with each processor running a different OS.
- k

On Tue, 27 Nov 2007 08:13:07 -0600 Kumar Gala galak@kernel.crashing.org wrote:
Was thinking about this some more and realized I don't like fdt_memory() getting called via bootm w/o the board code have control.
I think Kim suggest we have a CONFIG_OF_MEMORY_FIXUP that this call is wrapped around. But leave fdt_memory() available. I want it such that the board code/config is in control of what fixups gets called for it.
That's funny. My first patch wrapped the fixup in CONFIG_OF_MEMORY_FIXUP and it was you, who suggested to drop this ;-). AFAIR Kim suggested to wrap it in the existing OF_LIBFDT instead - what I did then. But I have no objections, if you put CONFIG_OF_MEMORY_FIXUP in place again.
Yeah, I know. I realized later that we should leave it to board code to decide what it wants in such cases. The reason for that is if you can envision having multiple device trees in multiprocessor system with each processor running a different OS.
so make it a weak fn then?
Kim

On Nov 27, 2007, at 10:39 AM, Kim Phillips wrote:
On Tue, 27 Nov 2007 08:13:07 -0600 Kumar Gala galak@kernel.crashing.org wrote:
Was thinking about this some more and realized I don't like fdt_memory() getting called via bootm w/o the board code have control.
I think Kim suggest we have a CONFIG_OF_MEMORY_FIXUP that this call is wrapped around. But leave fdt_memory() available. I want it such that the board code/config is in control of what fixups gets called for it.
That's funny. My first patch wrapped the fixup in CONFIG_OF_MEMORY_FIXUP and it was you, who suggested to drop this ;-). AFAIR Kim suggested to wrap it in the existing OF_LIBFDT instead - what I did then. But I have no objections, if you put CONFIG_OF_MEMORY_FIXUP in place again.
Yeah, I know. I realized later that we should leave it to board code to decide what it wants in such cases. The reason for that is if you can envision having multiple device trees in multiprocessor system with each processor running a different OS.
so make it a weak fn then?
weak doesn't cover it. I don't want to implement my own version of fdt_memory_fixup(). I want to control how its called.
- k

On Tue, 27 Nov 2007 11:16:50 -0600 Kumar Gala galak@kernel.crashing.org wrote:
On Nov 27, 2007, at 10:39 AM, Kim Phillips wrote:
On Tue, 27 Nov 2007 08:13:07 -0600 Kumar Gala galak@kernel.crashing.org wrote:
Was thinking about this some more and realized I don't like fdt_memory() getting called via bootm w/o the board code have control.
I think Kim suggest we have a CONFIG_OF_MEMORY_FIXUP that this call is wrapped around. But leave fdt_memory() available. I want it such that the board code/config is in control of what fixups gets called for it.
That's funny. My first patch wrapped the fixup in CONFIG_OF_MEMORY_FIXUP and it was you, who suggested to drop this ;-). AFAIR Kim suggested to wrap it in the existing OF_LIBFDT instead - what I did then. But I have no objections, if you put CONFIG_OF_MEMORY_FIXUP in place again.
Yeah, I know. I realized later that we should leave it to board code to decide what it wants in such cases. The reason for that is if you can envision having multiple device trees in multiprocessor system with each processor running a different OS.
so make it a weak fn then?
weak doesn't cover it. I don't want to implement my own version of fdt_memory_fixup(). I want to control how its called.
ya, ok. I see this now.
Kim
participants (4)
-
Kim Phillips
-
Kumar Gala
-
Martin Krause
-
Martin Krause