aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMurali Karicheri <m-karicheri2@ti.com>2015-03-03 12:52:08 -0500
committerBjorn Helgaas <bhelgaas@google.com>2015-03-03 15:42:55 -0500
commited748621031c2a205749997421e59fb4dfb1e909 (patch)
tree4739a881d9124fba79ba8b2ce40aed26158d91fb
parentc517d838eb7d07bbe9507871fab3931deccff539 (diff)
of: iommu: Add ptr to OF node arg to of_iommu_configure()
of_iommu_configure() is called from of_dma_configure() to setup iommu ops using DT property. This API is currently used for platform devices for which DMA configuration (including IOMMU ops) may come from the device's parent. To extend this functionality for PCI devices, this API needs to take a parent node ptr as an argument instead of assuming device's parent. This is needed since for PCI, the DMA configuration may be defined in the DT node of the root bus bridge's parent device. Currently only dma-range is used for PCI and IOMMU is not supported. Return error if the device is PCI. Add "parent" parameter (a struct device_node *) to of_iommu_configure(). Tested-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> (AMD Seattle) Signed-off-by: Murali Karicheri <m-karicheri2@ti.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Acked-by: Rob Herring <robh+dt@kernel.org> Acked-by: Will Deacon <will.deacon@arm.com> CC: Joerg Roedel <joro@8bytes.org> CC: Grant Likely <grant.likely@linaro.org> CC: Russell King <linux@arm.linux.org.uk> CC: Arnd Bergmann <arnd@arndb.de>
-rw-r--r--drivers/iommu/of_iommu.c10
-rw-r--r--drivers/of/platform.c2
-rw-r--r--include/linux/of_iommu.h6
3 files changed, 13 insertions, 5 deletions
diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c
index af1dc6a1c0a1..43429ab62228 100644
--- a/drivers/iommu/of_iommu.c
+++ b/drivers/iommu/of_iommu.c
@@ -133,19 +133,25 @@ struct iommu_ops *of_iommu_get_ops(struct device_node *np)
133 return ops; 133 return ops;
134} 134}
135 135
136struct iommu_ops *of_iommu_configure(struct device *dev) 136struct iommu_ops *of_iommu_configure(struct device *dev,
137 struct device_node *master_np)
137{ 138{
138 struct of_phandle_args iommu_spec; 139 struct of_phandle_args iommu_spec;
139 struct device_node *np; 140 struct device_node *np;
140 struct iommu_ops *ops = NULL; 141 struct iommu_ops *ops = NULL;
141 int idx = 0; 142 int idx = 0;
142 143
144 if (dev_is_pci(dev)) {
145 dev_err(dev, "IOMMU is currently not supported for PCI\n");
146 return NULL;
147 }
148
143 /* 149 /*
144 * We don't currently walk up the tree looking for a parent IOMMU. 150 * We don't currently walk up the tree looking for a parent IOMMU.
145 * See the `Notes:' section of 151 * See the `Notes:' section of
146 * Documentation/devicetree/bindings/iommu/iommu.txt 152 * Documentation/devicetree/bindings/iommu/iommu.txt
147 */ 153 */
148 while (!of_parse_phandle_with_args(dev->of_node, "iommus", 154 while (!of_parse_phandle_with_args(master_np, "iommus",
149 "#iommu-cells", idx, 155 "#iommu-cells", idx,
150 &iommu_spec)) { 156 &iommu_spec)) {
151 np = iommu_spec.np; 157 np = iommu_spec.np;
diff --git a/drivers/of/platform.c b/drivers/of/platform.c
index b189733a1539..667c6f13f12b 100644
--- a/drivers/of/platform.c
+++ b/drivers/of/platform.c
@@ -196,7 +196,7 @@ static void of_dma_configure(struct device *dev)
196 dev_dbg(dev, "device is%sdma coherent\n", 196 dev_dbg(dev, "device is%sdma coherent\n",
197 coherent ? " " : " not "); 197 coherent ? " " : " not ");
198 198
199 iommu = of_iommu_configure(dev); 199 iommu = of_iommu_configure(dev, dev->of_node);
200 dev_dbg(dev, "device is%sbehind an iommu\n", 200 dev_dbg(dev, "device is%sbehind an iommu\n",
201 iommu ? " " : " not "); 201 iommu ? " " : " not ");
202 202
diff --git a/include/linux/of_iommu.h b/include/linux/of_iommu.h
index 16c75547d725..ffbe4707d4aa 100644
--- a/include/linux/of_iommu.h
+++ b/include/linux/of_iommu.h
@@ -12,7 +12,8 @@ extern int of_get_dma_window(struct device_node *dn, const char *prefix,
12 size_t *size); 12 size_t *size);
13 13
14extern void of_iommu_init(void); 14extern void of_iommu_init(void);
15extern struct iommu_ops *of_iommu_configure(struct device *dev); 15extern struct iommu_ops *of_iommu_configure(struct device *dev,
16 struct device_node *master_np);
16 17
17#else 18#else
18 19
@@ -24,7 +25,8 @@ static inline int of_get_dma_window(struct device_node *dn, const char *prefix,
24} 25}
25 26
26static inline void of_iommu_init(void) { } 27static inline void of_iommu_init(void) { }
27static inline struct iommu_ops *of_iommu_configure(struct device *dev) 28static inline struct iommu_ops *of_iommu_configure(struct device *dev,
29 struct device_node *master_np)
28{ 30{
29 return NULL; 31 return NULL;
30} 32}