diff --git a/src/mem/hbm_ctrl.cc b/src/mem/hbm_ctrl.cc index 99618c4b5f..747e714f57 100644 --- a/src/mem/hbm_ctrl.cc +++ b/src/mem/hbm_ctrl.cc @@ -150,6 +150,21 @@ HBMCtrl::recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &backdoor) return latency; } +void +HBMCtrl::recvMemBackdoorReq(const MemBackdoorReq &req, + MemBackdoorPtr &backdoor) +{ + auto &range = req.range(); + if (pc0Int && pc0Int->getAddrRange().isSubset(range)) { + pc0Int->getBackdoor(backdoor); + } else if (pc1Int && pc1Int->getAddrRange().isSubset(range)) { + pc1Int->getBackdoor(backdoor); + } + else { + panic("Can't handle address range for range %s\n", range.to_string()); + } +} + bool HBMCtrl::writeQueueFullPC0(unsigned int neededEntries) const { diff --git a/src/mem/hbm_ctrl.hh b/src/mem/hbm_ctrl.hh index c9045f0ae7..a6ecf6c589 100644 --- a/src/mem/hbm_ctrl.hh +++ b/src/mem/hbm_ctrl.hh @@ -259,6 +259,8 @@ class HBMCtrl : public MemCtrl Tick recvAtomic(PacketPtr pkt) override; Tick recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &backdoor) override; void recvFunctional(PacketPtr pkt) override; + void recvMemBackdoorReq(const MemBackdoorReq &req, + MemBackdoorPtr &_backdoor) override; bool recvTimingReq(PacketPtr pkt) override; }; diff --git a/src/mem/thread_bridge.cc b/src/mem/thread_bridge.cc index 3f76ef49b3..efaf19a0e2 100644 --- a/src/mem/thread_bridge.cc +++ b/src/mem/thread_bridge.cc @@ -84,6 +84,14 @@ ThreadBridge::IncomingPort::recvFunctional(PacketPtr pkt) device_.out_port_.sendFunctional(pkt); } +void +ThreadBridge::IncomingPort::recvMemBackdoorReq(const MemBackdoorReq &req, + MemBackdoorPtr &backdoor) +{ + EventQueue::ScopedMigration migrate(device_.eventQueue()); + device_.out_port_.sendMemBackdoorReq(req, backdoor); +} + ThreadBridge::OutgoingPort::OutgoingPort(const std::string &name, ThreadBridge &device) : RequestPort(name, &device), device_(device) diff --git a/src/mem/thread_bridge.hh b/src/mem/thread_bridge.hh index 28c959193c..92cb078dd1 100644 --- a/src/mem/thread_bridge.hh +++ b/src/mem/thread_bridge.hh @@ -61,6 +61,8 @@ class ThreadBridge : public SimObject // FunctionalResponseProtocol void recvFunctional(PacketPtr pkt) override; + void recvMemBackdoorReq(const MemBackdoorReq &req, + MemBackdoorPtr &backdoor) override; private: ThreadBridge &device_;