Andreas Sandberg has uploaded this change for review. ( https://gem5-review.googlesource.com/2225

Change subject: arm, kmi: Clearing interrupts in KMI devices
......................................................................

arm, kmi: Clearing interrupts in KMI devices

Added funtionality to check and clear interrupts for KMI devices.

Change-Id: Ia3e91d07567b7faf3f82b0adfda4a165a502a339
Reviewed-by: Andreas Sandberg <[email protected]>
Signed-off-by: Andreas Sandberg <[email protected]>
---
M src/dev/arm/kmi.cc
M src/dev/arm/kmi.hh
2 files changed, 22 insertions(+), 24 deletions(-)



diff --git a/src/dev/arm/kmi.cc b/src/dev/arm/kmi.cc
index 9415467..9230c15 100644
--- a/src/dev/arm/kmi.cc
+++ b/src/dev/arm/kmi.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010 ARM Limited
+ * Copyright (c) 2010, 2017 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -53,7 +53,7 @@

 Pl050::Pl050(const Params *p)
     : AmbaIntDevice(p, 0xfff), control(0), status(0x43), clkdiv(0),
-      interrupts(0), rawInterrupts(0), ackNext(false), shiftDown(false),
+      rawInterrupts(0), ackNext(false), shiftDown(false),
       vnc(p->vnc), driverInitialized(false), intEvent(this)
 {
     if (vnc) {
@@ -101,8 +101,8 @@
         data = clkdiv;
         break;
       case kmiISR:
-        data = interrupts;
-        DPRINTF(Pl050, "Read Interrupts: %#x\n", (uint32_t)interrupts);
+        data = getInterrupt();
+        DPRINTF(Pl050, "Read Interrupts: %#x\n", getInterrupt());
         break;
       default:
         if (readId(pkt, ambaId, pioAddr)) {
@@ -238,28 +238,29 @@
 void
 Pl050::updateIntStatus()
 {
+    const bool old_interrupt(getInterrupt());
+
     if (!rxQueue.empty())
         rawInterrupts.rx = 1;
     else
         rawInterrupts.rx = 0;

-    interrupts.tx = rawInterrupts.tx & control.txint_enable;
-    interrupts.rx = rawInterrupts.rx & control.rxint_enable;
-
-    DPRINTF(Pl050, "rawInterupts=%#x control=%#x interrupts=%#x\n",
- (uint32_t)rawInterrupts, (uint32_t)control, (uint32_t)interrupts);
-
-    if (interrupts && !intEvent.scheduled())
+    if ((!old_interrupt && getInterrupt()) && !intEvent.scheduled()) {
         schedule(intEvent, curTick() + intDelay);
+    } else if (old_interrupt && !(getInterrupt())) {
+            gic->clearInt(intNum);
+    }
 }

 void
 Pl050::generateInterrupt()
 {
+    DPRINTF(Pl050, "Generate Interrupt: rawInt=%#x ctrl=%#x int=%#x\n",
+            rawInterrupts, control, getInterrupt());

-    if (interrupts) {
+    if (getInterrupt()) {
         gic->sendInt(intNum);
-        DPRINTF(Pl050, "Generated interrupt\n");
+        DPRINTF(Pl050, " -- Generated\n");
     }
 }

@@ -318,9 +319,6 @@
     SERIALIZE_SCALAR(stsreg);
     SERIALIZE_SCALAR(clkdiv);

-    uint8_t ints = interrupts;
-    SERIALIZE_SCALAR(ints);
-
     uint8_t raw_ints = rawInterrupts;
     SERIALIZE_SCALAR(raw_ints);

@@ -343,10 +341,6 @@
     status = stsreg;

     UNSERIALIZE_SCALAR(clkdiv);
-
-    uint8_t ints;
-    UNSERIALIZE_SCALAR(ints);
-    interrupts = ints;

     uint8_t raw_ints;
     UNSERIALIZE_SCALAR(raw_ints);
diff --git a/src/dev/arm/kmi.hh b/src/dev/arm/kmi.hh
index a321caf..55e4b42 100644
--- a/src/dev/arm/kmi.hh
+++ b/src/dev/arm/kmi.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010 ARM Limited
+ * Copyright (c) 2010, 2017 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -101,9 +101,6 @@
         Bitfield<1> tx;
     EndBitUnion(InterruptReg)

-    /** interrupt status register. */
-    InterruptReg interrupts;
-
     /** raw interrupt register (unmasked) */
     InterruptReg rawInterrupts;

@@ -129,6 +126,13 @@
     /** Function to generate interrupt */
     void generateInterrupt();

+    /** Get interrupt value */
+    InterruptReg getInterrupt() const {
+        InterruptReg tmp_interrupt(0);
+        tmp_interrupt.tx = rawInterrupts.tx & control.txint_enable;
+        tmp_interrupt.rx = rawInterrupts.rx & control.rxint_enable;
+        return tmp_interrupt;
+    }
     /** Wrapper to create an event out of the thing */
     EventWrapper<Pl050, &Pl050::generateInterrupt> intEvent;


--
To view, visit https://gem5-review.googlesource.com/2225
To unsubscribe, visit https://gem5-review.googlesource.com/settings

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

Reply via email to