* [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 1/5] qdev/isa: add isa bus support to qdev Gerd Hoffmann
` (4 more replies)
0 siblings, 5 replies; 9+ 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] 9+ messages in thread
* [Qemu-devel] [PATCH 1/5] qdev/isa: add isa bus support to qdev.
2009-07-28 16:16 [Qemu-devel] [PATCH 0/5] qdev: add isa bus support Gerd Hoffmann
@ 2009-07-28 16:16 ` Gerd Hoffmann
2009-07-30 14:40 ` Anthony Liguori
2009-07-28 16:16 ` [Qemu-devel] [PATCH 2/5] qdev/isa: add qdev support to i8042 (aka ps/2 kbd+mouse) Gerd Hoffmann
` (3 subsequent siblings)
4 siblings, 1 reply; 9+ messages in thread
From: Gerd Hoffmann @ 2009-07-28 16:16 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Wrong mmio stuff from previous version ripped out.
Pretty simple and straigt forward now.
IRQs modeled simliar to sysbus.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
Makefile.target | 10 +++---
hw/isa-bus.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
hw/isa.h | 25 ++++++++++++++++
3 files changed, 114 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..3dea55b
--- /dev/null
+++ b/hw/isa-bus.c
@@ -0,0 +1,84 @@
+#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] 9+ messages in thread
* [Qemu-devel] [PATCH 2/5] qdev/isa: add qdev support to i8042 (aka ps/2 kbd+mouse).
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 1/5] qdev/isa: add isa bus support to qdev Gerd Hoffmann
@ 2009-07-28 16:16 ` Gerd Hoffmann
2009-07-28 16:16 ` [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; 9+ 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/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] 9+ messages in thread
* [Qemu-devel] [PATCH 3/5] qdev/isa: make the piix isa bridge register an isa bus.
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 1/5] qdev/isa: add isa bus support to qdev Gerd Hoffmann
2009-07-28 16:16 ` [Qemu-devel] [PATCH 2/5] qdev/isa: add qdev support to i8042 (aka ps/2 kbd+mouse) Gerd Hoffmann
@ 2009-07-28 16:16 ` Gerd Hoffmann
2009-07-28 16:16 ` [Qemu-devel] [PATCH 4/5] qdev/isa: make pc use qdev for i8042 setup Gerd Hoffmann
2009-07-28 16:16 ` [Qemu-devel] [PATCH 5/5] qdev/isa: convert fdc Gerd Hoffmann
4 siblings, 0 replies; 9+ 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/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] 9+ messages in thread
* [Qemu-devel] [PATCH 4/5] qdev/isa: make pc use qdev for i8042 setup.
2009-07-28 16:16 [Qemu-devel] [PATCH 0/5] qdev: add isa bus support Gerd Hoffmann
` (2 preceding siblings ...)
2009-07-28 16:16 ` [Qemu-devel] [PATCH 3/5] qdev/isa: make the piix isa bridge register an isa bus Gerd Hoffmann
@ 2009-07-28 16:16 ` Gerd Hoffmann
2009-07-28 16:16 ` [Qemu-devel] [PATCH 5/5] qdev/isa: convert fdc Gerd Hoffmann
4 siblings, 0 replies; 9+ 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/pc.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/hw/pc.c b/hw/pc.c
index 46ff8cf..86bb138 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -1122,6 +1122,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;
@@ -1369,7 +1370,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] 9+ 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
` (3 preceding siblings ...)
2009-07-28 16:16 ` [Qemu-devel] [PATCH 4/5] qdev/isa: make pc use qdev for i8042 setup Gerd Hoffmann
@ 2009-07-28 16:16 ` Gerd Hoffmann
4 siblings, 0 replies; 9+ 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] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 1/5] qdev/isa: add isa bus support to qdev.
2009-07-28 16:16 ` [Qemu-devel] [PATCH 1/5] qdev/isa: add isa bus support to qdev Gerd Hoffmann
@ 2009-07-30 14:40 ` Anthony Liguori
2009-07-30 15:02 ` Gerd Hoffmann
0 siblings, 1 reply; 9+ messages in thread
From: Anthony Liguori @ 2009-07-30 14:40 UTC (permalink / raw)
To: Gerd Hoffmann; +Cc: qemu-devel
Gerd Hoffmann wrote:
> Wrong mmio stuff from previous version ripped out.
> Pretty simple and straigt forward now.
> IRQs modeled simliar to sysbus.
>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
> Makefile.target | 10 +++---
> hw/isa-bus.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> hw/isa.h | 25 ++++++++++++++++
> 3 files changed, 114 insertions(+), 5 deletions(-)
> create mode 100644 hw/isa-bus.c
>
>
> diff --git a/hw/isa-bus.c b/hw/isa-bus.c
> new file mode 100644
> index 0000000..3dea55b
> --- /dev/null
> +++ b/hw/isa-bus.c
> @@ -0,0 +1,84 @@
> +#include "hw.h"
> +#include "sysemu.h"
> +#include "isa.h"
> +
Need copyright/license.
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 1/5] qdev/isa: add isa bus support to qdev.
2009-07-30 14:40 ` Anthony Liguori
@ 2009-07-30 15:02 ` Gerd Hoffmann
0 siblings, 0 replies; 9+ messages in thread
From: Gerd Hoffmann @ 2009-07-30 15:02 UTC (permalink / raw)
To: Anthony Liguori; +Cc: qemu-devel
On 07/30/09 16:40, Anthony Liguori wrote:
>> --- /dev/null
>> +++ b/hw/isa-bus.c
> Need copyright/license.
Just sent as incremental patch as you've queued it up already.
cheers,
Gerd
^ permalink raw reply [flat|nested] 9+ 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
0 siblings, 0 replies; 9+ 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] 9+ messages in thread
end of thread, other threads:[~2009-07-31 10:30 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 1/5] qdev/isa: add isa bus support to qdev Gerd Hoffmann
2009-07-30 14:40 ` Anthony Liguori
2009-07-30 15:02 ` Gerd Hoffmann
2009-07-28 16:16 ` [Qemu-devel] [PATCH 2/5] qdev/isa: add qdev support to i8042 (aka ps/2 kbd+mouse) Gerd Hoffmann
2009-07-28 16:16 ` [Qemu-devel] [PATCH 3/5] qdev/isa: make the piix isa bridge register an isa bus Gerd Hoffmann
2009-07-28 16:16 ` [Qemu-devel] [PATCH 4/5] qdev/isa: make pc use qdev for i8042 setup Gerd Hoffmann
2009-07-28 16:16 ` [Qemu-devel] [PATCH 5/5] qdev/isa: convert fdc Gerd Hoffmann
-- strict thread matches above, loose matches on Subject: below --
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
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.