summary refs log tree commit diff stats
path: root/hw/intc
diff options
context:
space:
mode:
authorSong Gao <gaosong@loongson.cn>2025-09-16 20:21:05 +0800
committerSong Gao <gaosong@loongson.cn>2025-09-28 17:31:04 +0800
commit386aef3e4a7fbfb8c051f8c24832492288fe6185 (patch)
treec2af099a495851deeac95b0a7da21289fcd4d36a /hw/intc
parent07f3e5203ade3fd2e3d8d0593bcdb0aa39e022d4 (diff)
downloadfocaccia-qemu-386aef3e4a7fbfb8c051f8c24832492288fe6185.tar.gz
focaccia-qemu-386aef3e4a7fbfb8c051f8c24832492288fe6185.zip
hw/loongarch: Implement dintc realize and unrealize
Implement th DINTC realize and unrealize.

Signed-off-by: Song Gao <gaosong@loongson.cn>
Reviewed-by: Bibo Mao <maobibo@loongson.cn>
Message-ID: <20250916122109.749813-8-gaosong@loongson.cn>
Diffstat (limited to 'hw/intc')
-rw-r--r--hw/intc/loongarch_dintc.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/hw/intc/loongarch_dintc.c b/hw/intc/loongarch_dintc.c
index 7173a6aa29..598c666ec6 100644
--- a/hw/intc/loongarch_dintc.c
+++ b/hw/intc/loongarch_dintc.c
@@ -38,7 +38,12 @@ static const MemoryRegionOps loongarch_dintc_ops = {
 
 static void loongarch_dintc_realize(DeviceState *dev, Error **errp)
 {
+    LoongArchDINTCState *s = LOONGARCH_DINTC(dev);
     LoongArchDINTCClass *lac = LOONGARCH_DINTC_GET_CLASS(dev);
+    MachineState *machine = MACHINE(qdev_get_machine());
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
+    const CPUArchIdList  *id_list;
+    int i;
 
     Error *local_err = NULL;
     lac->parent_realize(dev, &local_err);
@@ -47,12 +52,28 @@ static void loongarch_dintc_realize(DeviceState *dev, Error **errp)
         return;
     }
 
+    assert(mc->possible_cpu_arch_ids);
+    id_list = mc->possible_cpu_arch_ids(machine);
+    s->num_cpu = id_list->len;
+    s->cpu = g_new(DINTCCore, s->num_cpu);
+    if (s->cpu == NULL) {
+        error_setg(errp, "Memory allocation for DINTCCore fail");
+        return;
+    }
+
+    for (i = 0; i < s->num_cpu; i++) {
+        s->cpu[i].arch_id = id_list->cpus[i].arch_id;
+        s->cpu[i].cpu = CPU(id_list->cpus[i].cpu);
+        qdev_init_gpio_out(dev, &s->cpu[i].parent_irq, 1);
+    }
+
     return;
 }
 
 static void loongarch_dintc_unrealize(DeviceState *dev)
 {
-    return;
+    LoongArchDINTCState *s = LOONGARCH_DINTC(dev);
+    g_free(s->cpu);
 }
 
 static void loongarch_dintc_init(Object *obj)