Message ID | 20200917032033.2020-5-fangying1@huawei.com |
---|---|
State | New |
Headers | show |
Series | hw/arm/virt: Introduce cpu and cache topology support | expand |
On Thu, Sep 17, 2020 at 11:20:25AM +0800, Ying Fang wrote: > From: Andrew Jones <drjones@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.peter@gmail.com> > Cc: Alexander Graf <agraf@suse.de> > Signed-off-by: Andrew Jones <drjones@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 > >
On 9/17/2020 4:12 PM, Andrew Jones wrote: > On Thu, Sep 17, 2020 at 11:20:25AM +0800, Ying Fang wrote: >> From: Andrew Jones <drjones@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.peter@gmail.com> >> Cc: Alexander Graf <agraf@suse.de> >> Signed-off-by: Andrew Jones <drjones@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 for the sync. I'll look into it. I did not know about the refresh and the effort Salil Mehta has made on this. We are not in the same dept and work for different projects. Thanks Ying. > > 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 >> >> > > . >
> From: Qemu-arm [mailto:qemu-arm-bounces+salil.mehta=huawei.com@nongnu.org] > On Behalf Of Andrew Jones > Sent: Thursday, September 17, 2020 9:13 AM > To: fangying <fangying1@huawei.com> > Cc: peter.maydell@linaro.org; Zhanghailiang <zhang.zhanghailiang@huawei.com>; > Alexander Graf <agraf@suse.de>; qemu-devel@nongnu.org; Chenzhendong (alex) > <alex.chen@huawei.com>; shannon.zhaosl@gmail.com; qemu-arm@nongnu.org; > alistair.francis@wdc.com; imammedo@redhat.com > Subject: Re: [RFC PATCH 04/12] device_tree: add qemu_fdt_add_path > > On Thu, Sep 17, 2020 at 11:20:25AM +0800, Ying Fang wrote: > > From: Andrew Jones <drjones@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.peter@gmail.com> > > Cc: Alexander Graf <agraf@suse.de> > > Signed-off-by: Andrew Jones <drjones@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 > I was not aware of this work going on. I am based at Cambridge and Fangying in Hangzhou and work for different teams. Yes, I have it and have integrated it with the Virtual CPU hotplug branch and I am testing them. I have also rebased virtual cpu hotplug patches and integrated the PMU related changes recently been discussed in other mail-chain. Plus, I am also dealing with the MPIDR/affinity part from the Kernel which has been discussed earlier with the Marc Zyngier. It looks some of the changes are common here like ability to set MPIDR of the vcpus at the time of their creation inside KVM. And the PPTT table changes which were present in your refresh branch as well. Changes related to the possible and present vcpus might need a sync as well. @Andrew, should I take out the part which is common and affects the virtual cpu hotplug and push them separately. This way I can have part of the changes related to the vcpu hotplug done which will also cover this patch-set requirements as well? @Fangying, will this work for you? Salil.
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); +} + 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 { \