Update bus bridges now that snoop ranges are passed properly

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
This commit is contained in:
Ron Dreslinski 2006-11-14 01:12:52 -05:00
parent 7babf6b3a8
commit 4135dd48ed
3 changed files with 21 additions and 9 deletions

View file

@ -91,10 +91,16 @@ Bridge::init()
bool bool
Bridge::BridgePort::recvTiming(PacketPtr pkt) Bridge::BridgePort::recvTiming(PacketPtr pkt)
{ {
DPRINTF(BusBridge, "recvTiming: src %d dest %d addr 0x%x\n", if (pkt->flags & SNOOP_COMMIT) {
pkt->getSrc(), pkt->getDest(), pkt->getAddr()); 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();
}
} }

View file

@ -160,11 +160,12 @@ Bus::recvTiming(PacketPtr pkt)
short dest = pkt->getDest(); short dest = pkt->getDest();
if (dest == Packet::Broadcast) { if (dest == Packet::Broadcast) {
if (timingSnoop(pkt)) { port = findPort(pkt->getAddr(), pkt->getSrc());
if (timingSnoop(pkt, port)) {
bool success; bool success;
pkt->flags |= SNOOP_COMMIT; pkt->flags |= SNOOP_COMMIT;
success = timingSnoop(pkt); success = timingSnoop(pkt, port);
assert(success); assert(success);
if (pkt->flags & SATISFIED) { if (pkt->flags & SATISFIED) {
@ -177,7 +178,6 @@ Bus::recvTiming(PacketPtr pkt)
occupyBus(pkt); occupyBus(pkt);
return true; return true;
} }
port = findPort(pkt->getAddr(), pkt->getSrc());
} else { } else {
//Snoop didn't succeed //Snoop didn't succeed
DPRINTF(Bus, "Adding a retry to RETRY list %i\n", pktPort); DPRINTF(Bus, "Adding a retry to RETRY list %i\n", pktPort);
@ -364,14 +364,15 @@ Bus::functionalSnoop(PacketPtr pkt)
} }
bool bool
Bus::timingSnoop(PacketPtr pkt) Bus::timingSnoop(PacketPtr pkt, Port* responder)
{ {
std::vector<int> ports = findSnoopPorts(pkt->getAddr(), pkt->getSrc()); std::vector<int> ports = findSnoopPorts(pkt->getAddr(), pkt->getSrc());
bool success = true; bool success = true;
while (!ports.empty() && success) 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(); 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", DPRINTF(Bus, "recvAtomic: packet src %d dest %d addr 0x%x cmd %s\n",
pkt->getSrc(), pkt->getDest(), pkt->getAddr(), pkt->cmdString()); pkt->getSrc(), pkt->getDest(), pkt->getAddr(), pkt->cmdString());
assert(pkt->getDest() == Packet::Broadcast); assert(pkt->getDest() == Packet::Broadcast);
pkt->flags |= SNOOP_COMMIT;
// Assume one bus cycle in order to get through. This may have // Assume one bus cycle in order to get through. This may have
// some clock skew issues yet again... // some clock skew issues yet again...
pkt->finishTime = curTick + clock; pkt->finishTime = curTick + clock;
Tick snoopTime = atomicSnoop(pkt); Tick snoopTime = atomicSnoop(pkt);
if (snoopTime) if (snoopTime)
return snoopTime; //Snoop satisfies it return snoopTime; //Snoop satisfies it
else else
@ -406,6 +410,8 @@ Bus::recvFunctional(PacketPtr pkt)
DPRINTF(Bus, "recvFunctional: packet src %d dest %d addr 0x%x cmd %s\n", DPRINTF(Bus, "recvFunctional: packet src %d dest %d addr 0x%x cmd %s\n",
pkt->getSrc(), pkt->getDest(), pkt->getAddr(), pkt->cmdString()); pkt->getSrc(), pkt->getDest(), pkt->getAddr(), pkt->cmdString());
assert(pkt->getDest() == Packet::Broadcast); assert(pkt->getDest() == Packet::Broadcast);
pkt->flags |= SNOOP_COMMIT;
functionalSnoop(pkt); functionalSnoop(pkt);
// If the snooping found what we were looking for, we're done. // If the snooping found what we were looking for, we're done.

View file

@ -118,7 +118,7 @@ class Bus : public MemObject
* the snoop to happen * the snoop to happen
* @return True if succeds. * @return True if succeds.
*/ */
bool timingSnoop(PacketPtr pkt); bool timingSnoop(PacketPtr pkt, Port *responder);
/** Process address range request. /** Process address range request.
* @param resp addresses that we can respond to * @param resp addresses that we can respond to