* [Qemu-devel] [PATCH 0/5] qdev: add isa bus support @ 2009-07-31 10:30 Gerd Hoffmann 2009-07-31 10:30 ` [Qemu-devel] [PATCH 1/5] qdev/isa: add isa bus support to qdev Gerd Hoffmann ` (4 more replies) 0 siblings, 5 replies; 7+ messages in thread From: Gerd Hoffmann @ 2009-07-31 10:30 UTC (permalink / raw) To: qemu-devel; +Cc: Gerd Hoffmann Hi, This series adds isa bus support to qdev and converts two devices (pc kbd controller, floppy controller). Respin with license information added to isa-bus.c as requested by anthony. cheers, Gerd ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH 1/5] qdev/isa: add isa bus support to qdev. 2009-07-31 10:30 [Qemu-devel] [PATCH 0/5] qdev: add isa bus support Gerd Hoffmann @ 2009-07-31 10:30 ` Gerd Hoffmann 2009-07-31 10:30 ` [Qemu-devel] [PATCH 2/5] qdev/isa: add qdev support to i8042 (aka ps/2 kbd+mouse) Gerd Hoffmann ` (3 subsequent siblings) 4 siblings, 0 replies; 7+ messages in thread From: Gerd Hoffmann @ 2009-07-31 10:30 UTC (permalink / raw) To: qemu-devel; +Cc: Gerd Hoffmann Pretty simple and straigt forward. IRQs modeled simliar to sysbus. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- Makefile.target | 10 +++--- hw/isa-bus.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ hw/isa.h | 25 +++++++++++++ 3 files changed, 132 insertions(+), 5 deletions(-) create mode 100644 hw/isa-bus.c diff --git a/Makefile.target b/Makefile.target index 49ba08d..8ce5e6b 100644 --- a/Makefile.target +++ b/Makefile.target @@ -327,7 +327,7 @@ obj-y += e1000.o obj-y += wdt_ib700.o wdt_i6300esb.o # Hardware support -obj-i386-y = ide.o pckbd.o vga.o $(sound-obj-y) dma.o +obj-i386-y = ide.o pckbd.o vga.o $(sound-obj-y) dma.o isa-bus.o obj-i386-y += fdc.o mc146818rtc.o serial.o i8259.o i8254.o pcspk.o pc.o obj-i386-y += cirrus_vga.o apic.o ioapic.o parallel.o acpi.o piix_pci.o obj-i386-y += usb-uhci.o vmmouse.o vmport.o vmware_vga.o hpet.o @@ -338,7 +338,7 @@ CPPFLAGS += -DHAS_AUDIO -DHAS_AUDIO_CHOICE endif # shared objects -obj-ppc-y = ppc.o ide.o vga.o $(sound-obj-y) dma.o openpic.o +obj-ppc-y = ppc.o ide.o vga.o $(sound-obj-y) dma.o isa-bus.o openpic.o # PREP target obj-ppc-y += pckbd.o serial.o i8259.o i8254.o fdc.o mc146818rtc.o obj-ppc-y += prep_pci.o ppc_prep.o @@ -366,7 +366,7 @@ obj-mips-y = mips_r4k.o mips_jazz.o mips_malta.o mips_mipssim.o obj-mips-y += mips_timer.o mips_int.o dma.o vga.o serial.o i8254.o i8259.o rc4030.o obj-mips-y += g364fb.o jazz_led.o dp8393x.o obj-mips-y += ide.o gt64xxx.o pckbd.o fdc.o mc146818rtc.o usb-uhci.o acpi.o ds1225y.o -obj-mips-y += piix_pci.o parallel.o cirrus_vga.o pcspk.o $(sound-obj-y) +obj-mips-y += piix_pci.o parallel.o cirrus_vga.o isa-bus.o pcspk.o $(sound-obj-y) obj-mips-y += mipsnet.o obj-mips-y += pflash_cfi01.o obj-mips-y += vmware_vga.o @@ -401,12 +401,12 @@ obj-cris-y += etraxfs_ser.o obj-cris-y += pflash_cfi02.o ifeq ($(TARGET_ARCH), sparc64) -obj-sparc-y = sun4u.o ide.o pckbd.o vga.o apb_pci.o +obj-sparc-y = sun4u.o ide.o isa-bus.o pckbd.o vga.o apb_pci.o obj-sparc-y += fdc.o mc146818rtc.o serial.o obj-sparc-y += cirrus_vga.o parallel.o else obj-sparc-y = sun4m.o tcx.o iommu.o slavio_intctl.o -obj-sparc-y += slavio_timer.o slavio_misc.o fdc.o sparc32_dma.o +obj-sparc-y += slavio_timer.o slavio_misc.o fdc.o isa-bus.o sparc32_dma.o obj-sparc-y += cs4231.o eccmemctl.o sbi.o sun4c_intctl.o endif diff --git a/hw/isa-bus.c b/hw/isa-bus.c new file mode 100644 index 0000000..8c14b1d --- /dev/null +++ b/hw/isa-bus.c @@ -0,0 +1,102 @@ +/* + * isa bus support for qdev. + * + * Copyright (c) 2009 Gerd Hoffmann <kraxel@redhat.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ +#include "hw.h" +#include "sysemu.h" +#include "isa.h" + +struct ISABus { + BusState qbus; +}; +static ISABus *isabus; + +static struct BusInfo isa_bus_info = { + .name = "ISA", + .size = sizeof(ISABus), + .props = (Property[]) { + { + .name = "iobase", + .info = &qdev_prop_hex32, + .offset = offsetof(ISADevice, iobase[0]), + .defval = (uint32_t[]) { -1 }, + },{ + .name = "iobase2", + .info = &qdev_prop_hex32, + .offset = offsetof(ISADevice, iobase[1]), + .defval = (uint32_t[]) { -1 }, + }, + {/* end of list */} + } +}; + +ISABus *isa_bus_new(DeviceState *dev) +{ + if (isabus) { + fprintf(stderr, "Can't create a second ISA bus\n"); + return NULL; + } + + isabus = FROM_QBUS(ISABus, qbus_create(&isa_bus_info, dev, NULL)); + return isabus; +} + +void isa_connect_irq(ISADevice *dev, int n, qemu_irq irq) +{ + assert(n >= 0 && n < dev->nirqs); + if (dev->irqs[n]) + *dev->irqs[n] = irq; +} + +void isa_init_irq(ISADevice *dev, qemu_irq *p) +{ + assert(dev->nirqs < ARRAY_SIZE(dev->irqs)); + dev->irqs[dev->nirqs] = p; + dev->nirqs++; +} + +static void isa_qdev_init(DeviceState *qdev, DeviceInfo *base) +{ + ISADevice *dev = DO_UPCAST(ISADevice, qdev, qdev); + ISADeviceInfo *info = DO_UPCAST(ISADeviceInfo, qdev, base); + + info->init(dev); +} + +void isa_qdev_register(ISADeviceInfo *info) +{ + info->qdev.init = isa_qdev_init; + info->qdev.bus_info = &isa_bus_info; + qdev_register(&info->qdev); +} + +ISADevice *isa_create_simple(const char *name, uint32_t iobase, uint32_t iobase2) +{ + DeviceState *dev; + ISADevice *isa; + + if (!isabus) { + fprintf(stderr, "Tried to create isa device %s with no isa bus present.\n", name); + return NULL; + } + dev = qdev_create(&isabus->qbus, name); + isa = DO_UPCAST(ISADevice, qdev, dev); + isa->iobase[0] = iobase; + isa->iobase[1] = iobase2; + qdev_init(dev); + return isa; +} diff --git a/hw/isa.h b/hw/isa.h index f126ecc..49c58f8 100644 --- a/hw/isa.h +++ b/hw/isa.h @@ -1,8 +1,33 @@ #ifndef HW_ISA_H #define HW_ISA_H + /* ISA bus */ #include "ioport.h" +#include "qdev.h" + +typedef struct ISABus ISABus; +typedef struct ISADevice ISADevice; +typedef struct ISADeviceInfo ISADeviceInfo; + +struct ISADevice { + DeviceState qdev; + uint32_t iobase[2]; + qemu_irq *irqs[2]; + int nirqs; +}; + +typedef void (*isa_qdev_initfn)(ISADevice *dev); +struct ISADeviceInfo { + DeviceInfo qdev; + isa_qdev_initfn init; +}; + +ISABus *isa_bus_new(DeviceState *dev); +void isa_connect_irq(ISADevice *dev, int n, qemu_irq irq); +void isa_init_irq(ISADevice *dev, qemu_irq *p); +void isa_qdev_register(ISADeviceInfo *info); +ISADevice *isa_create_simple(const char *name, uint32_t iobase, uint32_t iobase2); extern target_phys_addr_t isa_mem_base; -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH 2/5] qdev/isa: add qdev support to i8042 (aka ps/2 kbd+mouse). 2009-07-31 10:30 [Qemu-devel] [PATCH 0/5] qdev: add isa bus support Gerd Hoffmann 2009-07-31 10:30 ` [Qemu-devel] [PATCH 1/5] qdev/isa: add isa bus support to qdev Gerd Hoffmann @ 2009-07-31 10:30 ` Gerd Hoffmann 2009-07-31 10:30 ` [Qemu-devel] [PATCH 3/5] qdev/isa: make the piix isa bridge register an isa bus Gerd Hoffmann ` (2 subsequent siblings) 4 siblings, 0 replies; 7+ messages in thread From: Gerd Hoffmann @ 2009-07-31 10:30 UTC (permalink / raw) To: qemu-devel; +Cc: Gerd Hoffmann Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- hw/pckbd.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 40 insertions(+), 0 deletions(-) diff --git a/hw/pckbd.c b/hw/pckbd.c index d50cd6e..bb4cc0e 100644 --- a/hw/pckbd.c +++ b/hw/pckbd.c @@ -440,3 +440,43 @@ void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq, #endif qemu_register_reset(kbd_reset, s); } + +typedef struct ISAKBDState { + ISADevice dev; + KBDState kbd; +} ISAKBDState; + +static void i8042_initfn(ISADevice *dev) +{ + KBDState *s = &(DO_UPCAST(ISAKBDState, dev, dev)->kbd); + + isa_init_irq(dev, &s->irq_kbd); + isa_init_irq(dev, &s->irq_mouse); + + kbd_reset(s); + register_savevm("pckbd", 0, 3, kbd_save, kbd_load, s); + register_ioport_read(dev->iobase[0], 1, 1, kbd_read_data, s); + register_ioport_write(dev->iobase[0], 1, 1, kbd_write_data, s); + register_ioport_read(dev->iobase[1], 1, 1, kbd_read_status, s); + register_ioport_write(dev->iobase[1], 1, 1, kbd_write_command, s); + + s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s); + s->mouse = ps2_mouse_init(kbd_update_aux_irq, s); +#ifdef TARGET_I386 + vmmouse_init(s->mouse); +#endif + qemu_register_reset(kbd_reset, s); +} + +static ISADeviceInfo i8042_info = { + .qdev.name = "i8042", + .qdev.size = sizeof(ISAKBDState), + .qdev.no_user = 1, + .init = i8042_initfn, +}; + +static void i8042_register(void) +{ + isa_qdev_register(&i8042_info); +} +device_init(i8042_register) -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH 3/5] qdev/isa: make the piix isa bridge register an isa bus. 2009-07-31 10:30 [Qemu-devel] [PATCH 0/5] qdev: add isa bus support Gerd Hoffmann 2009-07-31 10:30 ` [Qemu-devel] [PATCH 1/5] qdev/isa: add isa bus support to qdev Gerd Hoffmann 2009-07-31 10:30 ` [Qemu-devel] [PATCH 2/5] qdev/isa: add qdev support to i8042 (aka ps/2 kbd+mouse) Gerd Hoffmann @ 2009-07-31 10:30 ` Gerd Hoffmann 2009-07-31 10:30 ` [Qemu-devel] [PATCH 4/5] qdev/isa: make pc use qdev for i8042 setup Gerd Hoffmann 2009-07-31 10:30 ` [Qemu-devel] [PATCH 5/5] qdev/isa: convert fdc Gerd Hoffmann 4 siblings, 0 replies; 7+ messages in thread From: Gerd Hoffmann @ 2009-07-31 10:30 UTC (permalink / raw) To: qemu-devel; +Cc: Gerd Hoffmann Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- hw/piix_pci.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/hw/piix_pci.c b/hw/piix_pci.c index db40ed3..e2ddf4b 100644 --- a/hw/piix_pci.c +++ b/hw/piix_pci.c @@ -25,6 +25,7 @@ #include "hw.h" #include "pc.h" #include "pci.h" +#include "isa.h" #include "sysbus.h" typedef uint32_t pci_addr_t; @@ -342,6 +343,7 @@ static void piix3_initfn(PCIDevice *d) { uint8_t *pci_conf; + isa_bus_new(&d->qdev); register_savevm("PIIX3", 0, 2, piix_save, piix_load, d); pci_conf = d->config; -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH 4/5] qdev/isa: make pc use qdev for i8042 setup. 2009-07-31 10:30 [Qemu-devel] [PATCH 0/5] qdev: add isa bus support Gerd Hoffmann ` (2 preceding siblings ...) 2009-07-31 10:30 ` [Qemu-devel] [PATCH 3/5] qdev/isa: make the piix isa bridge register an isa bus Gerd Hoffmann @ 2009-07-31 10:30 ` Gerd Hoffmann 2009-07-31 10:30 ` [Qemu-devel] [PATCH 5/5] qdev/isa: convert fdc Gerd Hoffmann 4 siblings, 0 replies; 7+ messages in thread From: Gerd Hoffmann @ 2009-07-31 10:30 UTC (permalink / raw) To: qemu-devel; +Cc: Gerd Hoffmann Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- hw/pc.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/hw/pc.c b/hw/pc.c index bc9e646..683d99e 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -1116,6 +1116,7 @@ static void pc_init1(ram_addr_t ram_size, int bios_size, isa_bios_size, oprom_area_size; PCIBus *pci_bus; PCIDevice *pci_dev; + ISADevice *isa_dev; int piix3_devfn = -1; CPUState *env; qemu_irq *cpu_irq; @@ -1362,7 +1363,9 @@ static void pc_init1(ram_addr_t ram_size, } } - i8042_init(i8259[1], i8259[12], 0x60); + isa_dev = isa_create_simple("i8042", 0x60, 0x64); + isa_connect_irq(isa_dev, 0, i8259[1]); + isa_connect_irq(isa_dev, 1, i8259[12]); DMA_init(0); #ifdef HAS_AUDIO audio_init(pci_enabled ? pci_bus : NULL, i8259); -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH 5/5] qdev/isa: convert fdc. 2009-07-31 10:30 [Qemu-devel] [PATCH 0/5] qdev: add isa bus support Gerd Hoffmann ` (3 preceding siblings ...) 2009-07-31 10:30 ` [Qemu-devel] [PATCH 4/5] qdev/isa: make pc use qdev for i8042 setup Gerd Hoffmann @ 2009-07-31 10:30 ` Gerd Hoffmann 4 siblings, 0 replies; 7+ messages in thread From: Gerd Hoffmann @ 2009-07-31 10:30 UTC (permalink / raw) To: qemu-devel; +Cc: Gerd Hoffmann Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- hw/fdc.c | 117 ++++++++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 76 insertions(+), 41 deletions(-) diff --git a/hw/fdc.c b/hw/fdc.c index 096f12e..c55560f 100644 --- a/hw/fdc.c +++ b/hw/fdc.c @@ -471,7 +471,6 @@ enum { #define FD_FORMAT_CMD(state) ((state) & FD_STATE_FORMAT) struct fdctrl_t { - SysBusDevice busdev; /* Controller's identification */ uint8_t version; /* HW */ @@ -513,6 +512,16 @@ struct fdctrl_t { int reset_sensei; }; +typedef struct fdctrl_sysbus_t { + SysBusDevice busdev; + struct fdctrl_t state; +} fdctrl_sysbus_t; + +typedef struct fdctrl_isabus_t { + ISADevice busdev; + struct fdctrl_t state; +} fdctrl_isabus_t; + static uint32_t fdctrl_read (void *opaque, uint32_t reg) { fdctrl_t *fdctrl = opaque; @@ -1866,27 +1875,26 @@ fdctrl_t *fdctrl_init (qemu_irq irq, int dma_chann, int mem_mapped, target_phys_addr_t io_base, BlockDriverState **fds) { - DeviceState *dev; - SysBusDevice *s; fdctrl_t *fdctrl; - dev = qdev_create(NULL, "fdc"); - qdev_init(dev); - s = sysbus_from_qdev(dev); - sysbus_connect_irq(s, 0, irq); - fdctrl = FROM_SYSBUS(fdctrl_t, s); if (mem_mapped) { - sysbus_mmio_map(s, 0, io_base); + DeviceState *dev; + fdctrl_sysbus_t *sys; + + dev = qdev_create(NULL, "sysbus-fdc"); + qdev_init(dev); + sys = DO_UPCAST(fdctrl_sysbus_t, busdev.qdev, dev); + fdctrl = &sys->state; + sysbus_connect_irq(&sys->busdev, 0, irq); + sysbus_mmio_map(&sys->busdev, 0, io_base); } else { - register_ioport_read((uint32_t)io_base + 0x01, 5, 1, - &fdctrl_read_port, fdctrl); - register_ioport_read((uint32_t)io_base + 0x07, 1, 1, - &fdctrl_read_port, fdctrl); - register_ioport_write((uint32_t)io_base + 0x01, 5, 1, - &fdctrl_write_port, fdctrl); - register_ioport_write((uint32_t)io_base + 0x07, 1, 1, - &fdctrl_write_port, fdctrl); + ISADevice *dev; + + dev = isa_create_simple("isa-fdc", io_base, 0); + fdctrl = &(DO_UPCAST(fdctrl_isabus_t, busdev, dev)->state); + isa_connect_irq(dev, 0, irq); } + fdctrl->dma_chann = dma_chann; DMA_register_channel(dma_chann, &fdctrl_transfer_handler, fdctrl); @@ -1899,18 +1907,17 @@ fdctrl_t *sun4m_fdctrl_init (qemu_irq irq, target_phys_addr_t io_base, BlockDriverState **fds, qemu_irq *fdc_tc) { DeviceState *dev; - SysBusDevice *s; + fdctrl_sysbus_t *sys; fdctrl_t *fdctrl; dev = qdev_create(NULL, "SUNW,fdtwo"); qdev_init(dev); - s = sysbus_from_qdev(dev); - sysbus_connect_irq(s, 0, irq); - sysbus_mmio_map(s, 0, io_base); + sys = DO_UPCAST(fdctrl_sysbus_t, busdev.qdev, dev); + fdctrl = &sys->state; + sysbus_connect_irq(&sys->busdev, 0, irq); + sysbus_mmio_map(&sys->busdev, 0, io_base); *fdc_tc = qdev_get_gpio_in(dev, 0); - fdctrl = FROM_SYSBUS(fdctrl_t, s); - fdctrl->dma_chann = -1; fdctrl_connect_drives(fdctrl, fds); @@ -1918,16 +1925,11 @@ fdctrl_t *sun4m_fdctrl_init (qemu_irq irq, target_phys_addr_t io_base, return fdctrl; } -static void fdctrl_init_common(SysBusDevice *dev, fdctrl_t *fdctrl, - int is_sun4m, int io) +static void fdctrl_init_common(fdctrl_t *fdctrl) { int i, j; static int command_tables_inited = 0; - sysbus_init_irq(dev, &fdctrl->irq); - qdev_init_gpio_in(&dev->qdev, fdctrl_handle_tc, 1); - sysbus_init_mmio(dev, 0x08, io); - /* Fill 'command_to_handler' lookup table */ if (!command_tables_inited) { command_tables_inited = 1; @@ -1947,47 +1949,80 @@ static void fdctrl_init_common(SysBusDevice *dev, fdctrl_t *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) +static void isabus_fdc_init1(ISADevice *dev) +{ + fdctrl_isabus_t *isa = DO_UPCAST(fdctrl_isabus_t, busdev, dev); + fdctrl_t *fdctrl = &isa->state; + + register_ioport_read(isa->busdev.iobase[0] + 0x01, 5, 1, + &fdctrl_read_port, fdctrl); + register_ioport_read(isa->busdev.iobase[0] + 0x07, 1, 1, + &fdctrl_read_port, fdctrl); + register_ioport_write(isa->busdev.iobase[0] + 0x01, 5, 1, + &fdctrl_write_port, fdctrl); + register_ioport_write(isa->busdev.iobase[0] + 0x07, 1, 1, + &fdctrl_write_port, fdctrl); + isa_init_irq(&isa->busdev, &fdctrl->irq); + + fdctrl_init_common(fdctrl); +} + +static void sysbus_fdc_init1(SysBusDevice *dev) { - fdctrl_t *fdctrl = FROM_SYSBUS(fdctrl_t, dev); + fdctrl_t *fdctrl = &(FROM_SYSBUS(fdctrl_sysbus_t, dev)->state); int io; io = cpu_register_io_memory(fdctrl_mem_read, fdctrl_mem_write, fdctrl); - fdctrl_init_common(dev, fdctrl, 0, io); + sysbus_init_mmio(dev, 0x08, io); + sysbus_init_irq(dev, &fdctrl->irq); + qdev_init_gpio_in(&dev->qdev, fdctrl_handle_tc, 1); + + fdctrl_init_common(fdctrl); } static void sun4m_fdc_init1(SysBusDevice *dev) { - fdctrl_t *fdctrl = FROM_SYSBUS(fdctrl_t, dev); + fdctrl_t *fdctrl = &(FROM_SYSBUS(fdctrl_sysbus_t, dev)->state); int io; io = cpu_register_io_memory(fdctrl_mem_read_strict, fdctrl_mem_write_strict, fdctrl); - fdctrl_init_common(dev, fdctrl, 1, io); + sysbus_init_mmio(dev, 0x08, io); + sysbus_init_irq(dev, &fdctrl->irq); + qdev_init_gpio_in(&dev->qdev, fdctrl_handle_tc, 1); + + fdctrl->sun4m = 1; + fdctrl_init_common(fdctrl); } -static SysBusDeviceInfo fdc_info = { - .init = fdc_init1, - .qdev.name = "fdc", - .qdev.size = sizeof(fdctrl_t), +static ISADeviceInfo isa_fdc_info = { + .init = isabus_fdc_init1, + .qdev.name = "isa-fdc", + .qdev.size = sizeof(fdctrl_isabus_t), +}; + +static SysBusDeviceInfo sysbus_fdc_info = { + .init = sysbus_fdc_init1, + .qdev.name = "sysbus-fdc", + .qdev.size = sizeof(fdctrl_sysbus_t), }; static SysBusDeviceInfo sun4m_fdc_info = { .init = sun4m_fdc_init1, .qdev.name = "SUNW,fdtwo", - .qdev.size = sizeof(fdctrl_t), + .qdev.size = sizeof(fdctrl_sysbus_t), }; static void fdc_register_devices(void) { - sysbus_register_withprop(&fdc_info); + isa_qdev_register(&isa_fdc_info); + sysbus_register_withprop(&sysbus_fdc_info); sysbus_register_withprop(&sun4m_fdc_info); } -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH 0/5] qdev: add isa bus support @ 2009-07-28 16:16 Gerd Hoffmann 2009-07-28 16:16 ` [Qemu-devel] [PATCH 5/5] qdev/isa: convert fdc Gerd Hoffmann 0 siblings, 1 reply; 7+ messages in thread From: Gerd Hoffmann @ 2009-07-28 16:16 UTC (permalink / raw) To: qemu-devel; +Cc: Gerd Hoffmann Hi, This series adds isa bus support to qdev and converts two devices (pc kbd controller, floppy controller). cheers, Gerd ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH 5/5] qdev/isa: convert fdc. 2009-07-28 16:16 [Qemu-devel] [PATCH 0/5] qdev: add isa bus support Gerd Hoffmann @ 2009-07-28 16:16 ` Gerd Hoffmann 0 siblings, 0 replies; 7+ messages in thread From: Gerd Hoffmann @ 2009-07-28 16:16 UTC (permalink / raw) To: qemu-devel; +Cc: Gerd Hoffmann Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- hw/fdc.c | 117 ++++++++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 76 insertions(+), 41 deletions(-) diff --git a/hw/fdc.c b/hw/fdc.c index 096f12e..c55560f 100644 --- a/hw/fdc.c +++ b/hw/fdc.c @@ -471,7 +471,6 @@ enum { #define FD_FORMAT_CMD(state) ((state) & FD_STATE_FORMAT) struct fdctrl_t { - SysBusDevice busdev; /* Controller's identification */ uint8_t version; /* HW */ @@ -513,6 +512,16 @@ struct fdctrl_t { int reset_sensei; }; +typedef struct fdctrl_sysbus_t { + SysBusDevice busdev; + struct fdctrl_t state; +} fdctrl_sysbus_t; + +typedef struct fdctrl_isabus_t { + ISADevice busdev; + struct fdctrl_t state; +} fdctrl_isabus_t; + static uint32_t fdctrl_read (void *opaque, uint32_t reg) { fdctrl_t *fdctrl = opaque; @@ -1866,27 +1875,26 @@ fdctrl_t *fdctrl_init (qemu_irq irq, int dma_chann, int mem_mapped, target_phys_addr_t io_base, BlockDriverState **fds) { - DeviceState *dev; - SysBusDevice *s; fdctrl_t *fdctrl; - dev = qdev_create(NULL, "fdc"); - qdev_init(dev); - s = sysbus_from_qdev(dev); - sysbus_connect_irq(s, 0, irq); - fdctrl = FROM_SYSBUS(fdctrl_t, s); if (mem_mapped) { - sysbus_mmio_map(s, 0, io_base); + DeviceState *dev; + fdctrl_sysbus_t *sys; + + dev = qdev_create(NULL, "sysbus-fdc"); + qdev_init(dev); + sys = DO_UPCAST(fdctrl_sysbus_t, busdev.qdev, dev); + fdctrl = &sys->state; + sysbus_connect_irq(&sys->busdev, 0, irq); + sysbus_mmio_map(&sys->busdev, 0, io_base); } else { - register_ioport_read((uint32_t)io_base + 0x01, 5, 1, - &fdctrl_read_port, fdctrl); - register_ioport_read((uint32_t)io_base + 0x07, 1, 1, - &fdctrl_read_port, fdctrl); - register_ioport_write((uint32_t)io_base + 0x01, 5, 1, - &fdctrl_write_port, fdctrl); - register_ioport_write((uint32_t)io_base + 0x07, 1, 1, - &fdctrl_write_port, fdctrl); + ISADevice *dev; + + dev = isa_create_simple("isa-fdc", io_base, 0); + fdctrl = &(DO_UPCAST(fdctrl_isabus_t, busdev, dev)->state); + isa_connect_irq(dev, 0, irq); } + fdctrl->dma_chann = dma_chann; DMA_register_channel(dma_chann, &fdctrl_transfer_handler, fdctrl); @@ -1899,18 +1907,17 @@ fdctrl_t *sun4m_fdctrl_init (qemu_irq irq, target_phys_addr_t io_base, BlockDriverState **fds, qemu_irq *fdc_tc) { DeviceState *dev; - SysBusDevice *s; + fdctrl_sysbus_t *sys; fdctrl_t *fdctrl; dev = qdev_create(NULL, "SUNW,fdtwo"); qdev_init(dev); - s = sysbus_from_qdev(dev); - sysbus_connect_irq(s, 0, irq); - sysbus_mmio_map(s, 0, io_base); + sys = DO_UPCAST(fdctrl_sysbus_t, busdev.qdev, dev); + fdctrl = &sys->state; + sysbus_connect_irq(&sys->busdev, 0, irq); + sysbus_mmio_map(&sys->busdev, 0, io_base); *fdc_tc = qdev_get_gpio_in(dev, 0); - fdctrl = FROM_SYSBUS(fdctrl_t, s); - fdctrl->dma_chann = -1; fdctrl_connect_drives(fdctrl, fds); @@ -1918,16 +1925,11 @@ fdctrl_t *sun4m_fdctrl_init (qemu_irq irq, target_phys_addr_t io_base, return fdctrl; } -static void fdctrl_init_common(SysBusDevice *dev, fdctrl_t *fdctrl, - int is_sun4m, int io) +static void fdctrl_init_common(fdctrl_t *fdctrl) { int i, j; static int command_tables_inited = 0; - sysbus_init_irq(dev, &fdctrl->irq); - qdev_init_gpio_in(&dev->qdev, fdctrl_handle_tc, 1); - sysbus_init_mmio(dev, 0x08, io); - /* Fill 'command_to_handler' lookup table */ if (!command_tables_inited) { command_tables_inited = 1; @@ -1947,47 +1949,80 @@ static void fdctrl_init_common(SysBusDevice *dev, fdctrl_t *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) +static void isabus_fdc_init1(ISADevice *dev) +{ + fdctrl_isabus_t *isa = DO_UPCAST(fdctrl_isabus_t, busdev, dev); + fdctrl_t *fdctrl = &isa->state; + + register_ioport_read(isa->busdev.iobase[0] + 0x01, 5, 1, + &fdctrl_read_port, fdctrl); + register_ioport_read(isa->busdev.iobase[0] + 0x07, 1, 1, + &fdctrl_read_port, fdctrl); + register_ioport_write(isa->busdev.iobase[0] + 0x01, 5, 1, + &fdctrl_write_port, fdctrl); + register_ioport_write(isa->busdev.iobase[0] + 0x07, 1, 1, + &fdctrl_write_port, fdctrl); + isa_init_irq(&isa->busdev, &fdctrl->irq); + + fdctrl_init_common(fdctrl); +} + +static void sysbus_fdc_init1(SysBusDevice *dev) { - fdctrl_t *fdctrl = FROM_SYSBUS(fdctrl_t, dev); + fdctrl_t *fdctrl = &(FROM_SYSBUS(fdctrl_sysbus_t, dev)->state); int io; io = cpu_register_io_memory(fdctrl_mem_read, fdctrl_mem_write, fdctrl); - fdctrl_init_common(dev, fdctrl, 0, io); + sysbus_init_mmio(dev, 0x08, io); + sysbus_init_irq(dev, &fdctrl->irq); + qdev_init_gpio_in(&dev->qdev, fdctrl_handle_tc, 1); + + fdctrl_init_common(fdctrl); } static void sun4m_fdc_init1(SysBusDevice *dev) { - fdctrl_t *fdctrl = FROM_SYSBUS(fdctrl_t, dev); + fdctrl_t *fdctrl = &(FROM_SYSBUS(fdctrl_sysbus_t, dev)->state); int io; io = cpu_register_io_memory(fdctrl_mem_read_strict, fdctrl_mem_write_strict, fdctrl); - fdctrl_init_common(dev, fdctrl, 1, io); + sysbus_init_mmio(dev, 0x08, io); + sysbus_init_irq(dev, &fdctrl->irq); + qdev_init_gpio_in(&dev->qdev, fdctrl_handle_tc, 1); + + fdctrl->sun4m = 1; + fdctrl_init_common(fdctrl); } -static SysBusDeviceInfo fdc_info = { - .init = fdc_init1, - .qdev.name = "fdc", - .qdev.size = sizeof(fdctrl_t), +static ISADeviceInfo isa_fdc_info = { + .init = isabus_fdc_init1, + .qdev.name = "isa-fdc", + .qdev.size = sizeof(fdctrl_isabus_t), +}; + +static SysBusDeviceInfo sysbus_fdc_info = { + .init = sysbus_fdc_init1, + .qdev.name = "sysbus-fdc", + .qdev.size = sizeof(fdctrl_sysbus_t), }; static SysBusDeviceInfo sun4m_fdc_info = { .init = sun4m_fdc_init1, .qdev.name = "SUNW,fdtwo", - .qdev.size = sizeof(fdctrl_t), + .qdev.size = sizeof(fdctrl_sysbus_t), }; static void fdc_register_devices(void) { - sysbus_register_withprop(&fdc_info); + isa_qdev_register(&isa_fdc_info); + sysbus_register_withprop(&sysbus_fdc_info); sysbus_register_withprop(&sun4m_fdc_info); } -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2009-07-31 10:30 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-07-31 10:30 [Qemu-devel] [PATCH 0/5] qdev: add isa bus support Gerd Hoffmann 2009-07-31 10:30 ` [Qemu-devel] [PATCH 1/5] qdev/isa: add isa bus support to qdev Gerd Hoffmann 2009-07-31 10:30 ` [Qemu-devel] [PATCH 2/5] qdev/isa: add qdev support to i8042 (aka ps/2 kbd+mouse) Gerd Hoffmann 2009-07-31 10:30 ` [Qemu-devel] [PATCH 3/5] qdev/isa: make the piix isa bridge register an isa bus Gerd Hoffmann 2009-07-31 10:30 ` [Qemu-devel] [PATCH 4/5] qdev/isa: make pc use qdev for i8042 setup Gerd Hoffmann 2009-07-31 10:30 ` [Qemu-devel] [PATCH 5/5] qdev/isa: convert fdc Gerd Hoffmann -- strict thread matches above, loose matches on Subject: below -- 2009-07-28 16:16 [Qemu-devel] [PATCH 0/5] qdev: add isa bus support Gerd Hoffmann 2009-07-28 16:16 ` [Qemu-devel] [PATCH 5/5] qdev/isa: convert fdc Gerd Hoffmann
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).