Handle NACK's that occur from devices on the same bus.
Not fully implemented yet, but good enough for single level cache coherence src/mem/packet.hh: Add a bit to distinguish invalidates and upgrades --HG-- extra : convert_revision : 5bf50d535857cea37fbdaf7993915d1332cb757e
This commit is contained in:
parent
9356bcda7b
commit
ec8a437b2c
2 changed files with 13 additions and 6 deletions
14
src/mem/cache/cache_impl.hh
vendored
14
src/mem/cache/cache_impl.hh
vendored
|
@ -287,13 +287,17 @@ template<class TagStore, class Buffering, class Coherence>
|
|||
void
|
||||
Cache<TagStore,Buffering,Coherence>::sendResult(PacketPtr &pkt, MSHR* mshr, bool success)
|
||||
{
|
||||
if (success) {
|
||||
if (success && !(pkt->flags & NACKED_LINE)) {
|
||||
missQueue->markInService(pkt, mshr);
|
||||
//Temp Hack for UPGRADES
|
||||
if (pkt->cmd == Packet::UpgradeReq) {
|
||||
pkt->flags &= ~CACHE_LINE_FILL;
|
||||
handleResponse(pkt);
|
||||
}
|
||||
} else if (pkt && !pkt->req->isUncacheable()) {
|
||||
pkt->flags &= ~NACKED_LINE;
|
||||
pkt->flags &= ~SATISFIED;
|
||||
pkt->flags &= ~SNOOP_COMMIT;
|
||||
missQueue->restoreOrigCmd(pkt);
|
||||
}
|
||||
}
|
||||
|
@ -305,8 +309,9 @@ Cache<TagStore,Buffering,Coherence>::handleResponse(Packet * &pkt)
|
|||
BlkType *blk = NULL;
|
||||
if (pkt->senderState) {
|
||||
if (pkt->result == Packet::Nacked) {
|
||||
pkt->reinitFromRequest();
|
||||
panic("Unimplemented NACK of packet\n");
|
||||
//pkt->reinitFromRequest();
|
||||
warn("NACKs from devices not connected to the same bus not implemented\n");
|
||||
return;
|
||||
}
|
||||
if (pkt->result == Packet::BadAddress) {
|
||||
//Make the response a Bad address and send it
|
||||
|
@ -397,7 +402,8 @@ Cache<TagStore,Buffering,Coherence>::snoop(Packet * &pkt)
|
|||
assert(!(pkt->flags & SATISFIED));
|
||||
pkt->flags |= SATISFIED;
|
||||
pkt->flags |= NACKED_LINE;
|
||||
respondToSnoop(pkt, curTick + hitLatency);
|
||||
warn("NACKs from devices not connected to the same bus not implemented\n");
|
||||
//respondToSnoop(pkt, curTick + hitLatency);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -174,7 +174,8 @@ class Packet
|
|||
IsResponse = 1 << 5,
|
||||
NeedsResponse = 1 << 6,
|
||||
IsSWPrefetch = 1 << 7,
|
||||
IsHWPrefetch = 1 << 8
|
||||
IsHWPrefetch = 1 << 8,
|
||||
IsUpgrade = 1 << 9
|
||||
};
|
||||
|
||||
public:
|
||||
|
@ -194,7 +195,7 @@ class Packet
|
|||
HardPFResp = IsRead | IsResponse | IsHWPrefetch | NeedsResponse,
|
||||
InvalidateReq = IsInvalidate | IsRequest,
|
||||
WriteInvalidateReq = IsWrite | IsInvalidate | IsRequest,
|
||||
UpgradeReq = IsInvalidate | IsRequest,
|
||||
UpgradeReq = IsInvalidate | IsRequest | IsUpgrade,
|
||||
ReadExReq = IsRead | IsInvalidate | IsRequest | NeedsResponse,
|
||||
ReadExResp = IsRead | IsInvalidate | IsResponse | NeedsResponse
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue