mem: Deduce if cache should forward snoops

This patch changes how the cache determines if snoops should be
forwarded from the memory side to the CPU side. Instead of having a
parameter, the cache now looks at the port connected on the CPU side,
and if it is a snooping port, then snoops are forwarded. Less error
prone, and less parameters to worry about.

The patch also tidies up the CPU classes to ensure that their I-side
port is not snooping by removing overrides to the snoop request
handler, such that snoop requests will panic via the default
MasterPort implement
This commit is contained in:
Andreas Hansson 2016-02-10 04:08:24 -05:00
parent bead7f249a
commit fbdeb60316
10 changed files with 10 additions and 18 deletions

View file

@ -76,7 +76,6 @@ class IOCache(Cache):
mshrs = 20 mshrs = 20
size = '1kB' size = '1kB'
tgts_per_mshr = 12 tgts_per_mshr = 12
forward_snoops = False
class PageTableWalkerCache(Cache): class PageTableWalkerCache(Cache):
assoc = 2 assoc = 2
@ -85,7 +84,7 @@ class PageTableWalkerCache(Cache):
mshrs = 10 mshrs = 10
size = '1kB' size = '1kB'
tgts_per_mshr = 12 tgts_per_mshr = 12
forward_snoops = False
# the x86 table walker actually writes to the table-walker cache # the x86 table walker actually writes to the table-walker cache
if buildEnv['TARGET_ISA'] == 'x86': if buildEnv['TARGET_ISA'] == 'x86':
is_read_only = False is_read_only = False

View file

@ -149,7 +149,6 @@ class O3_ARM_v7a_ICache(Cache):
tgts_per_mshr = 8 tgts_per_mshr = 8
size = '32kB' size = '32kB'
assoc = 2 assoc = 2
forward_snoops = False
is_read_only = True is_read_only = True
# Writeback clean lines as well # Writeback clean lines as well
writeback_clean = True writeback_clean = True
@ -176,7 +175,6 @@ class O3_ARM_v7aWalkCache(Cache):
size = '1kB' size = '1kB'
assoc = 8 assoc = 8
write_buffers = 16 write_buffers = 16
forward_snoops = False
is_read_only = True is_read_only = True
# Writeback clean lines as well # Writeback clean lines as well
writeback_clean = True writeback_clean = True

View file

@ -107,9 +107,6 @@ class MinorCPU : public BaseCPU
: MasterPort(name_, &cpu_), cpu(cpu_) : MasterPort(name_, &cpu_), cpu(cpu_)
{ } { }
protected:
/** Snooping a coherence request, do nothing. */
virtual void recvTimingSnoopReq(PacketPtr pkt) { }
}; };
protected: protected:

View file

@ -103,8 +103,12 @@ class LSQ : public Named
void recvReqRetry() { lsq.recvReqRetry(); } void recvReqRetry() { lsq.recvReqRetry(); }
bool isSnooping() const override { return true; }
void recvTimingSnoopReq(PacketPtr pkt) void recvTimingSnoopReq(PacketPtr pkt)
{ return lsq.recvTimingSnoopReq(pkt); } { return lsq.recvTimingSnoopReq(pkt); }
void recvFunctionalSnoop(PacketPtr pkt) { }
}; };
DcachePort dcachePort; DcachePort dcachePort;

View file

@ -147,7 +147,6 @@ class FullO3CPU : public BaseO3CPU
/** Timing version of receive. Handles setting fetch to the /** Timing version of receive. Handles setting fetch to the
* proper status to start fetching. */ * proper status to start fetching. */
virtual bool recvTimingResp(PacketPtr pkt); virtual bool recvTimingResp(PacketPtr pkt);
virtual void recvTimingSnoopReq(PacketPtr pkt) { }
/** Handles doing a retry of a failed fetch. */ /** Handles doing a retry of a failed fetch. */
virtual void recvReqRetry(); virtual void recvReqRetry();

View file

@ -127,7 +127,6 @@ class AtomicSimpleCPU : public BaseSimpleCPU
{ } { }
protected: protected:
virtual Tick recvAtomicSnoop(PacketPtr pkt) { return 0; }
bool recvTimingResp(PacketPtr pkt) bool recvTimingResp(PacketPtr pkt)
{ {

View file

@ -164,11 +164,6 @@ class TimingSimpleCPU : public BaseSimpleCPU
protected: protected:
/**
* Snooping a coherence request, do nothing.
*/
virtual void recvTimingSnoopReq(PacketPtr pkt) {}
TimingSimpleCPU* cpu; TimingSimpleCPU* cpu;
struct TickEvent : public Event struct TickEvent : public Event

View file

@ -64,8 +64,6 @@ class BaseCache(MemObject):
tgts_per_mshr = Param.Unsigned("Max number of accesses per MSHR") tgts_per_mshr = Param.Unsigned("Max number of accesses per MSHR")
write_buffers = Param.Unsigned(8, "Number of write buffers") write_buffers = Param.Unsigned(8, "Number of write buffers")
forward_snoops = Param.Bool(True,
"Forward snoops from mem side to cpu side")
is_read_only = Param.Bool(False, "Is this cache read only (e.g. inst)") is_read_only = Param.Bool(False, "Is this cache read only (e.g. inst)")
prefetcher = Param.BasePrefetcher(NULL,"Prefetcher attached to cache") prefetcher = Param.BasePrefetcher(NULL,"Prefetcher attached to cache")

View file

@ -77,7 +77,7 @@ BaseCache::BaseCache(const BaseCacheParams *p, unsigned blk_size)
fillLatency(p->response_latency), fillLatency(p->response_latency),
responseLatency(p->response_latency), responseLatency(p->response_latency),
numTarget(p->tgts_per_mshr), numTarget(p->tgts_per_mshr),
forwardSnoops(p->forward_snoops), forwardSnoops(true),
isReadOnly(p->is_read_only), isReadOnly(p->is_read_only),
blocked(0), blocked(0),
order(0), order(0),
@ -86,6 +86,8 @@ BaseCache::BaseCache(const BaseCacheParams *p, unsigned blk_size)
addrRanges(p->addr_ranges.begin(), p->addr_ranges.end()), addrRanges(p->addr_ranges.begin(), p->addr_ranges.end()),
system(p->system) system(p->system)
{ {
// forward snoops is overridden in init() once we can query
// whether the connected master is actually snooping or not
} }
void void
@ -131,6 +133,7 @@ BaseCache::init()
if (!cpuSidePort->isConnected() || !memSidePort->isConnected()) if (!cpuSidePort->isConnected() || !memSidePort->isConnected())
fatal("Cache ports on %s are not connected\n", name()); fatal("Cache ports on %s are not connected\n", name());
cpuSidePort->sendRangeChange(); cpuSidePort->sendRangeChange();
forwardSnoops = cpuSidePort->isSnooping();
} }
BaseMasterPort & BaseMasterPort &

View file

@ -302,7 +302,7 @@ class BaseCache : public MemObject
const int numTarget; const int numTarget;
/** Do we forward snoops from mem side port through to cpu side port? */ /** Do we forward snoops from mem side port through to cpu side port? */
const bool forwardSnoops; bool forwardSnoops;
/** /**
* Is this cache read only, for example the instruction cache, or * Is this cache read only, for example the instruction cache, or