On Thu, Sep 17, 2020 at 11:20:25AM +0800, Ying Fang wrote: > From: Andrew Jones <drjo...@redhat.com> > > qemu_fdt_add_path works like qemu_fdt_add_subnode, except it > also recursively adds any missing parent nodes. > > Cc: Peter Crosthwaite <crosthwaite.pe...@gmail.com> > Cc: Alexander Graf <ag...@suse.de> > Signed-off-by: Andrew Jones <drjo...@redhat.com> > --- > device_tree.c | 24 ++++++++++++++++++++++++ > include/sysemu/device_tree.h | 1 + > 2 files changed, 25 insertions(+) > > diff --git a/device_tree.c b/device_tree.c > index b335dae707..1854be3a02 100644 > --- a/device_tree.c > +++ b/device_tree.c > @@ -524,6 +524,30 @@ int qemu_fdt_add_subnode(void *fdt, const char *name) > return retval; > } > > +int qemu_fdt_add_path(void *fdt, const char *path) > +{ > + char *parent; > + int offset; > + > + offset = fdt_path_offset(fdt, path); > + if (offset < 0 && offset != -FDT_ERR_NOTFOUND) { > + error_report("%s Couldn't find node %s: %s", __func__, path, > + fdt_strerror(offset)); > + exit(1); > + } > + > + if (offset != -FDT_ERR_NOTFOUND) { > + return offset; > + } > + > + parent = g_strdup(path); > + strrchr(parent, '/')[0] = '\0'; > + qemu_fdt_add_path(fdt, parent); > + g_free(parent); > + > + return qemu_fdt_add_subnode(fdt, path); > +}
Igor didn't like the recursion when I posted this before so I changed it when doing the refresh[*] that I gave to Salil Mehta. Salil also works for Huawei, are you guys not working together? [*] https://github.com/rhdrjones/qemu/commits/virt-cpu-topology-refresh Thanks, drew > + > void qemu_fdt_dumpdtb(void *fdt, int size) > { > const char *dumpdtb = qemu_opt_get(qemu_get_machine_opts(), "dumpdtb"); > 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 { > \ > -- > 2.23.0 > >