Commit 8b17de88e0dbe05a4ed2b6b7c9f402857a584930
1 parent
e1ffb0f1
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-71466251a162
Showing
5 changed files
with
33 additions
and
22 deletions
Makefile.target
... | ... | @@ -514,7 +514,7 @@ LIBS += $(CONFIG_VNC_TLS_LIBS) |
514 | 514 | endif |
515 | 515 | |
516 | 516 | # SCSI layer |
517 | -OBJS+= lsi53c895a.o | |
517 | +OBJS+= lsi53c895a.o esp.o | |
518 | 518 | |
519 | 519 | # USB layer |
520 | 520 | OBJS+= usb-ohci.o |
... | ... | @@ -576,7 +576,7 @@ OBJS+= fdc.o mc146818rtc.o serial.o m48t59.o |
576 | 576 | OBJS+= cirrus_vga.o parallel.o ptimer.o |
577 | 577 | else |
578 | 578 | OBJS+= sun4m.o tcx.o pcnet.o iommu.o m48t59.o slavio_intctl.o |
579 | -OBJS+= slavio_timer.o slavio_serial.o slavio_misc.o fdc.o esp.o sparc32_dma.o | |
579 | +OBJS+= slavio_timer.o slavio_serial.o slavio_misc.o fdc.o sparc32_dma.o | |
580 | 580 | OBJS+= cs4231.o ptimer.o eccmemctl.o sbi.o sun4c_intctl.o |
581 | 581 | endif |
582 | 582 | endif | ... | ... |
hw/esp.c
... | ... | @@ -24,9 +24,7 @@ |
24 | 24 | #include "hw.h" |
25 | 25 | #include "block.h" |
26 | 26 | #include "scsi-disk.h" |
27 | -#include "sun4m.h" | |
28 | -/* FIXME: Only needed for MAX_DISKS, which is probably wrong. */ | |
29 | -#include "sysemu.h" | |
27 | +#include "scsi.h" | |
30 | 28 | |
31 | 29 | /* debug ESP card */ |
32 | 30 | //#define DEBUG_ESP |
... | ... | @@ -75,6 +73,9 @@ struct ESPState { |
75 | 73 | uint32_t dma_counter; |
76 | 74 | uint8_t *async_buf; |
77 | 75 | uint32_t async_len; |
76 | + | |
77 | + espdma_memory_read_write dma_memory_read; | |
78 | + espdma_memory_read_write dma_memory_write; | |
78 | 79 | void *dma_opaque; |
79 | 80 | }; |
80 | 81 | |
... | ... | @@ -152,7 +153,7 @@ static int get_cmd(ESPState *s, uint8_t *buf) |
152 | 153 | target = s->wregs[ESP_WBUSID] & 7; |
153 | 154 | DPRINTF("get_cmd: len %d target %d\n", dmalen, target); |
154 | 155 | if (s->dma) { |
155 | - espdma_memory_read(s->dma_opaque, buf, dmalen); | |
156 | + s->dma_memory_read(s->dma_opaque, buf, dmalen); | |
156 | 157 | } else { |
157 | 158 | buf[0] = 0; |
158 | 159 | memcpy(&buf[1], s->ti_buf, dmalen); |
... | ... | @@ -236,7 +237,7 @@ static void write_response(ESPState *s) |
236 | 237 | s->ti_buf[0] = s->sense; |
237 | 238 | s->ti_buf[1] = 0; |
238 | 239 | if (s->dma) { |
239 | - espdma_memory_write(s->dma_opaque, s->ti_buf, 2); | |
240 | + s->dma_memory_write(s->dma_opaque, s->ti_buf, 2); | |
240 | 241 | s->rregs[ESP_RSTAT] = STAT_IN | STAT_TC | STAT_ST; |
241 | 242 | s->rregs[ESP_RINTR] = INTR_BS | INTR_FC; |
242 | 243 | s->rregs[ESP_RSEQ] = SEQ_CD; |
... | ... | @@ -269,7 +270,7 @@ static void esp_do_dma(ESPState *s) |
269 | 270 | len = s->dma_left; |
270 | 271 | if (s->do_cmd) { |
271 | 272 | DPRINTF("command len %d + %d\n", s->cmdlen, len); |
272 | - espdma_memory_read(s->dma_opaque, &s->cmdbuf[s->cmdlen], len); | |
273 | + s->dma_memory_read(s->dma_opaque, &s->cmdbuf[s->cmdlen], len); | |
273 | 274 | s->ti_size = 0; |
274 | 275 | s->cmdlen = 0; |
275 | 276 | s->do_cmd = 0; |
... | ... | @@ -284,9 +285,9 @@ static void esp_do_dma(ESPState *s) |
284 | 285 | len = s->async_len; |
285 | 286 | } |
286 | 287 | if (to_device) { |
287 | - espdma_memory_read(s->dma_opaque, s->async_buf, len); | |
288 | + s->dma_memory_read(s->dma_opaque, s->async_buf, len); | |
288 | 289 | } else { |
289 | - espdma_memory_write(s->dma_opaque, s->async_buf, len); | |
290 | + s->dma_memory_write(s->dma_opaque, s->async_buf, len); | |
290 | 291 | } |
291 | 292 | s->dma_left -= len; |
292 | 293 | s->async_buf += len; |
... | ... | @@ -621,6 +622,8 @@ void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id) |
621 | 622 | } |
622 | 623 | |
623 | 624 | void *esp_init(target_phys_addr_t espaddr, |
625 | + espdma_memory_read_write dma_memory_read, | |
626 | + espdma_memory_read_write dma_memory_write, | |
624 | 627 | void *dma_opaque, qemu_irq irq, qemu_irq *reset) |
625 | 628 | { |
626 | 629 | ESPState *s; |
... | ... | @@ -631,6 +634,8 @@ void *esp_init(target_phys_addr_t espaddr, |
631 | 634 | return NULL; |
632 | 635 | |
633 | 636 | s->irq = irq; |
637 | + s->dma_memory_read = dma_memory_read; | |
638 | + s->dma_memory_write = dma_memory_write; | |
634 | 639 | s->dma_opaque = dma_opaque; |
635 | 640 | |
636 | 641 | esp_io_memory = cpu_register_io_memory(0, esp_mem_read, esp_mem_write, s); | ... | ... |
hw/scsi.h
0 → 100644
1 | +/* esp.c */ | |
2 | +#define ESP_MAX_DEVS 7 | |
3 | +typedef void (*espdma_memory_read_write)(void *opaque, uint8_t *buf, int len); | |
4 | +void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id); | |
5 | +void *esp_init(target_phys_addr_t espaddr, | |
6 | + espdma_memory_read_write dma_memory_read, | |
7 | + espdma_memory_read_write dma_memory_write, | |
8 | + void *dma_opaque, qemu_irq irq, qemu_irq *reset); | ... | ... |
hw/sun4m.c
... | ... | @@ -31,6 +31,7 @@ |
31 | 31 | #include "net.h" |
32 | 32 | #include "boards.h" |
33 | 33 | #include "firmware_abi.h" |
34 | +#include "scsi.h" | |
34 | 35 | |
35 | 36 | //#define DEBUG_IRQ |
36 | 37 | |
... | ... | @@ -505,8 +506,9 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, |
505 | 506 | exit(1); |
506 | 507 | } |
507 | 508 | |
508 | - main_esp = esp_init(hwdef->esp_base, espdma, *espdma_irq, | |
509 | - esp_reset); | |
509 | + main_esp = esp_init(hwdef->esp_base, | |
510 | + espdma_memory_read, espdma_memory_write, | |
511 | + espdma, *espdma_irq, esp_reset); | |
510 | 512 | |
511 | 513 | for (i = 0; i < ESP_MAX_DEVS; i++) { |
512 | 514 | index = drive_get_index(IF_SCSI, 0, i); |
... | ... | @@ -653,8 +655,9 @@ static void sun4c_hw_init(const struct hwdef *hwdef, int RAM_size, |
653 | 655 | exit(1); |
654 | 656 | } |
655 | 657 | |
656 | - main_esp = esp_init(hwdef->esp_base, espdma, *espdma_irq, | |
657 | - esp_reset); | |
658 | + main_esp = esp_init(hwdef->esp_base, | |
659 | + espdma_memory_read, espdma_memory_write, | |
660 | + espdma, *espdma_irq, esp_reset); | |
658 | 661 | |
659 | 662 | for (i = 0; i < ESP_MAX_DEVS; i++) { |
660 | 663 | 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, |
1158 | 1161 | exit(1); |
1159 | 1162 | } |
1160 | 1163 | |
1161 | - main_esp = esp_init(hwdef->esp_base, espdma, *espdma_irq, | |
1162 | - esp_reset); | |
1164 | + main_esp = esp_init(hwdef->esp_base, | |
1165 | + espdma_memory_read, espdma_memory_write, | |
1166 | + espdma, *espdma_irq, esp_reset); | |
1163 | 1167 | |
1164 | 1168 | for (i = 0; i < ESP_MAX_DEVS; i++) { |
1165 | 1169 | index = drive_get_index(IF_SCSI, 0, i); | ... | ... |
hw/sun4m.h
... | ... | @@ -59,12 +59,6 @@ void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, |
59 | 59 | CPUState *env); |
60 | 60 | void slavio_set_power_fail(void *opaque, int power_failing); |
61 | 61 | |
62 | -/* esp.c */ | |
63 | -#define ESP_MAX_DEVS 7 | |
64 | -void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id); | |
65 | -void *esp_init(target_phys_addr_t espaddr, | |
66 | - void *dma_opaque, qemu_irq irq, qemu_irq *reset); | |
67 | - | |
68 | 62 | /* cs4231.c */ |
69 | 63 | void cs_init(target_phys_addr_t base, int irq, void *intctl); |
70 | 64 | ... | ... |