
26 Nov
2007
26 Nov
'07
11:23 p.m.
+/ ********************************************************************/
+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 */