qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 25/25] esp: add 4 byte PDMA read and write transfers


From: Mark Cave-Ayland
Subject: [PATCH 25/25] esp: add 4 byte PDMA read and write transfers
Date: Wed, 30 Dec 2020 15:37:45 +0000

The MacOS toolbox ROM performs 4 byte reads/writes when transferring data to
and from the target.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/scsi/esp.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
index 773fe09c49..b356a65f5c 100644
--- a/hw/scsi/esp.c
+++ b/hw/scsi/esp.c
@@ -933,6 +933,12 @@ static void sysbus_esp_pdma_write(void *opaque, hwaddr 
addr,
         esp_pdma_write(s, val >> 8);
         esp_pdma_write(s, val);
         break;
+    case 4:
+        esp_pdma_write(s, val >> 24);
+        esp_pdma_write(s, val >> 16);
+        esp_pdma_write(s, val >> 8);
+        esp_pdma_write(s, val);
+        break;
     }
     dmalen = esp_get_tc(s);
     if (dmalen == 0 || (s->ti_wptr == TI_BUFSZ)) {
@@ -957,6 +963,12 @@ static uint64_t sysbus_esp_pdma_read(void *opaque, hwaddr 
addr,
         val = esp_pdma_read(s);
         val = (val << 8) | esp_pdma_read(s);
         break;
+    case 4:
+        val = esp_pdma_read(s);
+        val = (val << 8) | esp_pdma_read(s);
+        val = (val << 8) | esp_pdma_read(s);
+        val = (val << 8) | esp_pdma_read(s);
+        break;
     }
     if (s->ti_rptr == s->ti_wptr) {
         s->ti_wptr = 0;
@@ -971,7 +983,7 @@ static const MemoryRegionOps sysbus_esp_pdma_ops = {
     .write = sysbus_esp_pdma_write,
     .endianness = DEVICE_NATIVE_ENDIAN,
     .valid.min_access_size = 1,
-    .valid.max_access_size = 2,
+    .valid.max_access_size = 4,
 };
 
 static const struct SCSIBusInfo esp_scsi_info = {
@@ -1014,7 +1026,7 @@ static void sysbus_esp_realize(DeviceState *dev, Error 
**errp)
                           sysbus, "esp-regs", ESP_REGS << sysbus->it_shift);
     sysbus_init_mmio(sbd, &sysbus->iomem);
     memory_region_init_io(&sysbus->pdma, OBJECT(sysbus), &sysbus_esp_pdma_ops,
-                          sysbus, "esp-pdma", 2);
+                          sysbus, "esp-pdma", 4);
     sysbus_init_mmio(sbd, &sysbus->pdma);
 
     qdev_init_gpio_in(dev, sysbus_esp_gpio_demux, 2);
-- 
2.20.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]