]> xenbits.xensource.com Git - qemu-xen-4.3-testing.git/commitdiff
Let ESP SCSI adapter to be usable outside sun4m (Herv�oussineau)
authorblueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162>
Sun, 2 Mar 2008 08:48:47 +0000 (08:48 +0000)
committerblueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162>
Sun, 2 Mar 2008 08:48:47 +0000 (08:48 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4007 c046a42c-6fe2-441c-8c8c-71466251a162

Makefile.target
hw/esp.c
hw/scsi.h [new file with mode: 0644]
hw/sun4m.c
hw/sun4m.h

index 704d55b6611a9c30a60d7591d140345687532b5b..d60869db43290c11bd4328b1fbf25289526355dc 100644 (file)
@@ -514,7 +514,7 @@ LIBS += $(CONFIG_VNC_TLS_LIBS)
 endif
 
 # SCSI layer
-OBJS+= lsi53c895a.o
+OBJS+= lsi53c895a.o esp.o
 
 # USB layer
 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
 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
index c70132113471233c1a3f07aa3dd120f476da5761..bcd90fbb5eb939e544c30c4f3d8ca2ede91e3614 100644 (file)
--- a/hw/esp.c
+++ b/hw/esp.c
@@ -24,9 +24,7 @@
 #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
@@ -75,6 +73,9 @@ struct ESPState {
     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;
 };
 
@@ -152,7 +153,7 @@ static int get_cmd(ESPState *s, uint8_t *buf)
     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);
@@ -236,7 +237,7 @@ static void write_response(ESPState *s)
     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;
@@ -269,7 +270,7 @@ static void esp_do_dma(ESPState *s)
     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;
@@ -284,9 +285,9 @@ static void esp_do_dma(ESPState *s)
         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;
@@ -621,6 +622,8 @@ 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)
 {
     ESPState *s;
@@ -631,6 +634,8 @@ void *esp_init(target_phys_addr_t espaddr,
         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);
diff --git a/hw/scsi.h b/hw/scsi.h
new file mode 100644 (file)
index 0000000..a90927f
--- /dev/null
+++ b/hw/scsi.h
@@ -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);
index e4717c485c00d79430d681c5faaf9d04ad6228c6..79130c13da30604d44e26691cfa2f7052448dfa6 100644 (file)
@@ -31,6 +31,7 @@
 #include "net.h"
 #include "boards.h"
 #include "firmware_abi.h"
+#include "scsi.h"
 
 //#define DEBUG_IRQ
 
@@ -505,8 +506,9 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int RAM_size,
         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);
@@ -653,8 +655,9 @@ static void sun4c_hw_init(const struct hwdef *hwdef, int RAM_size,
         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);
@@ -1158,8 +1161,9 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, int RAM_size,
         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);
index 484e3e860e1ec20616d790107b7cdd6d1ae994b1..bf2eca31e25bd786908936b6579f21a15806f7e9 100644 (file)
@@ -59,12 +59,6 @@ void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base,
                        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);