Thread (7 messages) 7 messages, 2 authors, 2017-12-14

[PATCH v11 1/3] ACPI/IORT: Add msi address regions reservation helper

From: Lorenzo Pieralisi <hidden>
Date: 2017-12-14 11:47:59
Also in: linux-acpi, linux-devicetree, linux-iommu
Subsystem: acpi, the rest · Maintainers: "Rafael J. Wysocki", Linus Torvalds

On Wed, Dec 13, 2017 at 11:58:28AM +0000, Shameer Kolothum wrote:
On some platforms msi parent address regions have to be excluded from
normal IOVA allocation in that they are detected and decoded in a HW
specific way by system components and so they cannot be considered normal
IOVA address space.

Add a helper function that retrieves ITS address regions - the msi
parent - through IORT device <-> ITS mappings and reserves it so that
these regions will not be translated by IOMMU and will be excluded from
IOVA allocations. The function checks for the smmu model number and
only applies the msi reservation if the platform requires it.

Signed-off-by: Shameer Kolothum <redacted>
---
 drivers/acpi/arm64/iort.c        | 112 +++++++++++++++++++++++++++++++++++++--
 drivers/irqchip/irq-gic-v3-its.c |   3 +-
 include/linux/acpi_iort.h        |   7 ++-
 3 files changed, 117 insertions(+), 5 deletions(-)
You need this additional hunk to make it compile on !CONFIG_IOMMU_API:

-- >8 --
diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
index 3e0ce652c3e8..e2f7bddf5522 100644
--- a/drivers/acpi/arm64/iort.c
+++ b/drivers/acpi/arm64/iort.c
@@ -762,25 +762,6 @@ static int __maybe_unused __get_pci_rid(struct pci_dev *pdev, u16 alias,
 	return 0;
 }
 
-static __maybe_unused struct acpi_iort_node *iort_get_msi_resv_iommu(
-						struct device *dev)
-{
-	struct acpi_iort_node *iommu;
-	struct iommu_fwspec *fwspec = dev->iommu_fwspec;
-
-	iommu = iort_get_iort_node(fwspec->iommu_fwnode);
-
-	if (iommu && (iommu->type == ACPI_IORT_NODE_SMMU_V3)) {
-		struct acpi_iort_smmu_v3 *smmu;
-
-		smmu = (struct acpi_iort_smmu_v3 *)iommu->node_data;
-		if (smmu->model == ACPI_IORT_SMMU_V3_HISILICON_HI161X)
-			return iommu;
-	}
-
-	return NULL;
-}
-
 static int arm_smmu_iort_xlate(struct device *dev, u32 streamid,
 			       struct fwnode_handle *fwnode,
 			       const struct iommu_ops *ops)
@@ -807,6 +788,24 @@ static inline bool iort_iommu_driver_enabled(u8 type)
 }
 
 #ifdef CONFIG_IOMMU_API
+static struct acpi_iort_node *iort_get_msi_resv_iommu(struct device *dev)
+{
+	struct acpi_iort_node *iommu;
+	struct iommu_fwspec *fwspec = dev->iommu_fwspec;
+
+	iommu = iort_get_iort_node(fwspec->iommu_fwnode);
+
+	if (iommu && (iommu->type == ACPI_IORT_NODE_SMMU_V3)) {
+		struct acpi_iort_smmu_v3 *smmu;
+
+		smmu = (struct acpi_iort_smmu_v3 *)iommu->node_data;
+		if (smmu->model == ACPI_IORT_SMMU_V3_HISILICON_HI161X)
+			return iommu;
+	}
+
+	return NULL;
+}
+
 static inline const struct iommu_ops *iort_fwspec_iommu_ops(
 				struct iommu_fwspec *fwspec)
 {
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help