]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Hardware SCSI chip emulation updates.
authorToni Wilen <twilen@winuae.net>
Mon, 28 Jul 2014 16:45:56 +0000 (19:45 +0300)
committerToni Wilen <twilen@winuae.net>
Mon, 28 Jul 2014 16:45:56 +0000 (19:45 +0300)
ncr_scsi.cpp
qemuvga/lsi53c710.cpp
qemuvga/lsi53c895a.cpp
qemuvga/qemuuaeglue.h
qemuvga/scsi/esp.h
qemuvga/scsi/scsi.h
scsi.cpp

index 14fced0770a827a4011ec25b1ae575943c60307d..b7594726a1a825748424617ca715b35a93fb40f7 100644 (file)
@@ -163,7 +163,7 @@ int32_t scsi_req_enqueue(SCSIRequest *req)
        scsi_emulate_analyze(sd);
        //write_log (_T("%02x.%02x.%02x.%02x.%02x.%02x\n"), sd->cmd[0], sd->cmd[1], sd->cmd[2], sd->cmd[3], sd->cmd[4], sd->cmd[5]);
 
-       if (sd->direction < 0)
+       if (sd->direction <= 0)
                scsi_emulate_cmd(sd);
        if (sd->direction == 0)
                return 1;
@@ -254,7 +254,7 @@ int32_t scsi710_req_enqueue(SCSIRequest *req)
        scsi_emulate_analyze (sd);
        //write_log (_T("%02x.%02x.%02x.%02x.%02x.%02x\n"), sd->cmd[0], sd->cmd[1], sd->cmd[2], sd->cmd[3], sd->cmd[4], sd->cmd[5]);
        
-       if (sd->direction < 0)
+       if (sd->direction <= 0)
                scsi_emulate_cmd(sd);
        if (sd->direction == 0)
                return 1;
@@ -375,12 +375,18 @@ static uae_u32 REGPARAM2 ncr_lget (struct ncr_state *ncr, uaecptr addr)
        special_mem |= S_READ;
 #endif
        addr &= ncr->board_mask;
-       if (addr >= A4091_IO_ALT) {
-               v = (ncr_bget2 (ncr, addr + 3) << 0) | (ncr_bget2 (ncr, addr + 2) << 8) |
-                       (ncr_bget2 (ncr, addr + 1) << 16) | (ncr_bget2 (ncr, addr + 0) << 24);
+       if (ncr == &ncr_we) {
+               addr &= ~0x80;
+               v = (ncr_bget2(ncr, addr + 3) << 0) | (ncr_bget2(ncr, addr + 2) << 8) |
+                       (ncr_bget2(ncr, addr + 1) << 16) | (ncr_bget2(ncr, addr + 0) << 24);
        } else {
-               v = (ncr_bget2 (ncr, addr + 3) << 0) | (ncr_bget2 (ncr, addr + 2) << 8) |
-                       (ncr_bget2 (ncr, addr + 1) << 16) | (ncr_bget2 (ncr, addr + 0) << 24);
+               if (addr >= A4091_IO_ALT) {
+                       v = (ncr_bget2 (ncr, addr + 3) << 0) | (ncr_bget2 (ncr, addr + 2) << 8) |
+                               (ncr_bget2 (ncr, addr + 1) << 16) | (ncr_bget2 (ncr, addr + 0) << 24);
+               } else {
+                       v = (ncr_bget2 (ncr, addr + 3) << 0) | (ncr_bget2 (ncr, addr + 2) << 8) |
+                               (ncr_bget2 (ncr, addr + 1) << 16) | (ncr_bget2 (ncr, addr + 0) << 24);
+               }
        }
        return v;
 }
@@ -420,16 +426,24 @@ static void REGPARAM2 ncr_lput (struct ncr_state *ncr, uaecptr addr, uae_u32 l)
        special_mem |= S_WRITE;
 #endif
        addr &= ncr->board_mask;
