diff options
author | Andreas Hansson <andreas.hansson@arm.com> | 2015-05-05 03:22:29 -0400 |
---|---|---|
committer | Andreas Hansson <andreas.hansson@arm.com> | 2015-05-05 03:22:29 -0400 |
commit | 36f29496a019af4483430f17c4a6028b8dcfb2cf (patch) | |
tree | 28da4a1a1f29340fa7c95896427bf9c15da582d0 /src/mem/snoop_filter.cc | |
parent | 554ddc7c074b0d9793a6c4972e1c449a57b94590 (diff) | |
download | gem5-36f29496a019af4483430f17c4a6028b8dcfb2cf.tar.xz |
mem: Snoop into caches on uncacheable accesses
This patch takes a last step in fixing issues related to uncacheable
accesses. We do not separate uncacheable memory from uncacheable
devices, and in cases where it is really memory, there are valid
scenarios where we need to snoop since we do not support cache
maintenance instructions (yet). On snooping an uncacheable access we
thus provide data if possible. In essence this makes uncacheable
accesses IO coherent.
The snoop filter is also queried to steer the snoops, but not updated
since the uncacheable accesses do not allocate a block.
Diffstat (limited to 'src/mem/snoop_filter.cc')
-rwxr-xr-x | src/mem/snoop_filter.cc | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/mem/snoop_filter.cc b/src/mem/snoop_filter.cc index a8a53362c..9ff591065 100755 --- a/src/mem/snoop_filter.cc +++ b/src/mem/snoop_filter.cc @@ -74,7 +74,7 @@ SnoopFilter::lookupRequest(const Packet* cpkt, const SlavePort& slave_port) DPRINTF(SnoopFilter, "%s: SF value %x.%x\n", __func__, sf_item.requested, sf_item.holder); - if (cpkt->needsResponse()) { + if (!cpkt->req->isUncacheable() && cpkt->needsResponse()) { if (!cpkt->memInhibitAsserted()) { // Max one request per address per port panic_if(sf_item.requested & req_port, "double request :( "\ @@ -104,6 +104,9 @@ SnoopFilter::updateRequest(const Packet* cpkt, const SlavePort& slave_port, DPRINTF(SnoopFilter, "%s: packet src %s addr 0x%x cmd %s\n", __func__, slave_port.name(), cpkt->getAddr(), cpkt->cmdString()); + if (cpkt->req->isUncacheable()) + return; + Addr line_addr = cpkt->getAddr() & ~(linesize - 1); SnoopMask req_port = portToMask(slave_port); SnoopItem& sf_item = cachedLocations[line_addr]; @@ -195,14 +198,17 @@ SnoopFilter::updateSnoopResponse(const Packet* cpkt, __func__, rsp_port.name(), req_port.name(), cpkt->getAddr(), cpkt->cmdString()); + assert(cpkt->isResponse()); + assert(cpkt->memInhibitAsserted()); + + if (cpkt->req->isUncacheable()) + return; + Addr line_addr = cpkt->getAddr() & ~(linesize - 1); SnoopMask rsp_mask = portToMask(rsp_port); SnoopMask req_mask = portToMask(req_port); SnoopItem& sf_item = cachedLocations[line_addr]; - assert(cpkt->isResponse()); - assert(cpkt->memInhibitAsserted()); - DPRINTF(SnoopFilter, "%s: old SF value %x.%x\n", __func__, sf_item.requested, sf_item.holder); @@ -270,12 +276,15 @@ SnoopFilter::updateResponse(const Packet* cpkt, const SlavePort& slave_port) DPRINTF(SnoopFilter, "%s: packet src %s addr 0x%x cmd %s\n", __func__, slave_port.name(), cpkt->getAddr(), cpkt->cmdString()); + assert(cpkt->isResponse()); + + if (cpkt->req->isUncacheable()) + return; + Addr line_addr = cpkt->getAddr() & ~(linesize - 1); SnoopMask slave_mask = portToMask(slave_port); SnoopItem& sf_item = cachedLocations[line_addr]; - assert(cpkt->isResponse()); - DPRINTF(SnoopFilter, "%s: old SF value %x.%x\n", __func__, sf_item.requested, sf_item.holder); |