mirror of https://github.com/proxmox/mirror_qemu
Let ESP SCSI adapter to be usable outside sun4m (Herv�oussineau)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4007 c046a42c-6fe2-441c-8c8c-71466251a162master
parent
e1ffb0f18f
commit
8b17de88e0
|
@ -514,7 +514,7 @@ LIBS += $(CONFIG_VNC_TLS_LIBS)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# SCSI layer
|
# SCSI layer
|
||||||
OBJS+= lsi53c895a.o
|
OBJS+= lsi53c895a.o esp.o
|
||||||
|
|
||||||
# USB layer
|
# USB layer
|
||||||
OBJS+= usb-ohci.o
|
OBJS+= usb-ohci.o
|
||||||
|
@ -576,7 +576,7 @@ OBJS+= fdc.o mc146818rtc.o serial.o m48t59.o
|
||||||
OBJS+= cirrus_vga.o parallel.o ptimer.o
|
OBJS+= cirrus_vga.o parallel.o ptimer.o
|
||||||
else
|
else
|
||||||
OBJS+= sun4m.o tcx.o pcnet.o iommu.o m48t59.o slavio_intctl.o
|
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
|
OBJS+= cs4231.o ptimer.o eccmemctl.o sbi.o sun4c_intctl.o
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
21
hw/esp.c
21
hw/esp.c
|
@ -24,9 +24,7 @@
|
||||||
#include "hw.h"
|
#include "hw.h"
|
||||||
#include "block.h"
|
#include "block.h"
|
||||||
#include "scsi-disk.h"
|
#include "scsi-disk.h"
|
||||||
#include "sun4m.h"
|
#include "scsi.h"
|
||||||
/* FIXME: Only needed for MAX_DISKS, which is probably wrong. */
|
|
||||||
#include "sysemu.h"
|
|
||||||
|
|
||||||
/* debug ESP card */
|
/* debug ESP card */
|
||||||
//#define DEBUG_ESP
|
//#define DEBUG_ESP
|
||||||
|
@ -75,6 +73,9 @@ struct ESPState {
|
||||||
uint32_t dma_counter;
|
uint32_t dma_counter;
|
||||||
uint8_t *async_buf;
|
uint8_t *async_buf;
|
||||||
uint32_t async_len;
|
uint32_t async_len;
|
||||||
|
|
||||||
|
espdma_memory_read_write dma_memory_read;
|
||||||
|
espdma_memory_read_write dma_memory_write;
|
||||||
void *dma_opaque;
|
void *dma_opaque;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -152,7 +153,7 @@ static int get_cmd(ESPState *s, uint8_t *buf)
|
||||||
target = s->wregs[ESP_WBUSID] & 7;
|
target = s->wregs[ESP_WBUSID] & 7;
|
||||||
DPRINTF("get_cmd: len %d target %d\n", dmalen, target);
|
DPRINTF("get_cmd: len %d target %d\n", dmalen, target);
|
||||||
if (s->dma) {
|
if (s->dma) {
|
||||||
espdma_memory_read(s->dma_opaque, buf, dmalen);
|
s->dma_memory_read(s->dma_opaque, buf, dmalen);
|
||||||
} else {
|
} else {
|
||||||
buf[0] = 0;
|
buf[0] = 0;
|
||||||
memcpy(&buf[1], s->ti_buf, dmalen);
|
memcpy(&buf[1], s->ti_buf, dmalen);
|
||||||
|
@ -236,7 +237,7 @@ static void write_response(ESPState *s)
|
||||||
s->ti_buf[0] = s->sense;
|
s->ti_buf[0] = s->sense;
|
||||||
s->ti_buf[1] = 0;
|
s->ti_buf[1] = 0;
|
||||||
if (s->dma) {
|
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_RSTAT] = STAT_IN | STAT_TC | STAT_ST;
|
||||||
s->rregs[ESP_RINTR] = INTR_BS | INTR_FC;
|
s->rregs[ESP_RINTR] = INTR_BS | INTR_FC;
|
||||||
s->rregs[ESP_RSEQ] = SEQ_CD;
|
s->rregs[ESP_RSEQ] = SEQ_CD;
|
||||||
|
@ -269,7 +270,7 @@ static void esp_do_dma(ESPState *s)
|
||||||
len = s->dma_left;
|
len = s->dma_left;
|
||||||
if (s->do_cmd) {
|
if (s->do_cmd) {
|
||||||
DPRINTF("command len %d + %d\n", s->cmdlen, len);
|
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->ti_size = 0;
|
||||||
s->cmdlen = 0;
|
s->cmdlen = 0;
|
||||||
s->do_cmd = 0;
|
s->do_cmd = 0;
|
||||||
|
@ -284,9 +285,9 @@ static void esp_do_dma(ESPState *s)
|
||||||
len = s->async_len;
|
len = s->async_len;
|
||||||
}
|
}
|
||||||
if (to_device) {
|
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 {
|
} 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->dma_left -= len;
|
||||||
s->async_buf += len;
|
s->async_buf += len;
|
||||||
|
@ -621,6 +622,8 @@ void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id)
|
||||||
}
|
}
|
||||||
|
|
||||||
void *esp_init(target_phys_addr_t espaddr,
|
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)
|
void *dma_opaque, qemu_irq irq, qemu_irq *reset)
|
||||||
{
|
{
|
||||||
ESPState *s;
|
ESPState *s;
|
||||||
|
@ -631,6 +634,8 @@ void *esp_init(target_phys_addr_t espaddr,
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
s->irq = irq;
|
s->irq = irq;
|
||||||
|
s->dma_memory_read = dma_memory_read;
|
||||||
|
s->dma_memory_write = dma_memory_write;
|
||||||
s->dma_opaque = dma_opaque;
|
s->dma_opaque = dma_opaque;
|
||||||
|
|
||||||
esp_io_memory = cpu_register_io_memory(0, esp_mem_read, esp_mem_write, s);
|
esp_io_memory = cpu_register_io_memory(0, esp_mem_read, esp_mem_write, s);
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
/* 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);
|
16
hw/sun4m.c
16
hw/sun4m.c
|
@ -31,6 +31,7 @@
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
#include "boards.h"
|
#include "boards.h"
|
||||||
#include "firmware_abi.h"
|
#include "firmware_abi.h"
|
||||||
|
#include "scsi.h"
|
||||||
|
|
||||||
//#define DEBUG_IRQ
|
//#define DEBUG_IRQ
|
||||||
|
|
||||||
|
@ -505,8 +506,9 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int RAM_size,
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
main_esp = esp_init(hwdef->esp_base, espdma, *espdma_irq,
|
main_esp = esp_init(hwdef->esp_base,
|
||||||
esp_reset);
|
espdma_memory_read, espdma_memory_write,
|
||||||
|
espdma, *espdma_irq, esp_reset);
|
||||||
|
|
||||||
for (i = 0; i < ESP_MAX_DEVS; i++) {
|
for (i = 0; i < ESP_MAX_DEVS; i++) {
|
||||||
index = drive_get_index(IF_SCSI, 0, i);
|
index = drive_get_index(IF_SCSI, 0, i);
|
||||||
|
@ -653,8 +655,9 @@ static void sun4c_hw_init(const struct hwdef *hwdef, int RAM_size,
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
main_esp = esp_init(hwdef->esp_base, espdma, *espdma_irq,
|
main_esp = esp_init(hwdef->esp_base,
|
||||||
esp_reset);
|
espdma_memory_read, espdma_memory_write,
|
||||||
|
espdma, *espdma_irq, esp_reset);
|
||||||
|
|
||||||
for (i = 0; i < ESP_MAX_DEVS; i++) {
|
for (i = 0; i < ESP_MAX_DEVS; i++) {
|
||||||
index = drive_get_index(IF_SCSI, 0, i);
|
index = drive_get_index(IF_SCSI, 0, i);
|
||||||
|
@ -1158,8 +1161,9 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, int RAM_size,
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
main_esp = esp_init(hwdef->esp_base, espdma, *espdma_irq,
|
main_esp = esp_init(hwdef->esp_base,
|
||||||
esp_reset);
|
espdma_memory_read, espdma_memory_write,
|
||||||
|
espdma, *espdma_irq, esp_reset);
|
||||||
|
|
||||||
for (i = 0; i < ESP_MAX_DEVS; i++) {
|
for (i = 0; i < ESP_MAX_DEVS; i++) {
|
||||||
index = drive_get_index(IF_SCSI, 0, i);
|
index = drive_get_index(IF_SCSI, 0, i);
|
||||||
|
|
|
@ -59,12 +59,6 @@ void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base,
|
||||||
CPUState *env);
|
CPUState *env);
|
||||||
void slavio_set_power_fail(void *opaque, int power_failing);
|
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 */
|
/* cs4231.c */
|
||||||
void cs_init(target_phys_addr_t base, int irq, void *intctl);
|
void cs_init(target_phys_addr_t base, int irq, void *intctl);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue