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:
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
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user