Update bus bridges now that snoop ranges are passed properly
authorRon Dreslinski <rdreslin@umich.edu>
Tue, 14 Nov 2006 06:12:52 +0000 (01:12 -0500)
committerRon Dreslinski <rdreslin@umich.edu>
Tue, 14 Nov 2006 06:12:52 +0000 (01:12 -0500)
src/mem/bridge.cc:
    Update brdiges, now that snoop addresses are properly forwarded.
    Bus bridge should only handle snoops on the second phase (SNOOP_COMMIT)
src/mem/bus.cc:
src/mem/bus.hh:
    Make sure if a busBridge has access to both things that snoop and things that respond it only takes the request once

--HG--
extra : convert_revision : 26cc9ee4429be45d4476fa435e0e9a54843c2509

src/mem/bridge.cc
src/mem/bus.cc
src/mem/bus.hh

index 38dcfd2e8a6f8ba4479bea3cd3e75c79b3ac53ab..b787f79ca9ae1d4ec6ac1bac90ae941e7384e854 100644 (file)
@@ -91,10 +91,16 @@ Bridge::init()
 bool
 Bridge::BridgePort::recvTiming(PacketPtr pkt)
 {
-    DPRINTF(BusBridge, "recvTiming: src %d dest %d addr 0x%x\n",
-            pkt->getSrc(), pkt->getDest(), pkt->getAddr());
+    if (pkt->flags & SNOOP_COMMIT) {
+        DPRINTF(BusBridge, "recvTiming: src %d dest %d addr 0x%x\n",
+                pkt->getSrc(), pkt->getDest(), pkt->getAddr());
 
-    return otherPort->queueForSendTiming(pkt);
+        return otherPort->queueForSendTiming(pkt);
+    }
+    else {
+        // Else it's just a snoop, properly return if we are blocking
+        return !queueFull();
+    }
 }
 
 
index b97a7ddb948ad242cbd20ff24cfada00c4989d90..a9f95fdc7e5462b5628b45d1656abd113d379a45 100644 (file)
@@ -160,11 +160,12 @@ Bus::recvTiming(PacketPtr pkt)
 
     short dest = pkt->getDest();
     if (dest == Packet::Broadcast) {
-        if (timingSnoop(pkt)) {
+        port = findPort(pkt->getAddr(), pkt->getSrc());
+        if (timingSnoop(pkt, port)) {
             bool success;
 
             pkt->flags |= SNOOP_COMMIT;
-            success = timingSnoop(pkt);
+            success = timingSnoop(pkt, port);
             assert(success);
 
             if (pkt->flags & SATISFIED) {
@@ -177,7 +178,6 @@ Bus::recvTiming(PacketPtr pkt)
                 occupyBus(pkt);
                 return true;
             }
-            port = findPort(pkt->getAddr(), pkt->getSrc());
         } else {
             //Snoop didn't succeed
             DPRINTF(Bus, "Adding a retry to RETRY list %i\n", pktPort);
@@ -364,14 +364,15 @@ Bus::functionalSnoop(PacketPtr pkt)
 }
 
 bool
-Bus::timingSnoop(PacketPtr pkt)
+Bus::timingSnoop(PacketPtr pkt, Port* responder)
 {
     std::vector<int> ports = findSnoopPorts(pkt->getAddr(), pkt->getSrc());
     bool success = true;
 
     while (!ports.empty() && success)
     {
-        success = interfaces[ports.back()]->sendTiming(pkt);
+        if (interfaces[ports.back()] != responder) //Don't call if responder also, once will do
+            success = interfaces[ports.back()]->sendTiming(pkt);
         ports.pop_back();
     }
 
@@ -387,11 +388,14 @@ Bus::recvAtomic(PacketPtr pkt)
     DPRINTF(Bus, "recvAtomic: packet src %d dest %d addr 0x%x cmd %s\n",
             pkt->getSrc(), pkt->getDest(), pkt->getAddr(), pkt->cmdString());
     assert(pkt->getDest() == Packet::Broadcast);
+    pkt->flags |= SNOOP_COMMIT;
 
     // Assume one bus cycle in order to get through.  This may have
     // some clock skew issues yet again...
     pkt->finishTime = curTick + clock;
+
     Tick snoopTime = atomicSnoop(pkt);
+
     if (snoopTime)
         return snoopTime;  //Snoop satisfies it
     else
@@ -406,6 +410,8 @@ Bus::recvFunctional(PacketPtr pkt)
     DPRINTF(Bus, "recvFunctional: packet src %d dest %d addr 0x%x cmd %s\n",
             pkt->getSrc(), pkt->getDest(), pkt->getAddr(), pkt->cmdString());
     assert(pkt->getDest() == Packet::Broadcast);
+    pkt->flags |= SNOOP_COMMIT;
+
     functionalSnoop(pkt);
 
     // If the snooping found what we were looking for, we're done.
index ff1d2545d7be9aa5ebbade4c573872d34ba9dff9..7169a8e6db3c01bdc8a1e1ddc9b8288c79c5e897 100644 (file)
@@ -118,7 +118,7 @@ class Bus : public MemObject
      * the snoop to happen
      * @return True if succeds.
      */
-    bool timingSnoop(PacketPtr pkt);
+    bool timingSnoop(PacketPtr pkt, Port *responder);
 
     /** Process address range request.
      * @param resp addresses that we can respond to