All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Auger <eric.auger@linaro.org>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: eric.auger@st.com, "QEMU Developers" <qemu-devel@nongnu.org>,
	qemu-arm <qemu-arm@nongnu.org>,
	"David Gibson" <david@gibson.dropbear.id.au>,
	"Alex Williamson" <alex.williamson@redhat.com>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Thomas Huth" <thuth@redhat.com>,
	"Peter Crosthwaite" <crosthwaitepeter@gmail.com>,
	"Patch Tracking" <patches@linaro.org>,
	"Christoffer Dall" <christoffer.dall@linaro.org>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Baptiste Reynal" <b.reynal@virtualopensystems.com>,
	"Suravee Suthikulpanit" <suravee.suthikulpanit@amd.com>,
	thomas.lendacky@amd.com
Subject: Re: [PATCH v5 3/8] device_tree: introduce qemu_fdt_node_path
Date: Mon, 25 Jan 2016 15:41:00 +0100	[thread overview]
Message-ID: <56A633FC.3020609@linaro.org> (raw)
In-Reply-To: <CAFEAcA8xCQ2XaYvFXLFK8S89vWaBmoExmDq42WQzj3QOw86Ayg@mail.gmail.com>

Peter,
On 01/25/2016 03:26 PM, Peter Maydell wrote:
> On 18 January 2016 at 15:16, Eric Auger <eric.auger@linaro.org> wrote:
>> This new helper routine returns a NULL terminated array of
>> node paths matching a node name and a compat string.
>>
>> Signed-off-by: Eric Auger <eric.auger@linaro.org>
>>
>> ---
>>
>> v4 -> v5:
>> - support the case where several nodes exist, ie.
>>   return an array of node paths. Also add Error **
>>   parameter
>>
>> v1 -> v2:
>> - move doc comment in header file
>> - do not use a fixed size buffer
>> - break on errors in while loop
>> - use strcmp instead of strncmp
>>
>> RFC -> v1:
>> - improve error handling according to Alex' comments
>> ---
>>  device_tree.c                | 49 ++++++++++++++++++++++++++++++++++++++++++++
>>  include/sysemu/device_tree.h | 14 +++++++++++++
>>  2 files changed, 63 insertions(+)
>>
>> diff --git a/device_tree.c b/device_tree.c
>> index b262c2d..3c88a37 100644
>> --- a/device_tree.c
>> +++ b/device_tree.c
>> @@ -231,6 +231,55 @@ static int findnode_nofail(void *fdt, const char *node_path)
>>      return offset;
>>  }
>>
>> +char **qemu_fdt_node_path(void *fdt, const char *name, char *compat,
>> +                          Error **errp)
>> +{
>> +    int offset, len, ret;
>> +    const char *iter_name;
>> +    unsigned int path_len = 16, n = 0;
>> +    GSList *path_list = NULL, *iter;
>> +    char **path_array;
>> +
>> +    offset = fdt_node_offset_by_compatible(fdt, -1, compat);
>> +
>> +    while (offset >= 0) {
>> +        iter_name = fdt_get_name(fdt, offset, &len);
>> +        if (!iter_name) {
>> +            offset = len;
>> +            break;
>> +        }
>> +        if (!strcmp(iter_name, name)) {
>> +            char *path;
>> +
>> +            path = g_malloc(path_len);
>> +            while ((ret = fdt_get_path(fdt, offset, path, path_len))
>> +                  == -FDT_ERR_NOSPACE) {
>> +                path_len += 16;
>> +                path = g_realloc(path, path_len);
>> +            }
>> +            path_list = g_slist_prepend(path_list, path);
>> +            n++;
>> +        }
>> +        offset = fdt_node_offset_by_compatible(fdt, offset, compat);
>> +    }
>> +
>> +    if (offset < 0 && offset != -FDT_ERR_NOTFOUND) {
>> +        error_setg(errp, "%s: abort parsing dt for %s/%s: %s",
>> +                   __func__, name, compat, fdt_strerror(offset));
> 
> Needs to bail out (freeing memory).
effectively in case I get an error, it's better to free everything and
return a vector with with a single NULL element, see comment below. I
will correct this.
> 
>> +    }
>> +
>> +    path_array = g_new(char *, n + 1);
>> +    path_array[n--] = NULL;
> 
> 0, or '\0'. NULL is a pointer, not the NUL character. (This is a
> style issue, not a correctness one.)
actually I want to put NULL as the last element of my array and not a
NUL char. The function returns a NULL terminated vector as
g_strsplit_set does, for instance.

Thanks

Eric
> 
>> +
>> +    for (iter = path_list; iter; iter = iter->next) {
>> +        path_array[n--] = iter->data;
>> +    }
>> +
>> +    g_slist_free(path_list);
>> +
>> +    return path_array;
>> +}
>> +
>>  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 fdf25a4..436b5dd 100644
>> --- a/include/sysemu/device_tree.h
>> +++ b/include/sysemu/device_tree.h
>> @@ -20,6 +20,20 @@ void *load_device_tree(const char *filename_path, int *sizep);
>>  void *load_device_tree_from_sysfs(void);
>>  #endif
>>
>> +/**
>> + * qemu_fdt_node_path: return the paths of nodes matching a given
>> + * name and compat string
>> + * @fdt: pointer to the dt blob
>> + * @name: node name
>> + * @compat: compatibility string
>> + * @errp: handle to an error object
>> + *
>> + * returns a newly allocated NULL-terminated array of node paths.
> 
> Should say what we return on error (NULL ?)
> 
>> + * Use g_strfreev() to free it.
>> + */
>> +char **qemu_fdt_node_path(void *fdt, const char *name, char *compat,
>> +                          Error **errp);
>> +
>>  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,
>> --
>> 1.9.1
>>
> 
> thanks
> -- PMM
> 

