From patchwork Thu Sep 10 09:43:32 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerd Hoffmann X-Patchwork-Id: 33305 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by bilbo.ozlabs.org (Postfix) with ESMTPS id BA8D2B6F1E for ; Thu, 10 Sep 2009 20:49:44 +1000 (EST) Received: from localhost ([127.0.0.1]:46458 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MlhDg-0002k0-H4 for incoming@patchwork.ozlabs.org; Thu, 10 Sep 2009 06:49:40 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MlgC2-0008WM-0Q for qemu-devel@nongnu.org; Thu, 10 Sep 2009 05:43:54 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MlgBx-0008U5-LR for qemu-devel@nongnu.org; Thu, 10 Sep 2009 05:43:53 -0400 Received: from [199.232.76.173] (port=39547 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MlgBw-0008Tm-Gr for qemu-devel@nongnu.org; Thu, 10 Sep 2009 05:43:48 -0400 Received: from mx1.redhat.com ([209.132.183.28]:5492) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MlgBv-0005WF-Jo for qemu-devel@nongnu.org; Thu, 10 Sep 2009 05:43:48 -0400 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n8A9hkQj020477 for ; Thu, 10 Sep 2009 05:43:47 -0400 Received: from zweiblum.home.kraxel.org (vpn2-9-74.ams2.redhat.com [10.36.9.74]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id n8A9hf7j030527; Thu, 10 Sep 2009 05:43:42 -0400 Received: by zweiblum.home.kraxel.org (Postfix, from userid 500) id DDB99700E9; Thu, 10 Sep 2009 11:43:35 +0200 (CEST) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Thu, 10 Sep 2009 11:43:32 +0200 Message-Id: <1252575815-7824-11-git-send-email-kraxel@redhat.com> In-Reply-To: <1252575815-7824-1-git-send-email-kraxel@redhat.com> References: <1252575815-7824-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Cc: Gerd Hoffmann Subject: [Qemu-devel] [PATCH v2 10/13] qdev/isa: convert gravis ultrasound X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Gerd Hoffmann --- hw/gus.c | 75 ++++++++++++++++++++++++++++++++++++++-------------------- hw/gusemu.h | 4 +- 2 files changed, 51 insertions(+), 28 deletions(-) diff --git a/hw/gus.c b/hw/gus.c index 5e73c5a..b41095e 100644 --- a/hw/gus.c +++ b/hw/gus.c @@ -54,16 +54,18 @@ static struct { } conf = {0x240, 7, 3, 44100}; typedef struct GUSState { + ISADevice dev; GUSEmuState emu; QEMUSoundCard card; - int freq; + uint32_t freq; + uint32_t port; int pos, left, shift, irqs; GUSsample *mixbuf; uint8_t himem[1024 * 1024 + 32 + 4096]; int samples; SWVoiceOut *voice; int64_t last_ticks; - qemu_irq *pic; + qemu_irq pic; } GUSState; IO_READ_PROTO (gus_readb) @@ -168,8 +170,8 @@ reset: int GUS_irqrequest (GUSEmuState *emu, int hwirq, int n) { GUSState *s = emu->opaque; - /* qemu_irq_lower (s->pic[hwirq]); */ - qemu_irq_raise (s->pic[hwirq]); + /* qemu_irq_lower (s->pic); */ + qemu_irq_raise (s->pic); s->irqs += n; ldebug ("irqrequest %d %d %d\n", hwirq, n, s->irqs); return n; @@ -179,7 +181,7 @@ void GUS_irqclear (GUSEmuState *emu, int hwirq) { GUSState *s = emu->opaque; ldebug ("irqclear %d %d\n", hwirq, s->irqs); - qemu_irq_lower (s->pic[hwirq]); + qemu_irq_lower (s->pic); s->irqs -= 1; #ifdef IRQ_STORM if (s->irqs > 0) { @@ -250,16 +252,14 @@ static int GUS_load (QEMUFile *f, void *opaque, int version_id) return 0; } -int GUS_init (qemu_irq *pic) +static int gus_initfn (ISADevice *dev) { - GUSState *s; + GUSState *s = DO_UPCAST(GUSState, dev, dev); struct audsettings as; - s = qemu_mallocz (sizeof (*s)); - AUD_register_card ("gus", &s->card); - as.freq = conf.freq; + as.freq = s->freq; as.nchannels = 2; as.fmt = AUD_FMT_S16; as.endianness = GUS_ENDIANNESS; @@ -283,34 +283,57 @@ int GUS_init (qemu_irq *pic) s->samples = AUD_get_buffer_size_out (s->voice) >> s->shift; s->mixbuf = qemu_mallocz (s->samples << s->shift); - register_ioport_write (conf.port, 1, 1, gus_writeb, s); - register_ioport_write (conf.port, 1, 2, gus_writew, s); + register_ioport_write (s->port, 1, 1, gus_writeb, s); + register_ioport_write (s->port, 1, 2, gus_writew, s); - register_ioport_read ((conf.port + 0x100) & 0xf00, 1, 1, gus_readb, s); - register_ioport_read ((conf.port + 0x100) & 0xf00, 1, 2, gus_readw, s); + register_ioport_read ((s->port + 0x100) & 0xf00, 1, 1, gus_readb, s); + register_ioport_read ((s->port + 0x100) & 0xf00, 1, 2, gus_readw, s); - register_ioport_write (conf.port + 6, 10, 1, gus_writeb, s); - register_ioport_write (conf.port + 6, 10, 2, gus_writew, s); - register_ioport_read (conf.port + 6, 10, 1, gus_readb, s); - register_ioport_read (conf.port + 6, 10, 2, gus_readw, s); + register_ioport_write (s->port + 6, 10, 1, gus_writeb, s); + register_ioport_write (s->port + 6, 10, 2, gus_writew, s); + register_ioport_read (s->port + 6, 10, 1, gus_readb, s); + register_ioport_read (s->port + 6, 10, 2, gus_readw, s); - register_ioport_write (conf.port + 0x100, 8, 1, gus_writeb, s); - register_ioport_write (conf.port + 0x100, 8, 2, gus_writew, s); - register_ioport_read (conf.port + 0x100, 8, 1, gus_readb, s); - register_ioport_read (conf.port + 0x100, 8, 2, gus_readw, s); + register_ioport_write (s->port + 0x100, 8, 1, gus_writeb, s); + register_ioport_write (s->port + 0x100, 8, 2, gus_writew, s); + register_ioport_read (s->port + 0x100, 8, 1, gus_readb, s); + register_ioport_read (s->port + 0x100, 8, 2, gus_readw, s); DMA_register_channel (conf.dma, GUS_read_DMA, s); - s->emu.gusirq = conf.irq; - s->emu.gusdma = conf.dma; s->emu.himemaddr = s->himem; s->emu.gusdatapos = s->emu.himemaddr + 1024 * 1024 + 32; s->emu.opaque = s; - s->freq = conf.freq; - s->pic = pic; + isa_init_irq(dev, &s->pic, s->emu.gusirq); AUD_set_active_out (s->voice, 1); register_savevm ("gus", 0, 2, GUS_save, GUS_load, s); return 0; } + +int GUS_init (qemu_irq *pic) +{ + isa_create_simple("gus"); + return 0; +} + +static ISADeviceInfo gus_info = { + .qdev.name = "gus", + .qdev.desc = "Creative Sound Blaster 16", + .qdev.size = sizeof (GUSState), + .init = gus_initfn, + .qdev.props = (Property[]) { + DEFINE_PROP_UINT32 ("freq", GUSState, freq, 44100), + DEFINE_PROP_HEX32 ("iobase", GUSState, port, 0x240), + DEFINE_PROP_UINT32 ("irq", GUSState, emu.gusirq, 7), + DEFINE_PROP_UINT32 ("dma", GUSState, emu.gusdma, 3), + DEFINE_PROP_END_OF_LIST (), + }, +}; + +static void gus_register(void) +{ + isa_qdev_register(&gus_info); +} +device_init(gus_register) diff --git a/hw/gusemu.h b/hw/gusemu.h index a64300a..5093767 100644 --- a/hw/gusemu.h +++ b/hw/gusemu.h @@ -46,8 +46,8 @@ typedef struct _GUSEmuState { GUSbyte *himemaddr; /* 1024*1024 bytes used for storing uploaded samples (+32 additional bytes for read padding) */ GUSbyte *gusdatapos; /* (gusdataend-gusdata) bytes used for storing emulated GF1/mixer register states (32*32+4 bytes in initial GUSemu32 version) */ - int gusirq; - int gusdma; + uint32_t gusirq; + uint32_t gusdma; unsigned int timer1fraction; unsigned int timer2fraction; void *opaque;