Merge in .hgignore from head.
[gem5.git] / src / dev / alpha / tsunami_io.cc
index 38986b77e6146fb23849176ef2d0c7b12b8301db..f59a06fbaa00e45293bda4b8ed15cad584a8b076 100644 (file)
@@ -57,23 +57,38 @@ using namespace std;
 //Should this be AlphaISA?
 using namespace TheISA;
 
-TsunamiIO::RTC::RTC(const string &n, Tsunami* tsunami, time_t t, Tick i)
-    : _name(n), event(tsunami, i), addr(0)
+TsunamiIO::RTC::RTC(const string &n, Tsunami* tsunami, const vector<int> &t,
+                    bool bcd, Tick i)
+    : _name(n), event(tsunami, i), addr(0), year_is_bcd(bcd)
 {
     memset(clock_data, 0, sizeof(clock_data));
     stat_regA = RTCA_32768HZ | RTCA_1024HZ;
     stat_regB = RTCB_PRDC_IE |RTCB_BIN | RTCB_24HR;
 
     struct tm tm;
-    gmtime_r(&t, &tm);
+    parseTime(t, &tm);
 
-    sec = tm.tm_sec;
-    min = tm.tm_min;
+    year = tm.tm_year;
+
+    if (year_is_bcd) {
+        // The datasheet says that the year field can be either BCD or
+        // years since 1900.  Linux seems to be happy with years since
+        // 1900.
+        year = year % 100;
+        int tens = year / 10;
+        int ones = year % 10;
+        year = (tens << 4) + ones;
+    }
+
+    // Unix is 0-11 for month, data seet says start at 1
+    mon = tm.tm_mon + 1;
+    mday = tm.tm_mday;
     hour = tm.tm_hour;
+    min = tm.tm_min;
+    sec = tm.tm_sec;
+
+    // Datasheet says 1 is sunday
     wday = tm.tm_wday + 1;
-    mday = tm.tm_mday;
-    mon = tm.tm_mon + 1;
-    year = tm.tm_year;
 
     DPRINTFN("Real-time clock set to %s", asctime(&tm));
 }
@@ -424,7 +439,8 @@ TsunamiIO::PITimer::Counter::CounterEvent::description()
 
 TsunamiIO::TsunamiIO(Params *p)
     : BasicPioDevice(p), tsunami(p->tsunami), pitimer(p->name + "pitimer"),
-      rtc(p->name + ".rtc", p->tsunami, p->init_time, p->frequency)
+      rtc(p->name + ".rtc", p->tsunami, p->init_time, p->year_is_bcd,
+          p->frequency)
 {
     pioSize = 0x100;
 
@@ -445,7 +461,6 @@ TsunamiIO::frequency() const
 Tick
 TsunamiIO::read(PacketPtr pkt)
 {
-    assert(pkt->result == Packet::Unknown);
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
 
     Addr daddr = pkt->getAddr() - pioAddr;
@@ -504,14 +519,13 @@ TsunamiIO::read(PacketPtr pkt)
     } else {
        panic("I/O Read - invalid size - va %#x size %d\n", pkt->getAddr(), pkt->getSize());
     }
-    pkt->result = Packet::Success;
+    pkt->makeAtomicResponse();
     return pioDelay;
 }
 
 Tick
 TsunamiIO::write(PacketPtr pkt)
 {
-    assert(pkt->result == Packet::Unknown);
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
     Addr daddr = pkt->getAddr() - pioAddr;
 
@@ -584,7 +598,7 @@ TsunamiIO::write(PacketPtr pkt)
         panic("I/O Write - va%#x size %d data %#x\n", pkt->getAddr(), pkt->getSize(), pkt->get<uint8_t>());
     }
 
-    pkt->result = Packet::Success;
+    pkt->makeAtomicResponse();
     return pioDelay;
 }
 
@@ -649,7 +663,8 @@ BEGIN_DECLARE_SIM_OBJECT_PARAMS(TsunamiIO)
     Param<Tick> frequency;
     SimObjectParam<Platform *> platform;
     SimObjectParam<System *> system;
-    Param<time_t> time;
+    VectorParam<int> time;
+    Param<bool> year_is_bcd;
     SimObjectParam<Tsunami *> tsunami;
 
 END_DECLARE_SIM_OBJECT_PARAMS(TsunamiIO)
@@ -662,6 +677,7 @@ BEGIN_INIT_SIM_OBJECT_PARAMS(TsunamiIO)
     INIT_PARAM(platform, "platform"),
     INIT_PARAM(system, "system object"),
     INIT_PARAM(time, "System time to use (0 for actual time"),
+    INIT_PARAM(year_is_bcd, ""),
     INIT_PARAM(tsunami, "Tsunami")
 
 END_INIT_SIM_OBJECT_PARAMS(TsunamiIO)
@@ -676,6 +692,7 @@ CREATE_SIM_OBJECT(TsunamiIO)
     p->platform = platform;
     p->system = system;
     p->init_time = time;
+    p->year_is_bcd = year_is_bcd;
     p->tsunami = tsunami;
     return new TsunamiIO(p);
 }