From patchwork Wed Dec 8 12:13:11 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Graf X-Patchwork-Id: 74695 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 ozlabs.org (Postfix) with ESMTPS id C2FE3B6F1E for ; Wed, 8 Dec 2010 23:26:36 +1100 (EST) Received: from localhost ([127.0.0.1]:55921 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PQJ6P-0003We-Kr for incoming@patchwork.ozlabs.org; Wed, 08 Dec 2010 07:26:33 -0500 Received: from [140.186.70.92] (port=58496 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PQItn-0006IJ-3U for qemu-devel@nongnu.org; Wed, 08 Dec 2010 07:13:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PQItg-0007fu-4I for qemu-devel@nongnu.org; Wed, 08 Dec 2010 07:13:30 -0500 Received: from cantor.suse.de ([195.135.220.2]:33275 helo=mx1.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PQItf-0007f4-NC for qemu-devel@nongnu.org; Wed, 08 Dec 2010 07:13:23 -0500 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id BCAA393F19; Wed, 8 Dec 2010 13:13:21 +0100 (CET) From: Alexander Graf To: QEMU-devel Developers Date: Wed, 8 Dec 2010 13:13:11 +0100 Message-Id: <1291810400-11309-5-git-send-email-agraf@suse.de> X-Mailer: git-send-email 1.6.0.2 In-Reply-To: <1291810400-11309-1-git-send-email-agraf@suse.de> References: <1291810400-11309-1-git-send-email-agraf@suse.de> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4-2.6 Cc: Kevin Wolf , Joerg Roedel , Paul Brook , Blue Swirl , Gerd Hoffmann , Stefan Hajnoczi , tj@kernel.org, Roland Elek , Sebastian Herbszt Subject: [Qemu-devel] [PATCH 04/13] bmdma: split out irq setting 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 The IDE core doesn't care about BMDMA blocking IRQs from getting submitted, so let's reflect that in the code and make IRQ blocking fully transparent. Signed-off-by: Alexander Graf --- hw/ide/core.c | 6 ------ hw/ide/internal.h | 4 ++-- hw/ide/pci.c | 44 +++++++++++++++++++++++++++----------------- 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/hw/ide/core.c b/hw/ide/core.c index fce994f..6284539 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -2586,18 +2586,12 @@ static void ide_init1(IDEBus *bus, int unit) ide_sector_write_timer_cb, s); } -static int ide_nop_start_irq(void *opaque) -{ - return 1; -} - static int ide_nop(void *opaque) { return 0; } static const IDEDMAOps ide_dma_nop = { - .start_irq = ide_nop_start_irq, .start_dma = (void*)ide_nop, .start_transfer = (void*)ide_nop, .prepare_buf = (void*)ide_nop, diff --git a/hw/ide/internal.h b/hw/ide/internal.h index 15ab119..af7e741 100644 --- a/hw/ide/internal.h +++ b/hw/ide/internal.h @@ -457,7 +457,6 @@ struct IDEState { }; struct IDEDMAOps { - DMAFunc *start_irq; DMAStartFunc *start_dma; DMAFunc *start_transfer; DMAIntFunc *prepare_buf; @@ -530,6 +529,7 @@ struct BMDMAState { uint32_t nsector; IORange addr_ioport; QEMUBH *bh; + qemu_irq irq; }; static inline IDEState *idebus_active_if(IDEBus *bus) @@ -545,7 +545,7 @@ static inline IDEState *bmdma_active_if(BMDMAState *bmdma) static inline void ide_set_irq(IDEBus *bus) { - if (bus->dma.ops->start_irq(bus->dma.opaque)) { + if (!(bus->cmd & IDE_CMD_DISABLE_IRQ)) { qemu_irq_raise(bus->irq); } } diff --git a/hw/ide/pci.c b/hw/ide/pci.c index 2506cc5..270c13a 100644 --- a/hw/ide/pci.c +++ b/hw/ide/pci.c @@ -35,22 +35,6 @@ #define BMDMA_PAGE_SIZE 4096 -static int bmdma_start_irq(void *opaque) -{ - BMDMAState *bm = opaque; - IDEBus *bus = bm->bus; - - if (!(bus->cmd & IDE_CMD_DISABLE_IRQ)) { - if (bm) { - bm->status |= BM_STATUS_INT; - } - return 1; - } - - /* IRQ forbidden */ - return 0; -} - static void bmdma_start_dma(void *opaque, IDEState *s, BlockDriverCompletionFunc *dma_cb) { @@ -286,6 +270,24 @@ static int bmdma_start_transfer(void *opaque) return 0; } +static void bmdma_irq(void *opaque, int n, int level) +{ + BMDMAState *bm = opaque; + + if (!level) { + /* pass through lower */ + qemu_set_irq(bm->irq, level); + return; + } + + if (bm) { + bm->status |= BM_STATUS_INT; + } + + /* trigger the real irq */ + qemu_set_irq(bm->irq, level); +} + void bmdma_cmd_writeb(void *opaque, uint32_t addr, uint32_t val) { BMDMAState *bm = opaque; @@ -453,7 +455,6 @@ void pci_ide_create_devs(PCIDevice *dev, DriveInfo **hd_table) } static const struct IDEDMAOps bmdma_ops = { - .start_irq = bmdma_start_irq, .start_dma = bmdma_start_dma, .start_transfer = bmdma_start_transfer, .prepare_buf = bmdma_prepare_buf, @@ -467,6 +468,15 @@ static const struct IDEDMAOps bmdma_ops = { void bmdma_init(IDEBus *bus, BMDMAState *bm) { + qemu_irq *irq; + + if (bus->dma.ops == &bmdma_ops) { + return; + } + bus->dma.ops = &bmdma_ops; bus->dma.opaque = bm; + bm->irq = bus->irq; + irq = qemu_allocate_irqs(bmdma_irq, bm, 1); + bus->irq = *irq; }