diff mbox

[RESEND,RFC,3/6] device_tree: introduce qemu_fdt_node_path

Message ID 1447946528-1533-4-git-send-email-eric.auger@linaro.org
State New
Headers show

Commit Message

Auger Eric Nov. 19, 2015, 3:22 p.m. UTC
This new helper routine returns the node path of a device
referred to by its name and compat string.

Signed-off-by: Eric Auger <eric.auger@linaro.org>

---
 device_tree.c                | 40 ++++++++++++++++++++++++++++++++++++++++
 include/sysemu/device_tree.h |  3 +++
 2 files changed, 43 insertions(+)

-- 
1.8.3.2

Comments

Alex Bennée Nov. 26, 2015, 12:06 p.m. UTC | #1
Eric Auger <eric.auger@linaro.org> writes:

> This new helper routine returns the node path of a device

> referred to by its name and compat string.

>

> Signed-off-by: Eric Auger <eric.auger@linaro.org>

> ---

>  device_tree.c                | 40 ++++++++++++++++++++++++++++++++++++++++

>  include/sysemu/device_tree.h |  3 +++

>  2 files changed, 43 insertions(+)

>

> diff --git a/device_tree.c b/device_tree.c

> index 58a5329..f184e3c 100644

> --- a/device_tree.c

> +++ b/device_tree.c

> @@ -171,6 +171,46 @@ static int findnode_nofail(void *fdt, const char *node_path)

>      return offset;

>  }

>

> +/**

> + * qemu_fdt_node_path

> + *

> + * return the node path of a device, referred to by its node name

> + * and its compat string

> + * fdt: pointer to the dt blob

> + * name: name of the device

> + * compat: compatibility string of the device

> + *

> + * returns the node path

> + */

> +int qemu_fdt_node_path(void *fdt, const char *name, char *compat,

> +                       char **node_path)

> +{

> +    int offset = 0, len;

> +    const char *iter_name;

> +    char path[256];

> +    int ret;

> +

> +    *node_path = NULL;

> +    while (1) {

> +        offset = fdt_node_offset_by_compatible(fdt, offset, compat);

> +        if (offset == -FDT_ERR_NOTFOUND) {


Is this not the only error code fdt_node_offset_by_compatible() won't
return?

> +            break;

> +        }

> +        iter_name = fdt_get_name(fdt, offset, &len);

> +        if (!strncmp(iter_name, name, len)) {


is it possible for fdt_get_name to fail here and give you NULL and -len?

> +            goto found;

> +        }

> +    }

> +    return offset;

> +

> +found:

> +    ret = fdt_get_path(fdt, offset, path, 256);

> +    if (!ret) {

> +        *node_path = g_strdup(path);

> +    }

> +    return ret;

> +}

> +

>  int qemu_fdt_setprop(void *fdt, const char *node_path,

>                       const char *property, const void *val, int size)

