Merge zizzer:/bk/m5 into zeep.eecs.umich.edu:/z/saidi/work/m5-smp
[gem5.git] / dev / uart.cc
index 4784ad640c073e775b744d999d5b3ec19642649c..b71ab2d448fa9b278bb7c6240950c221cf48a049 100644 (file)
@@ -88,17 +88,18 @@ Uart::IntrEvent::scheduleIntr()
 }
 
 Uart::Uart(const string &name, SimConsole *c, MemoryController *mmu, Addr a,
-                         Addr s, HierParams *hier, Bus *bus, Platform *p)
+           Addr s, HierParams *hier, Bus *bus, Tick pio_latency, Platform *p)
     : PioDevice(name), addr(a), size(s), cons(c), txIntrEvent(this, TX_INT),
       rxIntrEvent(this, RX_INT), platform(p)
 {
-    mmu->add_child(this, Range<Addr>(addr, addr + size));
+    mmu->add_child(this, RangeSize(addr, size));
 
 
     if (bus) {
         pioInterface = newPioInterface(name, hier, bus, this,
                                       &Uart::cacheAccess);
-         pioInterface->addAddrRange(addr, addr + size - 1);
+        pioInterface->addAddrRange(RangeSize(addr, size));
+        pioLatency = pio_latency * bus->clockRatio;
     }
 
     readAddr = 0;
@@ -286,7 +287,7 @@ Uart::write(MemReqPtr &req, const uint8_t *data)
     switch (daddr) {
         case 0x0:
             if (!(LCR & 0x80)) { // write byte
-                cons->out(*(uint64_t *)data);
+                cons->out(*(uint8_t *)data);
                 platform->clearConsoleInt();
                 status &= ~TX_INT;
                 if (UART_IER_THRI & IER)
@@ -370,7 +371,7 @@ Uart::dataAvailable()
 Tick
 Uart::cacheAccess(MemReqPtr &req)
 {
-    return curTick + 1000;
+    return curTick + pioLatency;
 }
 
 void
@@ -394,7 +395,7 @@ Uart::serialize(ostream &os)
     if (txIntrEvent.scheduled())
         txintrwhen = txIntrEvent.when();
     else
-        rxintrwhen = 0;
+        txintrwhen = 0;
      SERIALIZE_SCALAR(rxintrwhen);
      SERIALIZE_SCALAR(txintrwhen);
 #endif
@@ -432,6 +433,7 @@ BEGIN_DECLARE_SIM_OBJECT_PARAMS(Uart)
     Param<Addr> addr;
     Param<Addr> size;
     SimObjectParam<Bus*> io_bus;
+    Param<Tick> pio_latency;
     SimObjectParam<HierParams *> hier;
 
 
@@ -445,6 +447,7 @@ BEGIN_INIT_SIM_OBJECT_PARAMS(Uart)
     INIT_PARAM(addr, "Device Address"),
     INIT_PARAM_DFLT(size, "Device size", 0x8),
     INIT_PARAM_DFLT(io_bus, "The IO Bus to attach to", NULL),
+    INIT_PARAM_DFLT(pio_latency, "Programmed IO latency in bus cycles", 1),
     INIT_PARAM_DFLT(hier, "Hierarchy global variables", &defaultHierParams)
 
 END_INIT_SIM_OBJECT_PARAMS(Uart)
@@ -452,7 +455,7 @@ END_INIT_SIM_OBJECT_PARAMS(Uart)
 CREATE_SIM_OBJECT(Uart)
 {
     return new Uart(getInstanceName(), console, mmu, addr, size, hier, io_bus,
-                    platform);
+                    pio_latency, platform);
 }
 
 REGISTER_SIM_OBJECT("Uart", Uart)