mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-18 13:11:31 +00:00
fdt: Fix fdtdec_get_addr_size() for 64-bit
Signed-off-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Tom Warren <twarren@nvidia.com> Signed-off-by: Stephen Warren <swarren@nvidia.com>
This commit is contained in:
parent
8b19dff579
commit
5b34436035
1 changed files with 35 additions and 19 deletions
54
lib/fdtdec.c
54
lib/fdtdec.c
|
@ -88,29 +88,45 @@ 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 fdt_addr_t *cell;
|
||||
int len;
|
||||
const fdt32_t *ptr, *end;
|
||||
int parent, na, ns, len;
|
||||
fdt_addr_t addr;
|
||||
|
||||
debug("%s: %s: ", __func__, prop_name);
|
||||
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;
|
||||
parent = fdt_parent_offset(blob, node);
|
||||
if (parent < 0) {
|
||||
debug("(no parent found)\n");
|
||||
return FDT_ADDR_T_NONE;
|
||||
}
|
||||
debug("(not 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);
|
||||
}
|
||||
|
||||
return addr;
|
||||
}
|
||||
|
||||
fdt_addr_t fdtdec_get_addr(const void *blob, int node,
|
||||
|
|
Loading…
Add table
Reference in a new issue