[U-Boot] [PATCH 1/2] fdt: add support the ePAPR "phandle" property
Grant Likely
grant.likely at secretlab.ca
Fri May 6 20:46:54 CEST 2011
On Fri, May 6, 2011 at 11:56 AM, Timur Tabi <timur at freescale.com> wrote:
> The ePAPR specification says that phandle properties should be called
> "phandle", and not "linux,phandle". To facilitate the migration from
> "linux,phandle" to "phandle", we update some functions to support both
> properties.
>
> Signed-off-by: Timur Tabi <timur at freescale.com>
As discussed on IRC, upstream libfdt already supports the "phandle"
property, so u-boot needs to be updated to the latest version from the
dtc.git repo on git.jdl.com. You'll still need the change to
common/fdt_support.c though.
g.
> ---
> common/fdt_support.c | 6 ++++++
> include/libfdt.h | 10 ++++++++++
> lib/libfdt/fdt_ro.c | 18 ++++++++++++++++++
> 3 files changed, 34 insertions(+), 0 deletions(-)
>
> diff --git a/common/fdt_support.c b/common/fdt_support.c
> index 496040b..85715ff 100644
> --- a/common/fdt_support.c
> +++ b/common/fdt_support.c
> @@ -1187,6 +1187,12 @@ int fdt_alloc_phandle(void *blob)
>
> for (offset = fdt_next_node(blob, -1, NULL); offset >= 0;
> offset = fdt_next_node(blob, offset, NULL)) {
> + /* Check the ePAPR-compliant "phandle" property name */
> + val = fdt_getprop(blob, offset, "phandle", &len);
> + if (val)
> + phandle = max(*val, phandle);
> +
> + /* Also check the deprecated "linux,phandle" property name */
> val = fdt_getprop(blob, offset, "linux,phandle", &len);
> if (val)
> phandle = max(*val, phandle);
> diff --git a/include/libfdt.h b/include/libfdt.h
> index d23d40e..092dd34 100644
> --- a/include/libfdt.h
> +++ b/include/libfdt.h
> @@ -452,6 +452,11 @@ static inline void *fdt_getprop_w(void *fdt, int nodeoffset,
> * fdt_get_phandle() retrieves the phandle of the device tree node at
> * structure block offset nodeoffset.
> *
> + * Both the ePAPR "phandle" property as well as the legacy "linux,phandle"
> + * property are supported. If the device tree node contains both properties,
> + * then "phandle" is used. However, it is considered an error if the two
> + * properties contain different values.
> + *
> * returns:
> * the phandle of the node at nodeoffset, on success (!= 0, != -1)
> * 0, if the node has no phandle, or another error occurs
> @@ -662,6 +667,11 @@ int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle);
> * 'compatible' property with the given string as one of its elements,
> * it returns non-zero otherwise, or on error.
> *
> + * Both the ePAPR "phandle" property as well as the legacy "linux,phandle"
> + * property are supported. If the device tree node contains both properties,
> + * then "phandle" is used. However, it is considered an error if the two
> + * properties contain different values.
> + *
> * returns:
> * 0, if the node has a 'compatible' property listing the given string
> * 1, if the node has a 'compatible' property, but it does not list
> diff --git a/lib/libfdt/fdt_ro.c b/lib/libfdt/fdt_ro.c
> index 1e1e322..57a901f 100644
> --- a/lib/libfdt/fdt_ro.c
> +++ b/lib/libfdt/fdt_ro.c
> @@ -278,6 +278,14 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)
> const uint32_t *php;
> int len;
>
> + /* First, check the "phandle" property */
> + php = fdt_getprop(fdt, nodeoffset, "phandle", &len);
> + if (php) {
> + /* If the property exists, then use it if it's valid */
> + return len == sizeof(*php) ? fdt32_to_cpu(*php) : 0;
> + }
> +
> + /* No "phandle", so check "linux,phandle" */
> php = fdt_getprop(fdt, nodeoffset, "linux,phandle", &len);
> if (!php || (len != sizeof(*php)))
> return 0;
> @@ -440,9 +448,19 @@ int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
>
> int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle)
> {
> + int ret;
> +
> if ((phandle == 0) || (phandle == -1))
> return -FDT_ERR_BADPHANDLE;
> phandle = cpu_to_fdt32(phandle);
> +
> + /* First check for a matching "phandle" property */
> + ret = fdt_node_offset_by_prop_value(fdt, -1, "phandle",
> + &phandle, sizeof(phandle));
> + if (ret > 0)
> + return ret;
> +
> + /* No "phandle", so check "linux,phandle" */
> return fdt_node_offset_by_prop_value(fdt, -1, "linux,phandle",
> &phandle, sizeof(phandle));
> }
> --
> 1.7.3.4
>
>
>
--
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.
More information about the U-Boot
mailing list