summaryrefslogtreecommitdiff
path: root/src/dev/arm/gic_v3_cpu_interface.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/dev/arm/gic_v3_cpu_interface.cc')
-rw-r--r--src/dev/arm/gic_v3_cpu_interface.cc21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/dev/arm/gic_v3_cpu_interface.cc b/src/dev/arm/gic_v3_cpu_interface.cc
index 97d914568..b4c271d4a 100644
--- a/src/dev/arm/gic_v3_cpu_interface.cc
+++ b/src/dev/arm/gic_v3_cpu_interface.cc
@@ -1819,15 +1819,19 @@ Gicv3CPUInterface::activateIRQ(uint32_t int_id, Gicv3::GroupId group)
if (int_id < Gicv3::SGI_MAX + Gicv3::PPI_MAX) {
// SGI or PPI, redistributor
redistributor->activateIRQ(int_id);
- redistributor->updateAndInformCPUInterface();
} else if (int_id < Gicv3::INTID_SECURE) {
// SPI, distributor
distributor->activateIRQ(int_id);
- distributor->updateAndInformCPUInterfaces();
} else if (int_id >= Gicv3Redistributor::SMALLEST_LPI_ID) {
// LPI, Redistributor
redistributor->setClrLPI(int_id, false);
}
+
+ // By setting the priority to 0xff we are effectively
+ // making the int_id not pending anymore at the cpu
+ // interface.
+ hppi.prio = 0xff;
+ updateDistributor();
}
void
@@ -1857,15 +1861,12 @@ Gicv3CPUInterface::deactivateIRQ(uint32_t int_id, Gicv3::GroupId group)
if (int_id < Gicv3::SGI_MAX + Gicv3::PPI_MAX) {
// SGI or PPI, redistributor
redistributor->deactivateIRQ(int_id);
- redistributor->updateAndInformCPUInterface();
} else if (int_id < Gicv3::INTID_SECURE) {
// SPI, distributor
distributor->deactivateIRQ(int_id);
- distributor->updateAndInformCPUInterfaces();
- } else {
- // LPI, redistributor, shouldn't deactivate
- redistributor->updateAndInformCPUInterface();
}
+
+ updateDistributor();
}
void
@@ -1992,6 +1993,12 @@ Gicv3CPUInterface::highestActiveGroup() const
}
void
+Gicv3CPUInterface::updateDistributor()
+{
+ distributor->update();
+}
+
+void
Gicv3CPUInterface::update()
{
bool signal_IRQ = false;