mem: Fix DRAM activationlLimit bug
authorOmar Naji <Omar.Naji@arm.com>
Mon, 20 Oct 2014 22:03:55 +0000 (18:03 -0400)
committerOmar Naji <Omar.Naji@arm.com>
Mon, 20 Oct 2014 22:03:55 +0000 (18:03 -0400)
Ensure that we do the proper event scheduling also when the activation
limit is disabled.

src/mem/dram_ctrl.cc

index c9d944faae5ae4411249ae72f69c5310052b2669..f65f7e1ddb97ee64eda81f270115ec5027895620 100644 (file)
@@ -917,35 +917,38 @@ DRAMCtrl::activateBank(Bank& bank, Tick act_tick, uint32_t row)
     }
 
     // next, we deal with tXAW, if the activation limit is disabled
-    // then we are done
-    if (actTicks[rank].empty())
-        return;
-
-    // sanity check
-    if (actTicks[rank].back() && (act_tick - actTicks[rank].back()) < tXAW) {
-        panic("Got %d activates in window %d (%llu - %llu) which is smaller "
-              "than %llu\n", activationLimit, act_tick - actTicks[rank].back(),
-              act_tick, actTicks[rank].back(), tXAW);
-    }
-
-    // shift the times used for the book keeping, the last element
-    // (highest index) is the oldest one and hence the lowest value
-    actTicks[rank].pop_back();
-
-    // record an new activation (in the future)
-    actTicks[rank].push_front(act_tick);
+    // then we directly schedule an activate power event
+    if (!actTicks[rank].empty()) {
+        // sanity check
+        if (actTicks[rank].back() &&
+           (act_tick - actTicks[rank].back()) < tXAW) {
+            panic("Got %d activates in window %d (%llu - %llu) which "
+                  "is smaller than %llu\n", activationLimit, act_tick -
+                  actTicks[rank].back(), act_tick, actTicks[rank].back(),
+                  tXAW);
+        }
 
-    // cannot activate more than X times in time window tXAW, push the
-    // next one (the X + 1'st activate) to be tXAW away from the
-    // oldest in our window of X
-    if (actTicks[rank].back() && (act_tick - actTicks[rank].back()) < tXAW) {
-        DPRINTF(DRAM, "Enforcing tXAW with X = %d, next activate no earlier "
-                "than %llu\n", activationLimit, actTicks[rank].back() + tXAW);
+        // shift the times used for the book keeping, the last element
+        // (highest index) is the oldest one and hence the lowest value
+        actTicks[rank].pop_back();
+
+        // record an new activation (in the future)
+        actTicks[rank].push_front(act_tick);
+
+        // cannot activate more than X times in time window tXAW, push the
+        // next one (the X + 1'st activate) to be tXAW away from the
+        // oldest in our window of X
+        if (actTicks[rank].back() &&
+           (act_tick - actTicks[rank].back()) < tXAW) {
+            DPRINTF(DRAM, "Enforcing tXAW with X = %d, next activate "
+                    "no earlier than %llu\n", activationLimit,
+                    actTicks[rank].back() + tXAW);
             for(int j = 0; j < banksPerRank; j++)
                 // next activate must not happen before end of window
                 banks[rank][j].actAllowedAt =
                     std::max(actTicks[rank].back() + tXAW,
                              banks[rank][j].actAllowedAt);
+        }
     }
 
     // at the point when this activate takes place, make sure we