WARNING: multiple messages have this Message-ID (diff)
From: Eric Auger <eric.auger@linaro.org>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: "Baptiste Reynal" <b.reynal@virtualopensystems.com>,
	"Thomas Huth" <thuth@redhat.com>,
	eric.auger@st.com, "Patch Tracking" <patches@linaro.org>,
	"Peter Crosthwaite" <crosthwaitepeter@gmail.com>,
	"QEMU Developers" <qemu-devel@nongnu.org>,
	"Alex Williamson" <alex.williamson@redhat.com>,
	qemu-arm <qemu-arm@nongnu.org>,
	"Suravee Suthikulpanit" <suravee.suthikulpanit@amd.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	thomas.lendacky@amd.com, "Alex Bennée" <alex.bennee@linaro.org>,
	"Christoffer Dall" <christoffer.dall@linaro.org>,
	"David Gibson" <david@gibson.dropbear.id.au>
Subject: Re: [Qemu-devel] [PATCH v5 3/8] device_tree: introduce qemu_fdt_node_path
Date: Mon, 25 Jan 2016 15:41:00 +0100	[thread overview]
Message-ID: <56A633FC.3020609@linaro.org> (raw)
In-Reply-To: <CAFEAcA8xCQ2XaYvFXLFK8S89vWaBmoExmDq42WQzj3QOw86Ayg@mail.gmail.com>

