Fix cshr Retry's
Fix Upgrades being blocked by slave --HG-- extra : convert_revision : cca98a38e32233145163577500f1362cd807ab15
This commit is contained in:
parent
72bf1c011e
commit
9e008d73d5
1 changed files with 19 additions and 1 deletions
20
src/mem/cache/base_cache.cc
vendored
20
src/mem/cache/base_cache.cc
vendored
|
@ -44,6 +44,7 @@ BaseCache::CachePort::CachePort(const std::string &_name, BaseCache *_cache,
|
||||||
: Port(_name), cache(_cache), isCpuSide(_isCpuSide)
|
: Port(_name), cache(_cache), isCpuSide(_isCpuSide)
|
||||||
{
|
{
|
||||||
blocked = false;
|
blocked = false;
|
||||||
|
cshrRetry = NULL;
|
||||||
//Start ports at null if more than one is created we should panic
|
//Start ports at null if more than one is created we should panic
|
||||||
//cpuSidePort = NULL;
|
//cpuSidePort = NULL;
|
||||||
//memSidePort = NULL;
|
//memSidePort = NULL;
|
||||||
|
@ -71,6 +72,22 @@ BaseCache::CachePort::deviceBlockSize()
|
||||||
bool
|
bool
|
||||||
BaseCache::CachePort::recvTiming(Packet *pkt)
|
BaseCache::CachePort::recvTiming(Packet *pkt)
|
||||||
{
|
{
|
||||||
|
if (isCpuSide
|
||||||
|
&& !pkt->req->isUncacheable()
|
||||||
|
&& pkt->isInvalidate()
|
||||||
|
&& !pkt->isRead() && !pkt->isWrite()) {
|
||||||
|
//Upgrade or Invalidate
|
||||||
|
//Look into what happens if two slave caches on bus
|
||||||
|
DPRINTF(Cache, "%s %x ? blk_addr: %x\n", pkt->cmdString(),
|
||||||
|
pkt->getAddr() & (((ULL(1))<<48)-1),
|
||||||
|
pkt->getAddr() & ~((Addr)cache->blkSize - 1));
|
||||||
|
|
||||||
|
assert(!(pkt->flags & SATISFIED));
|
||||||
|
pkt->flags |= SATISFIED;
|
||||||
|
//Invalidates/Upgrades need no response if they get the bus
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (pkt->isRequest() && blocked)
|
if (pkt->isRequest() && blocked)
|
||||||
{
|
{
|
||||||
DPRINTF(Cache,"Scheduling a retry while blocked\n");
|
DPRINTF(Cache,"Scheduling a retry while blocked\n");
|
||||||
|
@ -123,7 +140,7 @@ BaseCache::CachePort::recvRetry()
|
||||||
reqCpu->schedule(curTick + 1);
|
reqCpu->schedule(curTick + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (cshrRetry)
|
||||||
{
|
{
|
||||||
//pkt = cache->getCoherencePacket();
|
//pkt = cache->getCoherencePacket();
|
||||||
//We save the packet, no reordering on CSHRS
|
//We save the packet, no reordering on CSHRS
|
||||||
|
@ -135,6 +152,7 @@ BaseCache::CachePort::recvRetry()
|
||||||
pkt = NULL;
|
pkt = NULL;
|
||||||
BaseCache::CacheEvent * reqCpu = new BaseCache::CacheEvent(this);
|
BaseCache::CacheEvent * reqCpu = new BaseCache::CacheEvent(this);
|
||||||
reqCpu->schedule(curTick + 1);
|
reqCpu->schedule(curTick + 1);
|
||||||
|
cshrRetry = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue