41
#define DPRINTF(fmt, args...) \
42
do { printf("ESP: " fmt , ##args); } while (0)
41
#define DPRINTF(fmt, ...) \
42
do { printf("ESP: " fmt , ## __VA_ARGS__); } while (0)
44
#define DPRINTF(fmt, args...) do {} while (0)
44
#define DPRINTF(fmt, ...) do {} while (0)
47
#define ESP_ERROR(fmt, ...) \
48
do { printf("ESP ERROR: %s: " fmt, __func__ , ## __VA_ARGS__); } while (0)
47
50
#define ESP_REGS 16
50
53
typedef struct ESPState ESPState;
55
59
uint8_t rregs[ESP_REGS];
167
dmalen = s->rregs[ESP_TCLO] | (s->rregs[ESP_TCMID] << 8);
168
target = s->wregs[ESP_WBUSID] & 7;
169
DPRINTF("get_cmd: len %d target %d\n", dmalen, target);
173
target = s->wregs[ESP_WBUSID] & BUSID_DID;
175
dmalen = s->rregs[ESP_TCLO] | (s->rregs[ESP_TCMID] << 8);
171
176
s->dma_memory_read(s->dma_opaque, buf, dmalen);
179
memcpy(buf, s->ti_buf, dmalen);
174
memcpy(&buf[1], s->ti_buf, dmalen);
182
DPRINTF("get_cmd: len %d target %d\n", dmalen, target);
418
424
static uint32_t esp_mem_readb(void *opaque, target_phys_addr_t addr)
420
426
ESPState *s = opaque;
427
uint32_t saddr, old_val;
423
saddr = (addr >> s->it_shift) & (ESP_REGS - 1);
429
saddr = addr >> s->it_shift;
424
430
DPRINTF("read reg[%d]: 0x%2.2x\n", saddr, s->rregs[saddr]);
427
433
if (s->ti_size > 0) {
429
435
if ((s->rregs[ESP_RSTAT] & STAT_PIO_MASK) == 0) {
431
fprintf(stderr, "esp: PIO data read not implemented\n");
437
ESP_ERROR("PIO data read not implemented\n");
432
438
s->rregs[ESP_FIFO] = 0;
434
440
s->rregs[ESP_FIFO] = s->ti_buf[s->ti_rptr++];
521
532
s->rregs[ESP_RINTR] = INTR_DC;
522
533
s->rregs[ESP_RSEQ] = 0;
536
DPRINTF("Transfer padding (%2.2x)\n", val);
537
s->rregs[ESP_RSTAT] = STAT_TC;
538
s->rregs[ESP_RINTR] = INTR_FC;
539
s->rregs[ESP_RSEQ] = 0;
525
542
DPRINTF("Set ATN (%2.2x)\n", val);
545
DPRINTF("Select without ATN (%2.2x)\n", val);
528
DPRINTF("Set ATN (%2.2x)\n", val);
549
DPRINTF("Select with ATN (%2.2x)\n", val);
531
552
case CMD_SELATNS:
532
DPRINTF("Set ATN & stop (%2.2x)\n", val);
553
DPRINTF("Select with ATN & stop (%2.2x)\n", val);
533
554
handle_satn_stop(s);
536
557
DPRINTF("Enable selection (%2.2x)\n", val);
558
s->rregs[ESP_RINTR] = 0;
539
DPRINTF("Unhandled ESP command (%2.2x)\n", val);
561
ESP_ERROR("Unhandled ESP command (%2.2x)\n", val);
548
570
case ESP_WCCF ... ESP_WTEST:
551
s->rregs[saddr] = val & CFG2_MASK;
553
case ESP_CFG3 ... ESP_RES4:
572
case ESP_CFG2 ... ESP_RES4:
554
573
s->rregs[saddr] = val;
576
ESP_ERROR("invalid write of 0x%02x at [0x%x]\n", val, saddr);
559
579
s->wregs[saddr] = val;
562
static CPUReadMemoryFunc *esp_mem_read[3] = {
582
static CPUReadMemoryFunc * const esp_mem_read[3] = {
568
static CPUWriteMemoryFunc *esp_mem_write[3] = {
588
static CPUWriteMemoryFunc * const esp_mem_write[3] = {
574
594
static void esp_save(QEMUFile *f, void *opaque)
578
598
qemu_put_buffer(f, s->rregs, ESP_REGS);
579
599
qemu_put_buffer(f, s->wregs, ESP_REGS);
580
qemu_put_be32s(f, (uint32_t *)&s->ti_size);
600
qemu_put_sbe32s(f, &s->ti_size);
581
601
qemu_put_be32s(f, &s->ti_rptr);
582
602
qemu_put_be32s(f, &s->ti_wptr);
583
603
qemu_put_buffer(f, s->ti_buf, TI_BUFSZ);
600
620
qemu_get_buffer(f, s->rregs, ESP_REGS);
601
621
qemu_get_buffer(f, s->wregs, ESP_REGS);
602
qemu_get_be32s(f, (uint32_t *)&s->ti_size);
622
qemu_get_sbe32s(f, &s->ti_size);
603
623
qemu_get_be32s(f, &s->ti_rptr);
604
624
qemu_get_be32s(f, &s->ti_wptr);
605
625
qemu_get_buffer(f, s->ti_buf, TI_BUFSZ);
616
void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id)
636
static void esp_scsi_attach(DeviceState *host, BlockDriverState *bd, int id)
618
ESPState *s = (ESPState *)opaque;
638
ESPState *s = FROM_SYSBUS(ESPState, sysbus_from_qdev(host));
621
641
for (id = 0; id < ESP_MAX_DEVS; id++) {
642
if (id == (s->rregs[ESP_CFG1] & 0x7))
622
644
if (s->scsi_dev[id] == NULL)
638
660
s->scsi_dev[id] = scsi_disk_init(bd, 0, esp_command_complete, s);
641
void *esp_init(target_phys_addr_t espaddr, int it_shift,
642
espdma_memory_read_write dma_memory_read,
643
espdma_memory_read_write dma_memory_write,
644
void *dma_opaque, qemu_irq irq, qemu_irq *reset)
663
void esp_init(target_phys_addr_t espaddr, int it_shift,
664
espdma_memory_read_write dma_memory_read,
665
espdma_memory_read_write dma_memory_write,
666
void *dma_opaque, qemu_irq irq, qemu_irq *reset)
672
dev = qdev_create(NULL, "esp");
673
esp = DO_UPCAST(ESPState, busdev.qdev, dev);
674
esp->dma_memory_read = dma_memory_read;
675
esp->dma_memory_write = dma_memory_write;
676
esp->dma_opaque = dma_opaque;
677
esp->it_shift = it_shift;
679
s = sysbus_from_qdev(dev);
680
sysbus_connect_irq(s, 0, irq);
681
sysbus_mmio_map(s, 0, espaddr);
682
*reset = qdev_get_gpio_in(dev, 0);
685
static int esp_init1(SysBusDevice *dev)
687
ESPState *s = FROM_SYSBUS(ESPState, dev);
647
688
int esp_io_memory;
649
s = qemu_mallocz(sizeof(ESPState));
654
s->it_shift = it_shift;
655
s->dma_memory_read = dma_memory_read;
656
s->dma_memory_write = dma_memory_write;
657
s->dma_opaque = dma_opaque;
659
esp_io_memory = cpu_register_io_memory(0, esp_mem_read, esp_mem_write, s);
660
cpu_register_physical_memory(espaddr, ESP_REGS << it_shift, esp_io_memory);
690
sysbus_init_irq(dev, &s->irq);
691
assert(s->it_shift != -1);
693
esp_io_memory = cpu_register_io_memory(esp_mem_read, esp_mem_write, s);
694
sysbus_init_mmio(dev, ESP_REGS << s->it_shift, esp_io_memory);
664
register_savevm("esp", espaddr, 3, esp_save, esp_load, s);
698
register_savevm("esp", -1, 3, esp_save, esp_load, s);
665
699
qemu_register_reset(esp_reset, s);
667
*reset = *qemu_allocate_irqs(parent_esp_reset, s, 1);
701
qdev_init_gpio_in(&dev->qdev, parent_esp_reset, 1);
703
scsi_bus_new(&dev->qdev, esp_scsi_attach);
707
static void esp_register_devices(void)
709
sysbus_register_dev("esp", sizeof(ESPState), esp_init1);
712
device_init(esp_register_devices)