From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=45184 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PJH9s-0004TW-N2 for qemu-devel@nongnu.org; Thu, 18 Nov 2010 21:57:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PJH9k-0004dB-HG for qemu-devel@nongnu.org; Thu, 18 Nov 2010 21:57:04 -0500 Received: from cantor.suse.de ([195.135.220.2]:40723 helo=mx1.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PJH9k-0004c2-61 for qemu-devel@nongnu.org; Thu, 18 Nov 2010 21:56:56 -0500 From: Alexander Graf Date: Fri, 19 Nov 2010 03:56:46 +0100 Message-Id: <1290135413-21462-5-git-send-email-agraf@suse.de> In-Reply-To: <1290135413-21462-1-git-send-email-agraf@suse.de> References: <1290135413-21462-1-git-send-email-agraf@suse.de> Subject: [Qemu-devel] [PATCH 04/11] ide: add DMA hooks to bus ops List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: QEMU-devel Developers Cc: Kevin Wolf , Joerg Roedel , Gerd Hoffmann , Stefan Hajnoczi , tj@kernel.org, Roland Elek , Sebastian Herbszt 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 --- v1 -> v2: - make dma hooks explicit by putting them into ops struct (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 c8d7810..04190d2 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -607,7 +607,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_fn(bm, 1) == 0) goto eot; #ifdef DEBUG_AIO printf("aio_read: sector_num=%" PRId64 " n=%d\n", sector_num, n); @@ -752,7 +752,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_fn(bm, 0) == 0) goto eot; #ifdef DEBUG_AIO printf("aio_write: sector_num=%" PRId64 " n=%d\n", sector_num, n); @@ -1060,7 +1060,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_fn(bm, 1) == 0) goto eot; } @@ -2715,6 +2715,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; @@ -2740,6 +2741,8 @@ static IDEBusOps ide_bus_ops = { .transfer_start_fn = pata_transfer_start, .irq_set_fn = pata_set_irq, .dma_start_fn = pata_dma_start, + .dma_prepare_fn = dma_buf_prepare, + .dma_rw_fn = dma_buf_rw, }; void ide_init2(IDEBus *bus, qemu_irq irq) diff --git a/hw/ide/internal.h b/hw/ide/internal.h index ee7e13e..4bee636 100644 --- a/hw/ide/internal.h +++ b/hw/ide/internal.h @@ -374,6 +374,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 { @@ -457,6 +459,8 @@ struct IDEBusOps { TransferStartFunc *transfer_start_fn; IRQSetFunc *irq_set_fn; DMAStartFunc *dma_start_fn; + DMAPrepareFunc *dma_prepare_fn; + DMARWFunc *dma_rw_fn; }; struct IDEBus { -- 1.6.0.2