From: Eric Auger <eric.auger@redhat.com>
To: eric.auger.pro@gmail.com, eric.auger@redhat.com,
qemu-devel@nongnu.org, qemu-arm@nongnu.org,
peter.maydell@linaro.org, mst@redhat.com, armbru@redhat.com,
jean-philippe.brucker@arm.com, bharatb.linux@gmail.com,
yang.zhong@intel.com, dgilbert@redhat.com, quintela@redhat.com
Cc: kevin.tian@intel.com, peterx@redhat.com, tnowicki@marvell.com
Subject: [PATCH for-5.0 v11 17/20] hw/arm/virt-acpi-build: Add virtio-iommu node in IORT table
Date: Fri, 22 Nov 2019 19:29:40 +0100 [thread overview]
Message-ID: <20191122182943.4656-18-eric.auger@redhat.com> (raw)
In-Reply-To: <20191122182943.4656-1-eric.auger@redhat.com>
This patch builds the virtio-iommu node in the ACPI IORT table.
The RID space of the root complex, which spans 0x0-0x10000
maps to streamid space 0x0-0x10000 in the virtio-iommu which in
turn maps to deviceid space 0x0-0x10000 in the ITS group.
The iommu RID is excluded as described in virtio-iommu
specification.
Signed-off-by: Eric Auger <eric.auger@redhat.com>
---
v8 -> v9:
- iommu RID is not fixed anymore
v7 -> v8:
- exclude the iommu RID (0x8) in the root complex ID mapping
---
hw/arm/virt-acpi-build.c | 50 ++++++++++++++++++++++++++++++-------
include/hw/acpi/acpi-defs.h | 21 +++++++++++++++-
2 files changed, 61 insertions(+), 10 deletions(-)
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index 825f3a79c0..1e22cbbbfd 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -386,14 +386,14 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
AcpiIortIdMapping *idmap;
AcpiIortItsGroup *its;
AcpiIortTable *iort;
- AcpiIortSmmu3 *smmu;
- size_t node_size, iort_node_offset, iort_length, smmu_offset = 0;
+ size_t node_size, iort_node_offset, iort_length, iommu_offset = 0;
AcpiIortRC *rc;
+ int nb_rc_idmappings = 1;
iort = acpi_data_push(table_data, sizeof(*iort));
- if (vms->iommu == VIRT_IOMMU_SMMUV3) {
- nb_nodes = 3; /* RC, ITS, SMMUv3 */
+ if (vms->iommu) {
+ nb_nodes = 3; /* RC, ITS, IOMMU */
} else {
nb_nodes = 2; /* RC, ITS */
}
@@ -419,9 +419,9 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
if (vms->iommu == VIRT_IOMMU_SMMUV3) {
int irq = vms->irqmap[VIRT_SMMU] + ARM_SPI_BASE;
+ AcpiIortSmmu3 *smmu;
- /* SMMUv3 node */
- smmu_offset = iort_node_offset + node_size;
+ iommu_offset = iort_node_offset + node_size;
node_size = sizeof(*smmu) + sizeof(*idmap);
iort_length += node_size;
smmu = acpi_data_push(table_data, node_size);
@@ -443,16 +443,38 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
*/
fill_iort_idmap(smmu->id_mapping_array, 0, 0, 0xffff, 0,
iort_node_offset);
+ } else if (vms->iommu == VIRT_IOMMU_VIRTIO) {
+ AcpiIortPVIommuPCI *iommu;
+
+ nb_rc_idmappings = 2;
+ iommu_offset = iort_node_offset + node_size;
+ node_size = sizeof(*iommu) + 2 * sizeof(*idmap);
+ iort_length += node_size;
+ iommu = acpi_data_push(table_data, node_size);
+
+ iommu->type = ACPI_IORT_NODE_PARAVIRT;
+ iommu->length = cpu_to_le16(node_size);
+ iommu->mapping_count = cpu_to_le32(2);
+ iommu->mapping_offset = cpu_to_le32(sizeof(*iommu));
+ iommu->devid = cpu_to_le32(vms->virtio_iommu_bdf);
+ iommu->model = cpu_to_le32(ACPI_IORT_NODE_PV_VIRTIO_IOMMU_PCI);
+
+ /*
+ * Identity RID mapping covering the whole input RID range
+ * output IORT node is the ITS group node (the first node)
+ */
+ fill_iort_idmap(iommu->id_mapping_array, 0, 0, 0xffff, 0,
+ iort_node_offset);
}
/* Root Complex Node */
- node_size = sizeof(*rc) + sizeof(*idmap);
+ node_size = sizeof(*rc) + nb_rc_idmappings * sizeof(*idmap);
iort_length += node_size;
rc = acpi_data_push(table_data, node_size);
rc->type = ACPI_IORT_NODE_PCI_ROOT_COMPLEX;
rc->length = cpu_to_le16(node_size);
- rc->mapping_count = cpu_to_le32(1);
+ rc->mapping_count = cpu_to_le32(nb_rc_idmappings);
rc->mapping_offset = cpu_to_le32(sizeof(*rc));
/* fully coherent device */
@@ -463,7 +485,17 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
if (vms->iommu == VIRT_IOMMU_SMMUV3) {
/* Identity RID mapping and output IORT node is the iommu node */
fill_iort_idmap(rc->id_mapping_array, 0, 0, 0xFFFF, 0,
- smmu_offset);
+ iommu_offset);
+ } else if (vms->iommu == VIRT_IOMMU_VIRTIO) {
+ /*
+ * Identity mapping with the IOMMU RID (0x8) excluded. The output
+ * IORT node is the iommu node.
+ */
+ fill_iort_idmap(rc->id_mapping_array, 0, 0, vms->virtio_iommu_bdf, 0,
+ iommu_offset);
+ fill_iort_idmap(rc->id_mapping_array, 1, vms->virtio_iommu_bdf + 1,
+ 0xFFFF - vms->virtio_iommu_bdf,
+ vms->virtio_iommu_bdf + 1, iommu_offset);
} else {
/*
* Identity RID mapping and the output IORT node is the ITS group
diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index 57a3f58b0c..ba06f41fc0 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -581,7 +581,8 @@ enum {
ACPI_IORT_NODE_NAMED_COMPONENT = 0x01,
ACPI_IORT_NODE_PCI_ROOT_COMPLEX = 0x02,
ACPI_IORT_NODE_SMMU = 0x03,
- ACPI_IORT_NODE_SMMU_V3 = 0x04
+ ACPI_IORT_NODE_SMMU_V3 = 0x04,
+ ACPI_IORT_NODE_PARAVIRT = 0x80
};
struct AcpiIortIdMapping {
@@ -610,6 +611,24 @@ typedef struct AcpiIortItsGroup AcpiIortItsGroup;
#define ACPI_IORT_SMMU_V3_COHACC_OVERRIDE 1
+struct AcpiIortPVIommuPCI {
+ ACPI_IORT_NODE_HEADER_DEF
+ uint32_t devid;
+ uint8_t reserved2[12];
+ uint32_t model;
+ uint32_t flags;
+ uint8_t reserved3[16];
+ AcpiIortIdMapping id_mapping_array[0];
+} QEMU_PACKED;
+typedef struct AcpiIortPVIommuPCI AcpiIortPVIommuPCI;
+
+enum {
+ ACPI_IORT_NODE_PV_VIRTIO_IOMMU = 0x0,
+ ACPI_IORT_NODE_PV_VIRTIO_IOMMU_PCI = 0x1,
+};
+
+#define ACPI_IORT_NODE_PV_CACHE_COHERENT (1 << 0)
+
struct AcpiIortSmmu3 {
ACPI_IORT_NODE_HEADER_DEF
uint64_t base_address;
--
2.20.1
next prev parent reply other threads:[~2019-11-22 18:55 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-22 18:29 [PATCH for-5.0 v11 00/20] VIRTIO-IOMMU device Eric Auger
2019-11-22 18:29 ` [PATCH for-5.0 v11 01/20] migration: Support QLIST migration Eric Auger
2019-11-27 11:46 ` Dr. David Alan Gilbert
2020-01-08 13:19 ` Juan Quintela
2020-01-08 13:40 ` Auger Eric
2020-01-08 13:51 ` Juan Quintela
2020-01-08 14:02 ` Auger Eric
2019-11-22 18:29 ` [PATCH for-5.0 v11 02/20] virtio-iommu: Add skeleton Eric Auger
2019-12-10 16:31 ` Jean-Philippe Brucker
2019-12-19 10:31 ` Auger Eric
2019-11-22 18:29 ` [PATCH for-5.0 v11 03/20] virtio-iommu: Decode the command payload Eric Auger
2019-12-10 16:32 ` Jean-Philippe Brucker
2019-12-10 19:14 ` Peter Xu
2019-11-22 18:29 ` [PATCH for-5.0 v11 04/20] virtio-iommu: Add the iommu regions Eric Auger
2019-12-10 16:34 ` Jean-Philippe Brucker
2019-12-19 18:11 ` Auger Eric
2019-12-10 19:18 ` Peter Xu
2019-11-22 18:29 ` [PATCH for-5.0 v11 05/20] virtio-iommu: Endpoint and domains structs and helpers Eric Auger
2019-12-10 16:37 ` Jean-Philippe Brucker
2019-12-19 18:31 ` Auger Eric
2019-12-20 17:00 ` Jean-Philippe Brucker
2019-12-23 9:11 ` Auger Eric
2019-11-22 18:29 ` [PATCH for-5.0 v11 06/20] virtio-iommu: Implement attach/detach command Eric Auger
2019-12-10 16:41 ` Jean-Philippe Brucker
2019-12-23 9:14 ` Auger Eric
2019-11-22 18:29 ` [PATCH for-5.0 v11 07/20] virtio-iommu: Implement map/unmap Eric Auger
2019-12-10 16:43 ` Jean-Philippe Brucker
2019-12-23 9:42 ` Auger Eric
2019-11-22 18:29 ` [PATCH for-5.0 v11 08/20] virtio-iommu: Implement translate Eric Auger
2019-12-10 16:43 ` Jean-Philippe Brucker
2019-12-10 19:33 ` Peter Xu
2019-12-19 10:30 ` Auger Eric
2019-12-19 13:33 ` Peter Xu
2019-12-19 14:38 ` Auger Eric
2019-12-19 14:49 ` Peter Xu
2019-12-19 15:09 ` Auger Eric
2019-12-20 16:26 ` Jean-Philippe Brucker
2019-12-20 16:51 ` Peter Xu
2020-01-06 17:06 ` Jean-Philippe Brucker
2020-01-06 17:58 ` Peter Xu
2020-01-07 10:10 ` Jean-Philippe Brucker
2020-01-08 16:55 ` Auger Eric
2020-01-09 8:47 ` Jean-Philippe Brucker
2020-01-09 8:58 ` Auger Eric
2020-01-09 10:40 ` Jean-Philippe Brucker
2020-01-09 11:01 ` Auger Eric
2020-01-09 11:15 ` Jean-Philippe Brucker
2020-01-09 11:32 ` Auger Eric
2019-11-22 18:29 ` [PATCH for-5.0 v11 09/20] virtio-iommu: Implement fault reporting Eric Auger
2019-12-10 16:44 ` Jean-Philippe Brucker
2019-11-22 18:29 ` [PATCH for-5.0 v11 10/20] virtio-iommu-pci: Add virtio iommu pci support Eric Auger
2019-12-10 16:44 ` Jean-Philippe Brucker
2019-11-22 18:29 ` [PATCH for-5.0 v11 11/20] hw/arm/virt: Add the virtio-iommu device tree mappings Eric Auger
2019-12-10 16:45 ` Jean-Philippe Brucker
2019-11-22 18:29 ` [PATCH for-5.0 v11 12/20] qapi: Introduce DEFINE_PROP_INTERVAL Eric Auger
2019-11-22 19:03 ` Dr. David Alan Gilbert
2019-11-25 13:12 ` Auger Eric
2019-12-12 12:17 ` Markus Armbruster
2019-12-12 15:13 ` Auger Eric
2019-12-13 10:03 ` Markus Armbruster
2019-11-22 18:29 ` [PATCH for-5.0 v11 13/20] virtio-iommu: Implement probe request Eric Auger
2019-12-10 16:46 ` Jean-Philippe Brucker
2019-12-10 19:36 ` Peter Xu
2019-11-22 18:29 ` [PATCH for-5.0 v11 14/20] virtio-iommu: Handle reserved regions in the translation process Eric Auger
2019-12-10 16:46 ` Jean-Philippe Brucker
2019-12-10 19:39 ` Peter Xu
2019-11-22 18:29 ` [PATCH for-5.0 v11 15/20] virtio-iommu-pci: Add array of Interval properties Eric Auger
2019-12-10 16:47 ` Jean-Philippe Brucker
2019-11-22 18:29 ` [PATCH for-5.0 v11 16/20] hw/arm/virt-acpi-build: Introduce fill_iort_idmap helper Eric Auger
2019-12-10 16:47 ` Jean-Philippe Brucker
2019-11-22 18:29 ` Eric Auger [this message]
2019-12-10 16:48 ` [PATCH for-5.0 v11 17/20] hw/arm/virt-acpi-build: Add virtio-iommu node in IORT table Jean-Philippe Brucker
2019-11-22 18:29 ` [PATCH for-5.0 v11 18/20] virtio-iommu: Support migration Eric Auger
2019-11-27 12:06 ` Dr. David Alan Gilbert
2019-12-10 16:50 ` Jean-Philippe Brucker
2019-12-19 11:03 ` Auger Eric
2019-12-10 20:01 ` Peter Xu
2019-12-24 7:39 ` Auger Eric
2019-11-22 18:29 ` [PATCH for-5.0 v11 19/20] pc: Add support for virtio-iommu-pci Eric Auger
2019-12-10 16:50 ` Jean-Philippe Brucker
2019-12-24 7:39 ` Auger Eric
2020-01-09 12:02 ` Michael S. Tsirkin
2020-01-09 13:34 ` Auger Eric
2019-11-22 18:29 ` [PATCH for-5.0 v11 20/20] tests: Add virtio-iommu test Eric Auger
2019-11-22 21:56 ` [PATCH for-5.0 v11 00/20] VIRTIO-IOMMU device no-reply
2019-12-11 16:40 ` Michael S. Tsirkin
2019-12-11 16:48 ` Auger Eric
2019-12-11 20:40 ` Michael S. Tsirkin
2019-12-12 15:05 ` Auger Eric
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=20191122182943.4656-18-eric.auger@redhat.com \
--to=eric.auger@redhat.com \
--cc=armbru@redhat.com \
--cc=bharatb.linux@gmail.com \
--cc=dgilbert@redhat.com \
--cc=eric.auger.pro@gmail.com \
--cc=jean-philippe.brucker@arm.com \
--cc=kevin.tian@intel.com \
--cc=mst@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=peterx@redhat.com \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=tnowicki@marvell.com \
--cc=yang.zhong@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).