Message ID | 20190321181010.27005-2-thierry.reding@gmail.com |
---|---|
State | Accepted |
Delegated to: | Simon Glass |
Headers | show |
Series | ARM: tegra: Add support for framebuffer carveouts | expand |
On Fri, 22 Mar 2019 at 02:10, Thierry Reding <thierry.reding@gmail.com> wrote: > > From: Thierry Reding <treding@nvidia.com> > > 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 <treding@nvidia.com> > --- > 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 <sjg@chromium.org>
On Fri, Mar 22, 2019 at 03:52:59PM +0800, Simon Glass wrote: > On Fri, 22 Mar 2019 at 02:10, Thierry Reding <thierry.reding@gmail.com> wrote: > > > > From: Thierry Reding <treding@nvidia.com> > > > > 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 <treding@nvidia.com> > > --- > > 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 <sjg@chromium.org> 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
Hi Thierry, On Mon, 25 Mar 2019 at 01:27, Thierry Reding <thierry.reding@gmail.com> wrote: > > On Fri, Mar 22, 2019 at 03:52:59PM +0800, Simon Glass wrote: > > On Fri, 22 Mar 2019 at 02:10, Thierry Reding <thierry.reding@gmail.com> wrote: > > > > > > From: Thierry Reding <treding@nvidia.com> > > > > > > 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 <treding@nvidia.com> > > > --- > > > 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 <sjg@chromium.org> > > 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
Hi Thierry, On Mon, 25 Mar 2019 at 01:27, Thierry Reding <thierry.reding@gmail.com> wrote: > > On Fri, Mar 22, 2019 at 03:52:59PM +0800, Simon Glass wrote: > > On Fri, 22 Mar 2019 at 02:10, Thierry Reding <thierry.reding@gmail.com> wrote: > > > > > > From: Thierry Reding <treding@nvidia.com> > > > > > > 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 <treding@nvidia.com> > > > --- > > > 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 <sjg@chromium.org> > > 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!
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_MAX 17 +/* constants */ +#define FDT_MAX_PHANDLE 0xfffffffe + /* 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 <stdbool.h> #include <stddef.h> #include <stdint.h> #include <stdlib.h>