dev, arm: Warn on PL011 DMA disable
authorJan-Peter Larsson <jan-peter.larsson@arm.com>
Thu, 20 Dec 2018 15:55:56 +0000 (15:55 +0000)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Fri, 4 Jan 2019 13:24:40 +0000 (13:24 +0000)
The PL011 spec specifies a DMACR register at offset 0x48, which isn't
implemented in the model. Currently any attempt to access the register
results in a panic.

This change swaps the panic for a warning only when software writes into
DMACR to disable DMA, keeping the panic otherwise.

Change-Id: I04586b52df8d5d174536276fd7ae19e77ff4681a
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/15279
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>

src/dev/arm/pl011.cc [changed mode: 0644->0755]
src/dev/arm/pl011.hh [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index fe73d96..2e80045
@@ -133,6 +133,10 @@ Pl011::read(PacketPtr pkt)
         DPRINTF(Uart, "Reading Masked Int status as 0x%x\n", maskInt());
         data = maskInt();
         break;
+      case UART_DMACR:
+        warn("PL011: DMA not supported\n");
+        data = 0x0; // DMA never enabled
+        break;
       default:
         if (readId(pkt, AMBA_ID, pioAddr)) {
             // Hack for variable size accesses
@@ -239,6 +243,14 @@ Pl011::write(PacketPtr pkt)
             dataAvailable();
         }
         break;
+      case UART_DMACR:
+        // DMA is not supported, so panic if anyome tries to enable it.
+        // Bits 0, 1, 2 enables DMA on RX, TX, ERR respectively, others res0.
+        if (data & 0x7) {
+            panic("Tried to enable DMA on PL011\n");
+        }
+        warn("PL011: DMA not supported\n");
+        break;
       default:
         panic("Tried to write PL011 at offset %#x that doesn't exist\n", daddr);
         break;
old mode 100644 (file)
new mode 100755 (executable)
index 5a92d88..dac2f68
@@ -135,6 +135,7 @@ class Pl011 : public Uart, public AmbaDevice
     static const int UART_RIS  = 0x03C;
     static const int UART_MIS  = 0x040;
     static const int UART_ICR  = 0x044;
+    static const int UART_DMACR = 0x048;
 
     static const uint16_t UART_RIINTR = 1 << 0;
     static const uint16_t UART_CTSINTR = 1 << 1;