mem: Deduce if cache should forward snoops
authorAndreas Hansson <andreas.hansson@arm.com>
Wed, 10 Feb 2016 09:08:24 +0000 (04:08 -0500)
committerAndreas Hansson <andreas.hansson@arm.com>
Wed, 10 Feb 2016 09:08:24 +0000 (04:08 -0500)
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

configs/common/Caches.py
configs/common/O3_ARM_v7a.py
src/cpu/minor/cpu.hh
src/cpu/minor/lsq.hh
src/cpu/o3/cpu.hh
src/cpu/simple/atomic.hh
src/cpu/simple/timing.hh
src/mem/cache/Cache.py
src/mem/cache/base.cc
src/mem/cache/base.hh

index c65910e23a12b9a1fbef63ab2574493a7c35285e..af1dee626572d7cb03059db912126d6e559733ab 100644 (file)
@@ -76,7 +76,6 @@ class IOCache(Cache):
     mshrs = 20
     size = '1kB'
     tgts_per_mshr = 12
-    forward_snoops = False
 
 class PageTableWalkerCache(Cache):
     assoc = 2
@@ -85,7 +84,7 @@ class PageTableWalkerCache(Cache):
     mshrs = 10
     size = '1kB'
     tgts_per_mshr = 12
-    forward_snoops = False
+
     # the x86 table walker actually writes to the table-walker cache
     if buildEnv['TARGET_ISA'] == 'x86':
         is_read_only = False
index 1031582902f8487c9b1e287b10d77b4afeab7364..a38273c103ae8f84ffda1c2af003a834a7d79a2a 100644 (file)
@@ -149,7 +149,6 @@ class O3_ARM_v7a_ICache(Cache):
     tgts_per_mshr = 8
     size = '32kB'
     assoc = 2
-    forward_snoops = False
     is_read_only = True
     # Writeback clean lines as well
     writeback_clean = True
@@ -176,7 +175,6 @@ class O3_ARM_v7aWalkCache(Cache):
     size = '1kB'
     assoc = 8
     write_buffers = 16
-    forward_snoops = False
     is_read_only = True
     # Writeback clean lines as well
     writeback_clean = True
index 82dac6aa97c679d257fc2b04b6aef92cce670a75..dad015e8933f2b29163373f54cca3ab518fda824 100644 (file)
@@ -107,9 +107,6 @@ class MinorCPU : public BaseCPU
             : MasterPort(name_, &cpu_), cpu(cpu_)
         { }
 
-      protected:
-        /** Snooping a coherence request, do nothing.  */
-        virtual void recvTimingSnoopReq(PacketPtr pkt) { }
     };
 
   protected:
index 8a7d78216ee2601986673179851e90507a1301a6..33d7c506b899763b91f3adc595902196ca5f9c79 100644 (file)
@@ -103,8 +103,12 @@ class LSQ : public Named
 
         void recvReqRetry() { lsq.recvReqRetry(); }
 
+        bool isSnooping() const override { return true; }
+
         void recvTimingSnoopReq(PacketPtr pkt)
         { return lsq.recvTimingSnoopReq(pkt); }
+
+        void recvFunctionalSnoop(PacketPtr pkt) { }
     };
 
     DcachePort dcachePort;
index eed5811cb0079cd2edd14f7fc2cd309e42e995e1..2065202f7a7b6df60c2f881a1a5418ad0b8973b6 100644 (file)
@@ -147,7 +147,6 @@ class FullO3CPU : public BaseO3CPU
         /** Timing version of receive.  Handles setting fetch to the
          * proper status to start fetching. */
         virtual bool recvTimingResp(PacketPtr pkt);
-        virtual void recvTimingSnoopReq(PacketPtr pkt) { }
 
         /** Handles doing a retry of a failed fetch. */
         virtual void recvReqRetry();
index c643bfe581961678a7e578a2e301621f248714a8..098ecd759db23aa8579d226dc694c026aac370b4 100644 (file)
@@ -127,7 +127,6 @@ class AtomicSimpleCPU : public BaseSimpleCPU
         { }
 
       protected:
-        virtual Tick recvAtomicSnoop(PacketPtr pkt) { return 0; }
 
         bool recvTimingResp(PacketPtr pkt)
         {
index da8320793114764fce2c1c9d79a7dc2d577f0ea4..035f05158894ac6d165fffcece50d916be3161bd 100644 (file)
@@ -164,11 +164,6 @@ class TimingSimpleCPU : public BaseSimpleCPU
 
       protected:
 
-        /**
-         * Snooping a coherence request, do nothing.
-         */
-        virtual void recvTimingSnoopReq(PacketPtr pkt) {}
-
         TimingSimpleCPU* cpu;
 
         struct TickEvent : public Event
index 531337f1940c8cbf82aab12c3508b2a745a27cbd..263b2fea86119cf4fa82460825cf7880ce19b71b 100644 (file)
@@ -64,8 +64,6 @@ class BaseCache(MemObject):
     tgts_per_mshr = Param.Unsigned("Max number of accesses per MSHR")
     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)")
 
     prefetcher = Param.BasePrefetcher(NULL,"Prefetcher attached to cache")
index 41b6f38aab936478ee9e452aecc7030f79ea920c..a3ceaafa3c22a63817acf95c5324ff3171e9e649 100644 (file)
@@ -77,7 +77,7 @@ BaseCache::BaseCache(const BaseCacheParams *p, unsigned blk_size)
       fillLatency(p->response_latency),
       responseLatency(p->response_latency),
       numTarget(p->tgts_per_mshr),
-      forwardSnoops(p->forward_snoops),
+      forwardSnoops(true),
       isReadOnly(p->is_read_only),
       blocked(0),
       order(0),
@@ -86,6 +86,8 @@ BaseCache::BaseCache(const BaseCacheParams *p, unsigned blk_size)
       addrRanges(p->addr_ranges.begin(), p->addr_ranges.end()),
       system(p->system)
 {
+    // forward snoops is overridden in init() once we can query
+    // whether the connected master is actually snooping or not
 }
 
 void
@@ -131,6 +133,7 @@ BaseCache::init()
     if (!cpuSidePort->isConnected() || !memSidePort->isConnected())
         fatal("Cache ports on %s are not connected\n", name());
     cpuSidePort->sendRangeChange();
+    forwardSnoops = cpuSidePort->isSnooping();
 }
 
 BaseMasterPort &
index 8cd932f013951b5f22433f4295110887ea0ebadc..1f1f1469f6c36abd681360c329b65320284c0950 100644 (file)
@@ -302,7 +302,7 @@ class BaseCache : public MemObject
     const int numTarget;
 
     /** 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