@samitouri / QOSamiQemu / commits / e968e487ac

hw/riscv: add create_fdt_socket_cpu_sifive()

This sifive_u only helper shares DT code with other boards. The idea is to reduce code repetition while keeping sifive_u characteristics in place. Signed-off-by: Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-ID: <20260615203734.954428-14-daniel.barboza@oss.qualcomm.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>

Daniel Henrique Barboza committed Jun 15, 2026 at 17:37 UTC e968e487acf082279118667f495a3f4275a59d59
3 files changed +18 -21
hw/riscv/fdt-common.c
+11
@@ -189,3 +189,14 @@ void create_fdt_socket_cpus(void *fdt, RISCVCPU *socket_harts,
189 is_32_bit);
190 }
191 }
192 +
193 +void
194 +create_fdt_socket_cpu_sifive(void *fdt, char *clust_name,
195 + int cpu_id, int socket_id,
196 + int socket_hartid_base, uint32_t *phandle,
197 + uint32_t *intc_phandles)
198 +{
199 + create_fdt_socket_cpu_internal(fdt, clust_name, NULL, cpu_id,
200 + socket_id, socket_hartid_base,
201 + phandle, intc_phandles, false, false);
202 +}
hw/riscv/sifive_u.c
+3 -21
@@ -145,12 +145,9 @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
145 qemu_fdt_add_subnode(fdt, clust_name);
146
147 for (cpu = ms->smp.cpus - 1; cpu >= 0; cpu--) {
148 - int cpu_phandle = phandle++;
148 nodename = g_strdup_printf("/cpus/cpu@%d", cpu);
150 - char *intc = g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu);
151 - g_autofree char *core_name = NULL;
152 -
149 qemu_fdt_add_subnode(fdt, nodename);
150 +
151 /* cpu 0 is the management hart that does not have mmu */
152 if (cpu != 0) {
153 if (is_32_bit) {
@@ -162,25 +159,10 @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
159 } else {
160 riscv_isa_write_fdt(&s->soc.e_cpus.harts[0], fdt, nodename);
161 }
165 - qemu_fdt_setprop_string(fdt, nodename, "compatible", "riscv");
166 - qemu_fdt_setprop_string(fdt, nodename, "status", "okay");
167 - qemu_fdt_setprop_cell(fdt, nodename, "reg", cpu);
168 - qemu_fdt_setprop_string(fdt, nodename, "device_type", "cpu");
169 - qemu_fdt_setprop_cell(fdt, nodename, "phandle", cpu_phandle);
170 -
171 - intc_phandles[cpu] = phandle++;
172 -
173 - qemu_fdt_add_subnode(fdt, intc);
174 - qemu_fdt_setprop_cell(fdt, intc, "phandle", intc_phandles[cpu]);
175 - qemu_fdt_setprop_string(fdt, intc, "compatible", "riscv,cpu-intc");
176 - qemu_fdt_setprop(fdt, intc, "interrupt-controller", NULL, 0);
177 - qemu_fdt_setprop_cell(fdt, intc, "#interrupt-cells", 1);
162
179 - core_name = g_strdup_printf("%s/core%d", clust_name, cpu);
180 - qemu_fdt_add_subnode(fdt, core_name);
181 - qemu_fdt_setprop_cell(fdt, core_name, "cpu", cpu_phandle);
163 + create_fdt_socket_cpu_sifive(fdt, clust_name, cpu, 0, 0,
164 + &phandle, intc_phandles);
165
183 - g_free(intc);
166 g_free(nodename);
167 }
168
include/hw/riscv/fdt-common.h
+4
@@ -26,4 +26,8 @@ void create_fdt_socket_cpus(void *fdt, RISCVCPU *socket_harts,
26 int socket_hartid_base, uint32_t *phandle,
27 uint32_t *intc_phandles, bool numa_enabled,
28 bool is_32_bit);
29 +void create_fdt_socket_cpu_sifive(void *fdt, char *clust_name,
30 + int cpu_id, int socket_id,
31 + int socket_hartid_base, uint32_t *phandle,
32 + uint32_t *intc_phandles);
33 #endif