summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/arm/table_walker.cc2
-rw-r--r--src/arch/arm/table_walker.hh39
-rw-r--r--src/dev/io_device.cc7
-rw-r--r--src/dev/io_device.hh27
4 files changed, 41 insertions, 34 deletions
diff --git a/src/arch/arm/table_walker.cc b/src/arch/arm/table_walker.cc
index 591c16747..dfb406543 100644
--- a/src/arch/arm/table_walker.cc
+++ b/src/arch/arm/table_walker.cc
@@ -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)
diff --git a/src/arch/arm/table_walker.hh b/src/arch/arm/table_walker.hh
index a6ff2585b..36adc8a82 100644
--- a/src/arch/arm/table_walker.hh
+++ b/src/arch/arm/table_walker.hh
@@ -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;
diff --git a/src/dev/io_device.cc b/src/dev/io_device.cc
index eb799f688..83d3af095 100644
--- a/src/dev/io_device.cc
+++ b/src/dev/io_device.cc
@@ -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)
{ }
diff --git a/src/dev/io_device.hh b/src/dev/io_device.hh
index 99b207595..0e6556a50 100644
--- a/src/dev/io_device.hh
+++ b/src/dev/io_device.hh
@@ -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);