All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
To: eric.auger@redhat.com, imammedo@redhat.com
Cc: peter.maydell@linaro.org, ehabkost@redhat.com, mst@redhat.com,
	richard.henderson@linaro.org, qemu-devel@nongnu.org,
	shannon.zhaosl@gmail.com,
	Jean-Philippe Brucker <jean-philippe@linaro.org>,
	qemu-arm@nongnu.org, ani@anisinha.ca, pbonzini@redhat.com
Subject: [PATCH v4 07/11] pc: Allow instantiating a virtio-iommu device
Date: Fri,  1 Oct 2021 18:33:55 +0100	[thread overview]
Message-ID: <20211001173358.863017-8-jean-philippe@linaro.org> (raw)
In-Reply-To: <20211001173358.863017-1-jean-philippe@linaro.org>

Allow instantiating a virtio-iommu device by adding an ACPI Virtual I/O
Translation table (VIOT), which describes the relation between the
virtio-iommu and the endpoints it manages.

Add a hotplug handler for virtio-iommu on x86 and set the necessary
reserved region property. On x86, the [0xfee00000, 0xfeefffff] DMA
region is reserved for MSIs. DMA transactions to this range either
trigger IRQ remapping in the IOMMU or bypasses IOMMU translation.

Although virtio-iommu does not support IRQ remapping it must be informed
of the reserved region so that it can forward DMA transactions targeting
this region.

Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
---
 include/hw/i386/pc.h |  2 ++
 hw/i386/acpi-build.c |  5 +++++
 hw/i386/pc.c         | 24 ++++++++++++++++++++++--
 hw/i386/Kconfig      |  1 +
 4 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 82cf7b7e30..f3ba1ee4c0 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -45,6 +45,8 @@ typedef struct PCMachineState {
     bool pit_enabled;
     bool hpet_enabled;
     bool default_bus_bypass_iommu;
+    bool virtio_iommu;
+    uint16_t virtio_iommu_bdf;
     uint64_t max_fw_size;
 
     /* ACPI Memory hotplug IO base address */
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index d1c28440f4..4e46585709 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -71,6 +71,7 @@
 
 #include "hw/acpi/ipmi.h"
 #include "hw/acpi/hmat.h"
+#include "hw/acpi/viot.h"
 
 /* These are used to size the ACPI tables for -M pc-i440fx-1.7 and
  * -M pc-i440fx-2.0.  Even if the actual amount of AML generated grows
@@ -2593,6 +2594,10 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
             build_dmar_q35(tables_blob, tables->linker, x86ms->oem_id,
                            x86ms->oem_table_id);
         }
+    } else if (pcms->virtio_iommu) {
+        acpi_add_table(table_offsets, tables_blob);
+        build_viot(machine, tables_blob, tables->linker, pcms->virtio_iommu_bdf,
+                   x86ms->oem_id, x86ms->oem_table_id);
     }
     if (machine->nvdimms_state->is_enabled) {
         nvdimm_build_acpi(table_offsets, tables_blob, tables->linker,
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 789ccb6ef4..31710bc4fb 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -83,6 +83,7 @@
 #include "hw/i386/intel_iommu.h"
 #include "hw/net/ne2000-isa.h"
 #include "standard-headers/asm-x86/bootparam.h"
+#include "hw/virtio/virtio-iommu.h"
 #include "hw/virtio/virtio-pmem-pci.h"
 #include "hw/virtio/virtio-mem-pci.h"
 #include "hw/mem/memory-device.h"
@@ -1367,8 +1368,11 @@ static void pc_virtio_md_pci_unplug(HotplugHandler *hotplug_dev,
 static void pc_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
                                           DeviceState *dev, Error **errp)
 {
-    if (object_dynamic_cast(OBJECT(dev), TYPE_X86_IOMMU_DEVICE) &&
-        x86_iommu_get_default()) {
+    PCMachineState *pcms = PC_MACHINE(hotplug_dev);
+
+    if ((object_dynamic_cast(OBJECT(dev), TYPE_X86_IOMMU_DEVICE) ||
+         object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) &&
+        (x86_iommu_get_default() || pcms->virtio_iommu)) {
         error_setg(errp, "QEMU does not support multiple vIOMMUs "
                    "for x86 yet.");
         return;
@@ -1381,6 +1385,15 @@ static void pc_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
     } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_PMEM_PCI) ||
                object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) {
         pc_virtio_md_pci_pre_plug(hotplug_dev, dev, errp);
+    } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
+        /* Declare the APIC range as the reserved MSI region */
+        char *resv_prop_str = g_strdup_printf("0xfee00000:0xfeefffff:%d",
+                                              VIRTIO_IOMMU_RESV_MEM_T_MSI);
+
+        object_property_set_uint(OBJECT(dev), "len-reserved-regions", 1, errp);
+        object_property_set_str(OBJECT(dev), "reserved-regions[0]",
+                                resv_prop_str, errp);
+        g_free(resv_prop_str);
     }
 }
 
@@ -1394,6 +1407,12 @@ static void pc_machine_device_plug_cb(HotplugHandler *hotplug_dev,
     } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_PMEM_PCI) ||
                object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) {
         pc_virtio_md_pci_plug(hotplug_dev, dev, errp);
+    } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
+        PCMachineState *pcms = PC_MACHINE(hotplug_dev);
+        PCIDevice *pdev = PCI_DEVICE(dev);
+
+        pcms->virtio_iommu = true;
+        pcms->virtio_iommu_bdf = pci_get_bdf(pdev);
     }
 }
 
@@ -1436,6 +1455,7 @@ static HotplugHandler *pc_get_hotplug_handler(MachineState *machine,
         object_dynamic_cast(OBJECT(dev), TYPE_CPU) ||
         object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_PMEM_PCI) ||
         object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI) ||
+        object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI) ||
         object_dynamic_cast(OBJECT(dev), TYPE_X86_IOMMU_DEVICE)) {
         return HOTPLUG_HANDLER(machine);
     }
diff --git a/hw/i386/Kconfig b/hw/i386/Kconfig
index ddedcef0b2..13db05d557 100644
--- a/hw/i386/Kconfig
+++ b/hw/i386/Kconfig
@@ -54,6 +54,7 @@ config PC_ACPI
     select ACPI_X86
     select ACPI_CPU_HOTPLUG
     select ACPI_MEMORY_HOTPLUG
+    select ACPI_VIOT
     select SMBUS_EEPROM
     select PFLASH_CFI01
     depends on ACPI_SMBUS
-- 
2.33.0



  parent reply	other threads:[~2021-10-01 18:04 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-01 17:33 [PATCH v4 00/11] virtio-iommu: Add ACPI support Jean-Philippe Brucker
2021-10-01 17:33 ` [PATCH v4 01/11] hw/acpi: Add VIOT table Jean-Philippe Brucker
2021-10-06  8:09   ` Igor Mammedov
2021-10-08 15:20     ` Jean-Philippe Brucker
2021-10-01 17:33 ` [PATCH v4 02/11] hw/arm/virt-acpi-build: Add VIOT table for virtio-iommu Jean-Philippe Brucker
2021-10-01 17:33 ` [PATCH v4 03/11] hw/arm/virt: Remove device tree restriction " Jean-Philippe Brucker
2021-10-05 11:57   ` Eric Auger
2021-10-08 15:20     ` Jean-Philippe Brucker
2021-10-01 17:33 ` [PATCH v4 04/11] hw/arm/virt: Reject instantiation of multiple IOMMUs Jean-Philippe Brucker
2021-10-06  6:35   ` Igor Mammedov
2021-10-01 17:33 ` [PATCH v4 05/11] hw/arm/virt: Use object_property_set instead of qdev_prop_set Jean-Philippe Brucker
2021-10-05  9:27   ` Eric Auger
2021-10-06  6:36   ` Igor Mammedov
2021-10-01 17:33 ` [PATCH v4 06/11] hw/i386: Move vIOMMU uniqueness check into pc.c Jean-Philippe Brucker
2021-10-05 11:41   ` Eric Auger
2021-10-01 17:33 ` Jean-Philippe Brucker [this message]
2021-10-05 19:18   ` [PATCH v4 07/11] pc: Allow instantiating a virtio-iommu device Eric Auger
2021-10-06  7:19   ` Igor Mammedov
2021-10-08 15:24     ` Jean-Philippe Brucker
2021-10-08 10:46   ` Michael S. Tsirkin
2021-10-01 17:33 ` [PATCH v4 08/11] tests/acpi: allow updates of VIOT expected data files Jean-Philippe Brucker
2021-10-06  8:12   ` Igor Mammedov
2021-10-08 15:26     ` Jean-Philippe Brucker
2021-10-11 15:55       ` Igor Mammedov
2021-10-01 17:33 ` [PATCH v4 09/11] tests/acpi: add test cases for VIOT Jean-Philippe Brucker
2021-10-05 10:27   ` Ani Sinha
2021-10-08 15:27     ` Jean-Philippe Brucker
2021-10-05 19:40   ` Eric Auger
2021-10-06  8:14   ` Igor Mammedov
2021-10-01 17:33 ` [PATCH v4 10/11] tests/acpi: add expected blob for VIOT test on virt machine Jean-Philippe Brucker
2021-10-05 10:04   ` Ani Sinha
2021-10-08 15:33     ` Jean-Philippe Brucker
2021-10-05 19:38   ` Eric Auger
2021-10-08 15:30     ` Jean-Philippe Brucker
2021-10-01 17:33 ` [PATCH v4 11/11] tests/acpi: add expected blobs for VIOT test on q35 machine Jean-Philippe Brucker
2021-10-05 10:07   ` Ani Sinha
2021-10-05 19:41   ` Eric Auger
2021-10-05 15:45 ` [PATCH v4 00/11] virtio-iommu: Add ACPI support Michael S. Tsirkin
2021-10-08 15:17   ` Jean-Philippe Brucker
2021-10-11 10:10     ` Haiwei Li
2021-10-11 17:34       ` Jean-Philippe Brucker
2021-10-13  0:56         ` Haiwei Li
2021-10-18 15:25     ` Michael S. Tsirkin
2021-10-19 15:39       ` Jean-Philippe Brucker
2021-10-20 15:17         ` 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=20211001173358.863017-8-jean-philippe@linaro.org \
    --to=jean-philippe@linaro.org \
    --cc=ani@anisinha.ca \
    --cc=ehabkost@redhat.com \
    --cc=eric.auger@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=shannon.zhaosl@gmail.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.