
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);