Clean up fdc qdev conversion
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
		
							parent
							
								
									a71836de38
								
							
						
					
					
						commit
						12a71a027c
					
				
							
								
								
									
										139
									
								
								hw/fdc.c
									
									
									
									
									
								
							
							
						
						
									
										139
									
								
								hw/fdc.c
									
									
									
									
									
								
							@ -477,7 +477,6 @@ struct fdctrl_t {
 | 
				
			|||||||
    /* HW */
 | 
					    /* HW */
 | 
				
			||||||
    qemu_irq irq;
 | 
					    qemu_irq irq;
 | 
				
			||||||
    int dma_chann;
 | 
					    int dma_chann;
 | 
				
			||||||
    target_phys_addr_t io_base;
 | 
					 | 
				
			||||||
    /* Controller state */
 | 
					    /* Controller state */
 | 
				
			||||||
    QEMUTimer *result_timer;
 | 
					    QEMUTimer *result_timer;
 | 
				
			||||||
    uint8_t sra;
 | 
					    uint8_t sra;
 | 
				
			||||||
@ -512,8 +511,6 @@ struct fdctrl_t {
 | 
				
			|||||||
    /* Floppy drives */
 | 
					    /* Floppy drives */
 | 
				
			||||||
    fdrive_t drives[MAX_FD];
 | 
					    fdrive_t drives[MAX_FD];
 | 
				
			||||||
    int reset_sensei;
 | 
					    int reset_sensei;
 | 
				
			||||||
    uint32_t strict_io;
 | 
					 | 
				
			||||||
    uint32_t mem_mapped;
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static uint32_t fdctrl_read (void *opaque, uint32_t reg)
 | 
					static uint32_t fdctrl_read (void *opaque, uint32_t reg)
 | 
				
			||||||
@ -1855,39 +1852,12 @@ static void fdctrl_result_timer(void *opaque)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Init functions */
 | 
					/* Init functions */
 | 
				
			||||||
static void fdctrl_init_common (fdctrl_t *fdctrl, int dma_chann,
 | 
					static void fdctrl_connect_drives(fdctrl_t *fdctrl, BlockDriverState **fds)
 | 
				
			||||||
                                target_phys_addr_t io_base,
 | 
					 | 
				
			||||||
                                BlockDriverState **fds)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int i, j;
 | 
					    unsigned int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Fill 'command_to_handler' lookup table */
 | 
					 | 
				
			||||||
    for (i = ARRAY_SIZE(handlers) - 1; i >= 0; i--) {
 | 
					 | 
				
			||||||
        for (j = 0; j < sizeof(command_to_handler); j++) {
 | 
					 | 
				
			||||||
            if ((j & handlers[i].mask) == handlers[i].value)
 | 
					 | 
				
			||||||
                command_to_handler[j] = i;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    FLOPPY_DPRINTF("init controller\n");
 | 
					 | 
				
			||||||
    fdctrl->fifo = qemu_memalign(512, FD_SECTOR_LEN);
 | 
					 | 
				
			||||||
    fdctrl->result_timer = qemu_new_timer(vm_clock,
 | 
					 | 
				
			||||||
                                          fdctrl_result_timer, fdctrl);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fdctrl->version = 0x90; /* Intel 82078 controller */
 | 
					 | 
				
			||||||
    fdctrl->dma_chann = dma_chann;
 | 
					 | 
				
			||||||
    fdctrl->io_base = io_base;
 | 
					 | 
				
			||||||
    fdctrl->config = FD_CONFIG_EIS | FD_CONFIG_EFIFO; /* Implicit seek, polling & FIFO enabled */
 | 
					 | 
				
			||||||
    if (fdctrl->dma_chann != -1) {
 | 
					 | 
				
			||||||
        DMA_register_channel(dma_chann, &fdctrl_transfer_handler, fdctrl);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    for (i = 0; i < MAX_FD; i++) {
 | 
					    for (i = 0; i < MAX_FD; i++) {
 | 
				
			||||||
        fd_init(&fdctrl->drives[i], fds[i]);
 | 
					        fd_init(&fdctrl->drives[i], fds[i]);
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    fdctrl_external_reset(fdctrl);
 | 
					 | 
				
			||||||
    register_savevm("fdc", io_base, 2, fdc_save, fdc_load, fdctrl);
 | 
					 | 
				
			||||||
    qemu_register_reset(fdctrl_external_reset, fdctrl);
 | 
					 | 
				
			||||||
    for (i = 0; i < MAX_FD; i++) {
 | 
					 | 
				
			||||||
        fd_revalidate(&fdctrl->drives[i]);
 | 
					        fd_revalidate(&fdctrl->drives[i]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1901,9 +1871,6 @@ fdctrl_t *fdctrl_init (qemu_irq irq, int dma_chann, int mem_mapped,
 | 
				
			|||||||
    fdctrl_t *fdctrl;
 | 
					    fdctrl_t *fdctrl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dev = qdev_create(NULL, "fdc");
 | 
					    dev = qdev_create(NULL, "fdc");
 | 
				
			||||||
    qdev_prop_set_uint32(dev, "strict_io", 0);
 | 
					 | 
				
			||||||
    qdev_prop_set_uint32(dev, "mem_mapped", mem_mapped);
 | 
					 | 
				
			||||||
    qdev_prop_set_uint32(dev, "sun4m", 0);
 | 
					 | 
				
			||||||
    qdev_init(dev);
 | 
					    qdev_init(dev);
 | 
				
			||||||
    s = sysbus_from_qdev(dev);
 | 
					    s = sysbus_from_qdev(dev);
 | 
				
			||||||
    sysbus_connect_irq(s, 0, irq);
 | 
					    sysbus_connect_irq(s, 0, irq);
 | 
				
			||||||
@ -1920,8 +1887,10 @@ fdctrl_t *fdctrl_init (qemu_irq irq, int dma_chann, int mem_mapped,
 | 
				
			|||||||
        register_ioport_write((uint32_t)io_base + 0x07, 1, 1,
 | 
					        register_ioport_write((uint32_t)io_base + 0x07, 1, 1,
 | 
				
			||||||
                              &fdctrl_write_port, fdctrl);
 | 
					                              &fdctrl_write_port, fdctrl);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    fdctrl->dma_chann = dma_chann;
 | 
				
			||||||
 | 
					    DMA_register_channel(dma_chann, &fdctrl_transfer_handler, fdctrl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fdctrl_init_common(fdctrl, dma_chann, io_base, fds);
 | 
					    fdctrl_connect_drives(fdctrl, fds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return fdctrl;
 | 
					    return fdctrl;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1933,10 +1902,7 @@ fdctrl_t *sun4m_fdctrl_init (qemu_irq irq, target_phys_addr_t io_base,
 | 
				
			|||||||
    SysBusDevice *s;
 | 
					    SysBusDevice *s;
 | 
				
			||||||
    fdctrl_t *fdctrl;
 | 
					    fdctrl_t *fdctrl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dev = qdev_create(NULL, "fdc");
 | 
					    dev = qdev_create(NULL, "SUNW,fdtwo");
 | 
				
			||||||
    qdev_prop_set_uint32(dev, "strict_io", 1);
 | 
					 | 
				
			||||||
    qdev_prop_set_uint32(dev, "mem_mapped", 1);
 | 
					 | 
				
			||||||
    qdev_prop_set_uint32(dev, "sun4m", 1);
 | 
					 | 
				
			||||||
    qdev_init(dev);
 | 
					    qdev_init(dev);
 | 
				
			||||||
    s = sysbus_from_qdev(dev);
 | 
					    s = sysbus_from_qdev(dev);
 | 
				
			||||||
    sysbus_connect_irq(s, 0, irq);
 | 
					    sysbus_connect_irq(s, 0, irq);
 | 
				
			||||||
@ -1944,60 +1910,85 @@ fdctrl_t *sun4m_fdctrl_init (qemu_irq irq, target_phys_addr_t io_base,
 | 
				
			|||||||
    *fdc_tc = qdev_get_gpio_in(dev, 0);
 | 
					    *fdc_tc = qdev_get_gpio_in(dev, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fdctrl = FROM_SYSBUS(fdctrl_t, s);
 | 
					    fdctrl = FROM_SYSBUS(fdctrl_t, s);
 | 
				
			||||||
    fdctrl_init_common(fdctrl, -1, io_base, fds);
 | 
					
 | 
				
			||||||
 | 
					    fdctrl->dma_chann = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fdctrl_connect_drives(fdctrl, fds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return fdctrl;
 | 
					    return fdctrl;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void fdc_init1(SysBusDevice *dev)
 | 
					static void fdctrl_init_common(SysBusDevice *dev, fdctrl_t *fdctrl,
 | 
				
			||||||
 | 
					                               int is_sun4m, int io)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    fdctrl_t *s = FROM_SYSBUS(fdctrl_t, dev);
 | 
					    int i, j;
 | 
				
			||||||
    int io;
 | 
					    static int command_tables_inited = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sysbus_init_irq(dev, &s->irq);
 | 
					    sysbus_init_irq(dev, &fdctrl->irq);
 | 
				
			||||||
    qdev_init_gpio_in(&dev->qdev, fdctrl_handle_tc, 1);
 | 
					    qdev_init_gpio_in(&dev->qdev, fdctrl_handle_tc, 1);
 | 
				
			||||||
    if (s->strict_io) {
 | 
					 | 
				
			||||||
        io = cpu_register_io_memory(fdctrl_mem_read_strict,
 | 
					 | 
				
			||||||
                                    fdctrl_mem_write_strict, s);
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        io = cpu_register_io_memory(fdctrl_mem_read, fdctrl_mem_write, s);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    sysbus_init_mmio(dev, 0x08, io);
 | 
					    sysbus_init_mmio(dev, 0x08, io);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Fill 'command_to_handler' lookup table */
 | 
				
			||||||
 | 
					    if (!command_tables_inited) {
 | 
				
			||||||
 | 
					        command_tables_inited = 1;
 | 
				
			||||||
 | 
					        for (i = ARRAY_SIZE(handlers) - 1; i >= 0; i--) {
 | 
				
			||||||
 | 
					            for (j = 0; j < sizeof(command_to_handler); j++) {
 | 
				
			||||||
 | 
					                if ((j & handlers[i].mask) == handlers[i].value) {
 | 
				
			||||||
 | 
					                    command_to_handler[j] = i;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    FLOPPY_DPRINTF("init controller\n");
 | 
				
			||||||
 | 
					    fdctrl->fifo = qemu_memalign(512, FD_SECTOR_LEN);
 | 
				
			||||||
 | 
					    fdctrl->result_timer = qemu_new_timer(vm_clock,
 | 
				
			||||||
 | 
					                                          fdctrl_result_timer, fdctrl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fdctrl->version = 0x90; /* Intel 82078 controller */
 | 
				
			||||||
 | 
					    fdctrl->config = FD_CONFIG_EIS | FD_CONFIG_EFIFO; /* Implicit seek, polling & FIFO enabled */
 | 
				
			||||||
 | 
					    fdctrl->sun4m = is_sun4m;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fdctrl_external_reset(fdctrl);
 | 
				
			||||||
 | 
					    register_savevm("fdc", -1, 2, fdc_save, fdc_load, fdctrl);
 | 
				
			||||||
 | 
					    qemu_register_reset(fdctrl_external_reset, fdctrl);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void fdc_init1(SysBusDevice *dev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    fdctrl_t *fdctrl = FROM_SYSBUS(fdctrl_t, dev);
 | 
				
			||||||
 | 
					    int io;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    io = cpu_register_io_memory(fdctrl_mem_read, fdctrl_mem_write, fdctrl);
 | 
				
			||||||
 | 
					    fdctrl_init_common(dev, fdctrl, 0, io);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void sun4m_fdc_init1(SysBusDevice *dev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    fdctrl_t *fdctrl = FROM_SYSBUS(fdctrl_t, dev);
 | 
				
			||||||
 | 
					    int io;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    io = cpu_register_io_memory(fdctrl_mem_read_strict,
 | 
				
			||||||
 | 
					                                fdctrl_mem_write_strict, fdctrl);
 | 
				
			||||||
 | 
					    fdctrl_init_common(dev, fdctrl, 1, io);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static SysBusDeviceInfo fdc_info = {
 | 
					static SysBusDeviceInfo fdc_info = {
 | 
				
			||||||
    .init = fdc_init1,
 | 
					    .init = fdc_init1,
 | 
				
			||||||
    .qdev.name  = "fdc",
 | 
					    .qdev.name  = "fdc",
 | 
				
			||||||
    .qdev.size  = sizeof(fdctrl_t),
 | 
					    .qdev.size  = sizeof(fdctrl_t),
 | 
				
			||||||
    .qdev.props = (Property[]) {
 | 
					};
 | 
				
			||||||
        {
 | 
					
 | 
				
			||||||
            .name = "io_base",
 | 
					static SysBusDeviceInfo sun4m_fdc_info = {
 | 
				
			||||||
            .info = &qdev_prop_taddr,
 | 
					    .init = sun4m_fdc_init1,
 | 
				
			||||||
            .offset = offsetof(fdctrl_t, io_base),
 | 
					    .qdev.name  = "SUNW,fdtwo",
 | 
				
			||||||
        },
 | 
					    .qdev.size  = sizeof(fdctrl_t),
 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            .name = "strict_io",
 | 
					 | 
				
			||||||
            .info = &qdev_prop_uint32,
 | 
					 | 
				
			||||||
            .offset = offsetof(fdctrl_t, strict_io),
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            .name = "mem_mapped",
 | 
					 | 
				
			||||||
            .info = &qdev_prop_uint32,
 | 
					 | 
				
			||||||
            .offset = offsetof(fdctrl_t, mem_mapped),
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            .name = "sun4m",
 | 
					 | 
				
			||||||
            .info = &qdev_prop_uint32,
 | 
					 | 
				
			||||||
            .offset = offsetof(fdctrl_t, sun4m),
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {/* end of properties */}
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void fdc_register_devices(void)
 | 
					static void fdc_register_devices(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    sysbus_register_withprop(&fdc_info);
 | 
					    sysbus_register_withprop(&fdc_info);
 | 
				
			||||||
 | 
					    sysbus_register_withprop(&sun4m_fdc_info);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
device_init(fdc_register_devices)
 | 
					device_init(fdc_register_devices)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user