From patchwork Tue May 3 12:06:40 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 93777 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 7EA841007D1 for ; Tue, 3 May 2011 22:07:05 +1000 (EST) Received: from localhost ([::1]:53921 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QHENa-0007pn-CH for incoming@patchwork.ozlabs.org; Tue, 03 May 2011 08:07:02 -0400 Received: from eggs.gnu.org ([140.186.70.92]:36739) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QHENG-0007jG-42 for qemu-devel@nongnu.org; Tue, 03 May 2011 08:06:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QHENE-0007wj-Sj for qemu-devel@nongnu.org; Tue, 03 May 2011 08:06:42 -0400 Received: from verein.lst.de ([213.95.11.211]:43256 helo=newverein.lst.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QHENE-0007wa-K6 for qemu-devel@nongnu.org; Tue, 03 May 2011 08:06:40 -0400 Received: by newverein.lst.de (Postfix, from userid 2407) id A892E13F1C; Tue, 3 May 2011 14:06:40 +0200 (CEST) Date: Tue, 3 May 2011 14:06:40 +0200 From: Christoph Hellwig To: qemu-devel@nongnu.org Message-ID: <20110503120640.GB10206@lst.de> References: <20110503120616.GA10133@lst.de> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20110503120616.GA10133@lst.de> User-Agent: Mutt/1.5.17 (2007-11-01) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 213.95.11.211 Subject: [Qemu-devel] [PATCH 2/3] ide: allow other dma comands than read and write X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Replace the is_read flag with a dma_cmd flag to allow the dma and restart logic to handler other commands like TRIM. Signed-off-by: Christoph Hellwig Index: qemu/hw/ide/core.c =================================================================== --- qemu.orig/hw/ide/core.c 2011-05-03 11:32:14.727336751 +0200 +++ qemu/hw/ide/core.c 2011-05-03 11:35:56.259469943 +0200 @@ -473,7 +473,7 @@ handle_rw_error: if (ret < 0) { int op = BM_STATUS_DMA_RETRY; - if (s->is_read) + if (s->dma_cmd == IDE_DMA_READ) op |= BM_STATUS_RETRY_READ; if (ide_handle_rw_error(s, -ret, op)) { return; @@ -483,7 +483,7 @@ handle_rw_error: n = s->io_buffer_size >> 9; sector_num = ide_get_sector(s); if (n > 0) { - dma_buf_commit(s, s->is_read); + dma_buf_commit(s, ide_cmd_is_read(s)); sector_num += n; ide_set_sector(s, sector_num); s->nsector -= n; @@ -500,20 +500,23 @@ handle_rw_error: n = s->nsector; s->io_buffer_index = 0; s->io_buffer_size = n * 512; - if (s->bus->dma->ops->prepare_buf(s->bus->dma, s->is_read) == 0) + if (s->bus->dma->ops->prepare_buf(s->bus->dma, ide_cmd_is_read(s)) == 0) goto eot; #ifdef DEBUG_AIO - printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, is_read=%d\n", - sector_num, n, s->is_read); + printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, cmd_cmd=%d\n", + sector_num, n, s->dma_cmd); #endif - if (s->is_read) { + switch (s->dma_cmd) { + case IDE_DMA_READ: s->bus->dma->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num, ide_dma_cb, s); - } else { + break; + case IDE_DMA_WRITE: s->bus->dma->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num, ide_dma_cb, s); + break; } if (!s->bus->dma->aiocb) { @@ -527,12 +530,12 @@ eot: ide_set_inactive(s); } -static void ide_sector_start_dma(IDEState *s, int is_read) +static void ide_sector_start_dma(IDEState *s, enum ide_dma_cmd dma_cmd) { s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT; s->io_buffer_index = 0; s->io_buffer_size = 0; - s->is_read = is_read; + s->dma_cmd = dma_cmd; s->bus->dma->ops->start_dma(s->bus->dma, s, ide_dma_cb); } @@ -915,7 +918,7 @@ void ide_exec_cmd(IDEBus *bus, uint32_t if (!s->bs) goto abort_cmd; ide_cmd_lba48_transform(s, lba48); - ide_sector_start_dma(s, 1); + ide_sector_start_dma(s, IDE_DMA_READ); break; case WIN_WRITEDMA_EXT: lba48 = 1; @@ -924,7 +927,7 @@ void ide_exec_cmd(IDEBus *bus, uint32_t if (!s->bs) goto abort_cmd; ide_cmd_lba48_transform(s, lba48); - ide_sector_start_dma(s, 0); + ide_sector_start_dma(s, IDE_DMA_WRITE); s->media_changed = 1; break; case WIN_READ_NATIVE_MAX_EXT: Index: qemu/hw/ide/internal.h =================================================================== --- qemu.orig/hw/ide/internal.h 2011-05-03 11:32:13.884007986 +0200 +++ qemu/hw/ide/internal.h 2011-05-03 11:36:05.526086407 +0200 @@ -379,6 +379,14 @@ struct unreported_events { bool new_media; }; +enum ide_dma_cmd { + IDE_DMA_READ, + IDE_DMA_WRITE, +}; + +#define ide_cmd_is_read(s) \ + ((s)->dma_cmd == IDE_DMA_READ) + /* NOTE: IDEState represents in fact one drive */ struct IDEState { IDEBus *bus; @@ -446,7 +454,7 @@ struct IDEState { uint32_t mdata_size; uint8_t *mdata_storage; int media_changed; - int is_read; + enum ide_dma_cmd dma_cmd; /* SMART */ uint8_t smart_enabled; uint8_t smart_autosave; Index: qemu/hw/ide/macio.c =================================================================== --- qemu.orig/hw/ide/macio.c 2011-05-03 11:32:14.740670013 +0200 +++ qemu/hw/ide/macio.c 2011-05-03 11:35:56.302803041 +0200 @@ -145,12 +145,17 @@ static void pmac_ide_transfer_cb(void *o io->addr += io->len; io->len = 0; - if (s->is_read) + switch (s->dma_cmd) { + case IDE_DMA_READ: m->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num, pmac_ide_transfer_cb, io); - else + break; + case IDE_DMA_WRITE: m->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num, pmac_ide_transfer_cb, io); + break; + } + if (!m->aiocb) pmac_ide_transfer_cb(io, -1); } Index: qemu/hw/ide/pci.c =================================================================== --- qemu.orig/hw/ide/pci.c 2011-05-03 11:32:13.854008149 +0200 +++ qemu/hw/ide/pci.c 2011-05-03 11:32:27.877265512 +0200 @@ -169,7 +169,7 @@ static int bmdma_set_inactive(IDEDMA *dm return 0; } -static void bmdma_restart_dma(BMDMAState *bm, int is_read) +static void bmdma_restart_dma(BMDMAState *bm, enum ide_dma_cmd dma_cmd) { IDEState *s = bmdma_active_if(bm); @@ -177,7 +177,7 @@ static void bmdma_restart_dma(BMDMAState s->io_buffer_index = 0; s->io_buffer_size = 0; s->nsector = bm->nsector; - s->is_read = is_read; + s->dma_cmd = dma_cmd; bm->cur_addr = bm->addr; bm->dma_cb = ide_dma_cb; bmdma_start_dma(&bm->dma, s, bm->dma_cb); @@ -195,7 +195,7 @@ static void bmdma_restart_bh(void *opaqu if (bm->status & BM_STATUS_DMA_RETRY) { bm->status &= ~(BM_STATUS_DMA_RETRY | BM_STATUS_RETRY_READ); - bmdma_restart_dma(bm, is_read); + bmdma_restart_dma(bm, is_read ? IDE_DMA_READ : IDE_DMA_WRITE); } else if (bm->status & BM_STATUS_PIO_RETRY) { bm->status &= ~(BM_STATUS_PIO_RETRY | BM_STATUS_RETRY_READ); if (is_read) {