Device: Make changes necessary to support a coherent page walker cache.

Adds the flag 'recvSnoops' which enables pagewalkers using DmaPorts,
to properly configure snoops.

--HG--
extra : rebase_source : 64207bef62c3268ddff2236ee4adae873812325f
This commit is contained in:
Mitchell Hayenga
2011-12-01 00:15:22 -08:00
parent 946f7f0f55
commit fa753c1454
3 changed files with 42 additions and 8 deletions

View File

@@ -99,7 +99,7 @@ TableWalker::getPort(const std::string &if_name, int idx)
System *sys = params()->sys;
Tick minb = params()->min_backoff;
Tick maxb = params()->max_backoff;
port = new DmaPort(this, sys, minb, maxb);
port = new DmaPort(this, sys, minb, maxb, true);
return port;
}
return NULL;

View File

@@ -115,11 +115,13 @@ BasicPioDevice::addressRanges(AddrRangeList &range_list)
}
DmaPort::DmaPort(MemObject *dev, System *s, Tick min_backoff, Tick max_backoff)
DmaPort::DmaPort(MemObject *dev, System *s, Tick min_backoff, Tick max_backoff,
bool recv_snoops)
: Port(dev->name() + "-dmaport", dev), device(dev), sys(s),
pendingCount(0), actionInProgress(0), drainEvent(NULL),
backoffTime(0), minBackoffDelay(min_backoff),
maxBackoffDelay(max_backoff), inRetry(false), backoffEvent(this)
maxBackoffDelay(max_backoff), inRetry(false), recvSnoops(recv_snoops),
snoopRangeSent(false), backoffEvent(this)
{ }
bool
@@ -141,6 +143,12 @@ DmaPort::recvTiming(PacketPtr pkt)
pkt->reinitNacked();
queueDma(pkt, true);
} else if (pkt->senderState) {
if (recvSnoops) {
if (pkt->isRequest()) {
return true;
}
}
DmaReqState *state;
backoffTime >>= 2;

View File

@@ -130,20 +130,45 @@ class DmaPort : public Port
* it is that it's sending. */
bool inRetry;
/** Port accesses a cache which requires snooping */
bool recvSnoops;
/** Records snoop response so we only reply once to a status change */
bool snoopRangeSent;
virtual bool recvTiming(PacketPtr pkt);
virtual Tick recvAtomic(PacketPtr pkt)
{ panic("dma port shouldn't be used for pio access."); M5_DUMMY_RETURN }
{
if (recvSnoops) return 0;
panic("dma port shouldn't be used for pio access."); M5_DUMMY_RETURN
}
virtual void recvFunctional(PacketPtr pkt)
{ panic("dma port shouldn't be used for pio access."); }
{
if (recvSnoops) return;
panic("dma port shouldn't be used for pio access.");
}
virtual void recvStatusChange(Status status)
{ ; }
{
if (recvSnoops) {
if (status == RangeChange) {
if (!snoopRangeSent) {
snoopRangeSent = true;
sendStatusChange(Port::RangeChange);
}
return;
}
panic("Unexpected recvStatusChange\n");
}
}
virtual void recvRetry() ;
virtual void getDeviceAddressRanges(AddrRangeList &resp,
bool &snoop)
{ resp.clear(); snoop = false; }
{ resp.clear(); snoop = recvSnoops; }
void queueDma(PacketPtr pkt, bool front = false);
void sendDma();
@@ -152,7 +177,8 @@ class DmaPort : public Port
EventWrapper<DmaPort, &DmaPort::sendDma> backoffEvent;
public:
DmaPort(MemObject *dev, System *s, Tick min_backoff, Tick max_backoff);
DmaPort(MemObject *dev, System *s, Tick min_backoff, Tick max_backoff,
bool recv_snoops = false);
void dmaAction(Packet::Command cmd, Addr addr, int size, Event *event,
uint8_t *data, Tick delay, Request::Flags flag = 0);