* [U-Boot-Users] [PATCH][RFC] Add common memory fixup function
@ 2007-11-26 20:55 Kumar Gala
2007-11-26 22:12 ` Vitaly Bordug
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Kumar Gala @ 2007-11-26 20:55 UTC (permalink / raw)
To: u-boot
Guys,
Here's my cut at a more generic version of Martin's patch that respects
#ac and #sc.
Let me know what you think and if you have any comments. I'll add the
board bits in a complete patch if this looks ok.
- k
diff --git a/common/fdt_support.c b/common/fdt_support.c
index c67bb3d..e6de10f 100644
--- a/common/fdt_support.c
+++ b/common/fdt_support.c
@@ -441,6 +441,66 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat,
do_fixup_by_compat(fdt, compat, prop, &val, 4, create);
}
+int fdt_fixup_memory(void *blob, u64 start, u64 size)
+{
+ int i, err, nodeoffset, len = 0;
+ u8 tmp[16];
+ const u32 *addrcell, *sizecell;
+
+ err = fdt_check_header(blob);
+ if (err < 0) {
+ printf("%s: %s\n", __FUNCTION__, fdt_strerror(err));
+ return err;
+ }
+
+ /* update, or add and update /memory node */
+ nodeoffset = fdt_path_offset(blob, "/memory");
+ if (nodeoffset < 0) {
+ nodeoffset = fdt_add_subnode(blob, 0, "memory");
+ if (nodeoffset < 0)
+ printf("WARNING: could not create /memory: %s.\n",
+ fdt_strerror(nodeoffset));
+ return nodeoffset;
+ }
+ err = fdt_setprop(blob, nodeoffset, "device_type", "memory",
+ sizeof("memory"));
+ if (err < 0) {
+ printf("WARNING: could not set %s %s.\n", "device_type",
+ fdt_strerror(err));
+ return err;
+ }
+
+ addrcell = fdt_getprop(blob, 0, "#address-cells", NULL);
+ if ((addrcell) && (*addrcell == 2)) {
+ for (i = 0; i <= 7; i++)
+ tmp[i] = (start >> ((7 - i) * 8)) & 0xff;
+ len = 8;
+ } else {
+ for (i = 0; i <= 3; i++)
+ tmp[i] = (start >> ((3 - i) * 8)) & 0xff;
+ len = 4;
+ }
+
+ sizecell = fdt_getprop(blob, 0, "#size-cells", NULL);
+ if ((sizecell) && (*sizecell == 2)) {
+ for (i = 0; i <= 7; i++)
+ tmp[i+len] = (size >> ((7 - i) * 8)) & 0xff;
+ len += 8;
+ } else {
+ for (i = 0; i <= 3; i++)
+ tmp[i+len] = (size >> ((3 - i) * 8)) & 0xff;
+ len += 4;
+ }
+
+ err = fdt_setprop(fdt, nodeoffset, "reg", tmp, len);
+ if (err < 0) {
+ printf("WARNING: could not set %s %s.\n",
+ "reg", fdt_strerror(err));
+ return err;
+ }
+ return 0;
+}
+
void fdt_fixup_ethernet(void *fdt, bd_t *bd)
{
int node;
diff --git a/include/fdt_support.h b/include/fdt_support.h
index 8f781d4..3d6c1a8 100644
--- a/include/fdt_support.h
+++ b/include/fdt_support.h
@@ -44,6 +44,7 @@ void do_fixup_by_compat(void *fdt, const char *compat,
const char *prop, const void *val, int len, int create);
void do_fixup_by_compat_u32(void *fdt, const char *compat,
const char *prop, u32 val, int create);
+int fdt_fixup_memory(void *blob, u64 start, u64 size);
void fdt_fixup_ethernet(void *fdt, bd_t *bd);
#ifdef CONFIG_OF_HAS_UBOOT_ENV
^ permalink raw reply related [flat|nested] 8+ messages in thread* [U-Boot-Users] [PATCH][RFC] Add common memory fixup function 2007-11-26 20:55 [U-Boot-Users] [PATCH][RFC] Add common memory fixup function Kumar Gala @ 2007-11-26 22:12 ` Vitaly Bordug 2007-11-26 22:23 ` Kumar Gala 2007-11-27 8:38 ` Martin Krause 2007-11-27 8:04 ` Martin Krause 2007-11-27 8:13 ` Martin Krause 2 siblings, 2 replies; 8+ messages in thread From: Vitaly Bordug @ 2007-11-26 22:12 UTC (permalink / raw) To: u-boot On Mon, 26 Nov 2007 14:55:46 -0600 (CST) Kumar Gala wrote: > Guys, > > Here's my cut at a more generic version of Martin's patch that > respects #ac and #sc. > > Let me know what you think and if you have any comments. I'll add the > board bits in a complete patch if this looks ok. > funny, I did the same with slightly different approach. below goes my version... I think we are different only in #ac/#sc accounting, so let the people consider the best approach :) Or... am I wrong in something? ---- fdt: add common memory fixup function From: Martin Krause <martin.krause@tqs.de> 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> Signed-off-by: Vitaly Bordug <vitb@kernel.crashing.org> --- README | 9 +++++ board/cds/common/ft_board.c | 9 ----- board/cm5200/cm5200.c | 23 ++----------- common/cmd_bootm.c | 12 +++++++ common/fdt_support.c | 75 +++++++++++++++++++++++++++++++++++++++++++ cpu/mpc83xx/cpu.c | 20 ++--------- include/fdt_support.h | 1 + 7 files changed, 103 insertions(+), 46 deletions(-) diff --git a/README b/README index 3dad5fc..461f6b1 100644 --- a/README +++ b/README @@ -335,6 +335,15 @@ The following options need to be configured: passed using flattened device trees (based on open firmware concepts). + CONFIG_OF_MEMORY_FIXUP + + While using CONFIG_OF_LIBFDT above, each board needs special + /memory node set up in fdt with proper values. This config + option makes it auto-updated during bootm command. In some + cases, when HW requires "specific" crafting of /memory node, + or it is desired to have this step processed from BSP part + explicitly, this option should be disabled. + CONFIG_OF_LIBFDT * New libfdt-based support * Adds the "fdt" command diff --git a/board/cds/common/ft_board.c b/board/cds/common/ft_board.c index 3eda100..0c3c0f3 100644 --- a/board/cds/common/ft_board.c +++ b/board/cds/common/ft_board.c @@ -63,20 +63,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..13150f4 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) */ @@ -422,5 +404,6 @@ void ft_board_setup(void *blob, bd_t *bd) { ft_cpu_setup(blob, bd); ft_blob_update(blob, bd); + fdt_memory(blob); } #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */ diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index d816349..41547c6 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -992,6 +992,18 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag, do_reset (cmdtp, flag, argc, argv); } #endif +#ifdef CONFIG_OF_MEMORY_FIXUP + /* + * 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); + } +#endif #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..f1f906c 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -348,4 +348,79 @@ int fdt_bd_t(void *fdt) } #endif /* ifdef CONFIG_OF_HAS_BD_T */ +/********************************************************************/ + +static int ft_get_property_int(void *blob, char *path, const char *prop) +{ + int offset, len; + void *ptr; + u32 dst; + + offset = fdt_find_node_by_path(blob, path); + ptr = fdt_getprop(blob, offset, prop, &len); + debug("%s(): got %d size %d\n", __FUNCTION__, ptr, len); + if ((ptr) && (len == sizeof(int))) { + memcpy(&dst, ptr, len); + debug("dest %d\n", dst); + return dst; + } + return -1; +} + +int fdt_memory(void *fdt) +{ + int nodeoffset; + int err; + u32 tmp[4]; + bd_t *bd = gd->bd; + + err = fdt_check_header(fdt); + if (err < 0) { + printf("fdt_memory: %s\n", fdt_strerror(err)); + return err; + } + + memset(tmp, 0, sizeof(tmp)); + /* Now, figure out toplevel #ac and #sc - we'll need them later */ + offset = fdt_find_node_by_path(fdt, "/"); + ac = ft_get_property_int(fdt, "/", "#address-cells"); + sc = ft_get_property_int(fdt, "/", "#size-cells"); + debug("#address-cells=%d size-cells=%d\n", ac, sc); + + /* 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; + } + + /* this is a little rashly, but as long as u-boot is keeping + * memstart and memsize as ulong, should be safe. + */ + if ((ac >= 1) || (sc >= 1)) + debug("ulong memory params while #ac=%d and #sc=%d\n", + ac, sc); + tmp[ac-1] = cpu_to_fdt32(bd->bi_memstart); + tmp[ac+sc-1] = cpu_to_fdt32(bd->bi_memsize); + + err = fdt_setprop(blob, offset, "reg", + tmp, (ac+sc)*sizeof(tmp[0]))) + 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..99b10ee 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 @@ -567,6 +550,9 @@ ft_cpu_setup(void *blob, bd_t *bd) int len; ulong clock; + /* fixup/create /memory node */ + fdt_memory(blob); + clock = bd->bi_busfreq; p = ft_get_prop(blob, "/cpus/" OF_CPU "/bus-frequency", &len); if (p != NULL) 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); -- Sincerely, Vitaly ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [U-Boot-Users] [PATCH][RFC] Add common memory fixup function 2007-11-26 22:12 ` Vitaly Bordug @ 2007-11-26 22:23 ` Kumar Gala 2007-11-27 0:15 ` Vitaly Bordug 2007-11-27 8:38 ` Martin Krause 1 sibling, 1 reply; 8+ messages in thread From: Kumar Gala @ 2007-11-26 22:23 UTC (permalink / raw) To: u-boot > > +/ > ********************************************************************/ > + > +static int ft_get_property_int(void *blob, char *path, const char > *prop) > +{ > + int offset, len; > + void *ptr; > + u32 dst; > + > + offset = fdt_find_node_by_path(blob, path); > + ptr = fdt_getprop(blob, offset, prop, &len); > + debug("%s(): got %d size %d\n", __FUNCTION__, ptr, len); > + if ((ptr) && (len == sizeof(int))) { > + memcpy(&dst, ptr, len); > + debug("dest %d\n", dst); > + return dst; > + } > + return -1; > +} > + > +int fdt_memory(void *fdt) I want it to be passed start and size rather than grabbing them directly. I have future applications in which using the same function will be useful. > +{ > + int nodeoffset; > + int err; > + u32 tmp[4]; > + bd_t *bd = gd->bd; > + > + err = fdt_check_header(fdt); > + if (err < 0) { > + printf("fdt_memory: %s\n", fdt_strerror(err)); > + return err; > + } > + > + memset(tmp, 0, sizeof(tmp)); > + /* Now, figure out toplevel #ac and #sc - we'll need them later */ > + offset = fdt_find_node_by_path(fdt, "/"); > + ac = ft_get_property_int(fdt, "/", "#address-cells"); > + sc = ft_get_property_int(fdt, "/", "#size-cells"); > + debug("#address-cells=%d size-cells=%d\n", ac, sc); > + > + /* 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; > + } > + > + /* this is a little rashly, but as long as u-boot is keeping > + * memstart and memsize as ulong, should be safe. > + */ Hmm, I think this is a bad assumption. (We are looking at 36-bit phys support on e500 & e600). > + if ((ac >= 1) || (sc >= 1)) > + debug("ulong memory params while #ac=%d and #sc=%d\n", > + ac, sc); > + tmp[ac-1] = cpu_to_fdt32(bd->bi_memstart); > + tmp[ac+sc-1] = cpu_to_fdt32(bd->bi_memsize); > + > + err = fdt_setprop(blob, offset, "reg", > + tmp, (ac+sc)*sizeof(tmp[0]))) > + if (err < 0) { > + printf("WARNING: could not set %s %s.\n", > + "reg", fdt_strerror(err)); > + return err; > + } > + return 0; > +} > + > #endif /* CONFIG_OF_LIBFDT */ ^ permalink raw reply [flat|nested] 8+ messages in thread
* [U-Boot-Users] [PATCH][RFC] Add common memory fixup function 2007-11-26 22:23 ` Kumar Gala @ 2007-11-27 0:15 ` Vitaly Bordug 0 siblings, 0 replies; 8+ messages in thread From: Vitaly Bordug @ 2007-11-27 0:15 UTC (permalink / raw) To: u-boot On Mon, 26 Nov 2007 16:23:10 -0600 Kumar Gala wrote: > > + /* this is a little rashly, but as long as u-boot is > > keeping > > + * memstart and memsize as ulong, should be safe. > > + */ > > Hmm, I think this is a bad assumption. (We are looking at 36-bit > phys support on e500 & e600). I'll look at it once again, from u64 POW, as was discussed.... -- Sincerely, Vitaly ^ permalink raw reply [flat|nested] 8+ messages in thread
* [U-Boot-Users] [PATCH][RFC] Add common memory fixup function 2007-11-26 22:12 ` Vitaly Bordug 2007-11-26 22:23 ` Kumar Gala @ 2007-11-27 8:38 ` Martin Krause 1 sibling, 0 replies; 8+ messages in thread From: Martin Krause @ 2007-11-27 8:38 UTC (permalink / raw) To: u-boot Hi Vitaly, Vitaly Bordug wrote on Monday, November 26, 2007 11:12 PM: > On Mon, 26 Nov 2007 14:55:46 -0600 (CST) > Kumar Gala wrote: > > > Guys, > > > > Here's my cut at a more generic version of Martin's patch that > > respects #ac and #sc. > > > > Let me know what you think and if you have any comments. I'll add > > the board bits in a complete patch if this looks ok. > > > funny, I did the same with slightly different approach. > below goes my version... > > I think we are different only in #ac/#sc accounting, so > let the people consider the best approach :) > > Or... am I wrong in something? > ---- > > fdt: add common memory fixup function > > From: Martin Krause <martin.krause@tqs.de> > > 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> > Signed-off-by: Vitaly Bordug <vitb@kernel.crashing.org> > --- > > README | 9 +++++ > board/cds/common/ft_board.c | 9 ----- > board/cm5200/cm5200.c | 23 ++----------- > common/cmd_bootm.c | 12 +++++++ > common/fdt_support.c | 75 > +++++++++++++++++++++++++++++++++++++++++++ cpu/mpc83xx/cpu.c > | 20 ++--------- include/fdt_support.h | 1 + > 7 files changed, 103 insertions(+), 46 deletions(-) > [...] > diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c > index d816349..41547c6 100644 > --- a/common/cmd_bootm.c > +++ b/common/cmd_bootm.c > @@ -992,6 +992,18 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag, > do_reset (cmdtp, flag, argc, argv); > } > #endif > +#ifdef CONFIG_OF_MEMORY_FIXUP > + /* > + * 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); > + } > +#endif Ah, you placed a CONFIG_OF_MEMORY_FIXUP around the fdt_memory() call. That's OK with me, but then please set this define for all boards, which did a memory fixup already. I can't remeber, which boards this were exactly, but I know that the TQM5200 was one of it :-). Best Regards, Martin Krause ^ permalink raw reply [flat|nested] 8+ messages in thread
* [U-Boot-Users] [PATCH][RFC] Add common memory fixup function 2007-11-26 20:55 [U-Boot-Users] [PATCH][RFC] Add common memory fixup function Kumar Gala 2007-11-26 22:12 ` Vitaly Bordug @ 2007-11-27 8:04 ` Martin Krause 2007-11-27 8:13 ` Martin Krause 2 siblings, 0 replies; 8+ messages in thread From: Martin Krause @ 2007-11-27 8:04 UTC (permalink / raw) To: u-boot Kumar Gala wrote on Monday, November 26, 2007 9:56 PM: > Guys, > > Here's my cut at a more generic version of Martin's patch that > respects #ac and #sc. > > Let me know what you think and if you have any comments. I'll add the Looks fine to me. Best Regards, Martin Krause ^ permalink raw reply [flat|nested] 8+ messages in thread
* [U-Boot-Users] [PATCH][RFC] Add common memory fixup function 2007-11-26 20:55 [U-Boot-Users] [PATCH][RFC] Add common memory fixup function Kumar Gala 2007-11-26 22:12 ` Vitaly Bordug 2007-11-27 8:04 ` Martin Krause @ 2007-11-27 8:13 ` Martin Krause 2007-11-27 19:11 ` Scott Wood 2 siblings, 1 reply; 8+ messages in thread From: Martin Krause @ 2007-11-27 8:13 UTC (permalink / raw) To: u-boot Kumar Gala wrote on Monday, November 26, 2007 9:56 PM: > diff --git a/common/fdt_support.c b/common/fdt_support.c > index c67bb3d..e6de10f 100644 > --- a/common/fdt_support.c > +++ b/common/fdt_support.c > @@ -441,6 +441,66 @@ void do_fixup_by_compat_u32(void *fdt, const > char *compat, do_fixup_by_compat(fdt, compat, prop, &val, 4, > create); } > > +int fdt_fixup_memory(void *blob, u64 start, u64 size) > +{ > + int i, err, nodeoffset, len = 0; > + u8 tmp[16]; > + const u32 *addrcell, *sizecell; > + > + err = fdt_check_header(blob); > + if (err < 0) { > + printf("%s: %s\n", __FUNCTION__, fdt_strerror(err)); > + return err; > + } > + > + /* update, or add and update /memory node */ > + nodeoffset = fdt_path_offset(blob, "/memory"); > + if (nodeoffset < 0) { > + nodeoffset = fdt_add_subnode(blob, 0, "memory"); > + if (nodeoffset < 0) > + printf("WARNING: could not create /memory: %s.\n", > + fdt_strerror(nodeoffset)); > + return nodeoffset; > + } > + err = fdt_setprop(blob, nodeoffset, "device_type", "memory", > + sizeof("memory")); > + if (err < 0) { > + printf("WARNING: could not set %s %s.\n", "device_type", > + fdt_strerror(err)); > + return err; > + } > + > + addrcell = fdt_getprop(blob, 0, "#address-cells", NULL); > + if ((addrcell) && (*addrcell == 2)) { > + for (i = 0; i <= 7; i++) > + tmp[i] = (start >> ((7 - i) * 8)) & 0xff; > + len = 8; > + } else { > + for (i = 0; i <= 3; i++) > + tmp[i] = (start >> ((3 - i) * 8)) & 0xff; > + len = 4; > + } Could this perhaps lead to endianess issues under some special circumstances? Best Regards, Martin Krause ^ permalink raw reply [flat|nested] 8+ messages in thread
* [U-Boot-Users] [PATCH][RFC] Add common memory fixup function 2007-11-27 8:13 ` Martin Krause @ 2007-11-27 19:11 ` Scott Wood 0 siblings, 0 replies; 8+ messages in thread From: Scott Wood @ 2007-11-27 19:11 UTC (permalink / raw) To: u-boot On Tue, Nov 27, 2007 at 09:13:06AM +0100, Martin Krause wrote: > Kumar Gala wrote on Monday, November 26, 2007 9:56 PM: > > + addrcell = fdt_getprop(blob, 0, "#address-cells", NULL); > > + if ((addrcell) && (*addrcell == 2)) { > > + for (i = 0; i <= 7; i++) > > + tmp[i] = (start >> ((7 - i) * 8)) & 0xff; > > + len = 8; > > + } else { > > + for (i = 0; i <= 3; i++) > > + tmp[i] = (start >> ((3 - i) * 8)) & 0xff; > > + len = 4; > > + } > > Could this perhaps lead to endianess issues under some special > circumstances? I don't think so -- the device tree is defined as always being big-endian, regardless of the host endianness (multi-cell values would get a bit weird otherwise). -Scott ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2007-11-27 19:11 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2007-11-26 20:55 [U-Boot-Users] [PATCH][RFC] Add common memory fixup function Kumar Gala 2007-11-26 22:12 ` Vitaly Bordug 2007-11-26 22:23 ` Kumar Gala 2007-11-27 0:15 ` Vitaly Bordug 2007-11-27 8:38 ` Martin Krause 2007-11-27 8:04 ` Martin Krause 2007-11-27 8:13 ` Martin Krause 2007-11-27 19:11 ` Scott Wood
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox