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 | ... | ... |