mirror of
https://github.com/qemu/qemu.git
synced 2025-08-15 13:47:03 +00:00
hw/intc/aplic: refine the APLIC realize
When the APLIC is emulated in the kernel, the GPIO output lines to CPUs can be remove. In this case the APLIC trigger CPU interrupts by KVM APIs. This patch also move the code that claim the CPU interrupts to the beginning of APLIC realization. This can avoid the unnecessary resource allocation before checking failed. Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com> Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Message-ID: <20250224025722.3999-3-yongxuan.wang@sifive.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
afd4f4aa7f
commit
489840a012
@ -893,6 +893,26 @@ static void riscv_aplic_realize(DeviceState *dev, Error **errp)
|
|||||||
RISCVAPLICState *aplic = RISCV_APLIC(dev);
|
RISCVAPLICState *aplic = RISCV_APLIC(dev);
|
||||||
|
|
||||||
if (riscv_use_emulated_aplic(aplic->msimode)) {
|
if (riscv_use_emulated_aplic(aplic->msimode)) {
|
||||||
|
/* Create output IRQ lines for non-MSI mode */
|
||||||
|
if (!aplic->msimode) {
|
||||||
|
/* Claim the CPU interrupt to be triggered by this APLIC */
|
||||||
|
for (i = 0; i < aplic->num_harts; i++) {
|
||||||
|
RISCVCPU *cpu;
|
||||||
|
|
||||||
|
cpu = RISCV_CPU(cpu_by_arch_id(aplic->hartid_base + i));
|
||||||
|
if (riscv_cpu_claim_interrupts(cpu,
|
||||||
|
(aplic->mmode) ? MIP_MEIP : MIP_SEIP) < 0) {
|
||||||
|
error_report("%s already claimed",
|
||||||
|
(aplic->mmode) ? "MEIP" : "SEIP");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
aplic->external_irqs = g_malloc(sizeof(qemu_irq) *
|
||||||
|
aplic->num_harts);
|
||||||
|
qdev_init_gpio_out(dev, aplic->external_irqs, aplic->num_harts);
|
||||||
|
}
|
||||||
|
|
||||||
aplic->bitfield_words = (aplic->num_irqs + 31) >> 5;
|
aplic->bitfield_words = (aplic->num_irqs + 31) >> 5;
|
||||||
aplic->sourcecfg = g_new0(uint32_t, aplic->num_irqs);
|
aplic->sourcecfg = g_new0(uint32_t, aplic->num_irqs);
|
||||||
aplic->state = g_new0(uint32_t, aplic->num_irqs);
|
aplic->state = g_new0(uint32_t, aplic->num_irqs);
|
||||||
@ -927,23 +947,6 @@ static void riscv_aplic_realize(DeviceState *dev, Error **errp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create output IRQ lines for non-MSI mode */
|
|
||||||
if (!aplic->msimode) {
|
|
||||||
aplic->external_irqs = g_malloc(sizeof(qemu_irq) * aplic->num_harts);
|
|
||||||
qdev_init_gpio_out(dev, aplic->external_irqs, aplic->num_harts);
|
|
||||||
|
|
||||||
/* Claim the CPU interrupt to be triggered by this APLIC */
|
|
||||||
for (i = 0; i < aplic->num_harts; i++) {
|
|
||||||
RISCVCPU *cpu = RISCV_CPU(cpu_by_arch_id(aplic->hartid_base + i));
|
|
||||||
if (riscv_cpu_claim_interrupts(cpu,
|
|
||||||
(aplic->mmode) ? MIP_MEIP : MIP_SEIP) < 0) {
|
|
||||||
error_report("%s already claimed",
|
|
||||||
(aplic->mmode) ? "MEIP" : "SEIP");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
msi_nonbroken = true;
|
msi_nonbroken = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1067,7 +1070,6 @@ DeviceState *riscv_aplic_create(hwaddr addr, hwaddr size,
|
|||||||
|
|
||||||
if (riscv_use_emulated_aplic(msimode)) {
|
if (riscv_use_emulated_aplic(msimode)) {
|
||||||
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
|
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
|
||||||
}
|
|
||||||
|
|
||||||
if (!msimode) {
|
if (!msimode) {
|
||||||
for (i = 0; i < num_harts; i++) {
|
for (i = 0; i < num_harts; i++) {
|
||||||
@ -1078,6 +1080,7 @@ DeviceState *riscv_aplic_create(hwaddr addr, hwaddr size,
|
|||||||
(mmode) ? IRQ_M_EXT : IRQ_S_EXT));
|
(mmode) ? IRQ_M_EXT : IRQ_S_EXT));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return dev;
|
return dev;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user