Port: Add isSnooping to slave port (asking master port)
authorAndreas Hansson <andreas.hansson@arm.com>
Mon, 9 Jul 2012 16:35:32 +0000 (12:35 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Mon, 9 Jul 2012 16:35:32 +0000 (12:35 -0400)
This patch adds isSnooping to the slave port, and thus avoids going
through getMasterPort to be able to ask the master. Over the course of
the next few patches, all getMasterPort/getSlavePort in Port and
MemObject are to be protocol agnostic, and the snooping is part of the
protocol layer.

The function is already present on the master port, where it is
implemented by the module itself, e.g. a cache. On the slave side, it
is merely asking the connected master port. The same name is used by
both functions despite their difference in behaviour. The initial
design used isMasterSnooping on the slave port side, but the more
verbose function name was later changed.

src/mem/cache/cache_impl.hh
src/mem/coherent_bus.cc
src/mem/comm_monitor.cc
src/mem/port.hh
src/mem/ruby/system/RubyPort.cc

index af32346bb9543c144a6d1fb41a8fec8099c5254b..cc68bbd3d77736d1f073afa05f725de3c4761908 100644 (file)
@@ -795,7 +795,7 @@ Cache<TagStore>::functionalAccess(PacketPtr pkt, bool fromCpuSide)
         // continues towards the memory side
         if (fromCpuSide) {
             memSidePort->sendFunctional(pkt);
-        } else if (forwardSnoops && cpuSidePort->getMasterPort().isSnooping()) {
+        } else if (forwardSnoops && cpuSidePort->isSnooping()) {
             // if it came from the memory side, it must be a snoop request
             // and we should only forward it if we are forwarding snoops
             cpuSidePort->sendFunctionalSnoop(pkt);
index b40e84762801c246a24d69edff1eb445e5da84b9..ef8d68f008b82a839d733c36a40b10fdeef0a88c 100644 (file)
@@ -92,7 +92,8 @@ CoherentBus::init()
     // neighbouring master ports are snooping and add them as snoopers
     for (SlavePortConstIter p = slavePorts.begin(); p != slavePorts.end();
          ++p) {
-        if ((*p)->getMasterPort().isSnooping()) {
+        // check if the connected master port is snooping
+        if ((*p)->isSnooping()) {
             DPRINTF(BusAddrRanges, "Adding snooping master %s\n",
                     (*p)->getMasterPort().name());
             snoopPorts.push_back(*p);
index 4255d58ad705fca035ea3d8dea066bb7e6a3ed61..d8d5806bb8494ca71c3b93c3ad88a57bd3e16726 100644 (file)
@@ -328,7 +328,8 @@ CommMonitor::recvTimingSnoopResp(PacketPtr pkt)
 bool
 CommMonitor::isSnooping() const
 {
-    return slavePort.getMasterPort().isSnooping();
+    // check if the connected master port is snooping
+    return slavePort.isSnooping();
 }
 
 unsigned
index b93d5d444ba85f1edde2087475f54162eb4c0a5b..49b0e18461b6dd7e84038857d5d8e256f4e98ca4 100644 (file)
@@ -355,6 +355,13 @@ class SlavePort : public Port
     */
     unsigned peerBlockSize() const;
 
+    /**
+     * Find out if the peer master port is snooping or not.
+     *
+     * @return true if the peer master port is snooping
+     */
+    bool isSnooping() const { return _masterPort->isSnooping(); }
+
     /**
      * Called by the owner to send a range change
      */
index 3621cc9e3e5509c8c622a14d73d97b684f05221c..285017a06983197475910c7554fcdc891910270c 100644 (file)
@@ -695,7 +695,8 @@ RubyPort::ruby_eviction_callback(const Address& address)
     // should this really be using funcMasterId?
     Request req(address.getAddress(), 0, 0, Request::funcMasterId);
     for (CpuPortIter p = slave_ports.begin(); p != slave_ports.end(); ++p) {
-        if ((*p)->getMasterPort().isSnooping()) {
+        // check if the connected master port is snooping
+        if ((*p)->isSnooping()) {
             Packet *pkt = new Packet(&req, MemCmd::InvalidationReq);
             // send as a snoop request
             (*p)->sendTimingSnoopReq(pkt);