mem: Plumb backdoor requests through the xbar classes.

Change-Id: Ic8f49339ab95c31d2f00edfdf23a46f1271ec3aa
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/17593
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br>
Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
Gabe Black
2019-03-22 15:46:57 -07:00
parent 729d9949f7
commit 680a689fd6
4 changed files with 29 additions and 8 deletions

View File

@@ -721,7 +721,8 @@ CoherentXBar::recvReqRetry(PortID master_port_id)
}
Tick
CoherentXBar::recvAtomic(PacketPtr pkt, PortID slave_port_id)
CoherentXBar::recvAtomicBackdoor(PacketPtr pkt, PortID slave_port_id,
MemBackdoorPtr *backdoor)
{
DPRINTF(CoherentXBar, "%s: src %s packet %s\n", __func__,
slavePorts[slave_port_id]->name(), pkt->print());
@@ -800,7 +801,10 @@ CoherentXBar::recvAtomic(PacketPtr pkt, PortID slave_port_id)
}
// forward the request to the appropriate destination
response_latency = masterPorts[master_port_id]->sendAtomic(pkt);
auto master = masterPorts[master_port_id];
response_latency = backdoor ?
master->sendAtomicBackdoor(pkt, *backdoor) :
master->sendAtomic(pkt);
} else {
// if it does not need a response we sink the packet above
assert(pkt->needsResponse());

View File

@@ -123,7 +123,13 @@ class CoherentXBar : public BaseXBar
Tick
recvAtomic(PacketPtr pkt) override
{
return xbar.recvAtomic(pkt, id);
return xbar.recvAtomicBackdoor(pkt, id);
}
Tick
recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &backdoor) override
{
return xbar.recvAtomicBackdoor(pkt, id, &backdoor);
}
void
@@ -314,7 +320,8 @@ class CoherentXBar : public BaseXBar
void forwardTiming(PacketPtr pkt, PortID exclude_slave_port_id,
const std::vector<QueuedSlavePort*>& dests);
Tick recvAtomic(PacketPtr pkt, PortID slave_port_id);
Tick recvAtomicBackdoor(PacketPtr pkt, PortID slave_port_id,
MemBackdoorPtr *backdoor=nullptr);
Tick recvAtomicSnoop(PacketPtr pkt, PortID master_port_id);
/**

View File

@@ -244,7 +244,8 @@ NoncoherentXBar::recvReqRetry(PortID master_port_id)
}
Tick
NoncoherentXBar::recvAtomic(PacketPtr pkt, PortID slave_port_id)
NoncoherentXBar::recvAtomicBackdoor(PacketPtr pkt, PortID slave_port_id,
MemBackdoorPtr *backdoor)
{
DPRINTF(NoncoherentXBar, "recvAtomic: packet src %s addr 0x%x cmd %s\n",
slavePorts[slave_port_id]->name(), pkt->getAddr(),
@@ -263,7 +264,9 @@ NoncoherentXBar::recvAtomic(PacketPtr pkt, PortID slave_port_id)
transDist[pkt_cmd]++;
// forward the request to the appropriate destination
Tick response_latency = masterPorts[master_port_id]->sendAtomic(pkt);
auto master = masterPorts[master_port_id];
Tick response_latency = backdoor ?
master->sendAtomicBackdoor(pkt, *backdoor) : master->sendAtomic(pkt);
// add the response data
if (pkt->isResponse()) {

View File

@@ -113,7 +113,13 @@ class NoncoherentXBar : public BaseXBar
Tick
recvAtomic(PacketPtr pkt) override
{
return xbar.recvAtomic(pkt, id);
return xbar.recvAtomicBackdoor(pkt, id);
}
Tick
recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &backdoor) override
{
return xbar.recvAtomicBackdoor(pkt, id, &backdoor);
}
void
@@ -172,7 +178,8 @@ class NoncoherentXBar : public BaseXBar
virtual bool recvTimingReq(PacketPtr pkt, PortID slave_port_id);
virtual bool recvTimingResp(PacketPtr pkt, PortID master_port_id);
void recvReqRetry(PortID master_port_id);
Tick recvAtomic(PacketPtr pkt, PortID slave_port_id);
Tick recvAtomicBackdoor(PacketPtr pkt, PortID slave_port_id,
MemBackdoorPtr *backdoor=nullptr);
void recvFunctional(PacketPtr pkt, PortID slave_port_id);
public: