[U-Boot] [PATCH v2] drivers: core: Add translation in live tree case
Mario Six
mario.six at gdsys.cc
Fri Dec 15 08:19:30 UTC 2017
On Fri, Dec 15, 2017 at 9:05 AM, Mario Six <mario.six at gdsys.cc> wrote:
> 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
>
Small correction:
----- >8 -----
diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c
index 0030ab962e..09f0aeab4f 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 be32_to_cpu((fdt_addr_t)paddr);
+ } else {
+ return addr;
+ }
} else {
return fdt_get_base_address(gd->fdt_blob,
ofnode_to_offset(node));
----- >8 -----
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