endif
# SCSI layer
-OBJS+= lsi53c895a.o
+OBJS+= lsi53c895a.o esp.o
# USB layer
OBJS+= usb-ohci.o
OBJS+= cirrus_vga.o parallel.o ptimer.o
else
OBJS+= sun4m.o tcx.o pcnet.o iommu.o m48t59.o slavio_intctl.o
-OBJS+= slavio_timer.o slavio_serial.o slavio_misc.o fdc.o esp.o sparc32_dma.o
+OBJS+= slavio_timer.o slavio_serial.o slavio_misc.o fdc.o sparc32_dma.o
OBJS+= cs4231.o ptimer.o eccmemctl.o sbi.o sun4c_intctl.o
endif
endif
#include "hw.h"
#include "block.h"
#include "scsi-disk.h"
-#include "sun4m.h"
-/* FIXME: Only needed for MAX_DISKS, which is probably wrong. */
-#include "sysemu.h"
+#include "scsi.h"
/* debug ESP card */
//#define DEBUG_ESP
uint32_t dma_counter;
uint8_t *async_buf;
uint32_t async_len;
+
+ espdma_memory_read_write dma_memory_read;
+ espdma_memory_read_write dma_memory_write;
void *dma_opaque;
};
target = s->wregs[ESP_WBUSID] & 7;
DPRINTF("get_cmd: len %d target %d\n", dmalen, target);
if (s->dma) {
- espdma_memory_read(s->dma_opaque, buf, dmalen);
+ s->dma_memory_read(s->dma_opaque, buf, dmalen);
} else {
buf[0] = 0;
memcpy(&buf[1], s->ti_buf, dmalen);
s->ti_buf[0] = s->sense;
s->ti_buf[1] = 0;
if (s->dma) {
- espdma_memory_write(s->dma_opaque, s->ti_buf, 2);
+ s->dma_memory_write(s->dma_opaque, s->ti_buf, 2);
s->rregs[ESP_RSTAT] = STAT_IN | STAT_TC | STAT_ST;
s->rregs[ESP_RINTR] = INTR_BS | INTR_FC;
s->rregs[ESP_RSEQ] = SEQ_CD;
len = s->dma_left;
if (s->do_cmd) {
DPRINTF("command len %d + %d\n", s->cmdlen, len);
- espdma_memory_read(s->dma_opaque, &s->cmdbuf[s->cmdlen], len);
+ s->dma_memory_read(s->dma_opaque, &s->cmdbuf[s->cmdlen], len);
s->ti_size = 0;
s->cmdlen = 0;
s->do_cmd = 0;
len = s->async_len;
}
if (to_device) {
- espdma_memory_read(s->dma_opaque, s->async_buf, len);
+ s->dma_memory_read(s->dma_opaque, s->async_buf, len);
} else {
- espdma_memory_write(s->dma_opaque, s->async_buf, len);
+ s->dma_memory_write(s->dma_opaque, s->async_buf, len);
}
s->dma_left -= len;
s->async_buf += len;
}
void *esp_init(target_phys_addr_t espaddr,
+ espdma_memory_read_write dma_memory_read,
+ espdma_memory_read_write dma_memory_write,
void *dma_opaque, qemu_irq irq, qemu_irq *reset)
{
ESPState *s;
return NULL;
s->irq = irq;
+ s->dma_memory_read = dma_memory_read;
+ s->dma_memory_write = dma_memory_write;
s->dma_opaque = dma_opaque;
esp_io_memory = cpu_register_io_memory(0, esp_mem_read, esp_mem_write, s);
--- /dev/null
+/* esp.c */
+#define ESP_MAX_DEVS 7
+typedef void (*espdma_memory_read_write)(void *opaque, uint8_t *buf, int len);
+void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id);
+void *esp_init(target_phys_addr_t espaddr,
+ espdma_memory_read_write dma_memory_read,
+ espdma_memory_read_write dma_memory_write,
+ void *dma_opaque, qemu_irq irq, qemu_irq *reset);
#include "net.h"
#include "boards.h"
#include "firmware_abi.h"
+#include "scsi.h"
//#define DEBUG_IRQ
exit(1);
}
- main_esp = esp_init(hwdef->esp_base, espdma, *espdma_irq,
- esp_reset);
+ main_esp = esp_init(hwdef->esp_base,
+ espdma_memory_read, espdma_memory_write,
+ espdma, *espdma_irq, esp_reset);
for (i = 0; i < ESP_MAX_DEVS; i++) {
index = drive_get_index(IF_SCSI, 0, i);
exit(1);
}
- main_esp = esp_init(hwdef->esp_base, espdma, *espdma_irq,
- esp_reset);
+ main_esp = esp_init(hwdef->esp_base,
+ espdma_memory_read, espdma_memory_write,
+ espdma, *espdma_irq, esp_reset);
for (i = 0; i < ESP_MAX_DEVS; i++) {
index = drive_get_index(IF_SCSI, 0, i);
exit(1);
}
- main_esp = esp_init(hwdef->esp_base, espdma, *espdma_irq,
- esp_reset);
+ main_esp = esp_init(hwdef->esp_base,
+ espdma_memory_read, espdma_memory_write,
+ espdma, *espdma_irq, esp_reset);
for (i = 0; i < ESP_MAX_DEVS; i++) {
index = drive_get_index(IF_SCSI, 0, i);
CPUState *env);
void slavio_set_power_fail(void *opaque, int power_failing);
-/* esp.c */
-#define ESP_MAX_DEVS 7
-void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id);
-void *esp_init(target_phys_addr_t espaddr,
- void *dma_opaque, qemu_irq irq, qemu_irq *reset);
-
/* cs4231.c */
void cs_init(target_phys_addr_t base, int irq, void *intctl);