diff mbox series

[U-Boot,2/2] libfdt: return correct value if #size-cells property is not present

Message ID 20190726091339.24420-2-matthias.bgg@kernel.org
State Superseded
Delegated to: Simon Glass
Headers show
Series [U-Boot,1/2] libfdt: fdt_address_cells() and fdt_size_cells() | expand

Commit Message

Matthias Brugger July 26, 2019, 9:13 a.m. UTC
From: Matthias Brugger <mbrugger@suse.com>

According to the device tree specification, the default value for
was not present.

This patch also makes fdt_address_cells() and fdt_size_cells() conform
to the behaviour documented in libfdt.h. The defaults are only returned
if fdt_getprop() returns -FDT_ERR_NOTFOUND, otherwise the actual error
is returned.

This is based on upstream commit:
aa7254d ("libfdt: return correct value if #size-cells property is not present")
but misses the test case part, as we don't implement them in u-boot.

Signed-off-by: Matthias Brugger <mbrugger@suse.com>
---
 scripts/dtc/libfdt/fdt_addresses.c | 16 +++++++++++++---
 scripts/dtc/libfdt/libfdt.h        |  2 +-
 2 files changed, 14 insertions(+), 4 deletions(-)

Comments

Matthias Brugger Aug. 1, 2019, 11:42 a.m. UTC | #1
Hi all,

On 26/07/2019 11:13, matthias.bgg@kernel.org wrote:
> From: Matthias Brugger <mbrugger@suse.com>
> 
> According to the device tree specification, the default value for
> was not present.
> 
> This patch also makes fdt_address_cells() and fdt_size_cells() conform
> to the behaviour documented in libfdt.h. The defaults are only returned
> if fdt_getprop() returns -FDT_ERR_NOTFOUND, otherwise the actual error
> is returned.
> 
> This is based on upstream commit:
> aa7254d ("libfdt: return correct value if #size-cells property is not present")
> but misses the test case part, as we don't implement them in u-boot.
> 
> Signed-off-by: Matthias Brugger <mbrugger@suse.com>

After running these two patches through the CI [1] I realized that three test
are failing:
test/py sandbox
test/py sandbox with clang
test/py sandbox_flattree

All three fail dm_test_fdt_translation() in the case "No translation for busses
with #size-cells == 0" [2].

Can anybody with more insight in the test infrastructure and the sandbox
architecture help me to identify if this is
a) a bug in the sandbox
b) a bug in our test
c) a bug in my patch

I write this because I'm pretty sure that it is not option c), as we just stick
to the specs here.

Regards,
Matthias

[1] https://travis-ci.org/mbgg/u-boot/builds/565955218
[2] https://github.com/u-boot/u-boot/blob/master/test/dm/test-fdt.c#L511

> ---
>  scripts/dtc/libfdt/fdt_addresses.c | 16 +++++++++++++---
>  scripts/dtc/libfdt/libfdt.h        |  2 +-
>  2 files changed, 14 insertions(+), 4 deletions(-)
> 
> diff --git a/scripts/dtc/libfdt/fdt_addresses.c b/scripts/dtc/libfdt/fdt_addresses.c
> index 49537b578d..f13a87dfa0 100644
> --- a/scripts/dtc/libfdt/fdt_addresses.c
> +++ b/scripts/dtc/libfdt/fdt_addresses.c
> @@ -64,7 +64,7 @@ static int fdt_cells(const void *fdt, int nodeoffset, const char *name)
>  
>  	c = fdt_getprop(fdt, nodeoffset, name, &len);
>  	if (!c)
> -		return 2;
> +		return len;
>  
>  	if (len != sizeof(*c))
>  		return -FDT_ERR_BADNCELLS;
> @@ -78,10 +78,20 @@ static int fdt_cells(const void *fdt, int nodeoffset, const char *name)
>  
>  int fdt_address_cells(const void *fdt, int nodeoffset)
>  {
> -	return fdt_cells(fdt, nodeoffset, "#address-cells");
> +	int val;
> +
> +	val = fdt_cells(fdt, nodeoffset, "#address-cells");
> +	if (val == -FDT_ERR_NOTFOUND)
> +		return 2;
> +	return val;
>  }
>  
>  int fdt_size_cells(const void *fdt, int nodeoffset)
>  {
> -	return fdt_cells(fdt, nodeoffset, "#size-cells");
> +	int val;
> +
> +	val = fdt_cells(fdt, nodeoffset, "#size-cells");
> +	if (val == -FDT_ERR_NOTFOUND)
> +		return 1;
> +	return val;
>  }
> diff --git a/scripts/dtc/libfdt/libfdt.h b/scripts/dtc/libfdt/libfdt.h
> index 66f01fec53..5c778b115b 100644
> --- a/scripts/dtc/libfdt/libfdt.h
> +++ b/scripts/dtc/libfdt/libfdt.h
> @@ -1109,7 +1109,7 @@ int fdt_address_cells(const void *fdt, int nodeoffset);
>   *
>   * returns:
>   *	0 <= n < FDT_MAX_NCELLS, on success
> - *      2, if the node has no #size-cells property
> + *      1, if the node has no #size-cells property
>   *      -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid
>   *		#size-cells property
>   *	-FDT_ERR_BADMAGIC,
>
Simon Glass Aug. 13, 2019, 9:34 a.m. UTC | #2
+Stephen Warren

Hi Matthias,

