fdt: check for fdt errors in fdt_create_phandle
PATCH 1/3 fdt: check for fdt errors in fdt_create_phandle
fdt_create_phandle() was ignoring errors from fdt_set_phandle(). If an error occurs, print an error message and return 0, which is an invalid phandle. We also need to change the return type for fdt_create_phandle() to indicate that it cannot return an error code.
--- common/fdt_support.c | 11 +++++++++-- include/fdt_support.h | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-)
common/fdt_support.c +9 -2
@@ -1241,15 +1241,22 @@ int fdt_set_phandle(void *fdt, int nodeoffset, uint32_t phandle)* @fdt: ptr to device tree * @nodeoffset: node to update */ -int fdt_create_phandle (void *fdt,int nodeoffset) +unsigned int fdt_create_phandle (void *fdt,int nodeoffset) {/* see if there is a phandle already */ int phandle =fdt_get_phandle (fdt, nodeoffset);/* if we got 0, means no phandle so create one */ if (phandle ==0 ) { +int ret; + phandle =fdt_alloc_phandle (fdt); -fdt_set_phandle (fdt, nodeoffset, phandle); + ret =fdt_set_phandle (fdt, nodeoffset, phandle); +if (ret <0 ) { +printf ("Can't set phandle %u: %s\n" , phandle, +fdt_strerror (ret)); +return 0 ; + } }return phandle;
include/fdt_support.h +1 -1
@@ -90,7 +90,7 @@ int fdt_node_offset_by_compat_reg(void *blob, const char *compat, phys_addr_t compat_off);int fdt_alloc_phandle (void *blob);int fdt_set_phandle (void *fdt,int nodeoffset,uint32_t phandle); -int fdt_create_phandle (void *fdt,int nodeoffset); +unsigned int fdt_create_phandle (void *fdt,int nodeoffset);int fdt_add_edid (void *blob,const char *compat,unsigned char *buf); int fdt_verify_alias_address(void *fdt, int anode, const char *alias,
Signature · 1 line
1.7.4.4
PATCH 2/3 fdt: update fdt_alloc_phandle to use fdt_get_phandle
The device tree compiler, dtc, can use "phandle" and/or "linux,phandle" properties to specify the phandle for any node. By default, it uses both, but "linux,phandle" is deprecated. One day, we'd like to stop using "linux,phandle", but U-boot needs to support both properties equally first.
fdt_alloc_phandle() generates a unique phandle, but it was only checking the "linux,phandle" properties. Instead, we use fdt_get_phandle(), which checks both properties automatically. This ensures that we support dtbs that only use "phandle".
The side-effect is that fdt_alloc_phandle() now takes twice as long, since it has to check for two properties instead of one in each node that it searches.
--- common/fdt_support.c | 7 ++----- 1 files changed, 2 insertions(+), 5 deletions(-)
common/fdt_support.c +2 -5
@@ -1182,14 +1182,11 @@ int fdt_node_offset_by_compat_reg(void *blob, const char *compat,*/ int fdt_alloc_phandle (void *blob) { -int offset, len, phandle =0 ; -const u32 *val; +int offset, phandle =0 ;for (offset =fdt_next_node (blob,-1 ,NULL ); offset >=0 ; offset =fdt_next_node (blob, offset,NULL )) { - val =fdt_getprop (blob, offset,"linux,phandle" , &len); -if (val) - phandle =max (*val, phandle); + phandle =max (phandle,fdt_get_phandle (blob, offset)); }return phandle +1 ;
Signature · 1 line
1.7.4.4
PATCH 3/3 powerpc/85xx: use fdt_create_phandle() to create the Fman firmware phandles
In reply to Timur TabiFunction fdt_create_phandle() conveniently creates new phandle properties using both "linux,phandle" and "phandle", so it should be used by all code that wants to create a phandle.
The Fman firmware code, which embeds an Fman firmware into the device tree, was creating the phandle properties manually. Instead, change it to use fdt_create_phandle().
--- arch/powerpc/cpu/mpc85xx/fdt.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-)
arch/powerpc/cpu/mpc85xx/fdt.c +2 -3
@@ -504,9 +504,8 @@ void fdt_fixup_fman_firmware(void *blob) fdt_strerror(rc));return ; } - phandle =fdt_alloc_phandle (blob); - rc =fdt_setprop_cell (blob, fwnode,"linux,phandle" , phandle); -if (rc <0 ) { + phandle =fdt_create_phandle (blob, fwnode); +if (!phandle) {char s[64 ];fdt_get_path (blob, fwnode, s,sizeof (s)); printf("Could not add phandle property to node %s: %s\n", s,
Signature · 1 line
1.7.4.4
PATCH 1/3 fdt: check for fdt errors in fdt_create_phandle
In reply to Timur TabiQuoted 10 lines · Timur Tabi
fdt_create_phandle()was ignoring errors fromfdt_set_phandle(). If an error occurs, print an error message and return 0, which is an invalid phandle. We also need to change the return type forfdt_create_phandle()to indicate that it cannot return an error code.Signed-off-by Timur Tabi<[email protected]>--- common/fdt_support.c | 11 +++++++++-- include/fdt_support.h | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-)
Added to u-boot-fdt, sent a pull request to wd.
Thanks,
gvb
[snip]