diff options
| author | Song Gao <gaosong@loongson.cn> | 2025-09-16 20:21:05 +0800 |
|---|---|---|
| committer | Song Gao <gaosong@loongson.cn> | 2025-09-28 17:31:04 +0800 |
| commit | 386aef3e4a7fbfb8c051f8c24832492288fe6185 (patch) | |
| tree | c2af099a495851deeac95b0a7da21289fcd4d36a /hw/intc | |
| parent | 07f3e5203ade3fd2e3d8d0593bcdb0aa39e022d4 (diff) | |
| download | focaccia-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.c | 23 |
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) |