MEM: Add a snooping DMA port subclass for table walker
authorAndreas Hansson <andreas.hansson@arm.com>
Wed, 23 May 2012 13:14:12 +0000 (09:14 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Wed, 23 May 2012 13:14:12 +0000 (09:14 -0400)
This patch makes the (device) DmaPort non-snooping and removes the
recvSnoop constructor parameter and instead introduces a
SnoopingDmaPort subclass for the ARM table walker.

Functionality is unchanged, as are the stats, and the patch merely
clarifies that the normal DMA ports are not snooping (although they
may issue requests that are snooped by others, as done with PCI, PCIe,
AMBA4 ACE etc).

Currently this port is declared in the ARM table walker as it is not
used anywhere else. If other ports were to have similar behaviour it
could be moved in a future patch.

src/arch/arm/table_walker.cc
src/arch/arm/table_walker.hh
src/dev/io_device.cc
src/dev/io_device.hh

index 591c16747dd181eb4a08560159226592fade429d..dfb406543f2a46d172ec565db7e4b25c94089090 100644 (file)
@@ -51,7 +51,7 @@ using namespace ArmISA;
 
 TableWalker::TableWalker(const Params *p)
     : MemObject(p), port(this, params()->sys, params()->min_backoff,
-                         params()->max_backoff, true),
+                         params()->max_backoff),
       tlb(NULL), currState(NULL), pending(false),
       masterId(p->sys->getMasterId(name())),
       doL1DescEvent(this), doL2DescEvent(this), doProcessEvent(this)
index a6ff2585b1c1886b33170ebe3a15c62bfbf82b8b..36adc8a829e4be2b56b1ff790984cd8975ee1969 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010 ARM Limited
+ * Copyright (c) 2010-2012 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -51,7 +51,6 @@
 #include "sim/eventq.hh"
 #include "sim/fault_fwd.hh"
 
-class DmaPort;
 class ThreadContext;
 
 namespace ArmISA {
@@ -260,6 +259,40 @@ class TableWalker : public MemObject
 
     };
 
+  protected:
+
+    /**
+     * A snooping DMA port that currently does nothing besides
+     * extending the DMA port to accept snoops without complaining.
+     */
+    class SnoopingDmaPort : public DmaPort
+    {
+
+      protected:
+
+        virtual void recvTimingSnoopReq(PacketPtr pkt)
+        { }
+
+        virtual Tick recvAtomicSnoop(PacketPtr pkt)
+        { return 0; }
+
+        virtual void recvFunctionalSnoop(PacketPtr pkt)
+        { }
+
+        virtual bool isSnooping() const { return true; }
+
+      public:
+
+        /**
+         * A snooping DMA port merely calls the construtor of the DMA
+         * port.
+         */
+        SnoopingDmaPort(MemObject *dev, System *s, Tick min_backoff,
+                        Tick max_backoff) :
+            DmaPort(dev, s, min_backoff, max_backoff)
+        { }
+    };
+
     struct WalkerState //: public SimObject
     {
         /** Thread context that we're doing the walk for */
@@ -329,7 +362,7 @@ class TableWalker : public MemObject
 
 
     /** Port to issue translation requests from */
-    DmaPort port;
+    SnoopingDmaPort port;
 
     /** TLB that is initiating these table walks */
     TLB *tlb;
index eb799f68835e629af2f7f474110d0362b9a415c8..83d3af095f6c4cef89ba8f350d25d0da5d73350b 100644 (file)
@@ -120,13 +120,12 @@ BasicPioDevice::getAddrRanges()
 }
 
 
-DmaPort::DmaPort(MemObject *dev, System *s, Tick min_backoff, Tick max_backoff,
-                 bool recv_snoops)
-    : MasterPort(dev->name() + "-dmaport", dev), device(dev), sys(s),
+DmaPort::DmaPort(MemObject *dev, System *s, Tick min_backoff, Tick max_backoff)
+    : MasterPort(dev->name() + "-dma", dev), device(dev), sys(s),
       masterId(s->getMasterId(dev->name())),
       pendingCount(0), actionInProgress(0), drainEvent(NULL),
       backoffTime(0), minBackoffDelay(min_backoff),
-      maxBackoffDelay(max_backoff), inRetry(false), recvSnoops(recv_snoops),
+      maxBackoffDelay(max_backoff), inRetry(false),
       backoffEvent(this)
 { }
 
index 99b207595f8a83e9794fbd9f56557510aba4ae38..0e6556a50553dff62974068b73b173bf4814c760 100644 (file)
@@ -143,34 +143,10 @@ class DmaPort : public MasterPort
      * it is that it's sending. */
     bool inRetry;
 
-    /** Port accesses a cache which requires snooping */
-    bool recvSnoops;
-
     virtual bool recvTimingResp(PacketPtr pkt);
 
-    virtual void recvTimingSnoopReq(PacketPtr pkt)
-    {
-        if (!recvSnoops)
-            panic("%s was not expecting a snoop\n", name());
-    }
-
-    virtual Tick recvAtomicSnoop(PacketPtr pkt)
-    {
-        if (!recvSnoops)
-            panic("%s was not expecting a snoop\n", name());
-        return 0;
-    }
-
-    virtual void recvFunctionalSnoop(PacketPtr pkt)
-    {
-        if (!recvSnoops)
-            panic("%s was not expecting a snoop\n", name());
-    }
-
     virtual void recvRetry() ;
 
-    virtual bool isSnooping() const { return recvSnoops; }
-
     void queueDma(PacketPtr pkt, bool front = false);
     void sendDma();
 
@@ -178,8 +154,7 @@ class DmaPort : public MasterPort
     EventWrapper<DmaPort, &DmaPort::sendDma> backoffEvent;
 
   public:
-    DmaPort(MemObject *dev, System *s, Tick min_backoff, Tick max_backoff,
-            bool recv_snoops = false);
+    DmaPort(MemObject *dev, System *s, Tick min_backoff, Tick max_backoff);
 
     void dmaAction(Packet::Command cmd, Addr addr, int size, Event *event,
                    uint8_t *data, Tick delay, Request::Flags flag = 0);