Re: [U-Boot] [PATCH v3 01/13] libfdt: Add phandle generation helper
Hi Thierry, On Mon, 25 Mar 2019 at 01:27, Thierry Reding wrote: > > On Fri, Mar 22, 2019 at 03:52:59PM +0800, Simon Glass wrote: > > On Fri, 22 Mar 2019 at 02:10, Thierry Reding > > wrote: > > > > > > From: Thierry Reding > > > > > > The new fdt_generate_phandle() function can be used to generate a new, > > > unused phandle given a specific device tree blob. The implementation is > > > somewhat naive in that it simply walks the entire device tree to find > > > the highest phandle value and then returns a phandle value one higher > > > than that. A more clever implementation might try to find holes in the > > > current set of phandle values and fill them. But this implementation is > > > relatively simple and works reliably. > > > > > > Also add a test that validates that phandles generated by this new API > > > are indeed unique. > > > > > > Signed-off-by: Thierry Reding > > > --- > > > Changes in v3: > > > - update to latest upstream commit > > > > > > lib/libfdt/fdt_ro.c | 31 +++ > > > scripts/dtc/libfdt/fdt_ro.c | 31 +++ > > > scripts/dtc/libfdt/libfdt.h | 19 +++ > > > scripts/dtc/libfdt/libfdt_env.h | 1 + > > > 4 files changed, 82 insertions(+) > > > > Reviewed-by: Simon Glass > > Looks like this was reverted again upstream (for, in my opinion, dubious > reasons). Shall I just move it to fdtdec again and we can convert to > whatever we end up with upstream, if anything, later on? Yes that is OK with me. Regards, Simon Applied to u-boot-dm, thanks! ___ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot
Re: [U-Boot] [PATCH v3 01/13] libfdt: Add phandle generation helper
Hi Thierry, On Mon, 25 Mar 2019 at 01:27, Thierry Reding wrote: > > On Fri, Mar 22, 2019 at 03:52:59PM +0800, Simon Glass wrote: > > On Fri, 22 Mar 2019 at 02:10, Thierry Reding > > wrote: > > > > > > From: Thierry Reding > > > > > > The new fdt_generate_phandle() function can be used to generate a new, > > > unused phandle given a specific device tree blob. The implementation is > > > somewhat naive in that it simply walks the entire device tree to find > > > the highest phandle value and then returns a phandle value one higher > > > than that. A more clever implementation might try to find holes in the > > > current set of phandle values and fill them. But this implementation is > > > relatively simple and works reliably. > > > > > > Also add a test that validates that phandles generated by this new API > > > are indeed unique. > > > > > > Signed-off-by: Thierry Reding > > > --- > > > Changes in v3: > > > - update to latest upstream commit > > > > > > lib/libfdt/fdt_ro.c | 31 +++ > > > scripts/dtc/libfdt/fdt_ro.c | 31 +++ > > > scripts/dtc/libfdt/libfdt.h | 19 +++ > > > scripts/dtc/libfdt/libfdt_env.h | 1 + > > > 4 files changed, 82 insertions(+) > > > > Reviewed-by: Simon Glass > > Looks like this was reverted again upstream (for, in my opinion, dubious > reasons). Shall I just move it to fdtdec again and we can convert to > whatever we end up with upstream, if anything, later on? Yes that is OK with me. Regards, Simon ___ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot
Re: [U-Boot] [PATCH v3 01/13] libfdt: Add phandle generation helper
On Fri, Mar 22, 2019 at 03:52:59PM +0800, Simon Glass wrote: > On Fri, 22 Mar 2019 at 02:10, Thierry Reding wrote: > > > > From: Thierry Reding > > > > The new fdt_generate_phandle() function can be used to generate a new, > > unused phandle given a specific device tree blob. The implementation is > > somewhat naive in that it simply walks the entire device tree to find > > the highest phandle value and then returns a phandle value one higher > > than that. A more clever implementation might try to find holes in the > > current set of phandle values and fill them. But this implementation is > > relatively simple and works reliably. > > > > Also add a test that validates that phandles generated by this new API > > are indeed unique. > > > > Signed-off-by: Thierry Reding > > --- > > Changes in v3: > > - update to latest upstream commit > > > > lib/libfdt/fdt_ro.c | 31 +++ > > scripts/dtc/libfdt/fdt_ro.c | 31 +++ > > scripts/dtc/libfdt/libfdt.h | 19 +++ > > scripts/dtc/libfdt/libfdt_env.h | 1 + > > 4 files changed, 82 insertions(+) > > Reviewed-by: Simon Glass Looks like this was reverted again upstream (for, in my opinion, dubious reasons). Shall I just move it to fdtdec again and we can convert to whatever we end up with upstream, if anything, later on? Thierry signature.asc Description: PGP signature ___ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot
Re: [U-Boot] [PATCH v3 01/13] libfdt: Add phandle generation helper
On Fri, 22 Mar 2019 at 02:10, Thierry Reding wrote: > > From: Thierry Reding > > The new fdt_generate_phandle() function can be used to generate a new, > unused phandle given a specific device tree blob. The implementation is > somewhat naive in that it simply walks the entire device tree to find > the highest phandle value and then returns a phandle value one higher > than that. A more clever implementation might try to find holes in the > current set of phandle values and fill them. But this implementation is > relatively simple and works reliably. > > Also add a test that validates that phandles generated by this new API > are indeed unique. > > Signed-off-by: Thierry Reding > --- > Changes in v3: > - update to latest upstream commit > > lib/libfdt/fdt_ro.c | 31 +++ > scripts/dtc/libfdt/fdt_ro.c | 31 +++ > scripts/dtc/libfdt/libfdt.h | 19 +++ > scripts/dtc/libfdt/libfdt_env.h | 1 + > 4 files changed, 82 insertions(+) Reviewed-by: Simon Glass ___ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot
[U-Boot] [PATCH v3 01/13] libfdt: Add phandle generation helper
From: Thierry Reding The new fdt_generate_phandle() function can be used to generate a new, unused phandle given a specific device tree blob. The implementation is somewhat naive in that it simply walks the entire device tree to find the highest phandle value and then returns a phandle value one higher than that. A more clever implementation might try to find holes in the current set of phandle values and fill them. But this implementation is relatively simple and works reliably. Also add a test that validates that phandles generated by this new API are indeed unique. Signed-off-by: Thierry Reding --- Changes in v3: - update to latest upstream commit lib/libfdt/fdt_ro.c | 31 +++ scripts/dtc/libfdt/fdt_ro.c | 31 +++ scripts/dtc/libfdt/libfdt.h | 19 +++ scripts/dtc/libfdt/libfdt_env.h | 1 + 4 files changed, 82 insertions(+) diff --git a/lib/libfdt/fdt_ro.c b/lib/libfdt/fdt_ro.c index b6ca4e0b0c30..693de9aa5ad8 100644 --- a/lib/libfdt/fdt_ro.c +++ b/lib/libfdt/fdt_ro.c @@ -73,6 +73,37 @@ uint32_t fdt_get_max_phandle(const void *fdt) return 0; } +int fdt_generate_phandle(const void *fdt, uint32_t *phandle) +{ + uint32_t max = 0; + int offset = -1; + + while (true) { + uint32_t value; + + offset = fdt_next_node(fdt, offset, NULL); + if (offset < 0) { + if (offset == -FDT_ERR_NOTFOUND) + break; + + return offset; + } + + value = fdt_get_phandle(fdt, offset); + + if (value > max) + max = value; + } + + if (max == FDT_MAX_PHANDLE) + return -FDT_ERR_NOPHANDLES; + + if (phandle) + *phandle = max + 1; + + return 0; +} + int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size) { FDT_CHECK_HEADER(fdt); diff --git a/scripts/dtc/libfdt/fdt_ro.c b/scripts/dtc/libfdt/fdt_ro.c index dfb3236da388..dc499884e4d1 100644 --- a/scripts/dtc/libfdt/fdt_ro.c +++ b/scripts/dtc/libfdt/fdt_ro.c @@ -115,6 +115,37 @@ uint32_t fdt_get_max_phandle(const void *fdt) return 0; } +int fdt_generate_phandle(const void *fdt, uint32_t *phandle) +{ + uint32_t max = 0; + int offset = -1; + + while (true) { + uint32_t value; + + offset = fdt_next_node(fdt, offset, NULL); + if (offset < 0) { + if (offset == -FDT_ERR_NOTFOUND) + break; + + return offset; + } + + value = fdt_get_phandle(fdt, offset); + + if (value > max) + max = value; + } + + if (max == FDT_MAX_PHANDLE) + return -FDT_ERR_NOPHANDLES; + + if (phandle) + *phandle = max + 1; + + return 0; +} + int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size) { FDT_CHECK_HEADER(fdt); diff --git a/scripts/dtc/libfdt/libfdt.h b/scripts/dtc/libfdt/libfdt.h index fd73688f9e9f..cf86ddba8811 100644 --- a/scripts/dtc/libfdt/libfdt.h +++ b/scripts/dtc/libfdt/libfdt.h @@ -139,6 +139,10 @@ #define FDT_ERR_MAX17 +/* constants */ +#define FDT_MAX_PHANDLE 0xfffe + /* Valid values for phandles range from 1 to 2^32-2. */ + /**/ /* Low-level functions (you probably don't need these)*/ /**/ @@ -313,6 +317,21 @@ const char *fdt_string(const void *fdt, int stroffset); */ uint32_t fdt_get_max_phandle(const void *fdt); +/** + * fdt_generate_phandle - return a new, unused phandle for a device tree blob + * @fdt: pointer to the device tree blob + * @phandle: return location for the new phandle + * + * Walks the device tree blob and looks for the highest phandle value. On + * success, the new, unused phandle value (one higher than the previously + * highest phandle value in the device tree blob) will be returned in the + * @phandle parameter. + * + * Returns: + * 0 on success or a negative error-code on failure + */ +int fdt_generate_phandle(const void *fdt, uint32_t *phandle); + /** * fdt_num_mem_rsv - retrieve the number of memory reserve map entries * @fdt: pointer to the device tree blob diff --git a/scripts/dtc/libfdt/libfdt_env.h b/scripts/dtc/libfdt/libfdt_env.h index bd2474628775..3ff9e2863075 100644 --- a/scripts/dtc/libfdt/libfdt_env.h +++ b/scripts/dtc/libfdt/libfdt_env.h @@ -52,6 +52,7 @@ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include -- 2.21.0 ___ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot