mem: Use the caching built into AddrRangeMap in the xbar
Use that instead of caching built into the crossbar. Change-Id: If5a5355a0a1a6e532b14efc88a319de4c023f8c1 Reviewed-on: https://gem5-review.googlesource.com/5243 Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br> Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>
This commit is contained in:
committed by
Nikos Nikoleris
parent
c31af7e89b
commit
9494e7d16a
@@ -99,8 +99,6 @@ CoherentXBar::CoherentXBar(const CoherentXBarParams *p)
|
||||
csprintf(".respLayer%d", i)));
|
||||
snoopRespPorts.push_back(new SnoopRespPort(*bp, *this));
|
||||
}
|
||||
|
||||
clearPortCache();
|
||||
}
|
||||
|
||||
CoherentXBar::~CoherentXBar()
|
||||
|
||||
@@ -88,8 +88,6 @@ NoncoherentXBar::NoncoherentXBar(const NoncoherentXBarParams *p)
|
||||
respLayers.push_back(new RespLayer(*bp, *this,
|
||||
csprintf(".respLayer%d", i)));
|
||||
}
|
||||
|
||||
clearPortCache();
|
||||
}
|
||||
|
||||
NoncoherentXBar::~NoncoherentXBar()
|
||||
|
||||
@@ -327,17 +327,10 @@ BaseXBar::findPort(Addr addr)
|
||||
// ranges of all connected slave modules
|
||||
assert(gotAllAddrRanges);
|
||||
|
||||
// Check the cache
|
||||
PortID dest_id = checkPortCache(addr);
|
||||
if (dest_id != InvalidPortID)
|
||||
return dest_id;
|
||||
|
||||
// Check the address map interval tree
|
||||
auto i = portMap.contains(addr);
|
||||
if (i != portMap.end()) {
|
||||
dest_id = i->second;
|
||||
updatePortCache(dest_id, i->first);
|
||||
return dest_id;
|
||||
return i->second;
|
||||
}
|
||||
|
||||
// Check if this matches the default range
|
||||
@@ -518,8 +511,6 @@ BaseXBar::recvRangeChange(PortID master_port_id)
|
||||
for (const auto& s: slavePorts)
|
||||
s->sendRangeChange();
|
||||
}
|
||||
|
||||
clearPortCache();
|
||||
}
|
||||
|
||||
AddrRangeList
|
||||
|
||||
@@ -319,7 +319,7 @@ class BaseXBar : public MemObject
|
||||
/** the width of the xbar in bytes */
|
||||
const uint32_t width;
|
||||
|
||||
AddrRangeMap<PortID> portMap;
|
||||
AddrRangeMap<PortID, 3> portMap;
|
||||
|
||||
/**
|
||||
* Remember where request packets came from so that we can route
|
||||
@@ -350,53 +350,6 @@ class BaseXBar : public MemObject
|
||||
*/
|
||||
PortID findPort(Addr addr);
|
||||
|
||||
// Cache for the findPort function storing recently used ports from portMap
|
||||
struct PortCache {
|
||||
bool valid;
|
||||
PortID id;
|
||||
AddrRange range;
|
||||
};
|
||||
|
||||
PortCache portCache[3];
|
||||
|
||||
// Checks the cache and returns the id of the port that has the requested
|
||||
// address within its range
|
||||
inline PortID checkPortCache(Addr addr) const {
|
||||
if (portCache[0].valid && portCache[0].range.contains(addr)) {
|
||||
return portCache[0].id;
|
||||
}
|
||||
if (portCache[1].valid && portCache[1].range.contains(addr)) {
|
||||
return portCache[1].id;
|
||||
}
|
||||
if (portCache[2].valid && portCache[2].range.contains(addr)) {
|
||||
return portCache[2].id;
|
||||
}
|
||||
|
||||
return InvalidPortID;
|
||||
}
|
||||
|
||||
// Clears the earliest entry of the cache and inserts a new port entry
|
||||
inline void updatePortCache(short id, const AddrRange& range) {
|
||||
portCache[2].valid = portCache[1].valid;
|
||||
portCache[2].id = portCache[1].id;
|
||||
portCache[2].range = portCache[1].range;
|
||||
|
||||
portCache[1].valid = portCache[0].valid;
|
||||
portCache[1].id = portCache[0].id;
|
||||
portCache[1].range = portCache[0].range;
|
||||
|
||||
portCache[0].valid = true;
|
||||
portCache[0].id = id;
|
||||
portCache[0].range = range;
|
||||
}
|
||||
|
||||
// Clears the cache. Needs to be called in constructor.
|
||||
inline void clearPortCache() {
|
||||
portCache[2].valid = false;
|
||||
portCache[1].valid = false;
|
||||
portCache[0].valid = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the address ranges the crossbar is responsible for.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user