mem: Fix a bug in the DRAM controller arbitration
authorOmar Naji <Omar.Naji@arm.com>
Tue, 23 Dec 2014 14:31:18 +0000 (09:31 -0500)
committerOmar Naji <Omar.Naji@arm.com>
Tue, 23 Dec 2014 14:31:18 +0000 (09:31 -0500)
Fix a minor issue that affects multi-rank systems.

src/mem/dram_ctrl.cc

index 8378debf1f29a8783abdc0598f2dd88f213a7768..62ae9e9848f283d16e5cbbf0d9a97fa5fa9f94b3 100644 (file)
@@ -1477,7 +1477,13 @@ DRAMCtrl::minBankPrep(const deque<DRAMPacket*>& queue,
     // Offset by tRCD to correlate with ACT timing variables
     Tick min_cmd_at = busBusyUntil - tCL - tRCD;
 
-    // Prioritize same rank accesses that can issue B2B
+    // if we have multiple ranks and all
+    // waiting packets are accessing a rank which was previously active
+    // then bank_mask_same_rank will be set to a value while bank_mask will
+    // remain 0. In this case, the function should return the value of
+    // bank_mask_same_rank.
+    // else if waiting packets access a rank which was previously active and
+    // other ranks, prioritize same rank accesses that can issue B2B
     // Only optimize for same ranks when the command type
     // does not change; do not want to unnecessarily incur tWTR
     //
@@ -1485,8 +1491,8 @@ DRAMCtrl::minBankPrep(const deque<DRAMPacket*>& queue,
     // 1) Commands that access the same rank as previous burst
     //    and can prep the bank seamlessly.
     // 2) Commands (any rank) with earliest bank prep
-    if (!switched_cmd_type && same_rank_match &&
-        min_act_at_same_rank <= min_cmd_at) {
+    if ((bank_mask == 0) || (!switched_cmd_type && same_rank_match &&
+        min_act_at_same_rank <= min_cmd_at)) {
         bank_mask = bank_mask_same_rank;
     }