From 680a689fd6ca844b373bf2c5ba9028b7b563a356 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Fri, 22 Mar 2019 15:46:57 -0700 Subject: [PATCH] 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 Reviewed-by: Daniel Carvalho Maintainer: Gabe Black --- src/mem/coherent_xbar.cc | 8 ++++++-- src/mem/coherent_xbar.hh | 11 +++++++++-- src/mem/noncoherent_xbar.cc | 7 +++++-- src/mem/noncoherent_xbar.hh | 11 +++++++++-- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/mem/coherent_xbar.cc b/src/mem/coherent_xbar.cc index 3e994dd71..96e855f75 100644 --- a/src/mem/coherent_xbar.cc +++ b/src/mem/coherent_xbar.cc @@ -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()); diff --git a/src/mem/coherent_xbar.hh b/src/mem/coherent_xbar.hh index 2bb5db281..ff28cb743 100644 --- a/src/mem/coherent_xbar.hh +++ b/src/mem/coherent_xbar.hh @@ -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& 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); /** diff --git a/src/mem/noncoherent_xbar.cc b/src/mem/noncoherent_xbar.cc index b0fe205c1..a7b6b0fdc 100644 --- a/src/mem/noncoherent_xbar.cc +++ b/src/mem/noncoherent_xbar.cc @@ -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()) { diff --git a/src/mem/noncoherent_xbar.hh b/src/mem/noncoherent_xbar.hh index 9d4efbee2..4f72cef4d 100644 --- a/src/mem/noncoherent_xbar.hh +++ b/src/mem/noncoherent_xbar.hh @@ -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: -- 2.30.2