[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