[U-Boot] [PATCH v2] fdt: Fix regression in fdt_pack_reg()

Hans de Goede hdegoede at redhat.com
Fri Nov 28 14:23:51 CET 2014


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 at redhat.com>
---
Changes in v2:
-Improved patch subject
-s/_len/_cells/ to indicated that adress_cells and size_cells are in cells now
---
 common/fdt_support.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/common/fdt_support.c b/common/fdt_support.c
index ea42c63..6254e34 100644
--- a/common/fdt_support.c
+++ b/common/fdt_support.c
@@ -370,22 +370,22 @@ static int fdt_pack_reg(const void *fdt, void *buf, u64 *address, u64 *size,
 			int n)
 {
 	int i;
-	int address_len = fdt_address_cells(fdt, 0);
-	int size_len = fdt_size_cells(fdt, 0);
+	int address_cells = fdt_address_cells(fdt, 0);
+	int size_cells = fdt_size_cells(fdt, 0);
 	char *p = buf;
 
 	for (i = 0; i < n; i++) {
-		if (address_len == 2)
+		if (address_cells == 2)
 			*(fdt64_t *)p = cpu_to_fdt64(address[i]);
 		else
 			*(fdt32_t *)p = cpu_to_fdt32(address[i]);
-		p += address_len;
+		p += 4 * address_cells;
 
-		if (size_len == 2)
+		if (size_cells == 2)
 			*(fdt64_t *)p = cpu_to_fdt64(size[i]);
 		else
 			*(fdt32_t *)p = cpu_to_fdt32(size[i]);
-		p += size_len;
+		p += 4 * size_cells;
 	}
 
 	return p - (char *)buf;
-- 
2.1.0



More information about the U-Boot mailing list