dev-arm: Take LPIs into account when interacting with CPUIF regs
authorGiacomo Travaglini <giacomo.travaglini@arm.com>
Thu, 25 Apr 2019 09:43:48 +0000 (10:43 +0100)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Thu, 2 May 2019 14:33:22 +0000 (14:33 +0000)
Previous code was not handling LPIs when it came to
activation/deactivation of interrupts.

Change-Id: Ie38f83c66afdc42132679d7e2e5823990f1710d0
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/18595
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/dev/arm/gic_v3_cpu_interface.cc
src/dev/arm/gic_v3_redistributor.cc

index 577442efa0a932674e6b1c217496677fdb6144cd..3598f34d0144bd690f449a6fef228eaccf7bda9b 100644 (file)
@@ -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();
     }
 }
 
index e22d830aed98171ace5efbbdcff00ef985fac3c8..79de7d55c42fc76cc5af3d280177b834ad8bfcc3 100644 (file)
@@ -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();
     }
 }