diff options
author | Gabe Black <gabeblack@google.com> | 2017-10-18 20:50:57 -0700 |
---|---|---|
committer | Nikos Nikoleris <nikos.nikoleris@arm.com> | 2018-06-19 14:24:25 +0000 |
commit | 9494e7d16a18802b756fdc0e814837d5c98bbd86 (patch) | |
tree | 350a04e09fbb5f723b543f9346354443c5e76714 /src | |
parent | c31af7e89b89fbfecfad9634b2de8ec613f6fde3 (diff) | |
download | gem5-9494e7d16a18802b756fdc0e814837d5c98bbd86.tar.xz |
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>
Diffstat (limited to 'src')
-rw-r--r-- | src/mem/coherent_xbar.cc | 2 | ||||
-rw-r--r-- | src/mem/noncoherent_xbar.cc | 2 | ||||
-rw-r--r-- | src/mem/xbar.cc | 11 | ||||
-rw-r--r-- | src/mem/xbar.hh | 49 |
4 files changed, 2 insertions, 62 deletions
diff --git a/src/mem/coherent_xbar.cc b/src/mem/coherent_xbar.cc index 02b3122d9..872ee5c0d 100644 --- a/src/mem/coherent_xbar.cc +++ b/src/mem/coherent_xbar.cc @@ -99,8 +99,6 @@ CoherentXBar::CoherentXBar(const CoherentXBarParams *p) csprintf(".respLayer%d", i))); snoopRespPorts.push_back(new SnoopRespPort(*bp, *this)); } - - clearPortCache(); } CoherentXBar::~CoherentXBar() diff --git a/src/mem/noncoherent_xbar.cc b/src/mem/noncoherent_xbar.cc index 94649eaff..3ff991fdb 100644 --- a/src/mem/noncoherent_xbar.cc +++ b/src/mem/noncoherent_xbar.cc @@ -88,8 +88,6 @@ NoncoherentXBar::NoncoherentXBar(const NoncoherentXBarParams *p) respLayers.push_back(new RespLayer(*bp, *this, csprintf(".respLayer%d", i))); } - - clearPortCache(); } NoncoherentXBar::~NoncoherentXBar() diff --git a/src/mem/xbar.cc b/src/mem/xbar.cc index 1984a94aa..c3a5c83fe 100644 --- a/src/mem/xbar.cc +++ b/src/mem/xbar.cc @@ -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 diff --git a/src/mem/xbar.hh b/src/mem/xbar.hh index f826e142a..2b7e7ed48 100644 --- a/src/mem/xbar.hh +++ b/src/mem/xbar.hh @@ -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. * |