>  {

> diff --git a/include/sysemu/device_tree.h b/include/sysemu/device_tree.h

> index 307e53d..f9e6e6e 100644

> --- a/include/sysemu/device_tree.h

> +++ b/include/sysemu/device_tree.h

> @@ -18,6 +18,9 @@ void *create_device_tree(int *sizep);

>  void *load_device_tree(const char *filename_path, int *sizep);

>  void *load_device_tree_from_sysfs(void);

>

> +int qemu_fdt_node_path(void *fdt, const char *name, char *compat,

> +                       char **node_path);

> +

>  int qemu_fdt_setprop(void *fdt, const char *node_path,

>                       const char *property, const void *val, int size);

>  int qemu_fdt_setprop_cell(void *fdt, const char *node_path,



--
Alex Bennée
Auger Eric Dec. 3, 2015, 3:44 p.m. UTC | #2
On 11/26/2015 01:06 PM, Alex Bennée wrote:
> 

> Eric Auger <eric.auger@linaro.org> writes:

> 

>> This new helper routine returns the node path of a device

>> referred to by its name and compat string.

>>

>> Signed-off-by: Eric Auger <eric.auger@linaro.org>

>> ---

>>  device_tree.c                | 40 ++++++++++++++++++++++++++++++++++++++++

>>  include/sysemu/device_tree.h |  3 +++

>>  2 files changed, 43 insertions(+)

>>

>> diff --git a/device_tree.c b/device_tree.c

>> index 58a5329..f184e3c 100644

>> --- a/device_tree.c

>> +++ b/device_tree.c

>> @@ -171,6 +171,46 @@ static int findnode_nofail(void *fdt, const char *node_path)

>>      return offset;

>>  }

>>

>> +/**

>> + * qemu_fdt_node_path

>> + *

>> + * return the node path of a device, referred to by its node name

>> + * and its compat string

>> + * fdt: pointer to the dt blob

>> + * name: name of the device

>> + * compat: compatibility string of the device

>> + *

>> + * returns the node path

>> + */

>> +int qemu_fdt_node_path(void *fdt, const char *name, char *compat,

>> +                       char **node_path)

>> +{

>> +    int offset = 0, len;

>> +    const char *iter_name;

>> +    char path[256];

>> +    int ret;

>> +

>> +    *node_path = NULL;

>> +    while (1) {

>> +        offset = fdt_node_offset_by_compatible(fdt, offset, compat);

>> +        if (offset == -FDT_ERR_NOTFOUND) {

> 

> Is this not the only error code fdt_node_offset_by_compatible() won't

> return?

> 

>> +            break;

>> +        }

>> +        iter_name = fdt_get_name(fdt, offset, &len);

>> +        if (!strncmp(iter_name, name, len)) {

> 

> is it possible for fdt_get_name to fail here and give you NULL and -len?

I agree with both of your comments. Thanks for spotting my wrong
handling of the errors.

Thank you for your time!

Eric
> 

>> +            goto found;

>> +        }

>> +    }

>> +    return offset;

>> +

>> +found:

>> +    ret = fdt_get_path(fdt, offset, path, 256);

>> +    if (!ret) {

>> +        *node_path = g_strdup(path);

>> +    }

>> +    return ret;

>> +}

>> +

>>  int qemu_fdt_setprop(void *fdt, const char *node_path,

>>                       const char *property, const void *val, int size)

>>  {

>> diff --git a/include/sysemu/device_tree.h b/include/sysemu/device_tree.h

>> index 307e53d..f9e6e6e 100644

>> --- a/include/sysemu/device_tree.h

>> +++ b/include/sysemu/device_tree.h

>> @@ -18,6 +18,9 @@ void *create_device_tree(int *sizep);

>>  void *load_device_tree(const char *filename_path, int *sizep);

>>  void *load_device_tree_from_sysfs(void);

>>

>> +int qemu_fdt_node_path(void *fdt, const char *name, char *compat,

>> +                       char **node_path);

>> +

>>  int qemu_fdt_setprop(void *fdt, const char *node_path,

>>                       const char *property, const void *val, int size);

>>  int qemu_fdt_setprop_cell(void *fdt, const char *node_path,

> 

> 

> --

> Alex Bennée

>
diff mbox

Patch

diff --git a/device_tree.c b/device_tree.c
index 58a5329..f184e3c 100644
--- a/device_tree.c
+++ b/device_tree.c
@@ -171,6 +171,46 @@  static int findnode_nofail(void *fdt, const char *node_path)
     return offset;
 }
 
+/**
+ * qemu_fdt_node_path
+ *
+ * return the node path of a device, referred to by its node name
+ * and its compat string
+ * fdt: pointer to the dt blob
+ * name: name of the device
+ * compat: compatibility string of the device
+ *
+ * returns the node path
+ */
+int qemu_fdt_node_path(void *fdt, const char *name, char *compat,
+                       char **node_path)
+{
+    int offset = 0, len;
+    const char *iter_name;
+    char path[256];
+    int ret;
+
+    *node_path = NULL;
+    while (1) {
+        offset = fdt_node_offset_by_compatible(fdt, offset, compat);
+        if (offset == -FDT_ERR_NOTFOUND) {
+            break;
+        }
+        iter_name = fdt_get_name(fdt, offset, &len);
+        if (!strncmp(iter_name, name, len)) {
+            goto found;
+        }
+    }
+    return offset;
+
+found:
+    ret = fdt_get_path(fdt, offset, path, 256);
+    if (!ret) {
+        *node_path = g_strdup(path);
+    }
+    return ret;
+}
+
 int qemu_fdt_setprop(void *fdt, const char *node_path,
                      const char *property, const void *val, int size)
 {
diff --git a/include/sysemu/device_tree.h b/include/sysemu/device_tree.h
index 307e53d..f9e6e6e 100644
--- a/include/sysemu/device_tree.h
+++ b/include/sysemu/device_tree.h
@@ -18,6 +18,9 @@  void *create_device_tree(int *sizep);
 void *load_device_tree(const char *filename_path, int *sizep);
 void *load_device_tree_from_sysfs(void);
 
+int qemu_fdt_node_path(void *fdt, const char *name, char *compat,
+                       char **node_path);
+
 int qemu_fdt_setprop(void *fdt, const char *node_path,
                      const char *property, const void *val, int size);
 int qemu_fdt_setprop_cell(void *fdt, const char *node_path,