]> git.sur5r.net Git - u-boot/commitdiff
Revert "fdt: Fix fdtdec_get_addr_size() for 64-bit"
authorSimon Glass <sjg@chromium.org>
Mon, 3 Aug 2015 00:13:50 +0000 (18:13 -0600)
committerSimon Glass <sjg@chromium.org>
Fri, 14 Aug 2015 16:00:52 +0000 (10:00 -0600)
This reverts commit 5b34436035fc862b5e8d0d2c3eab74ba36f1a7f4.

This function has a few problems. It calls fdt_parent_offset() which as
mentioned in code review is very slow.

https://patchwork.ozlabs.org/patch/499482/
https://patchwork.ozlabs.org/patch/452604/

It also happens to break SPI flash on Minnowboard max which is how I noticed
that this was applied. I can send a patch to tidy that up, but in any case
I think we should consider a revert until the function is better implemented.

Signed-off-by: Simon Glass <sjg@chromium.org>
lib/fdtdec.c

index cdfc844a20b392e1dcb4e46742fb482c8614e5a8..d21fb74c22de6e3501982a5288097b103fe6584f 100644 (file)
@@ -90,45 +90,29 @@ const char *fdtdec_get_compatible(enum fdt_compat_id id)
 fdt_addr_t fdtdec_get_addr_size(const void *blob, int node,
                const char *prop_name, fdt_size_t *sizep)
 {
-       const fdt32_t *ptr, *end;
-       int parent, na, ns, len;
-       fdt_addr_t addr;
+       const fdt_addr_t *cell;
+       int len;
 
        debug("%s: %s: ", __func__, prop_name);
-
-       parent = fdt_parent_offset(blob, node);
-       if (parent < 0) {
-               debug("(no parent found)\n");
-               return FDT_ADDR_T_NONE;
-       }
-
-       na = fdt_address_cells(blob, parent);
-       ns = fdt_size_cells(blob, parent);
-
-       ptr = fdt_getprop(blob, node, prop_name, &len);
-       if (!ptr) {
-               debug("(not found)\n");
-               return FDT_ADDR_T_NONE;
-       }
-
-       end = ptr + len / sizeof(*ptr);
-
-       if (ptr + na + ns > end) {
-               debug("(not enough data: expected %d bytes, got %d bytes)\n",
-                     (na + ns) * 4, len);
-               return FDT_ADDR_T_NONE;
-       }
-
-       addr = fdtdec_get_number(ptr, na);
-
-       if (sizep) {
-               *sizep = fdtdec_get_number(ptr + na, ns);
-               debug("addr=%pa, size=%pa\n", &addr, sizep);
-       } else {
-               debug("%pa\n", &addr);
+       cell = fdt_getprop(blob, node, prop_name, &len);
+       if (cell && ((!sizep && len == sizeof(fdt_addr_t)) ||
+                    len == sizeof(fdt_addr_t) * 2)) {
+               fdt_addr_t addr = fdt_addr_to_cpu(*cell);
+               if (sizep) {
+                       const fdt_size_t *size;
+
+                       size = (fdt_size_t *)((char *)cell +
+                                       sizeof(fdt_addr_t));
+                       *sizep = fdt_size_to_cpu(*size);
+                       debug("addr=%08lx, size=%llx\n",
+                             (ulong)addr, (u64)*sizep);
+               } else {
+                       debug("%08lx\n", (ulong)addr);
+               }
+               return addr;
        }
-
-       return addr;
+       debug("(not found)\n");
+       return FDT_ADDR_T_NONE;
 }
 
 fdt_addr_t fdtdec_get_addr(const void *blob, int node,