Hi Ying Fang, I don't see any change in this patch from what I have in my tree, so this should be
From: Andrew Jones <drjo...@redhat.com> Thanks, drew On Thu, Feb 25, 2021 at 04:56:23PM +0800, Ying Fang wrote: > qemu_fdt_add_path() works like qemu_fdt_add_subnode(), except > it also adds any missing parent nodes. We also tweak an error > message of qemu_fdt_add_subnode(). > > Signed-off-by: Andrew Jones <drjo...@redhat.com> > Signed-off-by: Ying Fang <fangyi...@huawei.com> > --- > include/sysemu/device_tree.h | 1 + > softmmu/device_tree.c | 45 ++++++++++++++++++++++++++++++++++-- > 2 files changed, 44 insertions(+), 2 deletions(-) > > diff --git a/include/sysemu/device_tree.h b/include/sysemu/device_tree.h > index 982c89345f..15fb98af98 100644 > --- a/include/sysemu/device_tree.h > +++ b/include/sysemu/device_tree.h > @@ -104,6 +104,7 @@ uint32_t qemu_fdt_get_phandle(void *fdt, const char > *path); > uint32_t qemu_fdt_alloc_phandle(void *fdt); > int qemu_fdt_nop_node(void *fdt, const char *node_path); > int qemu_fdt_add_subnode(void *fdt, const char *name); > +int qemu_fdt_add_path(void *fdt, const char *path); > > #define qemu_fdt_setprop_cells(fdt, node_path, property, ...) > \ > do { > \ > diff --git a/softmmu/device_tree.c b/softmmu/device_tree.c > index b9a3ddc518..1e3857ca0c 100644 > --- a/softmmu/device_tree.c > +++ b/softmmu/device_tree.c > @@ -515,8 +515,8 @@ int qemu_fdt_add_subnode(void *fdt, const char *name) > > retval = fdt_add_subnode(fdt, parent, basename); > if (retval < 0) { > - error_report("FDT: Failed to create subnode %s: %s", name, > - fdt_strerror(retval)); > + error_report("%s: Failed to create subnode %s: %s", > + __func__, name, fdt_strerror(retval)); > exit(1); > } > > @@ -524,6 +524,47 @@ int qemu_fdt_add_subnode(void *fdt, const char *name) > return retval; > } > > +/* > + * Like qemu_fdt_add_subnode(), but will add all missing > + * subnodes in the path. > + */ > +int qemu_fdt_add_path(void *fdt, const char *path) > +{ > + char *dupname, *basename, *p; > + int parent, retval = -1; > + > + if (path[0] != '/') { > + return retval; > + } > + > + parent = fdt_path_offset(fdt, "/"); > + p = dupname = g_strdup(path); > + > + while (p) { > + *p = '/'; > + basename = p + 1; > + p = strchr(p + 1, '/'); > + if (p) { > + *p = '\0'; > + } > + retval = fdt_path_offset(fdt, dupname); > + if (retval < 0 && retval != -FDT_ERR_NOTFOUND) { > + error_report("%s: Invalid path %s: %s", > + __func__, path, fdt_strerror(retval)); > + exit(1); > + } else if (retval == -FDT_ERR_NOTFOUND) { > + retval = fdt_add_subnode(fdt, parent, basename); > + if (retval < 0) { > + break; > + } > + } > + parent = retval; > + } > + > + g_free(dupname); > + return retval; > +} > + > void qemu_fdt_dumpdtb(void *fdt, int size) > { > const char *dumpdtb = current_machine->dumpdtb; > -- > 2.23.0 > >