Patrick Sheridan has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/46339 )

Change subject: mem-dram: Kick refresh on rank after each response
......................................................................

mem-dram: Kick refresh on rank after each response

Currently the MemCtrl::processRespondEvent calls dram->checkRefreshState only if respQueue is empty. This causes an issue in a multi-rank DRAM device if a rank is waiting for a refresh but the mem_pkt for that rank is not the last one in the respQueue. This change will call checkRefreshState for every mem_pkt, and adds an additional check in checkRefreshState so that if oustandingEvents > 1, it does not start the refresh.

Jira Issue: https://gem5.atlassian.net/browse/GEM5-1005

Change-Id: Id6160ec4e9429b4317b26d81283ec5d0688583a7
---
M src/mem/mem_ctrl.cc
M src/mem/mem_interface.cc
2 files changed, 6 insertions(+), 3 deletions(-)



diff --git a/src/mem/mem_ctrl.cc b/src/mem/mem_ctrl.cc
index f663fa7..1e139de 100644
--- a/src/mem/mem_ctrl.cc
+++ b/src/mem/mem_ctrl.cc
@@ -535,12 +535,14 @@

             DPRINTF(Drain, "Controller done draining\n");
             signalDrainDone();
-        } else if (mem_pkt->isDram()) {
+        }
+    }
+
+    if (mem_pkt->isDram() && drainState() != DrainState::Draining) {
             // check the refresh state and kick the refresh event loop
             // into action again if banks already closed and just waiting
             // for read to complete
             dram->checkRefreshState(mem_pkt->rank);
-        }
     }

     // We have made a location in the queue available at this point,
diff --git a/src/mem/mem_interface.cc b/src/mem/mem_interface.cc
index 2a2ae18..7073069 100644
--- a/src/mem/mem_interface.cc
+++ b/src/mem/mem_interface.cc
@@ -989,7 +989,8 @@
     Rank& rank_ref = *ranks[rank];

     if ((rank_ref.refreshState == REF_PRE) &&
-        !rank_ref.prechargeEvent.scheduled()) {
+        !rank_ref.prechargeEvent.scheduled() &&
+        rank_ref.outstandingEvents == 1) {
           // kick the refresh event loop into action again if banks already
           // closed and just waiting for read to complete
           schedule(rank_ref.refreshEvent, curTick());

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/46339
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: Id6160ec4e9429b4317b26d81283ec5d0688583a7
Gerrit-Change-Number: 46339
Gerrit-PatchSet: 1
Gerrit-Owner: Patrick Sheridan <sher...@gmail.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to