-       if (addr >= A4091_IO_ALT) {
-               ncr_bput2 (ncr, addr + 3, l >> 0);
-               ncr_bput2 (ncr, addr + 2, l >> 8);
-               ncr_bput2 (ncr, addr + 1, l >> 16);
-               ncr_bput2 (ncr, addr + 0, l >> 24);
+       if (ncr == &ncr_we) {
+               addr &= ~0x80;
+               ncr_bput2(ncr, addr + 3, l >> 0);
+               ncr_bput2(ncr, addr + 2, l >> 8);
+               ncr_bput2(ncr, addr + 1, l >> 16);
+               ncr_bput2(ncr, addr + 0, l >> 24);
        } else {
-               ncr_bput2 (ncr, addr + 3, l >> 0);
-               ncr_bput2 (ncr, addr + 2, l >> 8);
-               ncr_bput2 (ncr, addr + 1, l >> 16);
-               ncr_bput2 (ncr, addr + 0, l >> 24);
+               if (addr >= A4091_IO_ALT) {
+                       ncr_bput2 (ncr, addr + 3, l >> 0);
+                       ncr_bput2 (ncr, addr + 2, l >> 8);
+                       ncr_bput2 (ncr, addr + 1, l >> 16);
+                       ncr_bput2 (ncr, addr + 0, l >> 24);
+               } else {
+                       ncr_bput2 (ncr, addr + 3, l >> 0);
+                       ncr_bput2 (ncr, addr + 2, l >> 8);
+                       ncr_bput2 (ncr, addr + 1, l >> 16);
+                       ncr_bput2 (ncr, addr + 0, l >> 24);
+               }
        }
 }
 
@@ -751,7 +765,7 @@ static void ncr710_reset_board (struct ncr_state *ncr)
 }
 
 static const uae_u8 warpengine_a4000_autoconfig[16] = {
-       0x90, 0x13, 0x75, 0x00, 0x08, 0x9b, 0x00, 0x19, 0x01, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00
+       0x90, 0x13, 0x75, 0x00, 0x08, 0x9b, 0x00, 0x19, 0x02, 0x0e, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00
 };
 #define WARP_ENGINE_ROM_SIZE 32768
 
@@ -770,7 +784,7 @@ addrbank *ncr710_warpengine_autoconfig_init(void)
        ncr->rom_offset = 0;
        ncr->rom_end = WARP_ENGINE_ROM_SIZE * 4;
        ncr->io_start = WARP_ENGINE_IO_OFFSET;
