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 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);