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:
Ron Dreslinski 2006-10-09 20:18:00 -04:00
parent 9356bcda7b
commit ec8a437b2c
2 changed files with 13 additions and 6 deletions

View file

@ -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 {

View file

@ -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
};