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)
/*
- * 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
#include "sim/eventq.hh"
#include "sim/fault_fwd.hh"
-class DmaPort;
class ThreadContext;
namespace ArmISA {
};
+ 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 */
/** Port to issue translation requests from */
- DmaPort port;
+ SnoopingDmaPort port;
/** TLB that is initiating these table walks */
TLB *tlb;
}
-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)
{ }
* 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();
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);