]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - common/fdt_support.c
mmc: omap_hsmmc: use a default 52MHz max clock rate if none is specified
[people/ms/u-boot.git] / common / fdt_support.c
index 7ccf8b19fd10e857cfd9f309218fcb52f2d4bbe7..bd0478de40c812c3f08a43af8f33866f21e12927 100644 (file)
@@ -197,7 +197,7 @@ int fdt_root(void *fdt)
                return err;
        }
 
-       serial = getenv("serial#");
+       serial = env_get("serial#");
        if (serial) {
                err = fdt_setprop(fdt, 0, "serial-number", serial,
                                  strlen(serial) + 1);
@@ -289,7 +289,7 @@ int fdt_chosen(void *fdt)
        if (nodeoffset < 0)
                return nodeoffset;
 
-       str = getenv("bootargs");
+       str = env_get("bootargs");
        if (str) {
                err = fdt_setprop(fdt, nodeoffset, "bootargs", str,
                                  strlen(str) + 1);
@@ -418,7 +418,7 @@ static int fdt_pack_reg(const void *fdt, void *buf, u64 *address, u64 *size,
 int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks)
 {
        int err, nodeoffset;
-       int len;
+       int len, i;
        u8 tmp[MEMORY_BANKS_MAX * 16]; /* Up to 64-bit address + 64-bit size */
 
        if (banks > MEMORY_BANKS_MAX) {
@@ -450,6 +450,12 @@ int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks)
        if (!banks)
                return 0;
 
+       for (i = 0; i < banks; i++)
+               if (start[i] == 0 && size[i] == 0)
+                       break;
+
+       banks = i;
+
        len = fdt_pack_reg(blob, tmp, start, size, banks);
 
        err = fdt_setprop(blob, nodeoffset, "reg", tmp, len);
@@ -469,12 +475,16 @@ int fdt_fixup_memory(void *blob, u64 start, u64 size)
 
 void fdt_fixup_ethernet(void *fdt)
 {
-       int i, j, prop;
+       int i = 0, j, prop;
        char *tmp, *end;
        char mac[16];
        const char *path;
        unsigned char mac_addr[ARP_HLEN];
        int offset;
+#ifdef FDT_SEQ_MACADDR_FROM_ENV
+       int nodeoff;
+       const struct fdt_property *fdt_prop;
+#endif
 
        if (fdt_path_offset(fdt, "/aliases") < 0)
                return;
@@ -487,7 +497,7 @@ void fdt_fixup_ethernet(void *fdt)
                offset = fdt_first_property_offset(fdt,
                        fdt_path_offset(fdt, "/aliases"));
                /* Select property number 'prop' */
-               for (i = 0; i < prop; i++)
+               for (j = 0; j < prop; j++)
                        offset = fdt_next_property_offset(fdt, offset);
 
                if (offset < 0)
@@ -496,11 +506,16 @@ void fdt_fixup_ethernet(void *fdt)
                path = fdt_getprop_by_offset(fdt, offset, &name, NULL);
                if (!strncmp(name, "ethernet", 8)) {
                        /* Treat plain "ethernet" same as "ethernet0". */
-                       if (!strcmp(name, "ethernet"))
+                       if (!strcmp(name, "ethernet")
+#ifdef FDT_SEQ_MACADDR_FROM_ENV
+                        || !strcmp(name, "ethernet0")
+#endif
+                       )
                                i = 0;
+#ifndef FDT_SEQ_MACADDR_FROM_ENV
                        else
                                i = trailing_strtol(name);
-
+#endif
                        if (i != -1) {
                                if (i == 0)
                                        strcpy(mac, "ethaddr");
@@ -509,7 +524,15 @@ void fdt_fixup_ethernet(void *fdt)
                        } else {
                                continue;
                        }
-                       tmp = getenv(mac);
+#ifdef FDT_SEQ_MACADDR_FROM_ENV
+                       nodeoff = fdt_path_offset(fdt, path);
+                       fdt_prop = fdt_get_property(fdt, nodeoff, "status",
+                                                   NULL);
+                       if (fdt_prop && !strcmp(fdt_prop->data, "disabled"))
+                               continue;
+                       i++;
+#endif
+                       tmp = env_get(mac);
                        if (!tmp)
                                continue;
 
@@ -528,6 +551,45 @@ void fdt_fixup_ethernet(void *fdt)
        }
 }
 
+int fdt_record_loadable(void *blob, u32 index, const char *name,
+                       uintptr_t load_addr, u32 size, uintptr_t entry_point,
+                       const char *type, const char *os)
+{
+       int err, node;
+
+       err = fdt_check_header(blob);
+       if (err < 0) {
+               printf("%s: %s\n", __func__, fdt_strerror(err));
+               return err;
+       }
+
+       /* find or create "/fit-images" node */
+       node = fdt_find_or_add_subnode(blob, 0, "fit-images");
+       if (node < 0)
+               return node;
+
+       /* find or create "/fit-images/<name>" node */
+       node = fdt_find_or_add_subnode(blob, node, name);
+       if (node < 0)
+               return node;
+
+       /*
+        * We record these as 32bit entities, possibly truncating addresses.
+        * However, spl_fit.c is not 64bit safe either: i.e. we should not
+        * have an issue here.
+        */
+       fdt_setprop_u32(blob, node, "load-addr", load_addr);
+       if (entry_point != -1)
+               fdt_setprop_u32(blob, node, "entry-point", entry_point);
+       fdt_setprop_u32(blob, node, "size", size);
+       if (type)
+               fdt_setprop_string(blob, node, "type", type);
+       if (os)
+               fdt_setprop_string(blob, node, "os", os);
+
+       return node;
+}
+
 /* Resize the fdt to its actual size + a bit of padding */
 int fdt_shrink_to_minimum(void *blob, uint extrasize)
 {
@@ -1655,3 +1717,34 @@ int fdt_fixup_display(void *blob, const char *path, const char *display)
        }
        return toff;
 }
+
+#ifdef CONFIG_OF_LIBFDT_OVERLAY
+/**
+ * fdt_overlay_apply_verbose - Apply an overlay with verbose error reporting
+ *
+ * @fdt: ptr to device tree
+ * @fdto: ptr to device tree overlay
+ *
+ * Convenience function to apply an overlay and display helpful messages
+ * in the case of an error
+ */
+int fdt_overlay_apply_verbose(void *fdt, void *fdto)
+{
+       int err;
+       bool has_symbols;
+
+       err = fdt_path_offset(fdt, "/__symbols__");
+       has_symbols = err >= 0;
+
+       err = fdt_overlay_apply(fdt, fdto);
+       if (err < 0) {
+               printf("failed on fdt_overlay_apply(): %s\n",
+                               fdt_strerror(err));
+               if (!has_symbols) {
+                       printf("base fdt does did not have a /__symbols__ node\n");
+                       printf("make sure you've compiled with -@\n");
+               }
+       }
+       return err;
+}
+#endif