On Thu, 1 Aug 2019 at 05:42, Matthias Brugger <matthias.bgg@gmail.com> wrote:
>
> Hi all,
>
> On 26/07/2019 11:13, matthias.bgg@kernel.org wrote:
> > From: Matthias Brugger <mbrugger@suse.com>
> >
> > According to the device tree specification, the default value for
> > was not present.
> >
> > This patch also makes fdt_address_cells() and fdt_size_cells() conform
> > to the behaviour documented in libfdt.h. The defaults are only returned
> > if fdt_getprop() returns -FDT_ERR_NOTFOUND, otherwise the actual error
> > is returned.
> >
> > This is based on upstream commit:
> > aa7254d ("libfdt: return correct value if #size-cells property is not present")
> > but misses the test case part, as we don't implement them in u-boot.
> >
> > Signed-off-by: Matthias Brugger <mbrugger@suse.com>
>
> After running these two patches through the CI [1] I realized that three test
> are failing:
> test/py sandbox
> test/py sandbox with clang
> test/py sandbox_flattree
>
> All three fail dm_test_fdt_translation() in the case "No translation for busses
> with #size-cells == 0" [2].
>
> Can anybody with more insight in the test infrastructure and the sandbox
> architecture help me to identify if this is
> a) a bug in the sandbox
> b) a bug in our test
> c) a bug in my patch
>
> I write this because I'm pretty sure that it is not option c), as we just stick
> to the specs here.

Can you check the test and see? It might well be that the test is wrong.

I hope we don't have tet code relying on this.

Regards,
SImon
mbrugger Sept. 4, 2019, 4:29 p.m. UTC | #3
Hi all,

On 13/08/2019 11:34, Simon Glass wrote:
> +Stephen Warren
> 
> Hi Matthias,
> 
> On Thu, 1 Aug 2019 at 05:42, Matthias Brugger <matthias.bgg@gmail.com> wrote:
>>
>> Hi all,
>>
>> On 26/07/2019 11:13, matthias.bgg@kernel.org wrote:
>>> From: Matthias Brugger <mbrugger@suse.com>
>>>
>>> According to the device tree specification, the default value for
>>> was not present.
>>>
>>> This patch also makes fdt_address_cells() and fdt_size_cells() conform
>>> to the behaviour documented in libfdt.h. The defaults are only returned
>>> if fdt_getprop() returns -FDT_ERR_NOTFOUND, otherwise the actual error
>>> is returned.
>>>
>>> This is based on upstream commit:
>>> aa7254d ("libfdt: return correct value if #size-cells property is not present")
>>> but misses the test case part, as we don't implement them in u-boot.
>>>
>>> Signed-off-by: Matthias Brugger <mbrugger@suse.com>
>>
>> After running these two patches through the CI [1] I realized that three test
>> are failing:
>> test/py sandbox
>> test/py sandbox with clang
>> test/py sandbox_flattree
>>
>> All three fail dm_test_fdt_translation() in the case "No translation for busses
>> with #size-cells == 0" [2].
>>
>> Can anybody with more insight in the test infrastructure and the sandbox
>> architecture help me to identify if this is
>> a) a bug in the sandbox
>> b) a bug in our test
>> c) a bug in my patch
>>
>> I write this because I'm pretty sure that it is not option c), as we just stick
>> to the specs here.
> 
> Can you check the test and see? It might well be that the test is wrong.
> 
> I hope we don't have tet code relying on this.
> 

I think I found the error. I missed a commit in libftd which fixes the issue.
I'll send a v2 soon.

Thanks,
Matthias
diff mbox series

Patch

diff --git a/scripts/dtc/libfdt/fdt_addresses.c b/scripts/dtc/libfdt/fdt_addresses.c
index 49537b578d..f13a87dfa0 100644
--- a/scripts/dtc/libfdt/fdt_addresses.c
+++ b/scripts/dtc/libfdt/fdt_addresses.c
@@ -64,7 +64,7 @@  static int fdt_cells(const void *fdt, int nodeoffset, const char *name)
 
 	c = fdt_getprop(fdt, nodeoffset, name, &len);
 	if (!c)
-		return 2;
+		return len;
 
 	if (len != sizeof(*c))
 		return -FDT_ERR_BADNCELLS;
@@ -78,10 +78,20 @@  static int fdt_cells(const void *fdt, int nodeoffset, const char *name)
 
 int fdt_address_cells(const void *fdt, int nodeoffset)
 {
-	return fdt_cells(fdt, nodeoffset, "#address-cells");
+	int val;
+
+	val = fdt_cells(fdt, nodeoffset, "#address-cells");
+	if (val == -FDT_ERR_NOTFOUND)
+		return 2;
+	return val;
 }
 
 int fdt_size_cells(const void *fdt, int nodeoffset)
 {
-	return fdt_cells(fdt, nodeoffset, "#size-cells");
+	int val;
+
+	val = fdt_cells(fdt, nodeoffset, "#size-cells");
+	if (val == -FDT_ERR_NOTFOUND)
+		return 1;
+	return val;
 }
diff --git a/scripts/dtc/libfdt/libfdt.h b/scripts/dtc/libfdt/libfdt.h
index 66f01fec53..5c778b115b 100644
--- a/scripts/dtc/libfdt/libfdt.h
+++ b/scripts/dtc/libfdt/libfdt.h
@@ -1109,7 +1109,7 @@  int fdt_address_cells(const void *fdt, int nodeoffset);
  *
  * returns:
  *	0 <= n < FDT_MAX_NCELLS, on success
- *      2, if the node has no #size-cells property
+ *      1, if the node has no #size-cells property
  *      -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid
  *		#size-cells property
  *	-FDT_ERR_BADMAGIC,