-       ncr->io_start = WARP_ENGINE_IO_END;
+       ncr->io_end = WARP_ENGINE_IO_END;
 
        struct romlist *rl = getromlistbyids(roms);
        if (rl) {
@@ -784,7 +798,7 @@ addrbank *ncr710_warpengine_autoconfig_init(void)
        ncr->rom = xcalloc (uae_u8, WARP_ENGINE_ROM_SIZE * 4);
        if (z) {
                for (int i = 0; i < WARP_ENGINE_ROM_SIZE; i++) {
-                       uae_u8 b;
+                       uae_u8 b = 0xff;
                        zfile_fread(&b, 1, 1, z);
                        ncr->rom[i * 4 + 0] = b | 0x0f;
                        ncr->rom[i * 4 + 1] = 0xff;
@@ -807,10 +821,8 @@ addrbank *ncr710_a4091_autoconfig_init (int devnum)
        struct ncr_state *ncr = ncra4091[devnum];
        int roms[3];
 
-       if (!ncr->enabled && devnum > 0) {
-               expamem_next();
-               return NULL;
-       }
+       if (!ncr->enabled && devnum > 0)
+               return &expamem_null;
 
        roms[0] = 58;
        roms[1] = 57;
index 3c46995af9c59f8499bd69dce81339a34d43e1ac..51967bc82713cc4f5ca723367028709fc2c3353b 100644 (file)
@@ -284,7 +284,7 @@ static void lsi_soft_reset(LSIState *s)
 {
     DPRINTF("Reset\n");
     s->carry = 0;
-       memset (s, 0, sizeof LSIState);
+       memset (s, 0, sizeof(LSIState));
 
     s->msg_action = 0;
     s->msg_len = 0;
@@ -625,7 +625,7 @@ static void lsi_request_free(LSIState *s, lsi_request *p)
     g_free(p);
 }
 
-void lsi_request_cancelled(SCSIRequest *req)
+void lsi710_request_cancelled(SCSIRequest *req)
 {
     LSIState *s = LSI53C895A(req->bus->qbus.parent);
     lsi_request *p = (lsi_request*)req->hba_private;
index 5be343e1f172a0f82a61e4544056e886a54642f9..348fbd2dd3a0c1906de56ae87231dcca054f45f8 100644 (file)
@@ -34,7 +34,7 @@ do { write_log("lsi_scsi: error: " fmt , ## __VA_ARGS__); } while (0)
 #else
 #define DPRINTF(fmt, ...) do {} while(0)
 #define BADF(fmt, ...) \
-do { write_log("lsi_scsi: error: " fmt , ## __VA_ARGS__); activate_debugger();} while (0)
+do { write_log("lsi_scsi: error: " fmt , ## __VA_ARGS__); } while (0)
 #endif
 
 #define LSI_MAX_DEVS 7
index af143a0af533f8bef4390f0cf9f2b4a41b68a1ef..5a936dde7a7a55d6f02282e5281180fda9a1f652 100644 (file)
@@ -374,3 +374,9 @@ extern uint64_t lsi710_mmio_read(void *opaque, hwaddr addr, unsigned size);
 
 extern void lsi_mmio_write(void *opaque, hwaddr addr, uint64_t val, unsigned size);
 extern uint64_t lsi_mmio_read(void *opaque, hwaddr addr, unsigned size);
+
+// ESP
+
+typedef void *qemu_irq;
+typedef void* SysBusDevice;
+
index e079fb8d16c16452848a3394ff68fa6b6bca189e..221abb5c21312d72363b8e1001bff297c43f3e5c 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef QEMU_HW_ESP_H
 #define QEMU_HW_ESP_H
 
-#include "hw/scsi/scsi.h"
-
 /* esp.c */
 #define ESP_MAX_DEVS 7
 typedef void (*ESPDMAMemoryReadWriteFunc)(void *opaque, uint8_t *buf, int len);
@@ -129,4 +127,26 @@ uint64_t esp_reg_read(ESPState *s, uint32_t saddr);
 void esp_reg_write(ESPState *s, uint32_t saddr, uint64_t val);
 extern const VMStateDescription vmstate_esp;
 
+extern void esp_irq_raise(qemu_irq);
+extern void esp_irq_lower(qemu_irq);
+
+void scsiesp_req_continue(SCSIRequest *req);
+SCSIRequest *scsiesp_req_new(SCSIDevice *d, uint32_t tag, uint32_t lun, uint8_t *buf, void *hba_private);
+int32_t scsiesp_req_enqueue(SCSIRequest *req);
+void scsiesp_req_unref(SCSIRequest *req);
+uint8_t *scsiesp_req_get_buf(SCSIRequest *req);
+SCSIDevice *scsiesp_device_find(SCSIBus *bus, int channel, int target, int lun);
+void scsiesp_req_cancel(SCSIRequest *req);
+
+uint64_t esp_reg_read(void *s, uint32_t saddr);
+void esp_reg_write(void *s, uint32_t saddr, uint64_t val);
+
+void esp_dma_enable(void *opaque, int level);
+
+void esp_request_cancelled(SCSIRequest *req);
+void esp_command_complete(SCSIRequest *req, uint32_t status, size_t resid);
+void esp_transfer_data(SCSIRequest *req, uint32_t len);
+void esp_scsi_init(DeviceState *dev, ESPDMAMemoryReadWriteFunc read, ESPDMAMemoryReadWriteFunc write);
+void esp_scsi_reset(DeviceState *dev, void *privdata);
+
 #endif
index f4d73215cf6681aa2786afae22af0861e0e5cb0a..2517588fc9d10609927f7da7e0446fa97e402830 100644 (file)
@@ -278,5 +278,4 @@ void lsi710_request_cancelled(SCSIRequest *req);
 void lsi710_command_complete(SCSIRequest *req, uint32_t status, size_t resid);
 void lsi710_transfer_data(SCSIRequest *req, uint32_t len);
 
-
 #endif
index 28e9aa6c76977ae0610a211a14718c4452f5ff8b..60b835f39aa758ea2256f15687a6b39f3cd1d2cb 100644 (file)
--- a/scsi.cpp
+++ b/scsi.cpp
@@ -314,3 +314,99 @@ int scsi_receive_data(struct scsi_data *sd, uae_u8 *b)
                return 1; // requested length got
        return 0;
 }
+
+// raw scsi
+#define SCSI_SIGNAL_PHASE_DATA_OUT 0
+#define SCSI_SIGNAL_PHASE_DATA_IN 1
+#define SCSI_SIGNAL_PHASE_COMMAND 2
+#define SCSI_SIGNAL_PHASE_STATUS 3
+#define SCSI_SIGNAL_PHASE_MESSAGE_OUT 6
+#define SCSI_SIGNAL_PHASE_MESSAGE_IN 7
+
+#define SCSI_BUS_PHASE_FREE 0
+#define SCSI_BUS_PHASE_ARBITRATION 1
+#define SCSI_BUS_PHASE_SELECTION 2
+#define SCSI_BUS_PHASE_RESELECTION 3
+#define SCSI_BUS_PHASE_COMMAND 4
+#define SCSI_BUS_PHASE_DATA_IN 5
+#define SCSI_BUS_PHASE_DATA_OUT 6
+#define SCSI_BUS_PHASE_STATUS 7
+#define SCSI_BUS_PHASE_MESSAGE_IN 8
+#define SCSI_BUS_PHASE_MESSAGE_OUT 9
+
+struct raw_scsi_device
+{
+       int x;
+       int id;
+};
+struct raw_scsi
+{
+       int signal_phase;
+       int old_signal_phase;
+       int bus_phase;
+       uae_u8 data;
+       int initiator;
+       int target;
+       uae_u8 cmd[16];
+       int len;
+       struct raw_scsi_device *device[8];
+};
+
+struct raw_scsi *new_raw_scsi(void)
+{
+       struct raw_scsi *rs = xcalloc(struct raw_scsi, 1);
+       return rs;
+}
+
+void free_raw_scsi(struct raw_scsi *rs)
+{
+       if (!rs)
+               return;
+       for (int i = 0; i < 8; i++)
+               xfree(rs->device[i]);
+       xfree(rs);
+}
+
+struct raw_scsi_device *new_raw_scsi_device(struct raw_scsi *rs, int id)
+{
+       rs->device[id] = xcalloc(struct raw_scsi_device, 1);
+       rs->device[id]->id = id;
+       return rs->device[id];
+}
+
+void free_raw_scsi_device(struct raw_scsi *rs, struct raw_scsi_device *dev)
+{
+       if (!dev)
+               return;
+       rs->device[dev->id] = NULL;
+       xfree(dev);
+}
+
+int raw_scsi_get_signal_phase(struct raw_scsi *rs, struct raw_scsi_device *dev)
+{
+       return rs->signal_phase;
+}
+
+void raw_scsi_put_signal_phase(struct raw_scsi *rs, struct raw_scsi_device *dev, uae_u8 phase)
+{
+       if (rs->signal_phase == phase)
+               return;
+       rs->old_signal_phase = rs->signal_phase;
+       rs->signal_phase = phase;
+       switch(rs->bus_phase)
+       {
+       case SCSI_BUS_PHASE_FREE:
+
+               break;
+       
+       }
+}
+
+uae_u16 raw_scsi_get_data(struct raw_scsi *rs, struct raw_scsi_device *dev)
+{
+       return rs->data;
+}
+
+void raw_scsi_put_data(struct raw_scsi *rs, struct raw_scsi_device *dev, uae_u16 data)
+{
+}