Hi Simon, On Thu, Dec 14, 2017 at 9:36 PM, Simon Glass <s...@chromium.org> wrote: > +Stephen, Tom > > Hi Mario, > > I've had to drop this since it breaks tegra. Stephen feels that this > is likely a bug in the patch rather than anything wrong with Tegra. Do > you have any thoughts? I can potentially try things out on the Tegra > boards I have. > > Regards, > Simon >
I think I've found the problem: It's an endianness issue. The of_translate_address function seems to return a raw big-endian address, while the of_read_number function translates it to CPU endianness before returning it. On the MPC8308 I tested on this made no difference, but little-endian systems will have problems. When I put a bogus dev_read_addr in the sandbox serial driver, I see the effect as well. Here's a hopefully fixed version (just the diff; I'll post a proper patch when your tests succeeded); it corrects the issue on sandbox, so I hope it will work on tegra as well: ----- >8 ----- diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c index 0030ab962e..ca22d09ff2 100644 --- a/drivers/core/ofnode.c +++ b/drivers/core/ofnode.c @@ -200,13 +200,22 @@ fdt_addr_t ofnode_get_addr_index(ofnode node, int index) uint flags; u64 size; int na; + __be32 addr; prop_val = of_get_address(ofnode_to_np(node), index, &size, &flags); if (!prop_val) return FDT_ADDR_T_NONE; na = of_n_addr_cells(ofnode_to_np(node)); - return of_read_number(prop_val, na); + addr = of_read_number(prop_val, na); + + if (IS_ENABLED(CONFIG_OF_TRANSLATE)) { + u64 paddr = of_translate_address(ofnode_to_np(node), &addr); + + return (fdt_addr_t)(be64_to_cpu(paddr) >> 32); + } else { + return addr; + } } else { return fdt_get_base_address(gd->fdt_blob, ofnode_to_offset(node)); ----- >8 ----- Thanks for the help, and best regards, Mario > > On 8 December 2017 at 10:11, <s...@google.com> wrote: >> On 23 November 2017 at 23:51, Mario Six <mario....@gdsys.cc> wrote: >>> The function dev_read_addr calls ofnode_get_addr_index in the live tree >>> case, which does not apply bus translations to the address read from the >>> device tree. This results in illegal addresses on boards that rely on >>> bus translations being applied. >>> >>> Fix this situation by applying bus translations in the live tree case as >>> well. >>> >>> Signed-off-by: Mario Six <mario....@gdsys.cc> >>> --- >>> >>> Changes v1 -> v2: >>> * Added IS_ENABLED(CONFIG_OF_TRANSLATE) case distinction >>> >>> --- >>> drivers/core/ofnode.c | 8 +++++++- >>> 1 file changed, 7 insertions(+), 1 deletion(-) >> >> Reviewed-by: Simon Glass <s...@chromium.org> >> >> Applied to u-boot-dm thanks! > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot