From: Peter Xu <peterx@redhat.com>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: qemu-devel@nongnu.org, imammedo@redhat.com, rth@twiddle.net,
ehabkost@redhat.com, jasowang@redhat.com, marcel@redhat.com,
pbonzini@redhat.com, jan.kiszka@web.de, rkrcmar@redhat.com,
alex.williamson@redhat.com, wexu@redhat.com,
davidkiarie4@gmail.com
Subject: Re: [Qemu-devel] [PATCH v12 13/27] intel_iommu: Add support for PCI MSI remap
Date: Fri, 22 Jul 2016 11:17:20 +0800 [thread overview]
Message-ID: <20160722031720.GA22866@pxdev.xzpeter.org> (raw)
In-Reply-To: <20160721204436-mutt-send-email-mst@kernel.org>
On Thu, Jul 21, 2016 at 08:45:30PM +0300, Michael S. Tsirkin wrote:
> On Thu, Jul 14, 2016 at 01:56:22PM +0800, Peter Xu wrote:
> > This patch enables interrupt remapping for PCI devices.
> >
> > To play the trick, one memory region "iommu_ir" is added as child region
> > of the original iommu memory region, covering range 0xfeeXXXXX (which is
> > the address range for APIC). All the writes to this range will be taken
> > as MSI, and translation is carried out only when IR is enabled.
> >
> > Idea suggested by Paolo Bonzini.
> >
> > Signed-off-by: Peter Xu <peterx@redhat.com>
> > ---
> > hw/i386/intel_iommu.c | 241 +++++++++++++++++++++++++++++++++++++++++
> > hw/i386/intel_iommu_internal.h | 2 +
> > include/hw/i386/intel_iommu.h | 66 +++++++++++
> > 3 files changed, 309 insertions(+)
> >
> > diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
> > index 6a6cb3b..3d1b15d 100644
> > --- a/hw/i386/intel_iommu.c
> > +++ b/hw/i386/intel_iommu.c
> > @@ -1982,6 +1982,242 @@ static Property vtd_properties[] = {
> > DEFINE_PROP_END_OF_LIST(),
> > };
> >
> > +/* Read IRTE entry with specific index */
> > +static int vtd_irte_get(IntelIOMMUState *iommu, uint16_t index,
> > + VTD_IRTE *entry)
> > +{
> > + dma_addr_t addr = 0x00;
> > +
> > + addr = iommu->intr_root + index * sizeof(*entry);
> > + if (dma_memory_read(&address_space_memory, addr, entry,
> > + sizeof(*entry))) {
> > + VTD_DPRINTF(GENERAL, "error: fail to access IR root at 0x%"PRIx64
> > + " + %"PRIu16, iommu->intr_root, index);
> > + return -VTD_FR_IR_ROOT_INVAL;
> > + }
> > +
> > + if (!entry->present) {
> > + VTD_DPRINTF(GENERAL, "error: present flag not set in IRTE"
> > + " entry index %u value 0x%"PRIx64 " 0x%"PRIx64,
> > + index, le64_to_cpu(entry->data[1]),
> > + le64_to_cpu(entry->data[0]));
> > + return -VTD_FR_IR_ENTRY_P;
> > + }
> > +
> > + if (entry->__reserved_0 || entry->__reserved_1 || \
> > + entry->__reserved_2) {
> > + VTD_DPRINTF(GENERAL, "error: IRTE entry index %"PRIu16
> > + " reserved fields non-zero: 0x%"PRIx64 " 0x%"PRIx64,
> > + index, le64_to_cpu(entry->data[1]),
> > + le64_to_cpu(entry->data[0]));
> > + return -VTD_FR_IR_IRTE_RSVD;
> > + }
> > +
> > + /*
> > + * TODO: Check Source-ID corresponds to SVT (Source Validation
> > + * Type) bits
> > + */
> > +
> > + return 0;
> > +}
> > +
> > +/* Fetch IRQ information of specific IR index */
> > +static int vtd_remap_irq_get(IntelIOMMUState *iommu, uint16_t index, VTDIrq *irq)
> > +{
> > + VTD_IRTE irte;
> > + int ret = 0;
> > +
> > + bzero(&irte, sizeof(irte));
> > +
> > + ret = vtd_irte_get(iommu, index, &irte);
> > + if (ret) {
> > + return ret;
> > + }
> > +
> > + irq->trigger_mode = irte.trigger_mode;
> > + irq->vector = irte.vector;
> > + irq->delivery_mode = irte.delivery_mode;
> > + /* Not support EIM yet: please refer to vt-d 9.10 DST bits */
> > +#define VTD_IR_APIC_DEST_MASK (0xff00ULL)
> > +#define VTD_IR_APIC_DEST_SHIFT (8)
> > + irq->dest = (le32_to_cpu(irte.dest_id) & VTD_IR_APIC_DEST_MASK) >> \
> > + VTD_IR_APIC_DEST_SHIFT;
> > + irq->dest_mode = irte.dest_mode;
> > + irq->redir_hint = irte.redir_hint;
> > +
> > + VTD_DPRINTF(IR, "remapping interrupt index %d: trig:%u,vec:%u,"
> > + "deliver:%u,dest:%u,dest_mode:%u", index,
> > + irq->trigger_mode, irq->vector, irq->delivery_mode,
> > + irq->dest, irq->dest_mode);
> > +
> > + return 0;
> > +}
> > +
> > +/* Generate one MSI message from VTDIrq info */
> > +static void vtd_generate_msi_message(VTDIrq *irq, MSIMessage *msg_out)
> > +{
> > + VTD_MSIMessage msg = {};
> > +
> > + /* Generate address bits */
> > + msg.dest_mode = irq->dest_mode;
> > + msg.redir_hint = irq->redir_hint;
> > + msg.dest = irq->dest;
> > + msg.__addr_head = cpu_to_le32(0xfee);
> > + /* Keep this from original MSI address bits */
> > + msg.__not_used = irq->msi_addr_last_bits;
> > +
> > + /* Generate data bits */
> > + msg.vector = irq->vector;
> > + msg.delivery_mode = irq->delivery_mode;
> > + msg.level = 1;
> > + msg.trigger_mode = irq->trigger_mode;
> > +
> > + msg_out->address = msg.msi_addr;
> > + msg_out->data = msg.msi_data;
> > +}
> > +
> > +/* Interrupt remapping for MSI/MSI-X entry */
> > +static int vtd_interrupt_remap_msi(IntelIOMMUState *iommu,
> > + MSIMessage *origin,
> > + MSIMessage *translated)
> > +{
> > + int ret = 0;
> > + VTD_IR_MSIAddress addr;
> > + uint16_t index;
> > + VTDIrq irq = {0};
> > +
> > + assert(origin && translated);
> > +
> > + if (!iommu || !iommu->intr_enabled) {
> > + goto do_not_translate;
> > + }
> > +
> > + if (origin->address & VTD_MSI_ADDR_HI_MASK) {
> > + VTD_DPRINTF(GENERAL, "error: MSI addr high 32 bits nonzero"
> > + " during interrupt remapping: 0x%"PRIx32,
> > + (uint32_t)((origin->address & VTD_MSI_ADDR_HI_MASK) >> \
> > + VTD_MSI_ADDR_HI_SHIFT));
> > + return -VTD_FR_IR_REQ_RSVD;
> > + }
> > +
> > + addr.data = origin->address & VTD_MSI_ADDR_LO_MASK;
>
> Below you treat data as LE, but here you use VTD_MSI_ADDR_LO_MASK
> which is native endian. This looks wrong to me.
You are right. I see that this is merged in master. Will fix this in
seperate patch.
Thanks,
-- peterx
next prev parent reply other threads:[~2016-07-22 3:17 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-14 5:56 [Qemu-devel] [PATCH v12 00/27] IOMMU: Enable interrupt remapping for Intel IOMMU Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 01/27] x86-iommu: introduce parent class Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 02/27] intel_iommu: rename VTD_PCI_DEVFN_MAX to x86-iommu Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 03/27] x86-iommu: provide x86_iommu_get_default Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 04/27] x86-iommu: introduce "intremap" property Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 05/27] acpi: enable INTR for DMAR report structure Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 06/27] intel_iommu: allow queued invalidation for IR Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 07/27] intel_iommu: set IR bit for ECAP register Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 08/27] acpi: add DMAR scope definition for root IOAPIC Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 09/27] intel_iommu: define interrupt remap table addr register Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 10/27] intel_iommu: handle interrupt remap enable Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 11/27] intel_iommu: define several structs for IOMMU IR Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 12/27] intel_iommu: add IR translation faults defines Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 13/27] intel_iommu: Add support for PCI MSI remap Peter Xu
2016-07-21 17:45 ` Michael S. Tsirkin
2016-07-22 3:17 ` Peter Xu [this message]
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 14/27] q35: ioapic: add support for emulated IOAPIC IR Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 15/27] ioapic: introduce ioapic_entry_parse() helper Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 16/27] intel_iommu: add support for split irqchip Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 17/27] x86-iommu: introduce IEC notifiers Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 18/27] ioapic: register IOMMU IEC notifier for ioapic Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 19/27] intel_iommu: Add support for Extended Interrupt Mode Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 20/27] intel_iommu: add SID validation for IR Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 21/27] kvm-irqchip: simplify kvm_irqchip_add_msi_route Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 22/27] kvm-irqchip: i386: add hook for add/remove virq Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 23/27] kvm-irqchip: x86: add msi route notify fn Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 24/27] kvm-irqchip: do explicit commit when update irq Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 25/27] intel_iommu: support all masks in interrupt entry cache invalidation Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 26/27] kvm-all: add trace events for kvm irqchip ops Peter Xu
2016-07-14 5:56 ` [Qemu-devel] [PATCH v12 27/27] intel_iommu: disallow kernel-irqchip=on with IR Peter Xu
2016-09-22 8:29 ` [Qemu-devel] [PATCH v12 00/27] IOMMU: Enable interrupt remapping for Intel IOMMU Igor Mammedov
2016-09-22 9:08 ` Peter Xu
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=20160722031720.GA22866@pxdev.xzpeter.org \
--to=peterx@redhat.com \
--cc=alex.williamson@redhat.com \
--cc=davidkiarie4@gmail.com \
--cc=ehabkost@redhat.com \
--cc=imammedo@redhat.com \
--cc=jan.kiszka@web.de \
--cc=jasowang@redhat.com \
--cc=marcel@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=rkrcmar@redhat.com \
--cc=rth@twiddle.net \
--cc=wexu@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.