* [Qemu-devel] [PATCH v2] riscv: virt: Add cpu-topology DT node.
@ 2019-06-24 23:41 Atish Patra
2019-06-25 10:20 ` Palmer Dabbelt
0 siblings, 1 reply; 2+ messages in thread
From: Atish Patra @ 2019-06-24 23:41 UTC (permalink / raw)
To: qemu-riscv, qemu-devel
Cc: Atish Patra, Palmer Dabbelt, Alistair Francis, Sagar Karandikar,
Bastian Koppelmann
Currently, there is no cpu topology defined in RISC-V.
Define a device tree node that clearly describes the
entire topology. This saves the trouble of scanning individual
cache to figure out the topology.
Here is the linux kernel patch series that enables topology
for RISC-V.
http://lists.infradead.org/pipermail/linux-riscv/2019-June/005072.html
CPU topology after applying this patch in QEMU & above series in kernel
/ # cat /sys/devices/system/cpu/cpu2/topology/thread_siblings_list
2
/ # cat /sys/devices/system/cpu/cpu2/topology/physical_package_id
0
/ # cat /sys/devices/system/cpu/cpu2/topology/core_siblings_list
0-7
Signed-off-by: Atish Patra <atish.patra@wdc.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
---
hw/riscv/virt.c | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index 84d94d0c42d8..45a1edcd6c4a 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -191,6 +191,7 @@ static void *create_fdt(RISCVVirtState *s, const struct MemmapEntry *memmap,
for (cpu = s->soc.num_harts - 1; cpu >= 0; cpu--) {
int cpu_phandle = phandle++;
+ int intc_phandle;
nodename = g_strdup_printf("/cpus/cpu@%d", cpu);
char *intc = g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu);
char *isa = riscv_isa_string(&s->soc.harts[cpu]);
@@ -203,9 +204,12 @@ static void *create_fdt(RISCVVirtState *s, const struct MemmapEntry *memmap,
qemu_fdt_setprop_string(fdt, nodename, "status", "okay");
qemu_fdt_setprop_cell(fdt, nodename, "reg", cpu);
qemu_fdt_setprop_string(fdt, nodename, "device_type", "cpu");
+ qemu_fdt_setprop_cell(fdt, nodename, "phandle", cpu_phandle);
+ qemu_fdt_setprop_cell(fdt, nodename, "linux,phandle", cpu_phandle);
+ intc_phandle = phandle++;
qemu_fdt_add_subnode(fdt, intc);
- qemu_fdt_setprop_cell(fdt, intc, "phandle", cpu_phandle);
- qemu_fdt_setprop_cell(fdt, intc, "linux,phandle", cpu_phandle);
+ qemu_fdt_setprop_cell(fdt, intc, "phandle", intc_phandle);
+ qemu_fdt_setprop_cell(fdt, intc, "linux,phandle", intc_phandle);
qemu_fdt_setprop_string(fdt, intc, "compatible", "riscv,cpu-intc");
qemu_fdt_setprop(fdt, intc, "interrupt-controller", NULL, 0);
qemu_fdt_setprop_cell(fdt, intc, "#interrupt-cells", 1);
@@ -214,6 +218,20 @@ static void *create_fdt(RISCVVirtState *s, const struct MemmapEntry *memmap,
g_free(nodename);
}
+ /* Add cpu-topology node */
+ qemu_fdt_add_subnode(fdt, "/cpus/cpu-map");
+ qemu_fdt_add_subnode(fdt, "/cpus/cpu-map/cluster0");
+ for (cpu = s->soc.num_harts - 1; cpu >= 0; cpu--) {
+ char *core_nodename = g_strdup_printf("/cpus/cpu-map/cluster0/core%d",
+ cpu);
+ char *cpu_nodename = g_strdup_printf("/cpus/cpu@%d", cpu);
+ uint32_t intc_phandle = qemu_fdt_get_phandle(fdt, cpu_nodename);
+ qemu_fdt_add_subnode(fdt, core_nodename);
+ qemu_fdt_setprop_cell(fdt, core_nodename, "cpu", intc_phandle);
+ g_free(core_nodename);
+ g_free(cpu_nodename);
+ }
+
cells = g_new0(uint32_t, s->soc.num_harts * 4);
for (cpu = 0; cpu < s->soc.num_harts; cpu++) {
nodename =
--
2.21.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [Qemu-devel] [PATCH v2] riscv: virt: Add cpu-topology DT node.
2019-06-24 23:41 [Qemu-devel] [PATCH v2] riscv: virt: Add cpu-topology DT node Atish Patra
@ 2019-06-25 10:20 ` Palmer Dabbelt
0 siblings, 0 replies; 2+ messages in thread
From: Palmer Dabbelt @ 2019-06-25 10:20 UTC (permalink / raw)
To: Atish Patra
Cc: qemu-riscv, sagark, Bastian Koppelmann, qemu-devel, Atish Patra,
Alistair Francis
On Mon, 24 Jun 2019 16:41:44 PDT (-0700), Atish Patra wrote:
> Currently, there is no cpu topology defined in RISC-V.
> Define a device tree node that clearly describes the
> entire topology. This saves the trouble of scanning individual
> cache to figure out the topology.
>
> Here is the linux kernel patch series that enables topology
> for RISC-V.
>
> http://lists.infradead.org/pipermail/linux-riscv/2019-June/005072.html
>
> CPU topology after applying this patch in QEMU & above series in kernel
>
> / # cat /sys/devices/system/cpu/cpu2/topology/thread_siblings_list
> 2
> / # cat /sys/devices/system/cpu/cpu2/topology/physical_package_id
> 0
> / # cat /sys/devices/system/cpu/cpu2/topology/core_siblings_list
> 0-7
>
> Signed-off-by: Atish Patra <atish.patra@wdc.com>
> Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Thanks. This is in the queue for 4.1, which is just pending Alistar's review
on those two Z patches I reworked.
> ---
> hw/riscv/virt.c | 22 ++++++++++++++++++++--
> 1 file changed, 20 insertions(+), 2 deletions(-)
>
> diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
> index 84d94d0c42d8..45a1edcd6c4a 100644
> --- a/hw/riscv/virt.c
> +++ b/hw/riscv/virt.c
> @@ -191,6 +191,7 @@ static void *create_fdt(RISCVVirtState *s, const struct MemmapEntry *memmap,
>
> for (cpu = s->soc.num_harts - 1; cpu >= 0; cpu--) {
> int cpu_phandle = phandle++;
> + int intc_phandle;
> nodename = g_strdup_printf("/cpus/cpu@%d", cpu);
> char *intc = g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu);
> char *isa = riscv_isa_string(&s->soc.harts[cpu]);
> @@ -203,9 +204,12 @@ static void *create_fdt(RISCVVirtState *s, const struct MemmapEntry *memmap,
> qemu_fdt_setprop_string(fdt, nodename, "status", "okay");
> qemu_fdt_setprop_cell(fdt, nodename, "reg", cpu);
> qemu_fdt_setprop_string(fdt, nodename, "device_type", "cpu");
> + qemu_fdt_setprop_cell(fdt, nodename, "phandle", cpu_phandle);
> + qemu_fdt_setprop_cell(fdt, nodename, "linux,phandle", cpu_phandle);
> + intc_phandle = phandle++;
> qemu_fdt_add_subnode(fdt, intc);
> - qemu_fdt_setprop_cell(fdt, intc, "phandle", cpu_phandle);
> - qemu_fdt_setprop_cell(fdt, intc, "linux,phandle", cpu_phandle);
> + qemu_fdt_setprop_cell(fdt, intc, "phandle", intc_phandle);
> + qemu_fdt_setprop_cell(fdt, intc, "linux,phandle", intc_phandle);
> qemu_fdt_setprop_string(fdt, intc, "compatible", "riscv,cpu-intc");
> qemu_fdt_setprop(fdt, intc, "interrupt-controller", NULL, 0);
> qemu_fdt_setprop_cell(fdt, intc, "#interrupt-cells", 1);
> @@ -214,6 +218,20 @@ static void *create_fdt(RISCVVirtState *s, const struct MemmapEntry *memmap,
> g_free(nodename);
> }
>
> + /* Add cpu-topology node */
> + qemu_fdt_add_subnode(fdt, "/cpus/cpu-map");
> + qemu_fdt_add_subnode(fdt, "/cpus/cpu-map/cluster0");
> + for (cpu = s->soc.num_harts - 1; cpu >= 0; cpu--) {
> + char *core_nodename = g_strdup_printf("/cpus/cpu-map/cluster0/core%d",
> + cpu);
> + char *cpu_nodename = g_strdup_printf("/cpus/cpu@%d", cpu);
> + uint32_t intc_phandle = qemu_fdt_get_phandle(fdt, cpu_nodename);
> + qemu_fdt_add_subnode(fdt, core_nodename);
> + qemu_fdt_setprop_cell(fdt, core_nodename, "cpu", intc_phandle);
> + g_free(core_nodename);
> + g_free(cpu_nodename);
> + }
> +
> cells = g_new0(uint32_t, s->soc.num_harts * 4);
> for (cpu = 0; cpu < s->soc.num_harts; cpu++) {
> nodename =
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2019-06-25 10:27 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-06-24 23:41 [Qemu-devel] [PATCH v2] riscv: virt: Add cpu-topology DT node Atish Patra
2019-06-25 10:20 ` Palmer Dabbelt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).