diff mbox

[U-Boot] ftd_support: Fix regression causes by "fdt: Try to use fdt_address_cells()/fdt_size_cells()"

Message ID 1417083397-7396-1-git-send-email-hdegoede@redhat.com
State Changes Requested
Delegated to: Simon Glass
Headers show

Commit Message

Hans de Goede Nov. 27, 2014, 10:16 a.m. UTC
After commit 933cdbb479: "fdt: Try to use fdt_address_cells()/fdt_size_cells()"
I noticed that allwinner boards would no longer boot.

Switching to fdt_address_cells / fdt_size_cells changes the result from
bytes to 32 bit words, so when we increment pointers into the blob, we must
do so by 32 bit words now.

This commit makes allwinner boards boot again.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 common/fdt_support.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Simon Glass Nov. 27, 2014, 2:25 p.m. UTC | #1
Hi Hans,

On 27 November 2014 at 03:16, Hans de Goede <hdegoede@redhat.com> wrote:
> After commit 933cdbb479: "fdt: Try to use fdt_address_cells()/fdt_size_cells()"
> I noticed that allwinner boards would no longer boot.
>
> Switching to fdt_address_cells / fdt_size_cells changes the result from
> bytes to 32 bit words, so when we increment pointers into the blob, we must
> do so by 32 bit words now.
>
> This commit makes allwinner boards boot again.
>
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>

Thanks for the patch.

Nit time - can you please tweak the patch subject? Should be fdt: for
the tag and try to keep under 60 chars, so something like "fdt: Fix
regression in fdt_pack_reg()"

Regards,
Simon
Simon Glass Nov. 27, 2014, 4:13 p.m. UTC | #2
On 27 November 2014 at 07:25, Simon Glass <sjg@chromium.org> wrote:
> Hi Hans,
>
> On 27 November 2014 at 03:16, Hans de Goede <hdegoede@redhat.com> wrote:
>> After commit 933cdbb479: "fdt: Try to use fdt_address_cells()/fdt_size_cells()"
>> I noticed that allwinner boards would no longer boot.
>>
>> Switching to fdt_address_cells / fdt_size_cells changes the result from
>> bytes to 32 bit words, so when we increment pointers into the blob, we must
>> do so by 32 bit words now.
>>
>> This commit makes allwinner boards boot again.
>>
>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>
> Thanks for the patch.
>
> Nit time - can you please tweak the patch subject? Should be fdt: for
> the tag and try to keep under 60 chars, so something like "fdt: Fix
> regression in fdt_pack_reg()"

Should have said I'm happy to do then when I apply it if you prefer.

- Simon
Jan Kiszka Nov. 28, 2014, 6:12 a.m. UTC | #3
On 2014-11-27 11:16, Hans de Goede wrote:
> After commit 933cdbb479: "fdt: Try to use fdt_address_cells()/fdt_size_cells()"
> I noticed that allwinner boards would no longer boot.
> 
> Switching to fdt_address_cells / fdt_size_cells changes the result from
> bytes to 32 bit words, so when we increment pointers into the blob, we must
> do so by 32 bit words now.
> 
> This commit makes allwinner boards boot again.
> 
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
>  common/fdt_support.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/common/fdt_support.c b/common/fdt_support.c
> index ea42c63..9e84937 100644
> --- a/common/fdt_support.c
> +++ b/common/fdt_support.c
> @@ -379,13 +379,13 @@ static int fdt_pack_reg(const void *fdt, void *buf, u64 *address, u64 *size,
>  			*(fdt64_t *)p = cpu_to_fdt64(address[i]);
>  		else
>  			*(fdt32_t *)p = cpu_to_fdt32(address[i]);
> -		p += address_len;
> +		p += 4 * address_len;
>  
>  		if (size_len == 2)
>  			*(fdt64_t *)p = cpu_to_fdt64(size[i]);
>  		else
>  			*(fdt32_t *)p = cpu_to_fdt32(size[i]);
> -		p += size_len;
> +		p += 4 * size_len;
>  	}
>  
>  	return p - (char *)buf;
> 

Just debugged this as well...

I would suggest to fix the variable names, too: address_cells and
size_cells.

Jan
Masahiro Yamada Nov. 28, 2014, 7:43 a.m. UTC | #4
Hi.



> On 2014-11-27 11:16, Hans de Goede wrote:
> > After commit 933cdbb479: "fdt: Try to use fdt_address_cells()/fdt_size_cells()"
> > I noticed that allwinner boards would no longer boot.
> > 
> > Switching to fdt_address_cells / fdt_size_cells changes the result from
> > bytes to 32 bit words, so when we increment pointers into the blob, we must
> > do so by 32 bit words now.
> > 
> > This commit makes allwinner boards boot again.
> > 
> > Signed-off-by: Hans de Goede <hdegoede@redhat.com>


This patch solved my Linux-boot problem as well.

Tested-by: Masahiro Yamada <yamada.m@jp.panasonic.com>



> 
> I would suggest to fix the variable names, too: address_cells and
> size_cells.

Agreed.


Best Regards
Masahiro Yamada
Stephen Warren Nov. 30, 2014, 3:44 a.m. UTC | #5
On 11/27/2014 03:16 AM, Hans de Goede wrote:
> After commit 933cdbb479: "fdt: Try to use fdt_address_cells()/fdt_size_cells()"
> I noticed that allwinner boards would no longer boot.
> 
> Switching to fdt_address_cells / fdt_size_cells changes the result from
> bytes to 32 bit words, so when we increment pointers into the blob, we must
> do so by 32 bit words now.
> 
> This commit makes allwinner boards boot again.

Tested-by: Stephen Warren <swarren@wwwdotorg.org>
This fixes kernel booting on the RPi too.
diff mbox

Patch

diff --git a/common/fdt_support.c b/common/fdt_support.c
index ea42c63..9e84937 100644
--- a/common/fdt_support.c
+++ b/common/fdt_support.c
@@ -379,13 +379,13 @@  static int fdt_pack_reg(const void *fdt, void *buf, u64 *address, u64 *size,
 			*(fdt64_t *)p = cpu_to_fdt64(address[i]);
 		else
 			*(fdt32_t *)p = cpu_to_fdt32(address[i]);
-		p += address_len;
+		p += 4 * address_len;
 
 		if (size_len == 2)
 			*(fdt64_t *)p = cpu_to_fdt64(size[i]);
 		else
 			*(fdt32_t *)p = cpu_to_fdt32(size[i]);
-		p += size_len;
+		p += 4 * size_len;
 	}
 
 	return p - (char *)buf;