All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Peter Xu <peterx@redhat.com>, Yu Wang <wyu@redhat.com>,
	Marcel Apfelbaum <marcel.apfelbaum@gmail.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Richard Henderson <rth@twiddle.net>,
	Eduardo Habkost <ehabkost@redhat.com>
Subject: [Qemu-devel] [PULL v2 20/30] intel_iommu: dma read/write draining support
Date: Tue, 18 Dec 2018 11:13:07 -0500	[thread overview]
Message-ID: <20181218161008.3882-21-mst@redhat.com> (raw)
In-Reply-To: <20181218161008.3882-1-mst@redhat.com>

From: Peter Xu <peterx@redhat.com>

Support DMA read/write draining should be easy for existing VT-d
emulation since the emulation itself does not have any request queue
there so we don't need to do anything to flush the un-commited queue.
What we need to do is to declare the support.

These capabilities are required to pass Windows SVVP test program.  It
is verified that when with parameters "x-aw-bits=48,caching-mode=off"
we can pass the Windows SVVP test with this patch applied.  Otherwise
we'll fail with:

        IOMMU[0] - DWD (DMA write draining) not supported
        IOMMU[0] - DWD (DMA read draining) not supported
        Segment 0 has no DMA remapping capable IOMMU units

However since these bits are not declared support for QEMU<=3.1, we'll
need a compatibility bit for it and we turn this on by default only
for QEMU>=4.0.

Please refer to VT-d spec 6.5.4 for more information.

CC: Yu Wang <wyu@redhat.com>
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1654550
Signed-off-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/i386/intel_iommu_internal.h | 3 +++
 include/hw/i386/intel_iommu.h  | 1 +
 include/hw/i386/pc.h           | 5 +++++
 hw/i386/intel_iommu.c          | 4 ++++
 4 files changed, 13 insertions(+)

diff --git a/hw/i386/intel_iommu_internal.h b/hw/i386/intel_iommu_internal.h
index d084099ed9..00e9edbc66 100644
--- a/hw/i386/intel_iommu_internal.h
+++ b/hw/i386/intel_iommu_internal.h
@@ -203,6 +203,9 @@
 #define VTD_CAP_MAMV                (VTD_MAMV << 48)
 #define VTD_CAP_PSI                 (1ULL << 39)
 #define VTD_CAP_SLLPS               ((1ULL << 34) | (1ULL << 35))
+#define VTD_CAP_DRAIN_WRITE         (1ULL << 54)
+#define VTD_CAP_DRAIN_READ          (1ULL << 55)
+#define VTD_CAP_DRAIN               (VTD_CAP_DRAIN_READ | VTD_CAP_DRAIN_WRITE)
 #define VTD_CAP_CM                  (1ULL << 7)
 
 /* Supported Adjusted Guest Address Widths */