Peter,
On 01/25/2016 03:26 PM, Peter Maydell wrote:
> On 18 January 2016 at 15:16, Eric Auger <eric.auger@linaro.org> wrote:
>> This new helper routine returns a NULL terminated array of
>> node paths matching a node name and a compat string.
>>
>> Signed-off-by: Eric Auger <eric.auger@linaro.org>
>>
>> ---
>>
>> v4 -> v5:
>> - support the case where several nodes exist, ie.
>>   return an array of node paths. Also add Error **
>>   parameter
>>
>> v1 -> v2:
>> - move doc comment in header file
>> - do not use a fixed size buffer
>> - break on errors in while loop
>> - use strcmp instead of strncmp
>>
>> RFC -> v1:
>> - improve error handling according to Alex' comments
>> ---
>>  device_tree.c                | 49 ++++++++++++++++++++++++++++++++++++++++++++
>>  include/sysemu/device_tree.h | 14 +++++++++++++
>>  2 files changed, 63 insertions(+)
>>
>> diff --git a/device_tree.c b/device_tree.c
>> index b262c2d..3c88a37 100644
>> --- a/device_tree.c
>> +++ b/device_tree.c
>> @@ -231,6 +231,55 @@ static int findnode_nofail(void *fdt, const char *node_path)
>>      return offset;
>>  }
>>
>> +char **qemu_fdt_node_path(void *fdt, const char *name, char *compat,
>> +                          Error **errp)
>> +{
>> +    int offset, len, ret;
>> +    const char *iter_name;
>> +    unsigned int path_len = 16, n = 0;
>> +    GSList *path_list = NULL, *iter;
>> +    char **path_array;
>> +
>> +    offset = fdt_node_offset_by_compatible(fdt, -1, compat);
>> +
>> +    while (offset >= 0) {
>> +        iter_name = fdt_get_name(fdt, offset, &len);
>> +        if (!iter_name) {
>> +            offset = len;
>> +            break;
>> +        }
>> +        if (!strcmp(iter_name, name)) {
>> +            char *path;
>> +
>> +            path = g_malloc(path_len);
>> +            while ((ret = fdt_get_path(fdt, offset, path, path_len))
>> +                  == -FDT_ERR_NOSPACE) {
>> +                path_len += 16;
>> +                path = g_realloc(path, path_len);
>> +            }
>> +            path_list = g_slist_prepend(path_list, path);
>> +            n++;
>> +        }
>> +        offset = fdt_node_offset_by_compatible(fdt, offset, compat);
>> +    }
>> +
>> +    if (offset < 0 && offset != -FDT_ERR_NOTFOUND) {
>> +        error_setg(errp, "%s: abort parsing dt for %s/%s: %s",
>> +                   __func__, name, compat, fdt_strerror(offset));
> 
> Needs to bail out (freeing memory).
effectively in case I get an error, it's better to free everything and
return a vector with with a single NULL element, see comment below. I
will correct this.
> 
>> +    }
>> +
>> +    path_array = g_new(char *, n + 1);
>> +    path_array[n--] = NULL;
> 
> 0, or '\0'. NULL is a pointer, not the NUL character. (This is a
> style issue, not a correctness one.)
actually I want to put NULL as the last element of my array and not a
NUL char. The function returns a NULL terminated vector as
g_strsplit_set does, for instance.

Thanks

Eric
> 
>> +
>> +    for (iter = path_list; iter; iter = iter->next) {
>> +        path_array[n--] = iter->data;
>> +    }
>> +
>> +    g_slist_free(path_list);
>> +
>> +    return path_array;
>> +}
>> +
>>  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 fdf25a4..436b5dd 100644
>> --- a/include/sysemu/device_tree.h
>> +++ b/include/sysemu/device_tree.h
>> @@ -20,6 +20,20 @@ void *load_device_tree(const char *filename_path, int *sizep);
>>  void *load_device_tree_from_sysfs(void);
>>  #endif
>>
>> +/**
>> + * qemu_fdt_node_path: return the paths of nodes matching a given
>> + * name and compat string
>> + * @fdt: pointer to the dt blob
>> + * @name: node name
>> + * @compat: compatibility string
>> + * @errp: handle to an error object
>> + *
>> + * returns a newly allocated NULL-terminated array of node paths.
> 
> Should say what we return on error (NULL ?)
> 
>> + * Use g_strfreev() to free it.
>> + */
>> +char **qemu_fdt_node_path(void *fdt, const char *name, char *compat,
>> +                          Error **errp);
>> +
>>  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,
>> --
>> 1.9.1
>>
> 
> thanks
> -- PMM
> 

  reply	other threads:[~2016-01-25 14:41 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-18 15:16 [PATCH v5 0/8] AMD XGBE KVM platform passthrough Eric Auger
2016-01-18 15:16 ` [Qemu-devel] " Eric Auger
2016-01-18 15:16 ` [PATCH v5 1/8] hw/vfio/platform: amd-xgbe device Eric Auger
2016-01-18 15:16   ` [Qemu-devel] " Eric Auger
2016-01-18 15:16 ` [PATCH v5 2/8] device_tree: introduce load_device_tree_from_sysfs Eric Auger
2016-01-18 15:16   ` [Qemu-devel] " Eric Auger
2016-01-25 14:13   ` Peter Maydell
2016-01-25 14:13     ` [Qemu-devel] " Peter Maydell
2016-02-01 13:11     ` Eric Auger
2016-02-01 13:11       ` [Qemu-devel] " Eric Auger
2016-01-18 15:16 ` [PATCH v5 3/8] device_tree: introduce qemu_fdt_node_path Eric Auger
2016-01-18 15:16   ` [Qemu-devel] " Eric Auger
2016-01-25 14:26   ` Peter Maydell
2016-01-25 14:26     ` [Qemu-devel] " Peter Maydell
2016-01-25 14:41     ` Eric Auger [this message]
2016-01-25 14:41       ` Eric Auger
2016-01-18 15:16 ` [PATCH v5 4/8] device_tree: qemu_fdt_getprop converted to use the error API Eric Auger
2016-01-18 15:16   ` [Qemu-devel] " Eric Auger
2016-01-18 15:16 ` [PATCH v5 5/8] device_tree: qemu_fdt_getprop_cell " Eric Auger
2016-01-18 15:16   ` [Qemu-devel] " Eric Auger
2016-01-18 15:16 ` [PATCH v5 6/8] hw/arm/sysbus-fdt: helpers for clock node generation Eric Auger
2016-01-18 15:16   ` [Qemu-devel] " Eric Auger
2016-01-25 14:05   ` Peter Maydell
2016-01-25 14:05     ` [Qemu-devel] " Peter Maydell
2016-01-25 14:09     ` Eric Auger
2016-01-25 14:09       ` [Qemu-devel] " Eric Auger
2016-01-25 14:34       ` Peter Maydell
2016-01-25 14:34         ` [Qemu-devel] " Peter Maydell
2016-01-25 14:43         ` Peter Maydell
2016-01-25 14:43           ` [Qemu-devel] " Peter Maydell
2016-01-25 14:51           ` Eric Auger
2016-01-25 14:51             ` [Qemu-devel] " Eric Auger
2016-01-18 15:16 ` [PATCH v5 7/8] hw/arm/sysbus-fdt: enable amd-xgbe dynamic instantiation Eric Auger
2016-01-18 15:16   ` [Qemu-devel] " Eric Auger
2016-01-25 14:33   ` Peter Maydell
2016-01-25 14:33     ` [Qemu-devel] " Peter Maydell
2016-02-01 13:11     ` Eric Auger
2016-02-01 13:11       ` [Qemu-devel] " Eric Auger
2016-01-18 15:16 ` [PATCH v5 8/8] hw/arm/sysbus-fdt: remove qemu_fdt_setprop returned value check Eric Auger
2016-01-18 15:16   ` [Qemu-devel] " Eric Auger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56A633FC.3020609@linaro.org \
    --to=eric.auger@linaro.org \
    --cc=alex.bennee@linaro.org \
    --cc=alex.williamson@redhat.com \
    --cc=b.reynal@virtualopensystems.com \
    --cc=christoffer.dall@linaro.org \
    --cc=crosthwaitepeter@gmail.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=eric.auger@st.com \
    --cc=patches@linaro.org \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=suravee.suthikulpanit@amd.com \
    --cc=thomas.lendacky@amd.com \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.