ruby: Fix MOESI_CMP_directory for new DMA status changes.
authorJavier Cano-Cano <javier.cano555@gmail.com>
Mon, 13 Mar 2017 15:38:18 +0000 (16:38 +0100)
committerJavier Cano-Cano <javier.cano555@gmail.com>
Wed, 5 Apr 2017 21:30:47 +0000 (21:30 +0000)
Multiple outstanding DMA requests introduced new DMA states that didn't
be considered into slicc code. This patch implements the missed DMA state
changes on MOESI_CMP_directory protocol.

Change-Id: I700d441d76556b7e77e0d507904af6ec6ba59cc2
Signed-off-by: Michael LeBeane <michael.lebeane@amd.com>
Reviewed-on: https://gem5-review.googlesource.com/2380
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Reviewed-by: Michael LeBeane <Michael.Lebeane@amd.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>

src/mem/protocol/MOESI_CMP_directory-dma.sm

index ccc7f8790b09ffe372dca1268bd7807bfcfdc600..b9da0d0dc437814ae1b5edb8f1799850f9f1610b 100644 (file)
@@ -77,6 +77,7 @@ machine(MachineType:DMA, "DMA Controller")
   Tick clockEdge();
   void set_tbe(TBE b);
   void unset_tbe();
+  void wakeUpAllBuffers();
 
   State getState(TBE tbe, Addr addr) {
     return cur_state;
@@ -249,6 +250,13 @@ machine(MachineType:DMA, "DMA Controller")
     unset_tbe();
   }
 
+  action(zz_stallAndWaitRequestQueue, "zz", desc="...") {
+    stall_and_wait(dmaRequestQueue_in, address);
+  }
+
+  action(wkad_wakeUpAllDependents, "wkad", desc="wake-up all dependents") {
+    wakeUpAllBuffers();
+  }
 
   transition(READY, ReadRequest, BUSY_RD) {
     s_sendReadRequest;
@@ -269,6 +277,7 @@ machine(MachineType:DMA, "DMA Controller")
     //u_updateAckCount;
     //o_checkForCompletion;
     p_popResponseQueue;
+    wkad_wakeUpAllDependents;
   }
 
   transition(BUSY_RD, All_Acks, READY) {
@@ -276,6 +285,7 @@ machine(MachineType:DMA, "DMA Controller")
     //u_sendExclusiveUnblockToDir;
     w_deallocateTBE;
     p_popTriggerQueue;
+    wkad_wakeUpAllDependents;
   }
 
   transition(READY, WriteRequest, BUSY_WR) {
@@ -301,5 +311,10 @@ machine(MachineType:DMA, "DMA Controller")
     u_sendExclusiveUnblockToDir;
     w_deallocateTBE;
     p_popTriggerQueue;
+    wkad_wakeUpAllDependents;
+  }
+
+  transition({BUSY_RD,BUSY_WR}, {ReadRequest,WriteRequest}) {
+    zz_stallAndWaitRequestQueue;
   }
 }