From ce03482a394fd4309104ca15d002d3070fac3aef Mon Sep 17 00:00:00 2001 From: Yu-hsin Wang Date: Thu, 8 Dec 2022 17:03:49 +0800 Subject: [PATCH] mem: Implement and use the recvMemBackdoorReq func. In the previous change, we miss some model supporting atomic backdoor. We should also implement the recvMemBackdoorReq to them. Change-Id: I4706d215aa4a5d18fe4306b2387f9c8750cb4b4a Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/66551 Reviewed-by: Gabe Black Maintainer: Gabe Black Tested-by: kokoro --- src/mem/hbm_ctrl.cc | 15 +++++++++++++++ src/mem/hbm_ctrl.hh | 2 ++ src/mem/thread_bridge.cc | 8 ++++++++ src/mem/thread_bridge.hh | 2 ++ 4 files changed, 27 insertions(+) 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_;