From: Jason Wang <jasowang@redhat.com>
To: "Liu, Yi L" <yi.l.liu@intel.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>
Cc: Peter Maydell <peter.maydell@linaro.org>,
Eduardo Habkost <ehabkost@redhat.com>,
Peter Xu <peterx@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>,
Richard Henderson <rth@twiddle.net>,
"Tian, Kevin" <kevin.tian@intel.com>,
"Lan, Tianyu" <tianyu.lan@intel.com>,
Alex Williamson <alex.williamson@redhat.com>
Subject: Re: [Qemu-devel] [PULL 08/41] intel_iommu: support device iotlb descriptor
Date: Thu, 16 Feb 2017 13:43:30 +0800 [thread overview]
Message-ID: <c1f86fba-6b22-8316-156f-2024bee46b0c@redhat.com> (raw)
In-Reply-To: <A2975661238FB949B60364EF0F2C25743900AAEF@shsmsx102.ccr.corp.intel.com>
On 2017年02月16日 13:36, Liu, Yi L wrote:
>> -----Original Message-----
>> From: Qemu-devel [mailto:qemu-devel-bounces+yi.l.liu=intel.com@nongnu.org]
>> On Behalf Of Michael S. Tsirkin
>> Sent: Tuesday, January 10, 2017 1:40 PM
>> To: qemu-devel@nongnu.org
>> Cc: Peter Maydell <peter.maydell@linaro.org>; Eduardo Habkost
>> <ehabkost@redhat.com>; Jason Wang <jasowang@redhat.com>; Peter Xu
>> <peterx@redhat.com>; Paolo Bonzini <pbonzini@redhat.com>; Richard
>> Henderson <rth@twiddle.net>
>> Subject: [Qemu-devel] [PULL 08/41] intel_iommu: support device iotlb
>> descriptor
>>
>> From: Jason Wang <jasowang@redhat.com>
>>
>> This patch enables device IOTLB support for intel iommu. The major work is to
>> implement QI device IOTLB descriptor processing and notify the device through
>> iommu notifier.
>>
> Hi Jason/Michael,
>
> Recently Peter Xu's patch also touched intel-iommu emulation. His patch shadows
> second-level page table by capturing iotlb flush from guest. It would result in page
> table updating in host. Does this patch also use the same map/umap API provided
> by VFIO?
Yes, it depends on the iommu notifier too.
> If it is, then I think it would also update page table in host. It looks to be
> a duplicate update. Pls refer to the following snapshot captured from section 6.5.2.5
> of vtd spec.
>
> "Since translation requests from a device may be serviced by hardware from the IOTLB, software must
> always request IOTLB invalidation (iotlb_inv_dsc) before requesting corresponding Device-TLB
> (dev_tlb_inv_dsc) invalidation."
>
> Maybe for device-iotlb, we need a separate API which just pass down the invalidate
> info without updating page table. Any thoughts?
cc Alex.
If we want ATS to be visible for guest (but I'm not sure if VFIO support
this), we probably need another notifier or a new flag.
Thanks
>
> Thanks,
> Yi L
>> Cc: Paolo Bonzini <pbonzini@redhat.com>
>> Cc: Richard Henderson <rth@twiddle.net>
>> Cc: Eduardo Habkost <ehabkost@redhat.com>
>> Cc: Michael S. Tsirkin <mst@redhat.com>
>> Signed-off-by: Jason Wang <jasowang@redhat.com>
>> Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
>> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
>> Reviewed-by: Peter Xu <peterx@redhat.com>
>> ---
>> hw/i386/intel_iommu_internal.h | 13 ++++++-
>> include/hw/i386/x86-iommu.h | 1 +
>> hw/i386/intel_iommu.c | 83
>> +++++++++++++++++++++++++++++++++++++++---
>> hw/i386/x86-iommu.c | 17 +++++++++
>> 4 files changed, 107 insertions(+), 7 deletions(-)
>>
>> diff --git a/hw/i386/intel_iommu_internal.h
>> b/hw/i386/intel_iommu_internal.h index 11abfa2..356f188 100644
>> --- a/hw/i386/intel_iommu_internal.h
>> +++ b/hw/i386/intel_iommu_internal.h
>> @@ -183,6 +183,7 @@
>> /* (offset >> 4) << 8 */
>> #define VTD_ECAP_IRO (DMAR_IOTLB_REG_OFFSET << 4)
>> #define VTD_ECAP_QI (1ULL << 1)
>> +#define VTD_ECAP_DT (1ULL << 2)
>> /* Interrupt Remapping support */
>> #define VTD_ECAP_IR (1ULL << 3)
>> #define VTD_ECAP_EIM (1ULL << 4)
>> @@ -326,6 +327,7 @@ typedef union VTDInvDesc VTDInvDesc;
>> #define VTD_INV_DESC_TYPE 0xf
>> #define VTD_INV_DESC_CC 0x1 /* Context-cache Invalidate Desc */
>> #define VTD_INV_DESC_IOTLB 0x2
>> +#define VTD_INV_DESC_DEVICE 0x3
>> #define VTD_INV_DESC_IEC 0x4 /* Interrupt Entry Cache
>> Invalidate Descriptor */
>> #define VTD_INV_DESC_WAIT 0x5 /* Invalidation Wait Descriptor */
>> @@ -361,6 +363,13 @@ typedef union VTDInvDesc VTDInvDesc;
>> #define VTD_INV_DESC_IOTLB_RSVD_LO 0xffffffff0000ff00ULL
>> #define VTD_INV_DESC_IOTLB_RSVD_HI 0xf80ULL
>>
>> +/* Mask for Device IOTLB Invalidate Descriptor */ #define
>> +VTD_INV_DESC_DEVICE_IOTLB_ADDR(val) ((val) & 0xfffffffffffff000ULL)
>> +#define VTD_INV_DESC_DEVICE_IOTLB_SIZE(val) ((val) & 0x1) #define
>> +VTD_INV_DESC_DEVICE_IOTLB_SID(val) (((val) >> 32) & 0xFFFFULL) #define
>> +VTD_INV_DESC_DEVICE_IOTLB_RSVD_HI 0xffeULL #define
>> +VTD_INV_DESC_DEVICE_IOTLB_RSVD_LO 0xffff0000ffe0fff8
>> +
>> /* Information about page-selective IOTLB invalidate */ struct
>> VTDIOTLBPageInvInfo {
>> uint16_t domain_id;
>> @@ -399,8 +408,8 @@ typedef struct VTDRootEntry VTDRootEntry;
>> #define VTD_CONTEXT_ENTRY_FPD (1ULL << 1) /* Fault Processing Disable
>> */
>> #define VTD_CONTEXT_ENTRY_TT (3ULL << 2) /* Translation Type */
>> #define VTD_CONTEXT_TT_MULTI_LEVEL 0
>> -#define VTD_CONTEXT_TT_DEV_IOTLB 1
>> -#define VTD_CONTEXT_TT_PASS_THROUGH 2
>> +#define VTD_CONTEXT_TT_DEV_IOTLB (1ULL << 2)
>> +#define VTD_CONTEXT_TT_PASS_THROUGH (2ULL << 2)
>> /* Second Level Page Translation Pointer*/
>> #define VTD_CONTEXT_ENTRY_SLPTPTR (~0xfffULL)
>> #define VTD_CONTEXT_ENTRY_RSVD_LO (0xff0ULL | ~VTD_HAW_MASK)
>> diff --git a/include/hw/i386/x86-iommu.h b/include/hw/i386/x86-iommu.h
>> index 0c89d98..361c07c 100644
>> --- a/include/hw/i386/x86-iommu.h
>> +++ b/include/hw/i386/x86-iommu.h
>> @@ -73,6 +73,7 @@ typedef struct IEC_Notifier IEC_Notifier; struct
>> X86IOMMUState {
>> SysBusDevice busdev;
>> bool intr_supported; /* Whether vIOMMU supports IR */
>> + bool dt_supported; /* Whether vIOMMU supports DT */
>> IommuType type; /* IOMMU type - AMD/Intel */
>> QLIST_HEAD(, IEC_Notifier) iec_notifiers; /* IEC notify list */ }; diff --git
>> a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c index e39b764..ec62239
>> 100644
>> --- a/hw/i386/intel_iommu.c
>> +++ b/hw/i386/intel_iommu.c
>> @@ -738,11 +738,18 @@ static int
>> vtd_dev_to_context_entry(IntelIOMMUState *s, uint8_t bus_num,
>> "context-entry hi 0x%"PRIx64 " lo 0x%"PRIx64,
>> ce->hi, ce->lo);
>> return -VTD_FR_CONTEXT_ENTRY_INV;
>> - } else if (ce->lo & VTD_CONTEXT_ENTRY_TT) {
>> - VTD_DPRINTF(GENERAL, "error: unsupported Translation Type in "
>> - "context-entry hi 0x%"PRIx64 " lo 0x%"PRIx64,
>> - ce->hi, ce->lo);
>> - return -VTD_FR_CONTEXT_ENTRY_INV;
>> + } else {
>> + switch (ce->lo & VTD_CONTEXT_ENTRY_TT) {
>> + case VTD_CONTEXT_TT_MULTI_LEVEL:
>> + /* fall through */
>> + case VTD_CONTEXT_TT_DEV_IOTLB:
>> + break;
>> + default:
>> + VTD_DPRINTF(GENERAL, "error: unsupported Translation Type in "
>> + "context-entry hi 0x%"PRIx64 " lo 0x%"PRIx64,
>> + ce->hi, ce->lo);
>> + return -VTD_FR_CONTEXT_ENTRY_INV;
>> + }
>> }
>> return 0;
>> }
>> @@ -1438,7 +1445,61 @@ static bool
>> vtd_process_inv_iec_desc(IntelIOMMUState *s,
>> vtd_iec_notify_all(s, !inv_desc->iec.granularity,
>> inv_desc->iec.index,
>> inv_desc->iec.index_mask);
>> + return true;
>> +}
>> +
>> +static bool vtd_process_device_iotlb_desc(IntelIOMMUState *s,
>> + VTDInvDesc *inv_desc) {
>> + VTDAddressSpace *vtd_dev_as;
>> + IOMMUTLBEntry entry;
>> + struct VTDBus *vtd_bus;
>> + hwaddr addr;
>> + uint64_t sz;
>> + uint16_t sid;
>> + uint8_t devfn;
>> + bool size;
>> + uint8_t bus_num;
>> +
>> + addr = VTD_INV_DESC_DEVICE_IOTLB_ADDR(inv_desc->hi);
>> + sid = VTD_INV_DESC_DEVICE_IOTLB_SID(inv_desc->lo);
>> + devfn = sid & 0xff;
>> + bus_num = sid >> 8;
>> + size = VTD_INV_DESC_DEVICE_IOTLB_SIZE(inv_desc->hi);
>> +
>> + if ((inv_desc->lo & VTD_INV_DESC_DEVICE_IOTLB_RSVD_LO) ||
>> + (inv_desc->hi & VTD_INV_DESC_DEVICE_IOTLB_RSVD_HI)) {
>> + VTD_DPRINTF(GENERAL, "error: non-zero reserved field in Device "
>> + "IOTLB Invalidate Descriptor hi 0x%"PRIx64 " lo 0x%"PRIx64,
>> + inv_desc->hi, inv_desc->lo);
>> + return false;
>> + }
>> +
>> + vtd_bus = vtd_find_as_from_bus_num(s, bus_num);
>> + if (!vtd_bus) {
>> + goto done;
>> + }
>> +
>> + vtd_dev_as = vtd_bus->dev_as[devfn];
>> + if (!vtd_dev_as) {
>> + goto done;
>> + }
>> +
>> + if (size) {
>> + sz = 1 << (ctz64(~(addr | (VTD_PAGE_MASK_4K - 1))) + 1);
>> + addr &= ~(sz - 1);
>> + } else {
>> + sz = VTD_PAGE_SIZE;
>> + }
>>
>> + entry.target_as = &vtd_dev_as->as;
>> + entry.addr_mask = sz - 1;
>> + entry.iova = addr;
>> + entry.perm = IOMMU_NONE;
>> + entry.translated_addr = 0;
>> + memory_region_notify_iommu(entry.target_as->root, entry);
>> +
>> +done:
>> return true;
>> }
>>
>> @@ -1490,6 +1551,14 @@ static bool vtd_process_inv_desc(IntelIOMMUState
>> *s)
>> }
>> break;
>>
>> + case VTD_INV_DESC_DEVICE:
>> + VTD_DPRINTF(INV, "Device IOTLB Invalidation Descriptor hi 0x%"PRIx64
>> + " lo 0x%"PRIx64, inv_desc.hi, inv_desc.lo);
>> + if (!vtd_process_device_iotlb_desc(s, &inv_desc)) {
>> + return false;
>> + }
>> + break;
>> +
>> default:
>> VTD_DPRINTF(GENERAL, "error: unkonw Invalidation Descriptor type "
>> "hi 0x%"PRIx64 " lo 0x%"PRIx64 " type %"PRIu8, @@ -2415,6
>> +2484,10 @@ static void vtd_init(IntelIOMMUState *s)
>> assert(s->intr_eim != ON_OFF_AUTO_AUTO);
>> }
>>
>> + if (x86_iommu->dt_supported) {
>> + s->ecap |= VTD_ECAP_DT;
>> + }
>> +
>> vtd_reset_context_cache(s);
>> vtd_reset_iotlb(s);
>>
>> diff --git a/hw/i386/x86-iommu.c b/hw/i386/x86-iommu.c index
>> 2278af7..23dcd3f 100644
>> --- a/hw/i386/x86-iommu.c
>> +++ b/hw/i386/x86-iommu.c
>> @@ -106,6 +106,18 @@ static void x86_iommu_intremap_prop_set(Object *o,
>> bool value, Error **errp)
>> s->intr_supported = value;
>> }
>>
>> +static bool x86_iommu_device_iotlb_prop_get(Object *o, Error **errp) {
>> + X86IOMMUState *s = X86_IOMMU_DEVICE(o);
>> + return s->dt_supported;
>> +}
>> +
>> +static void x86_iommu_device_iotlb_prop_set(Object *o, bool value,
>> +Error **errp) {
>> + X86IOMMUState *s = X86_IOMMU_DEVICE(o);
>> + s->dt_supported = value;
>> +}
>> +
>> static void x86_iommu_instance_init(Object *o) {
>> X86IOMMUState *s = X86_IOMMU_DEVICE(o); @@ -114,6 +126,11 @@
>> static void x86_iommu_instance_init(Object *o)
>> s->intr_supported = false;
>> object_property_add_bool(o, "intremap", x86_iommu_intremap_prop_get,
>> x86_iommu_intremap_prop_set, NULL);
>> + s->dt_supported = false;
>> + object_property_add_bool(o, "device-iotlb",
>> + x86_iommu_device_iotlb_prop_get,
>> + x86_iommu_device_iotlb_prop_set,
>> + NULL);
>> }
>>
>> static const TypeInfo x86_iommu_info = {
>> --
>> MST
>>
next prev parent reply other threads:[~2017-02-16 5:43 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-10 5:39 [Qemu-devel] [PULL 00/41] virtio, vhost, pc: fixes, features Michael S. Tsirkin
2017-01-10 5:39 ` [Qemu-devel] [PULL 01/41] migration: allow to prioritize save state entries Michael S. Tsirkin
2017-01-10 5:39 ` [Qemu-devel] [PULL 02/41] intel_iommu: allow migration Michael S. Tsirkin
2017-01-10 5:39 ` [Qemu-devel] [PULL 03/41] virtio-crypto: fix possible integer and heap overflow Michael S. Tsirkin
2017-01-10 5:39 ` [Qemu-devel] [PULL 04/41] virtio: convert to use DMA api Michael S. Tsirkin
2017-01-18 11:59 ` Paolo Bonzini
2017-01-18 19:10 ` Michael S. Tsirkin
2017-01-19 9:05 ` Paolo Bonzini
2017-01-10 5:39 ` [Qemu-devel] [PULL 05/41] intel_iommu: name vtd address space with devfn Michael S. Tsirkin
2017-01-10 5:39 ` [Qemu-devel] [PULL 06/41] intel_iommu: allocate new key when creating new address space Michael S. Tsirkin
2017-01-10 5:39 ` [Qemu-devel] [PULL 07/41] exec: introduce address_space_get_iotlb_entry() Michael S. Tsirkin
2017-01-10 5:39 ` [Qemu-devel] [PULL 08/41] intel_iommu: support device iotlb descriptor Michael S. Tsirkin
2017-01-18 12:19 ` Paolo Bonzini
2017-01-19 2:50 ` Jason Wang
2017-01-19 3:28 ` Peter Xu
2017-01-19 3:35 ` Jason Wang
2017-01-19 3:32 ` Jason Wang
2017-01-19 9:07 ` Paolo Bonzini
2017-02-16 5:36 ` Liu, Yi L
2017-02-16 5:43 ` Jason Wang [this message]
2017-02-16 5:59 ` Jason Wang
2017-02-17 6:18 ` Liu, Yi L
2017-02-17 6:43 ` Jason Wang
2017-02-20 8:27 ` Liu, Yi L
2017-02-20 9:03 ` Jason Wang
2017-02-20 9:13 ` Liu, Yi L
2017-02-20 9:18 ` Jason Wang
2017-02-17 3:26 ` Peter Xu
2017-02-17 6:36 ` Liu, Yi L
2017-02-17 7:00 ` Peter Xu
2017-02-20 8:47 ` Liu, Yi L
2017-01-10 5:39 ` [Qemu-devel] [PULL 09/41] virtio-pci: address space translation service (ATS) support Michael S. Tsirkin
2017-01-10 5:39 ` [Qemu-devel] [PULL 10/41] acpi: add ATSR for q35 Michael S. Tsirkin
2017-01-10 5:39 ` [Qemu-devel] [PULL 11/41] memory: handle alias for iommu notifier Michael S. Tsirkin
2017-01-10 5:39 ` [Qemu-devel] [PULL 12/41] memory: handle alias in memory_region_is_iommu() Michael S. Tsirkin
2017-01-10 5:39 ` [Qemu-devel] [PULL 13/41] doc/pcie: correct command line examples Michael S. Tsirkin
2017-01-10 5:39 ` [Qemu-devel] [PULL 14/41] virtio-crypto: use the correct length for cipher operation Michael S. Tsirkin
2017-01-10 5:39 ` [Qemu-devel] [PULL 15/41] cryptodev: introduce a new is_used property Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 16/41] cryptodev: wrap the ready flag Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 17/41] virtio-crypto-pci: add check for cryptodev object Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 18/41] virtio-crypto: avoid one cryptodev device is used by multiple virtio crypto devices Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 19/41] virtio-crypto-pci: tag virtio-crypto device hot pluggable Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 20/41] virtio-crypto: zeroize the key material before free Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 21/41] pcie_aer: Convert pcie_aer_init to Error Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 22/41] pcie_aer: support configurable AER capa version Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 23/41] virtio: fix vq->inuse recalc after migr Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 24/41] balloon: Don't balloon roms Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 25/41] net: Add virtio queue interface to update used index from vring state Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 26/41] net: vhost stop updates virtio queue state Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 27/41] virtio: Introduce virtqueue_drop_all procedure Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 28/41] net: virtio-net discards TX data after link down Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 29/41] vhost-user: Add MTU protocol feature and op Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 30/41] vhost-net: Notify the backend about the host MTU Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 31/41] virtio-net: Add MTU feature support Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 32/41] tests: pc: add memory hotplug acpi tables tests Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 33/41] memhp: move build_memory_hotplug_aml() into memory_hotplug.c Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 34/41] memhp: move build_memory_devices() " Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 35/41] memhp: consolidate scattered MHPD device declaration Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 36/41] memhp: merge build_memory_devices() into build_memory_hotplug_aml() Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 37/41] memhp: move GPE handler_E03 " Michael S. Tsirkin
2017-01-10 5:40 ` [Qemu-devel] [PULL 38/41] memhp: move memory hotplug only defines to memory_hotplug.c Michael S. Tsirkin
2017-01-10 5:41 ` [Qemu-devel] [PULL 39/41] memhp: don't generate memory hotplug AML if it's not enabled/supported Michael S. Tsirkin
2017-01-10 5:41 ` [Qemu-devel] [PULL 40/41] memhp: move DIMM devices into dedicated scope with related common methods Michael S. Tsirkin
2017-01-10 5:41 ` [Qemu-devel] [PULL 41/41] acpi-test: update expected files Michael S. Tsirkin
2017-01-10 14:52 ` [Qemu-devel] [PULL 00/41] virtio, vhost, pc: fixes, features Peter Maydell
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=c1f86fba-6b22-8316-156f-2024bee46b0c@redhat.com \
--to=jasowang@redhat.com \
--cc=alex.williamson@redhat.com \
--cc=ehabkost@redhat.com \
--cc=kevin.tian@intel.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
--cc=tianyu.lan@intel.com \
--cc=yi.l.liu@intel.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 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).