Commit 2be17ebded1eb5add24674cc88e4833d5afaa980
1 parent
cf2be984
Wire up TC signal from Aux1 to FDC
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4096 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
42 additions
and
13 deletions
hw/fdc.c
@@ -766,8 +766,18 @@ fdctrl_t *fdctrl_init (qemu_irq irq, int dma_chann, int mem_mapped, | @@ -766,8 +766,18 @@ fdctrl_t *fdctrl_init (qemu_irq irq, int dma_chann, int mem_mapped, | ||
766 | return fdctrl; | 766 | return fdctrl; |
767 | } | 767 | } |
768 | 768 | ||
769 | +static void fdctrl_handle_tc(void *opaque, int irq, int level) | ||
770 | +{ | ||
771 | + //fdctrl_t *s = opaque; | ||
772 | + | ||
773 | + if (level) { | ||
774 | + // XXX | ||
775 | + FLOPPY_DPRINTF("TC pulsed\n"); | ||
776 | + } | ||
777 | +} | ||
778 | + | ||
769 | fdctrl_t *sun4m_fdctrl_init (qemu_irq irq, target_phys_addr_t io_base, | 779 | fdctrl_t *sun4m_fdctrl_init (qemu_irq irq, target_phys_addr_t io_base, |
770 | - BlockDriverState **fds) | 780 | + BlockDriverState **fds, qemu_irq *fdc_tc) |
771 | { | 781 | { |
772 | fdctrl_t *fdctrl; | 782 | fdctrl_t *fdctrl; |
773 | int io_mem; | 783 | int io_mem; |
@@ -778,6 +788,7 @@ fdctrl_t *sun4m_fdctrl_init (qemu_irq irq, target_phys_addr_t io_base, | @@ -778,6 +788,7 @@ fdctrl_t *sun4m_fdctrl_init (qemu_irq irq, target_phys_addr_t io_base, | ||
778 | fdctrl_mem_write_strict, | 788 | fdctrl_mem_write_strict, |
779 | fdctrl); | 789 | fdctrl); |
780 | cpu_register_physical_memory(io_base, 0x08, io_mem); | 790 | cpu_register_physical_memory(io_base, 0x08, io_mem); |
791 | + *fdc_tc = *qemu_allocate_irqs(fdctrl_handle_tc, fdctrl, 1); | ||
781 | 792 | ||
782 | return fdctrl; | 793 | return fdctrl; |
783 | } | 794 | } |
hw/fdc.h
@@ -7,5 +7,5 @@ fdctrl_t *fdctrl_init (qemu_irq irq, int dma_chann, int mem_mapped, | @@ -7,5 +7,5 @@ fdctrl_t *fdctrl_init (qemu_irq irq, int dma_chann, int mem_mapped, | ||
7 | target_phys_addr_t io_base, | 7 | target_phys_addr_t io_base, |
8 | BlockDriverState **fds); | 8 | BlockDriverState **fds); |
9 | fdctrl_t *sun4m_fdctrl_init (qemu_irq irq, target_phys_addr_t io_base, | 9 | fdctrl_t *sun4m_fdctrl_init (qemu_irq irq, target_phys_addr_t io_base, |
10 | - BlockDriverState **fds); | 10 | + BlockDriverState **fds, qemu_irq *fdc_tc); |
11 | int fdctrl_get_drive_type(fdctrl_t *fdctrl, int drive_num); | 11 | int fdctrl_get_drive_type(fdctrl_t *fdctrl, int drive_num); |
hw/slavio_misc.c
@@ -51,6 +51,7 @@ typedef struct MiscState { | @@ -51,6 +51,7 @@ typedef struct MiscState { | ||
51 | uint32_t sysctrl; | 51 | uint32_t sysctrl; |
52 | uint16_t leds; | 52 | uint16_t leds; |
53 | CPUState *env; | 53 | CPUState *env; |
54 | + qemu_irq fdc_tc; | ||
54 | } MiscState; | 55 | } MiscState; |
55 | 56 | ||
56 | #define MISC_SIZE 1 | 57 | #define MISC_SIZE 1 |
@@ -66,6 +67,8 @@ typedef struct MiscState { | @@ -66,6 +67,8 @@ typedef struct MiscState { | ||
66 | #define MISC_MDM 0x01b00000 | 67 | #define MISC_MDM 0x01b00000 |
67 | #define MISC_SYS 0x01f00000 | 68 | #define MISC_SYS 0x01f00000 |
68 | 69 | ||
70 | +#define AUX1_TC 0x02 | ||
71 | + | ||
69 | #define AUX2_PWROFF 0x01 | 72 | #define AUX2_PWROFF 0x01 |
70 | #define AUX2_PWRINTCLR 0x02 | 73 | #define AUX2_PWRINTCLR 0x02 |
71 | #define AUX2_PWRFAIL 0x20 | 74 | #define AUX2_PWRFAIL 0x20 |
@@ -175,6 +178,14 @@ static void slavio_aux1_mem_writeb(void *opaque, target_phys_addr_t addr, | @@ -175,6 +178,14 @@ static void slavio_aux1_mem_writeb(void *opaque, target_phys_addr_t addr, | ||
175 | MiscState *s = opaque; | 178 | MiscState *s = opaque; |
176 | 179 | ||
177 | MISC_DPRINTF("Write aux1 %2.2x\n", val & 0xff); | 180 | MISC_DPRINTF("Write aux1 %2.2x\n", val & 0xff); |
181 | + if (val & AUX1_TC) { | ||
182 | + // Send a pulse to floppy terminal count line | ||
183 | + if (s->fdc_tc) { | ||
184 | + qemu_irq_raise(s->fdc_tc); | ||
185 | + qemu_irq_lower(s->fdc_tc); | ||
186 | + } | ||
187 | + val &= ~AUX1_TC; | ||
188 | + } | ||
178 | s->aux1 = val & 0xff; | 189 | s->aux1 = val & 0xff; |
179 | } | 190 | } |
180 | 191 | ||
@@ -407,7 +418,7 @@ static int slavio_misc_load(QEMUFile *f, void *opaque, int version_id) | @@ -407,7 +418,7 @@ static int slavio_misc_load(QEMUFile *f, void *opaque, int version_id) | ||
407 | void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, | 418 | void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, |
408 | target_phys_addr_t aux1_base, | 419 | target_phys_addr_t aux1_base, |
409 | target_phys_addr_t aux2_base, qemu_irq irq, | 420 | target_phys_addr_t aux2_base, qemu_irq irq, |
410 | - CPUState *env) | 421 | + CPUState *env, qemu_irq **fdc_tc) |
411 | { | 422 | { |
412 | int io; | 423 | int io; |
413 | MiscState *s; | 424 | MiscState *s; |
@@ -462,6 +473,7 @@ void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, | @@ -462,6 +473,7 @@ void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, | ||
462 | 473 | ||
463 | s->irq = irq; | 474 | s->irq = irq; |
464 | s->env = env; | 475 | s->env = env; |
476 | + *fdc_tc = &s->fdc_tc; | ||
465 | 477 | ||
466 | register_savevm("slavio_misc", base, 1, slavio_misc_save, slavio_misc_load, | 478 | register_savevm("slavio_misc", base, 1, slavio_misc_save, slavio_misc_load, |
467 | s); | 479 | s); |
hw/sun4m.c
@@ -376,6 +376,7 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, | @@ -376,6 +376,7 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, | ||
376 | qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq, | 376 | qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq, |
377 | *espdma_irq, *ledma_irq; | 377 | *espdma_irq, *ledma_irq; |
378 | qemu_irq *esp_reset, *le_reset; | 378 | qemu_irq *esp_reset, *le_reset; |
379 | + qemu_irq *fdc_tc; | ||
379 | unsigned long prom_offset, kernel_size; | 380 | unsigned long prom_offset, kernel_size; |
380 | int ret; | 381 | int ret; |
381 | char buf[1024]; | 382 | char buf[1024]; |
@@ -494,6 +495,11 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, | @@ -494,6 +495,11 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, | ||
494 | slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], | 495 | slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], |
495 | serial_hds[1], serial_hds[0]); | 496 | serial_hds[1], serial_hds[0]); |
496 | 497 | ||
498 | + slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->apc_base, | ||
499 | + hwdef->aux1_base, hwdef->aux2_base, | ||
500 | + slavio_irq[hwdef->me_irq], envs[0], | ||
501 | + &fdc_tc); | ||
502 | + | ||
497 | if (hwdef->fd_base != (target_phys_addr_t)-1) { | 503 | if (hwdef->fd_base != (target_phys_addr_t)-1) { |
498 | /* there is zero or one floppy drive */ | 504 | /* there is zero or one floppy drive */ |
499 | memset(fd, 0, sizeof(fd)); | 505 | memset(fd, 0, sizeof(fd)); |
@@ -501,7 +507,8 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, | @@ -501,7 +507,8 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, | ||
501 | if (index != -1) | 507 | if (index != -1) |
502 | fd[0] = drives_table[index].bdrv; | 508 | fd[0] = drives_table[index].bdrv; |
503 | 509 | ||
504 | - sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd); | 510 | + sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd, |
511 | + fdc_tc); | ||
505 | } | 512 | } |
506 | 513 | ||
507 | if (drive_get_max_bus(IF_SCSI) > 0) { | 514 | if (drive_get_max_bus(IF_SCSI) > 0) { |
@@ -520,9 +527,6 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, | @@ -520,9 +527,6 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, | ||
520 | esp_scsi_attach(main_esp, drives_table[index].bdrv, i); | 527 | esp_scsi_attach(main_esp, drives_table[index].bdrv, i); |
521 | } | 528 | } |
522 | 529 | ||
523 | - slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->apc_base, | ||
524 | - hwdef->aux1_base, hwdef->aux2_base, | ||
525 | - slavio_irq[hwdef->me_irq], envs[0]); | ||
526 | if (hwdef->cs_base != (target_phys_addr_t)-1) | 530 | if (hwdef->cs_base != (target_phys_addr_t)-1) |
527 | cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl); | 531 | cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl); |
528 | 532 | ||
@@ -549,6 +553,7 @@ static void sun4c_hw_init(const struct hwdef *hwdef, int RAM_size, | @@ -549,6 +553,7 @@ static void sun4c_hw_init(const struct hwdef *hwdef, int RAM_size, | ||
549 | void *iommu, *espdma, *ledma, *main_esp, *nvram; | 553 | void *iommu, *espdma, *ledma, *main_esp, *nvram; |
550 | qemu_irq *cpu_irqs, *slavio_irq, *espdma_irq, *ledma_irq; | 554 | qemu_irq *cpu_irqs, *slavio_irq, *espdma_irq, *ledma_irq; |
551 | qemu_irq *esp_reset, *le_reset; | 555 | qemu_irq *esp_reset, *le_reset; |
556 | + qemu_irq *fdc_tc; | ||
552 | unsigned long prom_offset, kernel_size; | 557 | unsigned long prom_offset, kernel_size; |
553 | int ret; | 558 | int ret; |
554 | char buf[1024]; | 559 | char buf[1024]; |
@@ -643,6 +648,10 @@ static void sun4c_hw_init(const struct hwdef *hwdef, int RAM_size, | @@ -643,6 +648,10 @@ static void sun4c_hw_init(const struct hwdef *hwdef, int RAM_size, | ||
643 | slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], | 648 | slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], |
644 | serial_hds[1], serial_hds[0]); | 649 | serial_hds[1], serial_hds[0]); |
645 | 650 | ||
651 | + slavio_misc = slavio_misc_init(-1, hwdef->apc_base, | ||
652 | + hwdef->aux1_base, hwdef->aux2_base, | ||
653 | + slavio_irq[hwdef->me_irq], env, &fdc_tc); | ||
654 | + | ||
646 | if (hwdef->fd_base != (target_phys_addr_t)-1) { | 655 | if (hwdef->fd_base != (target_phys_addr_t)-1) { |
647 | /* there is zero or one floppy drive */ | 656 | /* there is zero or one floppy drive */ |
648 | fd[1] = fd[0] = NULL; | 657 | fd[1] = fd[0] = NULL; |
@@ -650,7 +659,8 @@ static void sun4c_hw_init(const struct hwdef *hwdef, int RAM_size, | @@ -650,7 +659,8 @@ static void sun4c_hw_init(const struct hwdef *hwdef, int RAM_size, | ||
650 | if (index != -1) | 659 | if (index != -1) |
651 | fd[0] = drives_table[index].bdrv; | 660 | fd[0] = drives_table[index].bdrv; |
652 | 661 | ||
653 | - sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd); | 662 | + sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd, |
663 | + fdc_tc); | ||
654 | } | 664 | } |
655 | 665 | ||
656 | if (drive_get_max_bus(IF_SCSI) > 0) { | 666 | if (drive_get_max_bus(IF_SCSI) > 0) { |
@@ -669,10 +679,6 @@ static void sun4c_hw_init(const struct hwdef *hwdef, int RAM_size, | @@ -669,10 +679,6 @@ static void sun4c_hw_init(const struct hwdef *hwdef, int RAM_size, | ||
669 | esp_scsi_attach(main_esp, drives_table[index].bdrv, i); | 679 | esp_scsi_attach(main_esp, drives_table[index].bdrv, i); |
670 | } | 680 | } |
671 | 681 | ||
672 | - slavio_misc = slavio_misc_init(-1, hwdef->apc_base, | ||
673 | - hwdef->aux1_base, hwdef->aux2_base, | ||
674 | - slavio_irq[hwdef->me_irq], env); | ||
675 | - | ||
676 | kernel_size = sun4m_load_kernel(kernel_filename, kernel_cmdline, | 682 | kernel_size = sun4m_load_kernel(kernel_filename, kernel_cmdline, |
677 | initrd_filename); | 683 | initrd_filename); |
678 | 684 |
hw/sun4m.h
@@ -56,7 +56,7 @@ void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq, | @@ -56,7 +56,7 @@ void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq, | ||
56 | void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, | 56 | void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, |
57 | target_phys_addr_t aux1_base, | 57 | target_phys_addr_t aux1_base, |
58 | target_phys_addr_t aux2_base, qemu_irq irq, | 58 | target_phys_addr_t aux2_base, qemu_irq irq, |
59 | - CPUState *env); | 59 | + CPUState *env, qemu_irq **fdc_tc); |
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 | /* cs4231.c */ | 62 | /* cs4231.c */ |