[PATCH 07/30] iommu/of: Call of_iommu_get_resv_regions() directly
Jason Gunthorpe
jgg at nvidia.com
Wed Nov 29 17:10:14 PST 2023
virtio-iommu and dart already parse the ACPI firmware description in their
own get_resv_regions() callback. They just need to parse the OF
description.
The generic iommu_dma_get_resv_regions() really just knows how to parse
the IORT ACPI in addition to OF.
Directly call of_iommu_get_resv_regions() instead.
Move the declaration of of_iommu_get_resv_regions() to iommu-driver.h
since it is now intended to be called by drivers.
Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>
---
drivers/iommu/apple-dart.c | 5 ++---
drivers/iommu/dma-iommu.c | 5 ++---
drivers/iommu/of_iommu.c | 3 +++
drivers/iommu/virtio-iommu.c | 5 ++---
include/linux/iommu-driver.h | 9 +++++++++
include/linux/of_iommu.h | 8 --------
6 files changed, 18 insertions(+), 17 deletions(-)
diff --git a/drivers/iommu/apple-dart.c b/drivers/iommu/apple-dart.c
index 25135440b5dd54..bb0e5a4577fc03 100644
--- a/drivers/iommu/apple-dart.c
+++ b/drivers/iommu/apple-dart.c
@@ -20,6 +20,7 @@
#include <linux/interrupt.h>
#include <linux/io-pgtable.h>
#include <linux/iommu.h>
+#include <linux/iommu-driver.h>
#include <linux/iopoll.h>
#include <linux/module.h>
#include <linux/of.h>
@@ -32,8 +33,6 @@
#include <linux/swab.h>
#include <linux/types.h>
-#include "dma-iommu.h"
-
#define DART_MAX_STREAMS 256
#define DART_MAX_TTBR 4
#define MAX_DARTS_PER_DEVICE 2
@@ -972,7 +971,7 @@ static void apple_dart_get_resv_regions(struct device *dev,
list_add_tail(®ion->list, head);
}
- iommu_dma_get_resv_regions(dev, head);
+ of_iommu_get_resv_regions(dev, head);
}
static const struct iommu_ops apple_dart_iommu_ops = {
diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c
index d644b0502ef48e..5a828c92cd38b2 100644
--- a/drivers/iommu/dma-iommu.c
+++ b/drivers/iommu/dma-iommu.c
@@ -23,7 +23,7 @@
#include <linux/memremap.h>
#include <linux/mm.h>
#include <linux/mutex.h>
-#include <linux/of_iommu.h>
+#include <linux/iommu-driver.h>
#include <linux/pci.h>
#include <linux/scatterlist.h>
#include <linux/spinlock.h>
@@ -475,8 +475,7 @@ void iommu_dma_get_resv_regions(struct device *dev, struct list_head *list)
fwspec->ids, fwspec->num_ids);
}
- if (dev->of_node)
- of_iommu_get_resv_regions(dev, list);
+ of_iommu_get_resv_regions(dev, list);
}
EXPORT_SYMBOL(iommu_dma_get_resv_regions);
diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c
index cf68cdebc9f318..20266a8edd5c71 100644
--- a/drivers/iommu/of_iommu.c
+++ b/drivers/iommu/of_iommu.c
@@ -217,6 +217,9 @@ void of_iommu_get_resv_regions(struct device *dev, struct list_head *list)
struct of_phandle_iterator it;
int err;
+ if (!dev->of_node)
+ return;
+
of_for_each_phandle(&it, err, dev->of_node, "memory-region", NULL, 0) {
const __be32 *maps, *end;
struct resource phys;
diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c
index 34db37fd9675cd..b1a7b14a6c7a2f 100644
--- a/drivers/iommu/virtio-iommu.c
+++ b/drivers/iommu/virtio-iommu.c
@@ -12,6 +12,7 @@
#include <linux/freezer.h>
#include <linux/interval_tree.h>
#include <linux/iommu.h>
+#include <linux/iommu-driver.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/pci.h>
@@ -22,8 +23,6 @@
#include <uapi/linux/virtio_iommu.h>
-#include "dma-iommu.h"
-
#define MSI_IOVA_BASE 0x8000000
#define MSI_IOVA_LENGTH 0x100000
@@ -969,7 +968,7 @@ static void viommu_get_resv_regions(struct device *dev, struct list_head *head)
list_add_tail(&msi->list, head);
}
- iommu_dma_get_resv_regions(dev, head);
+ of_iommu_get_resv_regions(dev, head);
}
static struct iommu_ops viommu_ops;
diff --git a/include/linux/iommu-driver.h b/include/linux/iommu-driver.h
index 636b5b5f18f76f..c572620d3069b4 100644
--- a/include/linux/iommu-driver.h
+++ b/include/linux/iommu-driver.h
@@ -25,4 +25,13 @@ struct iommu_probe_info {
int iommu_probe_device_pinf(struct iommu_probe_info *pinf);
struct iommu_device *iommu_device_from_fwnode(struct fwnode_handle *fwnode);
+#if IS_ENABLED(CONFIG_OF_IOMMU)
+void of_iommu_get_resv_regions(struct device *dev, struct list_head *list);
+#else
+static inline void of_iommu_get_resv_regions(struct device *dev,
+ struct list_head *list)
+{
+}
+#endif
+
#endif
diff --git a/include/linux/of_iommu.h b/include/linux/of_iommu.h
index e61cbbe12dac6f..9d5532f2f11486 100644
--- a/include/linux/of_iommu.h
+++ b/include/linux/of_iommu.h
@@ -11,9 +11,6 @@ struct iommu_ops;
extern int of_iommu_configure(struct device *dev, struct device_node *master_np,
const u32 *id);
-extern void of_iommu_get_resv_regions(struct device *dev,
- struct list_head *list);
-
#else
static inline int of_iommu_configure(struct device *dev,
@@ -23,11 +20,6 @@ static inline int of_iommu_configure(struct device *dev,
return -ENODEV;
}
-static inline void of_iommu_get_resv_regions(struct device *dev,
- struct list_head *list)
-{
-}
-
#endif /* CONFIG_OF_IOMMU */
#endif /* __OF_IOMMU_H */
--
2.42.0
More information about the Linux-rockchip
mailing list