From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36087) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UorFJ-000821-D0 for qemu-devel@nongnu.org; Tue, 18 Jun 2013 04:26:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UorFH-0005mU-Mc for qemu-devel@nongnu.org; Tue, 18 Jun 2013 04:26:33 -0400 Received: from mx1.redhat.com ([209.132.183.28]:30146) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UorFH-0005mO-FK for qemu-devel@nongnu.org; Tue, 18 Jun 2013 04:26:31 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r5I8QUtl011655 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 18 Jun 2013 04:26:30 -0400 From: Kevin Wolf Date: Tue, 18 Jun 2013 10:26:02 +0200 Message-Id: <1371543971-23241-9-git-send-email-kwolf@redhat.com> In-Reply-To: <1371543971-23241-1-git-send-email-kwolf@redhat.com> References: <1371543971-23241-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PATCH 08/17] ide: Convert DMA read/write commands to ide_cmd_table handler List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, stefanha@redhat.com Signed-off-by: Kevin Wolf --- hw/ide/core.c | 69 ++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/hw/ide/core.c b/hw/ide/core.c index 86af4b0..2c8a0ff 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -1152,6 +1152,38 @@ static bool cmd_write_pio(IDEState *s, uint8_t cmd) return false; } +static bool cmd_read_dma(IDEState *s, uint8_t cmd) +{ + bool lba48 = (cmd == WIN_READDMA_EXT); + + if (!s->bs) { + ide_abort_command(s); + return true; + } + + ide_cmd_lba48_transform(s, lba48); + ide_sector_start_dma(s, IDE_DMA_READ); + + return false; +} + +static bool cmd_write_dma(IDEState *s, uint8_t cmd) +{ + bool lba48 = (cmd == WIN_WRITEDMA_EXT); + + if (!s->bs) { + ide_abort_command(s); + return true; + } + + ide_cmd_lba48_transform(s, lba48); + ide_sector_start_dma(s, IDE_DMA_WRITE); + + s->media_changed = 1; + + return false; +} + #define HD_OK (1u << IDE_HD) #define CD_OK (1u << IDE_CD) #define CFA_OK (1u << IDE_CFATA) @@ -1175,13 +1207,13 @@ static const struct { [WIN_READ] = { cmd_read_pio, ALL_OK }, [WIN_READ_ONCE] = { cmd_read_pio, ALL_OK }, [WIN_READ_EXT] = { cmd_read_pio, HD_CFA_OK }, - [WIN_READDMA_EXT] = { NULL, HD_CFA_OK }, + [WIN_READDMA_EXT] = { cmd_read_dma, HD_CFA_OK }, [WIN_READ_NATIVE_MAX_EXT] = { NULL, HD_CFA_OK }, [WIN_MULTREAD_EXT] = { cmd_read_multiple, HD_CFA_OK }, [WIN_WRITE] = { cmd_write_pio, HD_CFA_OK }, [WIN_WRITE_ONCE] = { cmd_write_pio, HD_CFA_OK }, [WIN_WRITE_EXT] = { cmd_write_pio, HD_CFA_OK }, - [WIN_WRITEDMA_EXT] = { NULL, HD_CFA_OK }, + [WIN_WRITEDMA_EXT] = { cmd_write_dma, HD_CFA_OK }, [CFA_WRITE_SECT_WO_ERASE] = { cmd_write_pio, CFA_OK }, [WIN_MULTWRITE_EXT] = { cmd_write_multiple, HD_CFA_OK }, [WIN_WRITE_VERIFY] = { cmd_write_pio, HD_CFA_OK }, @@ -1206,10 +1238,10 @@ static const struct { [WIN_MULTREAD] = { cmd_read_multiple, HD_CFA_OK }, [WIN_MULTWRITE] = { cmd_write_multiple, HD_CFA_OK }, [WIN_SETMULT] = { cmd_set_multiple_mode, HD_CFA_OK | SET_DSC }, - [WIN_READDMA] = { NULL, HD_CFA_OK }, - [WIN_READDMA_ONCE] = { NULL, HD_CFA_OK }, - [WIN_WRITEDMA] = { NULL, HD_CFA_OK }, - [WIN_WRITEDMA_ONCE] = { NULL, HD_CFA_OK }, + [WIN_READDMA] = { cmd_read_dma, HD_CFA_OK }, + [WIN_READDMA_ONCE] = { cmd_read_dma, HD_CFA_OK }, + [WIN_WRITEDMA] = { cmd_write_dma, HD_CFA_OK }, + [WIN_WRITEDMA_ONCE] = { cmd_write_dma, HD_CFA_OK }, [CFA_WRITE_MULTI_WO_ERASE] = { cmd_write_multiple, CFA_OK }, [WIN_STANDBYNOW1] = { cmd_nop, ALL_OK }, [WIN_IDLEIMMEDIATE] = { cmd_nop, ALL_OK }, @@ -1277,31 +1309,6 @@ void ide_exec_cmd(IDEBus *bus, uint32_t val) } switch(val) { - case WIN_READDMA_EXT: - lba48 = 1; - /* fall through */ - case WIN_READDMA: - case WIN_READDMA_ONCE: - if (!s->bs) { - goto abort_cmd; - } - ide_cmd_lba48_transform(s, lba48); - ide_sector_start_dma(s, IDE_DMA_READ); - break; - - case WIN_WRITEDMA_EXT: - lba48 = 1; - /* fall through */ - case WIN_WRITEDMA: - case WIN_WRITEDMA_ONCE: - if (!s->bs) { - goto abort_cmd; - } - ide_cmd_lba48_transform(s, lba48); - ide_sector_start_dma(s, IDE_DMA_WRITE); - s->media_changed = 1; - break; - case WIN_READ_NATIVE_MAX_EXT: lba48 = 1; /* fall through */ -- 1.8.1.4