diff --git a/include/hw/i386/intel_iommu.h b/include/hw/i386/intel_iommu.h
index ed4e758273..a321cc9691 100644
--- a/include/hw/i386/intel_iommu.h
+++ b/include/hw/i386/intel_iommu.h
@@ -245,6 +245,7 @@ struct IntelIOMMUState {
     OnOffAuto intr_eim;             /* Toggle for EIM cabability */
     bool buggy_eim;                 /* Force buggy EIM unless eim=off */
     uint8_t aw_bits;                /* Host/IOVA address width (in bits) */
+    bool dma_drain;                 /* Whether DMA r/w draining enabled */
 
     /*
      * Protects IOMMU states in general.  Currently it protects the
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 9d29c4b1df..c7c0c944e8 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -296,6 +296,11 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
 
 #define PC_COMPAT_3_1 \
     HW_COMPAT_3_1 \
+    {\
+        .driver   = "intel-iommu",\
+        .property = "dma-drain",\
+        .value    = "off",\
+    },
 
 #define PC_COMPAT_3_0 \
     HW_COMPAT_3_0 \
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
index 4806d7edb4..26cc731c7b 100644
--- a/hw/i386/intel_iommu.c
+++ b/hw/i386/intel_iommu.c
@@ -2659,6 +2659,7 @@ static Property vtd_properties[] = {
     DEFINE_PROP_UINT8("x-aw-bits", IntelIOMMUState, aw_bits,
                       VTD_HOST_ADDRESS_WIDTH),
     DEFINE_PROP_BOOL("caching-mode", IntelIOMMUState, caching_mode, FALSE),
+    DEFINE_PROP_BOOL("dma-drain", IntelIOMMUState, dma_drain, true),
     DEFINE_PROP_END_OF_LIST(),
 };
 
@@ -3147,6 +3148,9 @@ static void vtd_init(IntelIOMMUState *s)
     s->cap = VTD_CAP_FRO | VTD_CAP_NFR | VTD_CAP_ND |
              VTD_CAP_MAMV | VTD_CAP_PSI | VTD_CAP_SLLPS |
              VTD_CAP_SAGAW_39bit | VTD_CAP_MGAW(s->aw_bits);
+    if (s->dma_drain) {
+        s->cap |= VTD_CAP_DRAIN;
+    }
     if (s->aw_bits == VTD_HOST_AW_48BIT) {
         s->cap |= VTD_CAP_SAGAW_48bit;
     }
-- 
MST

  parent reply	other threads:[~2018-12-18 16:13 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-18 16:11 [Qemu-devel] [PULL v2 00/30] pci, pc, virtio: fixes, features Michael S. Tsirkin
2018-12-18 16:11 ` [Qemu-devel] [PULL v2 01/30] pcie: set link state inactive/active after hot unplug/plug Michael S. Tsirkin
2018-12-18 16:11 ` [Qemu-devel] [PULL v2 02/30] pc:piix4: Update smbus I/O space after a migration Michael S. Tsirkin
2018-12-18 16:11 ` [Qemu-devel] [PULL v2 03/30] virtio: Helper for registering virtio device types Michael S. Tsirkin
2018-12-18 16:11 ` [Qemu-devel] [PULL v2 04/30] virtio: Provide version-specific variants of virtio PCI devices Michael S. Tsirkin
2018-12-18 16:11 ` [Qemu-devel] [PULL v2 05/30] tests: Remove unused include Michael S. Tsirkin
2018-12-18 16:11 ` [Qemu-devel] [PULL v2 06/30] hw/smbios: Restrict access to "hw/smbios/ipmi.h" Michael S. Tsirkin
2018-12-18 16:11 ` [Qemu-devel] [PULL v2 07/30] hw/smbios: Remove "smbios_ipmi.h" Michael S. Tsirkin
2018-12-18 16:11 ` [Qemu-devel] [PULL v2 08/30] hw/smbios: Move to the hw/firmware/ subdirectory Michael S. Tsirkin
2018-12-18 16:11 ` [Qemu-devel] [PULL v2 09/30] hw/pci-bridge: Fix invalid free() Michael S. Tsirkin
2018-12-18 16:11 ` [Qemu-devel] [PULL v2 10/30] pcie: Create enums for link speed and width Michael S. Tsirkin
2018-12-18 16:12 ` [Qemu-devel] [PULL v2 11/30] pci: Sync PCIe downstream port LNKSTA on read Michael S. Tsirkin
2018-12-18 16:12 ` [Qemu-devel] [PULL v2 12/30] qapi: Define PCIe link speed and width properties Michael S. Tsirkin
2018-12-18 16:12 ` [Qemu-devel] [PULL v2 13/30] pcie: Add link speed and width fields to PCIESlot Michael S. Tsirkin
2018-12-18 16:12 ` [Qemu-devel] [PULL v2 14/30] pcie: Fill PCIESlot link fields to support higher speeds and widths Michael S. Tsirkin
2018-12-18 16:12 ` [Qemu-devel] [PULL v2 15/30] pcie: Allow generic PCIe root port to specify link speed and width Michael S. Tsirkin
2018-12-18 16:12 ` [Qemu-devel] [PULL v2 16/30] vfio/pci: Remove PCIe Link Status emulation Michael S. Tsirkin
2018-12-18 16:12 ` [Qemu-devel] [PULL v2 17/30] pcie: Fast PCIe root ports for new machines Michael S. Tsirkin
2018-12-18 16:12 ` [Qemu-devel] [PULL v2 18/30] intel_iommu: dump correct iova when failed Michael S. Tsirkin
2018-12-18 16:13 ` [Qemu-devel] [PULL v2 19/30] intel_iommu: convert invalid traces into error reports Michael S. Tsirkin
2018-12-18 16:13 ` Michael S. Tsirkin [this message]
2018-12-18 16:13 ` [Qemu-devel] [PULL v2 21/30] intel_iommu: remove "x-" prefix for "aw-bits" Michael S. Tsirkin
2018-12-18 16:13 ` [Qemu-devel] [PULL v2 22/30] hw: acpi: The RSDP build API can return void Michael S. Tsirkin
2018-12-18 16:13 ` [Qemu-devel] [PULL v2 23/30] hw: arm: acpi: Fix incorrect checksums in RSDP Michael S. Tsirkin
2018-12-18 16:13 ` [Qemu-devel] [PULL v2 24/30] hw: i386: Use correct RSDT length for checksum Michael S. Tsirkin
2018-12-18 16:13 ` [Qemu-devel] [PULL v2 25/30] hw: arm: Carry RSDP specific data through AcpiRsdpData Michael S. Tsirkin
2018-12-18 16:13 ` [Qemu-devel] [PULL v2 26/30] hw: arm: Convert the RSDP build to the buid_append_foo() API Michael S. Tsirkin
2018-12-18 16:13 ` [Qemu-devel] [PULL v2 27/30] hw: arm: Support both legacy and current RSDP build Michael S. Tsirkin
2018-12-18 16:13 ` [Qemu-devel] [PULL v2 28/30] hw: acpi: Export and share the ARM " Michael S. Tsirkin
2018-12-18 16:13 ` [Qemu-devel] [PULL v2 29/30] hw: acpi: Remove AcpiRsdpDescriptor and fix tests Michael S. Tsirkin
2018-12-20 15:02   ` [Qemu-devel] [PATCH v3 " Igor Mammedov
2018-12-18 16:13 ` [Qemu-devel] [PULL v2 30/30] hw/i386: Remove deprecated machines pc-0.10 and pc-0.11 Michael S. Tsirkin
2018-12-19 19:15 ` [Qemu-devel] [PULL v2 00/30] pci, pc, virtio: fixes, features Peter Maydell
2018-12-20 14:49   ` Igor Mammedov
2018-12-20 14:52     ` Peter Maydell
2018-12-20 15:11       ` Igor Mammedov
2018-12-20 15:03     ` Michael S. Tsirkin

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=20181218161008.3882-21-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    --cc=wyu@redhat.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.