From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MR42p-0004bH-11 for qemu-devel@nongnu.org; Wed, 15 Jul 2009 08:57:11 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MR42k-0004Yk-Ao for qemu-devel@nongnu.org; Wed, 15 Jul 2009 08:57:10 -0400 Received: from [199.232.76.173] (port=52539 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MR42k-0004Yf-5e for qemu-devel@nongnu.org; Wed, 15 Jul 2009 08:57:06 -0400 Received: from mx2.redhat.com ([66.187.237.31]:39735) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MR42j-0002e9-2i for qemu-devel@nongnu.org; Wed, 15 Jul 2009 08:57:05 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n6FCv24v004499 for ; Wed, 15 Jul 2009 08:57:02 -0400 From: Gerd Hoffmann Date: Wed, 15 Jul 2009 14:56:51 +0200 Message-Id: <1247662614-12927-2-git-send-email-kraxel@redhat.com> In-Reply-To: <1247662614-12927-1-git-send-email-kraxel@redhat.com> References: <1247662614-12927-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PATCH 1/4] qdev/isa: add isa bus support to qdev. List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org 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 --- Makefile.target | 8 +++--- hw/isa-bus.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ hw/isa.h | 25 +++++++++++++++++ 3 files changed, 111 insertions(+), 4 deletions(-) create mode 100644 hw/isa-bus.c diff --git a/Makefile.target b/Makefile.target index 1a71f3a..3395dee 100644 --- a/Makefile.target +++ b/Makefile.target @@ -563,7 +563,7 @@ obj-y += wdt_ib700.o wdt_i6300esb.o ifeq ($(TARGET_BASE_ARCH), i386) # Hardware support -obj-y += ide.o pckbd.o vga.o $(sound-obj-y) dma.o +obj-y += ide.o pckbd.o vga.o $(sound-obj-y) dma.o isa-bus.o obj-y += fdc.o mc146818rtc.o serial.o i8259.o i8254.o pcspk.o pc.o obj-y += cirrus_vga.o apic.o ioapic.o parallel.o acpi.o piix_pci.o obj-y += usb-uhci.o vmmouse.o vmport.o vmware_vga.o hpet.o @@ -573,7 +573,7 @@ endif ifeq ($(TARGET_BASE_ARCH), ppc) CPPFLAGS += -DHAS_AUDIO -DHAS_AUDIO_CHOICE # shared objects -obj-y += ppc.o ide.o vga.o $(sound-obj-y) dma.o openpic.o +obj-y += ppc.o ide.o vga.o $(sound-obj-y) dma.o isa-bus.o openpic.o # PREP target obj-y += pckbd.o serial.o i8259.o i8254.o fdc.o mc146818rtc.o obj-y += prep_pci.o ppc_prep.o @@ -599,7 +599,7 @@ obj-y += mips_r4k.o mips_jazz.o mips_malta.o mips_mipssim.o obj-y += mips_timer.o mips_int.o dma.o vga.o serial.o i8254.o i8259.o rc4030.o obj-y += g364fb.o jazz_led.o dp8393x.o obj-y += ide.o gt64xxx.o pckbd.o fdc.o mc146818rtc.o usb-uhci.o acpi.o ds1225y.o -obj-y += piix_pci.o parallel.o cirrus_vga.o pcspk.o $(sound-obj-y) +obj-y += piix_pci.o parallel.o cirrus_vga.o isa-bus.o pcspk.o $(sound-obj-y) obj-y += mipsnet.o obj-y += pflash_cfi01.o obj-y += vmware_vga.o @@ -635,7 +635,7 @@ obj-y += pflash_cfi02.o endif ifeq ($(TARGET_BASE_ARCH), sparc) ifeq ($(TARGET_ARCH), sparc64) -obj-y += sun4u.o ide.o pckbd.o vga.o apb_pci.o +obj-y += sun4u.o ide.o isa-bus.o pckbd.o vga.o apb_pci.o obj-y += fdc.o mc146818rtc.o serial.o obj-y += cirrus_vga.o parallel.o else diff --git a/hw/isa-bus.c b/hw/isa-bus.c new file mode 100644 index 0000000..c0a6447 --- /dev/null +++ b/hw/isa-bus.c @@ -0,0 +1,82 @@ +#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) + 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