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:
parent
bead7f249a
commit
fbdeb60316
10 changed files with 10 additions and 18 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
2
src/mem/cache/Cache.py
vendored
2
src/mem/cache/Cache.py
vendored
|
@ -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")
|
||||||
|
|
5
src/mem/cache/base.cc
vendored
5
src/mem/cache/base.cc
vendored
|
@ -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 &
|
||||||
|
|
2
src/mem/cache/base.hh
vendored
2
src/mem/cache/base.hh
vendored
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue