From patchwork Wed Dec 1 19:17:06 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Graf X-Patchwork-Id: 73900 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 B9060B70A5 for ; Thu, 2 Dec 2010 07:14:04 +1100 (EST) Received: from localhost ([127.0.0.1]:36664 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PNsFW-0004YB-5q for incoming@patchwork.ozlabs.org; Wed, 01 Dec 2010 14:21:54 -0500 Received: from [140.186.70.92] (port=47410 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PNsB5-00030b-UX for qemu-devel@nongnu.org; Wed, 01 Dec 2010 14:17:24 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PNsB3-0004tM-24 for qemu-devel@nongnu.org; Wed, 01 Dec 2010 14:17:19 -0500 Received: from cantor2.suse.de ([195.135.220.15]:56924 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PNsB2-0004s7-H9 for qemu-devel@nongnu.org; Wed, 01 Dec 2010 14:17:16 -0500 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 0713D92706; Wed, 1 Dec 2010 20:17:14 +0100 (CET) From: Alexander Graf To: QEMU-devel Developers Date: Wed, 1 Dec 2010 20:17:06 +0100 Message-Id: <1291231032-21150-5-git-send-email-agraf@suse.de> X-Mailer: git-send-email 1.6.0.2 In-Reply-To: <1291231032-21150-1-git-send-email-agraf@suse.de> References: <1291231032-21150-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/10] ide: add DMA hooks to bus ops 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 For DMA operations, we need to hook into even more IDE functionality. This patch adds the respective hooking points, allowing us to handle SG lists ourselves in the AHCI code. Signed-off-by: Roland Elek Signed-off-by: Alexander Graf Reviewed-by: Stefan Hajnoczi --- v1 -> v2: - make dma hooks explicit by putting them into ops struct (stefanha) v6 -> v7: - rename IDEBusOps (stefanha) --- hw/ide/core.c | 9 ++++++--- hw/ide/internal.h | 4 ++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/hw/ide/core.c b/hw/ide/core.c index 3912c21..1680a38 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -614,7 +614,7 @@ static void ide_read_dma_cb(void *opaque, int ret) n = s->nsector; s->io_buffer_index = 0; s->io_buffer_size = n * 512; - if (dma_buf_prepare(bm, 1) == 0) + if (s->bus->ops->dma_prepare(bm, 1) == 0) goto eot; #ifdef DEBUG_AIO printf("aio_read: sector_num=%" PRId64 " n=%d\n", sector_num, n); @@ -756,7 +756,7 @@ static void ide_write_dma_cb(void *opaque, int ret) n = s->nsector; s->io_buffer_size = n * 512; /* launch next transfer */ - if (dma_buf_prepare(bm, 0) == 0) + if (s->bus->ops->dma_prepare(bm, 0) == 0) goto eot; #ifdef DEBUG_AIO printf("aio_write: sector_num=%" PRId64 " n=%d\n", sector_num, n); @@ -1064,7 +1064,7 @@ static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret) s->lba += n; } s->packet_transfer_size -= s->io_buffer_size; - if (dma_buf_rw(bm, 1) == 0) + if (s->bus->ops->dma_rw(bm, 1) == 0) goto eot; } @@ -2716,6 +2716,7 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs, } else { pstrcpy(s->version, sizeof(s->version), QEMU_VERSION); } + ide_reset(s); bdrv_set_removable(bs, s->drive_kind == IDE_CD); return 0; @@ -2741,6 +2742,8 @@ static IDEBusOps pata_bus_ops = { .transfer_start = pata_transfer_start, .set_irq = pata_set_irq, .dma_start = pata_dma_start, + .dma_prepare = dma_buf_prepare, + .dma_rw = dma_buf_rw, }; void ide_init2(IDEBus *bus, qemu_irq irq) diff --git a/hw/ide/internal.h b/hw/ide/internal.h index f5d6ba7..1b5e738 100644 --- a/hw/ide/internal.h +++ b/hw/ide/internal.h @@ -375,6 +375,8 @@ typedef void TransferStartFunc(IDEState *, EndTransferFunc *); typedef void IRQSetFunc(IDEBus *); typedef void DMAStartFunc(IDEState *, BlockDriverCompletionFunc *); +typedef int DMAPrepareFunc(BMDMAState *, int); +typedef int DMARWFunc(BMDMAState *, int); /* NOTE: IDEState represents in fact one drive */ struct IDEState { @@ -458,6 +460,8 @@ struct IDEBusOps { TransferStartFunc *transfer_start; IRQSetFunc *set_irq; DMAStartFunc *dma_start; + DMAPrepareFunc *dma_prepare; + DMARWFunc *dma_rw; }; struct IDEBus {