From: Toni Wilen Date: Mon, 28 Jul 2014 16:45:56 +0000 (+0300) Subject: Hardware SCSI chip emulation updates. X-Git-Tag: 3000~116 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=70ae0c7e08be8e88cd4bc10eff69e51c3ec1fa15;p=francis%2Fwinuae.git Hardware SCSI chip emulation updates. --- diff --git a/ncr_scsi.cpp b/ncr_scsi.cpp index 14fced07..b7594726 100644 --- a/ncr_scsi.cpp +++ b/ncr_scsi.cpp @@ -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; diff --git a/qemuvga/lsi53c710.cpp b/qemuvga/lsi53c710.cpp index 3c46995a..51967bc8 100644 --- a/qemuvga/lsi53c710.cpp +++ b/qemuvga/lsi53c710.cpp @@ -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; diff --git a/qemuvga/lsi53c895a.cpp b/qemuvga/lsi53c895a.cpp index 5be343e1..348fbd2d 100644 --- a/qemuvga/lsi53c895a.cpp +++ b/qemuvga/lsi53c895a.cpp @@ -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 diff --git a/qemuvga/qemuuaeglue.h b/qemuvga/qemuuaeglue.h index af143a0a..5a936dde 100644 --- a/qemuvga/qemuuaeglue.h +++ b/qemuvga/qemuuaeglue.h @@ -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; + diff --git a/qemuvga/scsi/esp.h b/qemuvga/scsi/esp.h index e079fb8d..221abb5c 100644 --- a/qemuvga/scsi/esp.h +++ b/qemuvga/scsi/esp.h @@ -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 diff --git a/qemuvga/scsi/scsi.h b/qemuvga/scsi/scsi.h index f4d73215..2517588f 100644 --- a/qemuvga/scsi/scsi.h +++ b/qemuvga/scsi/scsi.h @@ -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 diff --git a/scsi.cpp b/scsi.cpp index 28e9aa6c..60b835f3 100644 --- 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) +{ +}