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,7 +514,7 @@ LIBS += $(CONFIG_VNC_TLS_LIBS) | ||
| 514 | endif | 514 | endif |
| 515 | 515 | ||
| 516 | # SCSI layer | 516 | # SCSI layer |
| 517 | -OBJS+= lsi53c895a.o | 517 | +OBJS+= lsi53c895a.o esp.o |
| 518 | 518 | ||
| 519 | # USB layer | 519 | # USB layer |
| 520 | OBJS+= usb-ohci.o | 520 | OBJS+= usb-ohci.o |
| @@ -576,7 +576,7 @@ OBJS+= fdc.o mc146818rtc.o serial.o m48t59.o | @@ -576,7 +576,7 @@ OBJS+= fdc.o mc146818rtc.o serial.o m48t59.o | ||
| 576 | OBJS+= cirrus_vga.o parallel.o ptimer.o | 576 | OBJS+= cirrus_vga.o parallel.o ptimer.o |
| 577 | else | 577 | else |
| 578 | OBJS+= sun4m.o tcx.o pcnet.o iommu.o m48t59.o slavio_intctl.o | 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 | OBJS+= cs4231.o ptimer.o eccmemctl.o sbi.o sun4c_intctl.o | 580 | OBJS+= cs4231.o ptimer.o eccmemctl.o sbi.o sun4c_intctl.o |
| 581 | endif | 581 | endif |
| 582 | endif | 582 | endif |
hw/esp.c
| @@ -24,9 +24,7 @@ | @@ -24,9 +24,7 @@ | ||
| 24 | #include "hw.h" | 24 | #include "hw.h" |
| 25 | #include "block.h" | 25 | #include "block.h" |
| 26 | #include "scsi-disk.h" | 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 | /* debug ESP card */ | 29 | /* debug ESP card */ |
| 32 | //#define DEBUG_ESP | 30 | //#define DEBUG_ESP |
| @@ -75,6 +73,9 @@ struct ESPState { | @@ -75,6 +73,9 @@ struct ESPState { | ||
| 75 | uint32_t dma_counter; | 73 | uint32_t dma_counter; |
| 76 | uint8_t *async_buf; | 74 | uint8_t *async_buf; |
| 77 | uint32_t async_len; | 75 | uint32_t async_len; |
| 76 | + | ||
| 77 | + espdma_memory_read_write dma_memory_read; | ||
| 78 | + espdma_memory_read_write dma_memory_write; | ||
| 78 | void *dma_opaque; | 79 | void *dma_opaque; |
| 79 | }; | 80 | }; |
| 80 | 81 | ||
| @@ -152,7 +153,7 @@ static int get_cmd(ESPState *s, uint8_t *buf) | @@ -152,7 +153,7 @@ static int get_cmd(ESPState *s, uint8_t *buf) | ||
| 152 | target = s->wregs[ESP_WBUSID] & 7; | 153 | target = s->wregs[ESP_WBUSID] & 7; |
| 153 | DPRINTF("get_cmd: len %d target %d\n", dmalen, target); | 154 | DPRINTF("get_cmd: len %d target %d\n", dmalen, target); |
| 154 | if (s->dma) { | 155 | if (s->dma) { |
| 155 | - espdma_memory_read(s->dma_opaque, buf, dmalen); | 156 | + s->dma_memory_read(s->dma_opaque, buf, dmalen); |
| 156 | } else { | 157 | } else { |
| 157 | buf[0] = 0; | 158 | buf[0] = 0; |
| 158 | memcpy(&buf[1], s->ti_buf, dmalen); | 159 | memcpy(&buf[1], s->ti_buf, dmalen); |
| @@ -236,7 +237,7 @@ static void write_response(ESPState *s) | @@ -236,7 +237,7 @@ static void write_response(ESPState *s) | ||
| 236 | s->ti_buf[0] = s->sense; | 237 | s->ti_buf[0] = s->sense; |
| 237 | s->ti_buf[1] = 0; | 238 | s->ti_buf[1] = 0; |
| 238 | if (s->dma) { | 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 | s->rregs[ESP_RSTAT] = STAT_IN | STAT_TC | STAT_ST; | 241 | s->rregs[ESP_RSTAT] = STAT_IN | STAT_TC | STAT_ST; |
| 241 | s->rregs[ESP_RINTR] = INTR_BS | INTR_FC; | 242 | s->rregs[ESP_RINTR] = INTR_BS | INTR_FC; |
| 242 | s->rregs[ESP_RSEQ] = SEQ_CD; | 243 | s->rregs[ESP_RSEQ] = SEQ_CD; |
| @@ -269,7 +270,7 @@ static void esp_do_dma(ESPState *s) | @@ -269,7 +270,7 @@ static void esp_do_dma(ESPState *s) | ||
| 269 | len = s->dma_left; | 270 | len = s->dma_left; |
| 270 | if (s->do_cmd) { | 271 | if (s->do_cmd) { |
| 271 | DPRINTF("command len %d + %d\n", s->cmdlen, len); | 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 | s->ti_size = 0; | 274 | s->ti_size = 0; |
| 274 | s->cmdlen = 0; | 275 | s->cmdlen = 0; |
| 275 | s->do_cmd = 0; | 276 | s->do_cmd = 0; |
| @@ -284,9 +285,9 @@ static void esp_do_dma(ESPState *s) | @@ -284,9 +285,9 @@ static void esp_do_dma(ESPState *s) | ||
| 284 | len = s->async_len; | 285 | len = s->async_len; |
| 285 | } | 286 | } |
| 286 | if (to_device) { | 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 | } else { | 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 | s->dma_left -= len; | 292 | s->dma_left -= len; |
| 292 | s->async_buf += len; | 293 | s->async_buf += len; |
| @@ -621,6 +622,8 @@ void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id) | @@ -621,6 +622,8 @@ void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id) | ||
| 621 | } | 622 | } |
| 622 | 623 | ||
| 623 | void *esp_init(target_phys_addr_t espaddr, | 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 | void *dma_opaque, qemu_irq irq, qemu_irq *reset) | 627 | void *dma_opaque, qemu_irq irq, qemu_irq *reset) |
| 625 | { | 628 | { |
| 626 | ESPState *s; | 629 | ESPState *s; |
| @@ -631,6 +634,8 @@ void *esp_init(target_phys_addr_t espaddr, | @@ -631,6 +634,8 @@ void *esp_init(target_phys_addr_t espaddr, | ||
| 631 | return NULL; | 634 | return NULL; |
| 632 | 635 | ||
| 633 | s->irq = irq; | 636 | s->irq = irq; |
| 637 | + s->dma_memory_read = dma_memory_read; | ||
| 638 | + s->dma_memory_write = dma_memory_write; | ||
| 634 | s->dma_opaque = dma_opaque; | 639 | s->dma_opaque = dma_opaque; |
| 635 | 640 | ||
| 636 | esp_io_memory = cpu_register_io_memory(0, esp_mem_read, esp_mem_write, s); | 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,6 +31,7 @@ | ||
| 31 | #include "net.h" | 31 | #include "net.h" |
| 32 | #include "boards.h" | 32 | #include "boards.h" |
| 33 | #include "firmware_abi.h" | 33 | #include "firmware_abi.h" |
| 34 | +#include "scsi.h" | ||
| 34 | 35 | ||
| 35 | //#define DEBUG_IRQ | 36 | //#define DEBUG_IRQ |
| 36 | 37 | ||
| @@ -505,8 +506,9 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, | @@ -505,8 +506,9 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, | ||
| 505 | exit(1); | 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 | for (i = 0; i < ESP_MAX_DEVS; i++) { | 513 | for (i = 0; i < ESP_MAX_DEVS; i++) { |
| 512 | index = drive_get_index(IF_SCSI, 0, i); | 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,8 +655,9 @@ static void sun4c_hw_init(const struct hwdef *hwdef, int RAM_size, | ||
| 653 | exit(1); | 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 | for (i = 0; i < ESP_MAX_DEVS; i++) { | 662 | for (i = 0; i < ESP_MAX_DEVS; i++) { |
| 660 | index = drive_get_index(IF_SCSI, 0, i); | 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,8 +1161,9 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, int RAM_size, | ||
| 1158 | exit(1); | 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 | for (i = 0; i < ESP_MAX_DEVS; i++) { | 1168 | for (i = 0; i < ESP_MAX_DEVS; i++) { |
| 1165 | index = drive_get_index(IF_SCSI, 0, i); | 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,12 +59,6 @@ void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, | ||
| 59 | CPUState *env); | 59 | CPUState *env); |
| 60 | void slavio_set_power_fail(void *opaque, int power_failing); | 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 | /* cs4231.c */ | 62 | /* cs4231.c */ |
| 69 | void cs_init(target_phys_addr_t base, int irq, void *intctl); | 63 | void cs_init(target_phys_addr_t base, int irq, void *intctl); |
| 70 | 64 |