Giacomo Travaglini has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/12948

Change subject: dev-arm: Enable FIQ signaling for Group0 interrupts in GICv2
......................................................................

dev-arm: Enable FIQ signaling for Group0 interrupts in GICv2

Change-Id: Iafaf26344a26eade60c08dd2c0d716af14d9b328
Signed-off-by: Giacomo Travaglini <[email protected]>
---
M src/dev/arm/gic_v2.cc
M src/dev/arm/gic_v2.hh
2 files changed, 50 insertions(+), 4 deletions(-)



diff --git a/src/dev/arm/gic_v2.cc b/src/dev/arm/gic_v2.cc
index 355ee73..6b4d77e 100644
--- a/src/dev/arm/gic_v2.cc
+++ b/src/dev/arm/gic_v2.cc
@@ -364,7 +364,7 @@
                     ctx, iar.ack_id, iar.cpu_id, iar);
             cpuHighestInt[ctx] = SPURIOUS_INT;
             updateIntState(-1);
-            platform->intrctrl->clear(ctx, ArmISA::INT_IRQ, 0);
+            clearInt(ctx, active_int);
             return iar;
         } else {
              return SPURIOUS_INT;
@@ -795,7 +795,7 @@
             if (isLevelSensitive(cpu, prev_highest)) {

                 DPRINTF(Interrupt, "Clear IRQ for cpu%d\n", cpu);
-                platform->intrctrl->clear(cpu, ArmISA::INT_IRQ, 0);
+                clearInt(cpu, prev_highest);
             }
             continue;
         }
@@ -809,7 +809,12 @@

DPRINTF(Interrupt, "Posting interrupt %d to cpu%d\n", highest_int,
                     cpu);
-            postInt(cpu, curTick() + intLatency);
+
+            if (isFiq(cpu, highest_int)) {
+                postFiq(cpu, curTick() + intLatency);
+            } else {
+                postInt(cpu, curTick() + intLatency);
+            }
         }
     }
 }
@@ -895,6 +900,16 @@
 }

 void
+GicV2::clearInt(ContextID ctx, uint32_t int_num)
+{
+    if (isFiq(ctx, int_num)) {
+        platform->intrctrl->clear(ctx, ArmISA::INT_FIQ, 0);
+    } else {
+        platform->intrctrl->clear(ctx, ArmISA::INT_IRQ, 0);
+    }
+}
+
+void
 GicV2::postInt(uint32_t cpu, Tick when)
 {
     if (!(postIntEvent[cpu]->scheduled())) {
diff --git a/src/dev/arm/gic_v2.hh b/src/dev/arm/gic_v2.hh
index 4f30b00..c9c1a47 100644
--- a/src/dev/arm/gic_v2.hh
+++ b/src/dev/arm/gic_v2.hh
@@ -334,7 +334,35 @@
         }
     }

-    /** CPU enabled */
+    bool isGroup0(ContextID ctx, uint32_t int_num) {
+        const uint32_t group_reg = getIntGroup(ctx, intNumToWord(int_num));
+        return bits(group_reg, intNumToBit(int_num));
+    }
+
+    /**
+     * This method checks if an interrupt ID must be signaled or has been
+     * signaled as a FIQ to the cpu. It does that by reading:
+     *
+     * 1) GICD_IGROUPR: controls if the interrupt is part of group0 or
+     * group1. Only group0 interrupts can be signaled as FIQs.
+     *
+ * 2) GICC_CTLR.FIQEn: controls whether the CPU interface signals Group 0
+     * interrupts to a target processor using the FIQ or the IRQ signal
+     */
+    bool isFiq(ContextID ctx, uint32_t int_num) {
+        const bool is_group0 = isGroup0(ctx, int_num);
+        const bool use_fiq = cpuControl[ctx].fiqEn;
+
+        if (is_group0 && use_fiq) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /** CPU enabled:
+     * Checks if GICC_CTLR.EnableGrp0 or EnableGrp1 are set
+     */
     bool cpuEnabled(ContextID ctx) const {
         return cpuControl[ctx].enableGrp0 ||
                cpuControl[ctx].enableGrp1;
@@ -393,6 +421,9 @@
     int intNumToWord(int num) const { return num >> 5; }
     int intNumToBit(int num) const { return num % 32; }

+    /** Clears a cpu IRQ or FIQ signal */
+    void clearInt(ContextID ctx, uint32_t int_num);
+
     /**
      * Post an interrupt to a CPU with a delay
      */

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/12948
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: Iafaf26344a26eade60c08dd2c0d716af14d9b328
Gerrit-Change-Number: 12948
Gerrit-PatchSet: 1
Gerrit-Owner: Giacomo Travaglini <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to