Only issue responses if we aren;t already blocked
[gem5.git] / src / dev / tsunami_io.cc
index 7c649a84a07ee6d879024db8fba50b1473ab393c..e3da10eb50dbc9ca0e4022966c25029164462d05 100644 (file)
  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Ali Saidi
+ *          Andrew Schultz
+ *          Miguel Serrano
  */
 
 /** @file
@@ -118,25 +122,27 @@ TsunamiIO::RTC::writeData(const uint8_t data)
     }
 }
 
-void
-TsunamiIO::RTC::readData(uint8_t *data)
+uint8_t
+TsunamiIO::RTC::readData()
 {
     if (addr < RTC_STAT_REGA)
-        *data = clock_data[addr];
+        return clock_data[addr];
     else {
         switch (addr) {
           case RTC_STAT_REGA:
             // toggle UIP bit for linux
             stat_regA ^= RTCA_UIP;
-            *data = stat_regA;
+            return stat_regA;
             break;
           case RTC_STAT_REGB:
-            *data = stat_regB;
+            return stat_regB;
             break;
           case RTC_STAT_REGC:
           case RTC_STAT_REGD:
-            *data = 0x00;
+            return 0x00;
             break;
+          default:
+            panic("Shouldn't be here");
         }
     }
 }
@@ -263,31 +269,35 @@ TsunamiIO::PITimer::Counter::latchCount()
     }
 }
 
-void
-TsunamiIO::PITimer::Counter::read(uint8_t *data)
+uint8_t
+TsunamiIO::PITimer::Counter::read()
 {
     if (latch_on) {
         switch (read_byte) {
           case LSB:
             read_byte = MSB;
-            *data = (uint8_t)latched_count;
+            return (uint8_t)latched_count;
             break;
           case MSB:
             read_byte = LSB;
             latch_on = false;
-            *data = latched_count >> 8;
+            return latched_count >> 8;
             break;
+          default:
+            panic("Shouldn't be here");
         }
     } else {
         switch (read_byte) {
           case LSB:
             read_byte = MSB;
-            *data = (uint8_t)count;
+            return (uint8_t)count;
             break;
           case MSB:
             read_byte = LSB;
-            *data = count >> 8;
+            return count >> 8;
             break;
+          default:
+            panic("Shouldn't be here");
         }
     }
 }
@@ -441,7 +451,6 @@ TsunamiIO::read(Packet *pkt)
     assert(pkt->result == Packet::Unknown);
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
 
-    pkt->time += pioDelay;
     Addr daddr = pkt->getAddr() - pioAddr;
 
     DPRINTF(Tsunami, "io read  va=%#x size=%d IOPorrt=%#x\n", pkt->getAddr(),
@@ -469,16 +478,16 @@ TsunamiIO::read(Packet *pkt)
               pkt->set(0x00);
               break;
           case TSDEV_TMR0_DATA:
-            pitimer.counter0.read(pkt->getPtr<uint8_t>());
+            pkt->set(pitimer.counter0.read());
             break;
           case TSDEV_TMR1_DATA:
-            pitimer.counter1.read(pkt->getPtr<uint8_t>());
+            pkt->set(pitimer.counter1.read());
             break;
           case TSDEV_TMR2_DATA:
-            pitimer.counter2.read(pkt->getPtr<uint8_t>());
+            pkt->set(pitimer.counter2.read());
             break;
           case TSDEV_RTC_DATA:
-            rtc.readData(pkt->getPtr<uint8_t>());
+            pkt->set(rtc.readData());
             break;
           case TSDEV_CTRL_PORTB:
             if (pitimer.counter2.outputHigh())
@@ -505,8 +514,6 @@ TsunamiIO::read(Packet *pkt)
 Tick
 TsunamiIO::write(Packet *pkt)
 {
-    pkt->time += pioDelay;
-
     assert(pkt->result == Packet::Unknown);
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
     Addr daddr = pkt->getAddr() - pioAddr;