mem: Add bank and rank indices as fields to the DRAM bank
authorAndreas Hansson <andreas.hansson@arm.com>
Mon, 30 Jun 2014 17:56:02 +0000 (13:56 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Mon, 30 Jun 2014 17:56:02 +0000 (13:56 -0400)
This patch adds the index of the bank and rank as a field so that we can
determine the identity of a given bank (reference or pointer) for the
power tracing. We also grab the opportunity of cleaning up the
arguments used for identifying the bank when activating.

src/mem/dram_ctrl.cc
src/mem/dram_ctrl.hh

index e4248b3375995e77c447bed600c43b930760999c..b4e1eac7ba9d7abf05c3e8ae63701b546e1c55ed 100644 (file)
@@ -96,6 +96,14 @@ DRAMCtrl::DRAMCtrl(const DRAMCtrlParams* p) :
         actTicks[c].resize(activationLimit, 0);
     }
 
+    // set the bank indices
+    for (int r = 0; r < ranksPerChannel; r++) {
+        for (int b = 0; b < banksPerRank; b++) {
+            banks[r][b].rank = r;
+            banks[r][b].bank = b;
+        }
+    }
+
     // perform a basic check of the write thresholds
     if (p->write_low_thresh_perc >= p->write_high_thresh_perc)
         fatal("Write buffer low threshold %d must be smaller than the "
@@ -752,23 +760,24 @@ DRAMCtrl::accessAndRespond(PacketPtr pkt, Tick static_latency)
 }
 
 void
-DRAMCtrl::activateBank(Tick act_tick, uint8_t rank, uint8_t bank,
-                       uint32_t row, Bank& bank_ref)
+DRAMCtrl::activateBank(Bank& bank, Tick act_tick, uint32_t row)
 {
-    assert(0 <= rank && rank < ranksPerChannel);
+    // get the rank index from the bank
+    uint8_t rank = bank.rank;
+
     assert(actTicks[rank].size() == activationLimit);
 
     DPRINTF(DRAM, "Activate at tick %d\n", act_tick);
 
     // update the open row
-    assert(bank_ref.openRow == Bank::NO_ROW);
-    bank_ref.openRow = row;
+    assert(bank.openRow == Bank::NO_ROW);
+    bank.openRow = row;
 
     // start counting anew, this covers both the case when we
     // auto-precharged, and when this access is forced to
     // precharge
-    bank_ref.bytesAccessed = 0;
-    bank_ref.rowAccesses = 0;
+    bank.bytesAccessed = 0;
+    bank.rowAccesses = 0;
 
     ++numBanksActive;
     assert(numBanksActive <= banksPerRank * ranksPerChannel);
@@ -777,10 +786,10 @@ DRAMCtrl::activateBank(Tick act_tick, uint8_t rank, uint8_t bank,
             act_tick, numBanksActive);
 
     // The next access has to respect tRAS for this bank
-    bank_ref.preAllowedAt = act_tick + tRAS;
+    bank.preAllowedAt = act_tick + tRAS;
 
     // Respect the row-to-column command delay
-    bank_ref.colAllowedAt = act_tick + tRCD;
+    bank.colAllowedAt = act_tick + tRCD;
 
     // start by enforcing tRRD
     for(int i = 0; i < banksPerRank; i++) {
@@ -922,8 +931,7 @@ DRAMCtrl::doDRAMAccess(DRAMPacket* dram_pkt)
 
         // Record the activation and deal with all the global timing
         // constraints caused be a new activation (tRRD and tXAW)
-        activateBank(act_tick, dram_pkt->rank, dram_pkt->bank,
-                     dram_pkt->row, bank);
+        activateBank(bank, act_tick, dram_pkt->row);
 
         // issue the command as early as possible
         cmd_at = bank.colAllowedAt;
index c8104a49d3884ba227179b795c6c760103474220..aee2635b452fc34c4152d314c57417ab68746837 100644 (file)
@@ -154,6 +154,8 @@ class DRAMCtrl : public AbstractMemory
         static const uint32_t NO_ROW = -1;
 
         uint32_t openRow;
+        uint8_t rank;
+        uint8_t bank;
 
         Tick colAllowedAt;
         Tick preAllowedAt;
@@ -163,7 +165,8 @@ class DRAMCtrl : public AbstractMemory
         uint32_t bytesAccessed;
 
         Bank() :
-            openRow(NO_ROW), colAllowedAt(0), preAllowedAt(0), actAllowedAt(0),
+            openRow(NO_ROW), rank(0), bank(0),
+            colAllowedAt(0), preAllowedAt(0), actAllowedAt(0),
             rowAccesses(0), bytesAccessed(0)
         { }
     };
@@ -387,14 +390,11 @@ class DRAMCtrl : public AbstractMemory
      * method updates the time that the banks become available based
      * on the current limits.
      *
+     * @param bank Reference to the bank
      * @param act_tick Time when the activation takes place
-     * @param rank Index of the rank
-     * @param bank Index of the bank
      * @param row Index of the row
-     * @param bank_ref Reference to the bank
      */
-    void activateBank(Tick act_tick, uint8_t rank, uint8_t bank,
-                      uint32_t row, Bank& bank_ref);
+    void activateBank(Bank& bank, Tick act_tick, uint32_t row);
 
     /**
      * Precharge a given bank and also update when the precharge is