From 0772e6364bc2c782b73d46d351185c5889acd422 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 26 Mar 2008 16:09:35 +0000 Subject: [PATCH] Improve DMA transfers by increasing the size of DMA buffers. This involves a new constant IDE_DMA_BUF_SIZE which is separate from MAX_MULT_SECTORS. Cross-ported from xen-unstable 17267:f4a92f0db20fda98a633c149e3396c005a759a77 Signed-off-by: Ian Jackson Signed-off-by: Samuel Thibault --- hw/ide.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/hw/ide.c b/hw/ide.c index 56a1cda9..b73dba27 100644 --- a/hw/ide.c +++ b/hw/ide.c @@ -202,6 +202,12 @@ /* set to 1 set disable mult support */ #define MAX_MULT_SECTORS 16 +#define IDE_DMA_BUF_SIZE 131072 + +#if (IDE_DMA_BUF_SIZE < MAX_MULT_SECTORS * 512) +#error "IDE_DMA_BUF_SIZE must be bigger or equal to MAX_MULT_SECTORS * 512" +#endif + /* ATAPI defines */ #define ATAPI_PACKET_SIZE 12 @@ -920,8 +926,8 @@ static void ide_read_dma_cb(void *opaque, int ret) /* launch next transfer */ n = s->nsector; - if (n > MAX_MULT_SECTORS) - n = MAX_MULT_SECTORS; + if (n > IDE_DMA_BUF_SIZE / 512) + n = IDE_DMA_BUF_SIZE / 512; s->io_buffer_index = 0; s->io_buffer_size = n * 512; #ifdef DEBUG_AIO @@ -1028,8 +1034,8 @@ static void ide_write_dma_cb(void *opaque, int ret) /* launch next transfer */ n = s->nsector; - if (n > MAX_MULT_SECTORS) - n = MAX_MULT_SECTORS; + if (n > IDE_DMA_BUF_SIZE / 512) + n = IDE_DMA_BUF_SIZE / 512; s->io_buffer_index = 0; s->io_buffer_size = n * 512; @@ -1323,8 +1329,8 @@ static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret) data_offset = 16; } else { n = s->packet_transfer_size >> 11; - if (n > (MAX_MULT_SECTORS / 4)) - n = (MAX_MULT_SECTORS / 4); + if (n > (IDE_DMA_BUF_SIZE / 2048)) + n = (IDE_DMA_BUF_SIZE / 2048); s->io_buffer_size = n * 2048; data_offset = 0; } @@ -2557,7 +2563,7 @@ static void ide_init2(IDEState *ide_state, for(i = 0; i < 2; i++) { s = ide_state + i; - s->io_buffer = qemu_memalign(512, MAX_MULT_SECTORS*512 + 4); + s->io_buffer = qemu_memalign(512, IDE_DMA_BUF_SIZE + 4); if (i == 0) s->bs = hd0; else -- 2.39.5