Commit cfb9de9ce48d108cfc56052dc9bc402a6197c199
1 parent
418dcf5b
ESP SCSI qdev conversion
Signed-off-by: Paul Brook <paul@codesourcery.com>
Showing
4 changed files
with
61 additions
and
70 deletions
hw/esp.c
... | ... | @@ -22,7 +22,7 @@ |
22 | 22 | * THE SOFTWARE. |
23 | 23 | */ |
24 | 24 | |
25 | -#include "hw.h" | |
25 | +#include "sysbus.h" | |
26 | 26 | #include "scsi-disk.h" |
27 | 27 | #include "scsi.h" |
28 | 28 | |
... | ... | @@ -53,6 +53,7 @@ |
53 | 53 | typedef struct ESPState ESPState; |
54 | 54 | |
55 | 55 | struct ESPState { |
56 | + SysBusDevice busdev; | |
56 | 57 | uint32_t it_shift; |
57 | 58 | qemu_irq irq; |
58 | 59 | uint8_t rregs[ESP_REGS]; |
... | ... | @@ -617,9 +618,9 @@ static int esp_load(QEMUFile *f, void *opaque, int version_id) |
617 | 618 | return 0; |
618 | 619 | } |
619 | 620 | |
620 | -void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id) | |
621 | +static void esp_scsi_attach(DeviceState *host, BlockDriverState *bd, int id) | |
621 | 622 | { |
622 | - ESPState *s = (ESPState *)opaque; | |
623 | + ESPState *s = FROM_SYSBUS(ESPState, sysbus_from_qdev(host)); | |
623 | 624 | |
624 | 625 | if (id < 0) { |
625 | 626 | for (id = 0; id < ESP_MAX_DEVS; id++) { |
... | ... | @@ -644,31 +645,53 @@ void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id) |
644 | 645 | s->scsi_dev[id] = scsi_disk_init(bd, 0, esp_command_complete, s); |
645 | 646 | } |
646 | 647 | |
647 | -void *esp_init(target_phys_addr_t espaddr, int it_shift, | |
648 | - espdma_memory_read_write dma_memory_read, | |
649 | - espdma_memory_read_write dma_memory_write, | |
650 | - void *dma_opaque, qemu_irq irq, qemu_irq *reset) | |
648 | +void esp_init(target_phys_addr_t espaddr, int it_shift, | |
649 | + espdma_memory_read_write dma_memory_read, | |
650 | + espdma_memory_read_write dma_memory_write, | |
651 | + void *dma_opaque, qemu_irq irq, qemu_irq *reset) | |
651 | 652 | { |
652 | - ESPState *s; | |
653 | - int esp_io_memory; | |
653 | + DeviceState *dev; | |
654 | + SysBusDevice *s; | |
655 | + | |
656 | + dev = qdev_create(NULL, "esp"); | |
657 | + qdev_set_prop_ptr(dev, "dma_memory_read", dma_memory_read); | |
658 | + qdev_set_prop_ptr(dev, "dma_memory_write", dma_memory_write); | |
659 | + qdev_set_prop_ptr(dev, "dma_opaque", dma_opaque); | |
660 | + qdev_set_prop_int(dev, "it_shift", it_shift); | |
661 | + qdev_init(dev); | |
662 | + s = sysbus_from_qdev(dev); | |
663 | + sysbus_connect_irq(s, 0, irq); | |
664 | + sysbus_mmio_map(s, 0, espaddr); | |
665 | +} | |
654 | 666 | |
655 | - s = qemu_mallocz(sizeof(ESPState)); | |
667 | +static void esp_init1(SysBusDevice *dev) | |
668 | +{ | |
669 | + ESPState *s = FROM_SYSBUS(ESPState, dev); | |
670 | + int esp_io_memory; | |
656 | 671 | |
657 | - s->irq = irq; | |
658 | - s->it_shift = it_shift; | |
659 | - s->dma_memory_read = dma_memory_read; | |
660 | - s->dma_memory_write = dma_memory_write; | |
661 | - s->dma_opaque = dma_opaque; | |
672 | + sysbus_init_irq(dev, &s->irq); | |
673 | + s->it_shift = qdev_get_prop_int(&dev->qdev, "it_shift", -1); | |
674 | + assert(s->it_shift != -1); | |
675 | + s->dma_memory_read = qdev_get_prop_ptr(&dev->qdev, "dma_memory_read"); | |
676 | + s->dma_memory_write = qdev_get_prop_ptr(&dev->qdev, "dma_memory_write"); | |
677 | + s->dma_opaque = qdev_get_prop_ptr(&dev->qdev, "dma_opaque"); | |
662 | 678 | |
663 | 679 | esp_io_memory = cpu_register_io_memory(0, esp_mem_read, esp_mem_write, s); |
664 | - cpu_register_physical_memory(espaddr, ESP_REGS << it_shift, esp_io_memory); | |
680 | + sysbus_init_mmio(dev, ESP_REGS << s->it_shift, esp_io_memory); | |
665 | 681 | |
666 | 682 | esp_reset(s); |
667 | 683 | |
668 | - register_savevm("esp", espaddr, 3, esp_save, esp_load, s); | |
684 | + register_savevm("esp", -1, 3, esp_save, esp_load, s); | |
669 | 685 | qemu_register_reset(esp_reset, s); |
670 | 686 | |
671 | - *reset = *qemu_allocate_irqs(parent_esp_reset, s, 1); | |
687 | + qdev_init_irq_sink(&dev->qdev, parent_esp_reset, 1); | |
672 | 688 | |
673 | - return s; | |
689 | + scsi_bus_new(&dev->qdev, esp_scsi_attach); | |
674 | 690 | } |
691 | + | |
692 | +static void esp_register_devices(void) | |
693 | +{ | |
694 | + sysbus_register_dev("esp", sizeof(ESPState), esp_init1); | |
695 | +} | |
696 | + | |
697 | +device_init(esp_register_devices) | ... | ... |
hw/mips_jazz.c
... | ... | @@ -129,8 +129,6 @@ void mips_jazz_init (ram_addr_t ram_size, |
129 | 129 | qemu_irq *rc4030, *i8259; |
130 | 130 | rc4030_dma *dmas; |
131 | 131 | void* rc4030_opaque; |
132 | - void *scsi_hba; | |
133 | - int hd; | |
134 | 132 | int s_rtc, s_dma_dummy; |
135 | 133 | NICInfo *nd; |
136 | 134 | PITState *pit; |
... | ... | @@ -226,15 +224,9 @@ void mips_jazz_init (ram_addr_t ram_size, |
226 | 224 | } |
227 | 225 | |
228 | 226 | /* SCSI adapter */ |
229 | - scsi_hba = esp_init(0x80002000, 0, | |
230 | - rc4030_dma_read, rc4030_dma_write, dmas[0], | |
231 | - rc4030[5], &esp_reset); | |
232 | - for (n = 0; n < ESP_MAX_DEVS; n++) { | |
233 | - hd = drive_get_index(IF_SCSI, 0, n); | |
234 | - if (hd != -1) { | |
235 | - esp_scsi_attach(scsi_hba, drives_table[hd].bdrv, n); | |
236 | - } | |
237 | - } | |
227 | + esp_init(0x80002000, 0, | |
228 | + rc4030_dma_read, rc4030_dma_write, dmas[0], | |
229 | + rc4030[5], &esp_reset); | |
238 | 230 | |
239 | 231 | /* Floppy */ |
240 | 232 | if (drive_get_max_bus(IF_FLOPPY) >= MAX_FD) { | ... | ... |
hw/scsi.h
1 | 1 | /* esp.c */ |
2 | 2 | #define ESP_MAX_DEVS 7 |
3 | 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, int it_shift, | |
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); | |
4 | +void esp_init(target_phys_addr_t espaddr, int it_shift, | |
5 | + espdma_memory_read_write dma_memory_read, | |
6 | + espdma_memory_read_write dma_memory_write, | |
7 | + void *dma_opaque, qemu_irq irq, qemu_irq *reset); | ... | ... |
hw/sun4m.c
... | ... | @@ -391,7 +391,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, |
391 | 391 | { |
392 | 392 | CPUState *env, *envs[MAX_CPUS]; |
393 | 393 | unsigned int i; |
394 | - void *iommu, *espdma, *ledma, *main_esp, *nvram; | |
394 | + void *iommu, *espdma, *ledma, *nvram; | |
395 | 395 | qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq, |
396 | 396 | *espdma_irq, *ledma_irq; |
397 | 397 | qemu_irq *esp_reset, *le_reset; |
... | ... | @@ -533,16 +533,9 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, |
533 | 533 | exit(1); |
534 | 534 | } |
535 | 535 | |
536 | - main_esp = esp_init(hwdef->esp_base, 2, | |
537 | - espdma_memory_read, espdma_memory_write, | |
538 | - espdma, *espdma_irq, esp_reset); | |
539 | - | |
540 | - for (i = 0; i < ESP_MAX_DEVS; i++) { | |
541 | - drive_index = drive_get_index(IF_SCSI, 0, i); | |
542 | - if (drive_index == -1) | |
543 | - continue; | |
544 | - esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i); | |
545 | - } | |
536 | + esp_init(hwdef->esp_base, 2, | |
537 | + espdma_memory_read, espdma_memory_write, | |
538 | + espdma, *espdma_irq, esp_reset); | |
546 | 539 | |
547 | 540 | if (hwdef->cs_base) |
548 | 541 | cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl); |
... | ... | @@ -1184,7 +1177,7 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, |
1184 | 1177 | { |
1185 | 1178 | CPUState *env, *envs[MAX_CPUS]; |
1186 | 1179 | unsigned int i; |
1187 | - void *iounits[MAX_IOUNITS], *espdma, *ledma, *main_esp, *nvram, *sbi; | |
1180 | + void *iounits[MAX_IOUNITS], *espdma, *ledma, *nvram, *sbi; | |
1188 | 1181 | qemu_irq *cpu_irqs[MAX_CPUS], *sbi_irq, *sbi_cpu_irq, |
1189 | 1182 | *espdma_irq, *ledma_irq; |
1190 | 1183 | qemu_irq *esp_reset, *le_reset; |
... | ... | @@ -1192,7 +1185,6 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, |
1192 | 1185 | unsigned long kernel_size; |
1193 | 1186 | int ret; |
1194 | 1187 | char buf[1024]; |
1195 | - int drive_index; | |
1196 | 1188 | void *fw_cfg; |
1197 | 1189 | |
1198 | 1190 | /* init CPUs */ |
... | ... | @@ -1292,16 +1284,9 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, |
1292 | 1284 | exit(1); |
1293 | 1285 | } |
1294 | 1286 | |
1295 | - main_esp = esp_init(hwdef->esp_base, 2, | |
1296 | - espdma_memory_read, espdma_memory_write, | |
1297 | - espdma, *espdma_irq, esp_reset); | |
1298 | - | |
1299 | - for (i = 0; i < ESP_MAX_DEVS; i++) { | |
1300 | - drive_index = drive_get_index(IF_SCSI, 0, i); | |
1301 | - if (drive_index == -1) | |
1302 | - continue; | |
1303 | - esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i); | |
1304 | - } | |
1287 | + esp_init(hwdef->esp_base, 2, | |
1288 | + espdma_memory_read, espdma_memory_write, | |
1289 | + espdma, *espdma_irq, esp_reset); | |
1305 | 1290 | |
1306 | 1291 | kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename, |
1307 | 1292 | RAM_size); |
... | ... | @@ -1406,8 +1391,7 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, |
1406 | 1391 | const char *initrd_filename, const char *cpu_model) |
1407 | 1392 | { |
1408 | 1393 | CPUState *env; |
1409 | - unsigned int i; | |
1410 | - void *iommu, *espdma, *ledma, *main_esp, *nvram; | |
1394 | + void *iommu, *espdma, *ledma, *nvram; | |
1411 | 1395 | qemu_irq *cpu_irqs, *slavio_irq, *espdma_irq, *ledma_irq; |
1412 | 1396 | qemu_irq *esp_reset, *le_reset; |
1413 | 1397 | qemu_irq *fdc_tc; |
... | ... | @@ -1518,16 +1502,9 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, |
1518 | 1502 | exit(1); |
1519 | 1503 | } |
1520 | 1504 | |
1521 | - main_esp = esp_init(hwdef->esp_base, 2, | |
1522 | - espdma_memory_read, espdma_memory_write, | |
1523 | - espdma, *espdma_irq, esp_reset); | |
1524 | - | |
1525 | - for (i = 0; i < ESP_MAX_DEVS; i++) { | |
1526 | - drive_index = drive_get_index(IF_SCSI, 0, i); | |
1527 | - if (drive_index == -1) | |
1528 | - continue; | |
1529 | - esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i); | |
1530 | - } | |
1505 | + esp_init(hwdef->esp_base, 2, | |
1506 | + espdma_memory_read, espdma_memory_write, | |
1507 | + espdma, *espdma_irq, esp_reset); | |
1531 | 1508 | |
1532 | 1509 | kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename, |
1533 | 1510 | RAM_size); | ... | ... |