qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Alexander Graf <agraf@suse.de>
To: QEMU-devel Developers <qemu-devel@nongnu.org>
Cc: tj@kernel.org, Joerg Roedel <Joerg.Roedel@amd.com>,
	Sebastian Herbszt <herbszt@gmx.de>,
	Roland Elek <elek.roland@gmail.com>
Subject: [Qemu-devel] [PATCH 04/10] ide: enable preallocated sg lists
Date: Wed, 17 Nov 2010 02:05:30 +0100	[thread overview]
Message-ID: <1289955937-24121-5-git-send-email-agraf@suse.de> (raw)
In-Reply-To: <1289955937-24121-1-git-send-email-agraf@suse.de>

The AHCI core does all the SG handling for us, so we need to allow it
to keep its own layouts.

This patch adds hooks into the IDE code to allow for preallocated SG lists.

Signed-off-by: Roland Elek <elek.roland@gmail.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
---
 hw/ide/core.c     |   38 +++++++++++++++++++++++++++++++-------
 hw/ide/internal.h |    1 +
 2 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/hw/ide/core.c b/hw/ide/core.c
index 276b853..4c15ea2 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -444,8 +444,16 @@ static int dma_buf_prepare(BMDMAState *bm, int is_write)
         uint32_t addr;
         uint32_t size;
     } prd;
-    int l, len;
+    int l, len, i;
 
+    if (s->sg_third_party) {
+        /* We already have an sglist. */
+        s->io_buffer_size = 0;
+        for (i=0; i < s->sg.nsg; i++) {
+            s->io_buffer_size += s->sg.sg[i].len;
+        }
+        return s->io_buffer_size != 0;
+    }
     qemu_sglist_init(&s->sg, s->nsector / (IDE_PAGE_SIZE / 512) + 1);
     s->io_buffer_size = 0;
     for(;;) {
@@ -535,12 +543,25 @@ static int dma_buf_rw(BMDMAState *bm, int is_write)
         if (bm->cur_prd_len == 0) {
             /* end of table (with a fail safe of one page) */
             if (bm->cur_prd_last ||
-                (bm->cur_addr - bm->addr) >= IDE_PAGE_SIZE)
-                return 0;
-            cpu_physical_memory_read(bm->cur_addr, (uint8_t *)&prd, 8);
-            bm->cur_addr += 8;
-            prd.addr = le32_to_cpu(prd.addr);
-            prd.size = le32_to_cpu(prd.size);
+                (bm->cur_addr - bm->addr) >= IDE_PAGE_SIZE) {
+                    s->sg.sg -= s->sg.nsg; //XXX
+                    return 0;
+                }
+            if (s->sg_third_party) {
+                /* We've already parsed the guest RAM PRDT.
+                 * This is essential for AHCI, where the PRDT is in a different
+                 * format than in IDE BMDMA.
+                 */
+                memcpy((uint8_t *)&prd, s->sg.sg, sizeof(prd));
+                s->sg.sg++;
+            } else {
+                cpu_physical_memory_read(bm->cur_addr, (uint8_t *)&prd, 8);
+                bm->cur_addr += 8;
+                prd.addr = le32_to_cpu(prd.addr);
+                prd.size = le32_to_cpu(prd.size);
+            }
+
+
             len = prd.size & 0xfffe;
             if (len == 0)
                 len = 0x10000;
@@ -2715,6 +2736,9 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs,
     } else {
         pstrcpy(s->version, sizeof(s->version), QEMU_VERSION);
     }
+
+    s->sg_third_party = 0;
+
     ide_reset(s);
     bdrv_set_removable(bs, s->drive_kind == IDE_CD);
     return 0;
diff --git a/hw/ide/internal.h b/hw/ide/internal.h
index 19e5efb..005283c 100644
--- a/hw/ide/internal.h
+++ b/hw/ide/internal.h
@@ -422,6 +422,7 @@ struct IDEState {
     /* ATA DMA state */
     int io_buffer_size;
     QEMUSGList sg;
+    int sg_third_party;
     /* PIO transfer handling */
     int req_nb_sectors; /* number of sectors per interrupt */
     EndTransferFunc *end_transfer_func;
-- 
1.6.0.2

  parent reply	other threads:[~2010-11-17  1:05 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-17  1:05 [Qemu-devel] [PATCH 00/10] AHCI emulation support Alexander Graf
2010-11-17  1:05 ` [Qemu-devel] [PATCH 01/10] ide: split ide command interpretation off Alexander Graf
2010-11-17  1:05 ` [Qemu-devel] [PATCH 02/10] ide: fix whitespace gap in ide_exec_cmd Alexander Graf
2010-11-17  1:05 ` [Qemu-devel] [PATCH 03/10] ide: add support for ide extenders Alexander Graf
2010-11-17  8:57   ` Gerd Hoffmann
2010-11-17  1:05 ` Alexander Graf [this message]
2010-11-17  8:59   ` [Qemu-devel] [PATCH 04/10] ide: enable preallocated sg lists Gerd Hoffmann
2010-11-17  9:21   ` Stefan Hajnoczi
2010-11-17  1:05 ` [Qemu-devel] [PATCH 05/10] ide: add ncq identify data for ahci sata drives Alexander Graf
2010-11-17  1:05 ` [Qemu-devel] [PATCH 06/10] pci: add storage class for sata Alexander Graf
2010-11-17  1:05 ` [Qemu-devel] [PATCH 07/10] pci: add ich7 pci id Alexander Graf
2010-11-17  1:05 ` [Qemu-devel] [PATCH 08/10] ahci: add ahci emulation Alexander Graf
2010-11-17  9:08   ` Gerd Hoffmann
2010-11-17 12:21     ` Alexander Graf
2010-11-17 13:56       ` Gerd Hoffmann
2010-11-17  1:05 ` [Qemu-devel] [PATCH 09/10] ahci: add -drive support Alexander Graf
2010-11-17  1:05 ` [Qemu-devel] [PATCH 10/10] ahci: spawn controller on demand Alexander Graf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1289955937-24121-5-git-send-email-agraf@suse.de \
    --to=agraf@suse.de \
    --cc=Joerg.Roedel@amd.com \
    --cc=elek.roland@gmail.com \
    --cc=herbszt@gmx.de \
    --cc=qemu-devel@nongnu.org \
    --cc=tj@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).