Commit f64ab228b8464246fad7fdb5669911513b9a695d
1 parent
c70c59ee
Convert fdc to qdev
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Showing
1 changed file
with
70 additions
and
23 deletions
hw/fdc.c
... | ... | @@ -26,11 +26,13 @@ |
26 | 26 | * The controller is used in Sun4m systems in a slightly different |
27 | 27 | * way. There are changes in DOR register and DMA is not available. |
28 | 28 | */ |
29 | + | |
29 | 30 | #include "hw.h" |
30 | 31 | #include "fdc.h" |
31 | 32 | #include "block.h" |
32 | 33 | #include "qemu-timer.h" |
33 | 34 | #include "isa.h" |
35 | +#include "sysbus.h" | |
34 | 36 | |
35 | 37 | /********************************************************/ |
36 | 38 | /* debug Floppy devices */ |
... | ... | @@ -468,6 +470,7 @@ enum { |
468 | 470 | #define FD_FORMAT_CMD(state) ((state) & FD_STATE_FORMAT) |
469 | 471 | |
470 | 472 | struct fdctrl_t { |
473 | + SysBusDevice busdev; | |
471 | 474 | /* Controller's identification */ |
472 | 475 | uint8_t version; |
473 | 476 | /* HW */ |
... | ... | @@ -1849,11 +1852,10 @@ static void fdctrl_result_timer(void *opaque) |
1849 | 1852 | } |
1850 | 1853 | |
1851 | 1854 | /* Init functions */ |
1852 | -static fdctrl_t *fdctrl_init_common (qemu_irq irq, int dma_chann, | |
1853 | - target_phys_addr_t io_base, | |
1854 | - BlockDriverState **fds) | |
1855 | +static void fdctrl_init_common (fdctrl_t *fdctrl, int dma_chann, | |
1856 | + target_phys_addr_t io_base, | |
1857 | + BlockDriverState **fds) | |
1855 | 1858 | { |
1856 | - fdctrl_t *fdctrl; | |
1857 | 1859 | int i, j; |
1858 | 1860 | |
1859 | 1861 | /* Fill 'command_to_handler' lookup table */ |
... | ... | @@ -1865,13 +1867,11 @@ static fdctrl_t *fdctrl_init_common (qemu_irq irq, int dma_chann, |
1865 | 1867 | } |
1866 | 1868 | |
1867 | 1869 | FLOPPY_DPRINTF("init controller\n"); |
1868 | - fdctrl = qemu_mallocz(sizeof(fdctrl_t)); | |
1869 | 1870 | fdctrl->fifo = qemu_memalign(512, FD_SECTOR_LEN); |
1870 | 1871 | fdctrl->result_timer = qemu_new_timer(vm_clock, |
1871 | 1872 | fdctrl_result_timer, fdctrl); |
1872 | 1873 | |
1873 | 1874 | fdctrl->version = 0x90; /* Intel 82078 controller */ |
1874 | - fdctrl->irq = irq; | |
1875 | 1875 | fdctrl->dma_chann = dma_chann; |
1876 | 1876 | fdctrl->io_base = io_base; |
1877 | 1877 | fdctrl->config = FD_CONFIG_EIS | FD_CONFIG_EFIFO; /* Implicit seek, polling & FIFO enabled */ |
... | ... | @@ -1887,24 +1887,26 @@ static fdctrl_t *fdctrl_init_common (qemu_irq irq, int dma_chann, |
1887 | 1887 | for (i = 0; i < MAX_FD; i++) { |
1888 | 1888 | fd_revalidate(&fdctrl->drives[i]); |
1889 | 1889 | } |
1890 | - | |
1891 | - return fdctrl; | |
1892 | 1890 | } |
1893 | 1891 | |
1894 | 1892 | fdctrl_t *fdctrl_init (qemu_irq irq, int dma_chann, int mem_mapped, |
1895 | 1893 | target_phys_addr_t io_base, |
1896 | 1894 | BlockDriverState **fds) |
1897 | 1895 | { |
1896 | + DeviceState *dev; | |
1897 | + SysBusDevice *s; | |
1898 | 1898 | fdctrl_t *fdctrl; |
1899 | - int io_mem; | |
1900 | - | |
1901 | - fdctrl = fdctrl_init_common(irq, dma_chann, io_base, fds); | |
1902 | 1899 | |
1903 | - fdctrl->sun4m = 0; | |
1900 | + dev = qdev_create(NULL, "fdc"); | |
1901 | + qdev_set_prop_int(dev, "strict_io", 0); | |
1902 | + qdev_set_prop_int(dev, "mem_mapped", mem_mapped); | |
1903 | + qdev_set_prop_int(dev, "sun4m", 0); | |
1904 | + qdev_init(dev); | |
1905 | + s = sysbus_from_qdev(dev); | |
1906 | + sysbus_connect_irq(s, 0, irq); | |
1907 | + fdctrl = FROM_SYSBUS(fdctrl_t, s); | |
1904 | 1908 | if (mem_mapped) { |
1905 | - io_mem = cpu_register_io_memory(fdctrl_mem_read, fdctrl_mem_write, | |
1906 | - fdctrl); | |
1907 | - cpu_register_physical_memory(io_base, 0x08, io_mem); | |
1909 | + sysbus_mmio_map(s, 0, io_base); | |
1908 | 1910 | } else { |
1909 | 1911 | register_ioport_read((uint32_t)io_base + 0x01, 5, 1, |
1910 | 1912 | &fdctrl_read_port, fdctrl); |
... | ... | @@ -1916,22 +1918,67 @@ fdctrl_t *fdctrl_init (qemu_irq irq, int dma_chann, int mem_mapped, |
1916 | 1918 | &fdctrl_write_port, fdctrl); |
1917 | 1919 | } |
1918 | 1920 | |
1921 | + fdctrl_init_common(fdctrl, dma_chann, io_base, fds); | |
1922 | + | |
1919 | 1923 | return fdctrl; |
1920 | 1924 | } |
1921 | 1925 | |
1922 | 1926 | fdctrl_t *sun4m_fdctrl_init (qemu_irq irq, target_phys_addr_t io_base, |
1923 | 1927 | BlockDriverState **fds, qemu_irq *fdc_tc) |
1924 | 1928 | { |
1929 | + DeviceState *dev; | |
1930 | + SysBusDevice *s; | |
1925 | 1931 | fdctrl_t *fdctrl; |
1926 | - int io_mem; | |
1927 | 1932 | |
1928 | - fdctrl = fdctrl_init_common(irq, -1, io_base, fds); | |
1929 | - fdctrl->sun4m = 1; | |
1930 | - io_mem = cpu_register_io_memory(fdctrl_mem_read_strict, | |
1931 | - fdctrl_mem_write_strict, | |
1932 | - fdctrl); | |
1933 | - cpu_register_physical_memory(io_base, 0x08, io_mem); | |
1934 | - *fdc_tc = *qemu_allocate_irqs(fdctrl_handle_tc, fdctrl, 1); | |
1933 | + dev = qdev_create(NULL, "fdc"); | |
1934 | + qdev_set_prop_int(dev, "strict_io", 1); | |
1935 | + qdev_set_prop_int(dev, "mem_mapped", 1); | |
1936 | + qdev_set_prop_int(dev, "sun4m", 1); | |
1937 | + qdev_init(dev); | |
1938 | + s = sysbus_from_qdev(dev); | |
1939 | + sysbus_connect_irq(s, 0, irq); | |
1940 | + sysbus_mmio_map(s, 0, io_base); | |
1941 | + *fdc_tc = qdev_get_gpio_in(dev, 0); | |
1942 | + | |
1943 | + fdctrl = FROM_SYSBUS(fdctrl_t, s); | |
1944 | + fdctrl_init_common(fdctrl, -1, io_base, fds); | |
1935 | 1945 | |
1936 | 1946 | return fdctrl; |
1937 | 1947 | } |
1948 | + | |
1949 | +static void fdc_init1(SysBusDevice *dev) | |
1950 | +{ | |
1951 | + fdctrl_t *s = FROM_SYSBUS(fdctrl_t, dev); | |
1952 | + int io; | |
1953 | + | |
1954 | + sysbus_init_irq(dev, &s->irq); | |
1955 | + qdev_init_gpio_in(&dev->qdev, fdctrl_handle_tc, 1); | |
1956 | + if (qdev_get_prop_int(&dev->qdev, "strict_io", 0)) { | |
1957 | + io = cpu_register_io_memory(fdctrl_mem_read_strict, | |
1958 | + fdctrl_mem_write_strict, s); | |
1959 | + } else { | |
1960 | + io = cpu_register_io_memory(fdctrl_mem_read, fdctrl_mem_write, s); | |
1961 | + } | |
1962 | + sysbus_init_mmio(dev, 0x08, io); | |
1963 | +} | |
1964 | + | |
1965 | + | |
1966 | +static SysBusDeviceInfo fdc_info = { | |
1967 | + .init = fdc_init1, | |
1968 | + .qdev.name = "fdc", | |
1969 | + .qdev.size = sizeof(fdctrl_t), | |
1970 | + .qdev.props = (DevicePropList[]) { | |
1971 | + {.name = "io_base", .type = PROP_TYPE_INT}, | |
1972 | + {.name = "strict_io", .type = PROP_TYPE_INT}, | |
1973 | + {.name = "mem_mapped", .type = PROP_TYPE_INT}, | |
1974 | + {.name = "sun4m", .type = PROP_TYPE_INT}, | |
1975 | + {.name = NULL} | |
1976 | + } | |
1977 | +}; | |
1978 | + | |
1979 | +static void fdc_register_devices(void) | |
1980 | +{ | |
1981 | + sysbus_register_withprop(&fdc_info); | |
1982 | +} | |
1983 | + | |
1984 | +device_init(fdc_register_devices) | ... | ... |