dev-arm: Reduce boilerplate when read/writing to Pio devices
authorGiacomo Travaglini <giacomo.travaglini@arm.com>
Tue, 12 Jan 2021 15:07:02 +0000 (15:07 +0000)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Mon, 8 Feb 2021 14:54:39 +0000 (14:54 +0000)
Change-Id: Id59ac950f37d7f4f2642daf324d501da1ee622de
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/40775
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/dev/arm/pl011.cc
src/dev/arm/rtc_pl031.cc
src/dev/arm/ufs_device.cc

index ea7641615458cbd81772845782bbd002f86e1e26..cfe241ddd3d951e24501123ae776098b55615002 100755 (executable)
@@ -64,6 +64,7 @@ Tick
 Pl011::read(PacketPtr pkt)
 {
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
+    assert(pkt->getSize() <= 4);
 
     Addr daddr = pkt->getAddr() - pioAddr;
 
@@ -145,22 +146,7 @@ Pl011::read(PacketPtr pkt)
         break;
     }
 
-    switch(pkt->getSize()) {
-      case 1:
-        pkt->setLE<uint8_t>(data);
-        break;
-      case 2:
-        pkt->setLE<uint16_t>(data);
-        break;
-      case 4:
-        pkt->setLE<uint32_t>(data);
-        break;
-      default:
-        panic("Uart read size too big?\n");
-        break;
-    }
-
-
+    pkt->setUintX(data, ByteOrder::little);
     pkt->makeAtomicResponse();
     return pioDelay;
 }
@@ -170,6 +156,7 @@ Pl011::write(PacketPtr pkt)
 {
 
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
+    assert(pkt->getSize() <= 4);
 
     Addr daddr = pkt->getAddr() - pioAddr;
 
@@ -179,23 +166,7 @@ Pl011::write(PacketPtr pkt)
     // use a temporary data since the uart registers are read/written with
     // different size operations
     //
-    uint32_t data = 0;
-
-    switch(pkt->getSize()) {
-      case 1:
-        data = pkt->getLE<uint8_t>();
-        break;
-      case 2:
-        data = pkt->getLE<uint16_t>();
-        break;
-      case 4:
-        data = pkt->getLE<uint32_t>();
-        break;
-      default:
-        panic("Uart write size too big?\n");
-        break;
-    }
-
+    const uint32_t data = pkt->getUintX(ByteOrder::little);
 
     switch (daddr) {
         case UART_DR:
index a6cdc7df65f88881b1d7731e32461959bd0a4692..de84384c19750d7813aa52c61698663028f556a9 100644 (file)
@@ -61,7 +61,7 @@ Tick
 PL031::read(PacketPtr pkt)
 {
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
-    assert(pkt->getSize() == 4);
+    assert(pkt->getSize() <= 4);
     Addr daddr = pkt->getAddr() - pioAddr;
     uint32_t data;
 
@@ -99,22 +99,7 @@ PL031::read(PacketPtr pkt)
         break;
     }
 
-    switch(pkt->getSize()) {
-      case 1:
-        pkt->setLE<uint8_t>(data);
-        break;
-      case 2:
-        pkt->setLE<uint16_t>(data);
-        break;
-      case 4:
-        pkt->setLE<uint32_t>(data);
-        break;
-      default:
-        panic("Uart read size too big?\n");
-        break;
-    }
-
-
+    pkt->setUintX(data, ByteOrder::little);
     pkt->makeAtomicResponse();
     return pioDelay;
 }
@@ -123,7 +108,7 @@ Tick
 PL031::write(PacketPtr pkt)
 {
     assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
-    assert(pkt->getSize() == 4);
+    assert(pkt->getSize() <= 4);
     Addr daddr = pkt->getAddr() - pioAddr;
     DPRINTF(Timer, "Writing to RTC at offset: %#x\n", daddr);
 
index 1406e4afc8992d5d731783fd41f4bb5e41ac12a1..e04cb39faa9164c099ee614f555976775e008b1a 100644 (file)
@@ -1029,26 +1029,9 @@ UFSHostDevice::read(PacketPtr pkt)
 Tick
 UFSHostDevice::write(PacketPtr pkt)
 {
-    uint32_t data = 0;
-
-    switch (pkt->getSize()) {
-
-      case 1:
-        data = pkt->getLE<uint8_t>();
-        break;
-
-      case 2:
-        data = pkt->getLE<uint16_t>();
-        break;
+    assert(pkt->getSize() <= 4);
 
-      case 4:
-        data = pkt->getLE<uint32_t>();
-        break;
-
-      default:
-        panic("Undefined UFSHCD controller write size!\n");
-        break;
-    }
+    const uint32_t data = pkt->getUintX(ByteOrder::little);
 
     switch (pkt->getAddr() & 0xFF)
     {