Skip to content
Snippets Groups Projects
Commit 236efe36 authored by Simon Glass's avatar Simon Glass
Browse files

Revert "fdt: Fix fdtdec_get_addr_size() for 64-bit"

This reverts commit 5b344360.

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: default avatarSimon Glass <sjg@chromium.org>
parent 590870e7
No related branches found
No related tags found
No related merge requests found
...@@ -90,45 +90,29 @@ const char *fdtdec_get_compatible(enum fdt_compat_id id) ...@@ -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, fdt_addr_t fdtdec_get_addr_size(const void *blob, int node,
const char *prop_name, fdt_size_t *sizep) const char *prop_name, fdt_size_t *sizep)
{ {
const fdt32_t *ptr, *end; const fdt_addr_t *cell;
int parent, na, ns, len; int len;
fdt_addr_t addr;
debug("%s: %s: ", __func__, prop_name); debug("%s: %s: ", __func__, prop_name);
cell = fdt_getprop(blob, node, prop_name, &len);
parent = fdt_parent_offset(blob, node); if (cell && ((!sizep && len == sizeof(fdt_addr_t)) ||
if (parent < 0) { len == sizeof(fdt_addr_t) * 2)) {
debug("(no parent found)\n"); fdt_addr_t addr = fdt_addr_to_cpu(*cell);
return FDT_ADDR_T_NONE; if (sizep) {
} const fdt_size_t *size;
na = fdt_address_cells(blob, parent); size = (fdt_size_t *)((char *)cell +
ns = fdt_size_cells(blob, parent); sizeof(fdt_addr_t));
*sizep = fdt_size_to_cpu(*size);
ptr = fdt_getprop(blob, node, prop_name, &len); debug("addr=%08lx, size=%llx\n",
if (!ptr) { (ulong)addr, (u64)*sizep);
debug("(not found)\n"); } else {
return FDT_ADDR_T_NONE; debug("%08lx\n", (ulong)addr);
} }
return addr;
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);
} }
debug("(not found)\n");
return addr; return FDT_ADDR_T_NONE;
} }
fdt_addr_t fdtdec_get_addr(const void *blob, int node, fdt_addr_t fdtdec_get_addr(const void *blob, int node,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment