diff options
Diffstat (limited to 'src/dev/arm/gic_v3_cpu_interface.cc')
-rw-r--r-- | src/dev/arm/gic_v3_cpu_interface.cc | 21 |
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; |