From: Giacomo Travaglini Date: Thu, 25 Apr 2019 09:43:48 +0000 (+0100) Subject: dev-arm: Take LPIs into account when interacting with CPUIF regs X-Git-Tag: v19.0.0.0~896 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c16b5042997a9247066f4f06d9c59479fc0c169c;p=gem5.git dev-arm: Take LPIs into account when interacting with CPUIF regs Previous code was not handling LPIs when it came to activation/deactivation of interrupts. Change-Id: Ie38f83c66afdc42132679d7e2e5823990f1710d0 Signed-off-by: Giacomo Travaglini Reviewed-by: Andreas Sandberg Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/18595 Maintainer: Andreas Sandberg Tested-by: kokoro --- diff --git a/src/dev/arm/gic_v3_cpu_interface.cc b/src/dev/arm/gic_v3_cpu_interface.cc index 577442efa..3598f34d0 100644 --- a/src/dev/arm/gic_v3_cpu_interface.cc +++ b/src/dev/arm/gic_v3_cpu_interface.cc @@ -409,7 +409,8 @@ Gicv3CPUInterface::readMiscReg(int misc_reg) int_id = getHPPIR0(); // avoid activation for special interrupts - if (int_id < Gicv3::INTID_SECURE) { + if (int_id < Gicv3::INTID_SECURE || + int_id >= Gicv3Redistributor::SMALLEST_LPI_ID) { activateIRQ(int_id, hppi.group); } } else { @@ -464,7 +465,8 @@ Gicv3CPUInterface::readMiscReg(int misc_reg) int_id = getHPPIR1(); // avoid activation for special interrupts - if (int_id < Gicv3::INTID_SECURE) { + if (int_id < Gicv3::INTID_SECURE || + int_id >= Gicv3Redistributor::SMALLEST_LPI_ID) { activateIRQ(int_id, hppi.group); } } else { @@ -778,7 +780,8 @@ Gicv3CPUInterface::setMiscReg(int misc_reg, RegVal val) int int_id = val & 0xffffff; // avoid activation for special interrupts - if (int_id >= Gicv3::INTID_SECURE) { + if (int_id >= Gicv3::INTID_SECURE && + int_id <= Gicv3::INTID_SPURIOUS) { return; } @@ -847,7 +850,8 @@ Gicv3CPUInterface::setMiscReg(int misc_reg, RegVal val) int int_id = val & 0xffffff; // avoid deactivation for special interrupts - if (int_id >= Gicv3::INTID_SECURE) { + if (int_id >= Gicv3::INTID_SECURE && + int_id <= Gicv3::INTID_SPURIOUS) { return; } @@ -1770,6 +1774,9 @@ Gicv3CPUInterface::activateIRQ(uint32_t int_id, Gicv3::GroupId group) // SPI, distributor distributor->activateIRQ(int_id); distributor->updateAndInformCPUInterfaces(); + } else if (int_id >= Gicv3Redistributor::SMALLEST_LPI_ID) { + // LPI, Redistributor + redistributor->setClrLPI(int_id, false); } } @@ -1806,7 +1813,8 @@ Gicv3CPUInterface::deactivateIRQ(uint32_t int_id, Gicv3::GroupId group) distributor->deactivateIRQ(int_id); distributor->updateAndInformCPUInterfaces(); } else { - return; + // LPI, redistributor, shouldn't deactivate + redistributor->updateAndInformCPUInterface(); } } diff --git a/src/dev/arm/gic_v3_redistributor.cc b/src/dev/arm/gic_v3_redistributor.cc index e22d830ae..79de7d55c 100644 --- a/src/dev/arm/gic_v3_redistributor.cc +++ b/src/dev/arm/gic_v3_redistributor.cc @@ -854,7 +854,8 @@ Gicv3Redistributor::update() } if (!new_hppi && cpuInterface->hppi.prio != 0xff && - cpuInterface->hppi.intid < Gicv3::SGI_MAX + Gicv3::PPI_MAX) { + (cpuInterface->hppi.intid < Gicv3::SGI_MAX + Gicv3::PPI_MAX || + cpuInterface->hppi.intid > SMALLEST_LPI_ID)) { distributor->fullUpdate(); } }