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:
parent
7babf6b3a8
commit
4135dd48ed
3 changed files with 21 additions and 9 deletions
|
@ -91,10 +91,16 @@ Bridge::init()
|
||||||
bool
|
bool
|
||||||
Bridge::BridgePort::recvTiming(PacketPtr pkt)
|
Bridge::BridgePort::recvTiming(PacketPtr pkt)
|
||||||
{
|
{
|
||||||
|
if (pkt->flags & SNOOP_COMMIT) {
|
||||||
DPRINTF(BusBridge, "recvTiming: src %d dest %d addr 0x%x\n",
|
DPRINTF(BusBridge, "recvTiming: src %d dest %d addr 0x%x\n",
|
||||||
pkt->getSrc(), pkt->getDest(), pkt->getAddr());
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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,13 +364,14 @@ 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)
|
||||||
{
|
{
|
||||||
|
if (interfaces[ports.back()] != responder) //Don't call if responder also, once will do
|
||||||
success = interfaces[ports.back()]->sendTiming(pkt);
|
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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue