[U-Boot] [PATCH v2] drivers: core: Add translation in live tree case
Mario Six
mario.six at gdsys.cc
Fri Dec 15 08:05:22 UTC 2017
Hi Simon,
On Thu, Dec 14, 2017 at 9:36 PM, Simon Glass <sjg at 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, <sjg at google.com> wrote:
>> On 23 November 2017 at 23:51, Mario Six <mario.six at 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.six at 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 <sjg at chromium.org>
>>
>> Applied to u-boot-dm thanks!
>
More information about the U-Boot
mailing list