@@ -1899,6 +1899,13 @@ arm_iommu_create_mapping(struct bus_type *bus, dma_addr_t base, size_t size,
mapping->order = order;
spin_lock_init(&mapping->lock);
+#ifdef CONFIG_PLATFORM_ENABLE_IOMMU
+ if (WARN_ON(bus->map))
+ goto err3;
+
+ bus->map = mapping;
+#endif
+
mapping->domain = iommu_domain_alloc(bus);
if (!mapping->domain)
goto err3;
@@ -308,4 +308,8 @@ config CMA_AREAS
endif
+config PLATFORM_ENABLE_IOMMU
+ bool "Make platform devices iommuable"
+ depends on IOMMU_API
+
endmenu
@@ -21,6 +21,8 @@
#include <linux/slab.h>
#include <linux/pm_runtime.h>
+#include <asm/dma-iommu.h>
+
#include "base.h"
#define to_platform_driver(drv) (container_of((drv), struct platform_driver, \
@@ -305,8 +307,19 @@ int platform_device_add(struct platform_device *pdev)
dev_name(&pdev->dev), dev_name(pdev->dev.parent));
ret = device_add(&pdev->dev);
- if (ret == 0)
- return ret;
+ if (ret)
+ goto failed;
+
+#ifdef CONFIG_PLATFORM_ENABLE_IOMMU
+ if (platform_bus_type.map && !pdev->dev.archdata.mapping) {
+ ret = arm_iommu_attach_device(&pdev->dev,
+ platform_bus_type.map);
+ if (ret)
+ goto failed;
+ }
+#endif
+
+ return 0;
failed:
while (--i >= 0) {
@@ -164,7 +164,7 @@ config TEGRA_IOMMU_SMMU
config TEGRA_IOMMU_SMMU_LINEAR
bool "Physical RAM IOVA Liner Mapping Support"
- depends on TEGRA_IOMMU_SMMU
+ depends on TEGRA_IOMMU_SMMU && !PLATFORM_ENABLE_IOMMU
default y
help
Enables support for linear mapping between physical address
@@ -35,6 +35,7 @@ struct subsys_private;
struct bus_type;
struct device_node;
struct iommu_ops;
+struct dma_iommu_mapping;
struct bus_attribute {
struct attribute attr;
@@ -106,7 +107,9 @@ struct bus_type {
const struct dev_pm_ops *pm;
struct iommu_ops *iommu_ops;
-
+#ifdef CONFIG_PLATFORM_ENABLE_IOMMU
+ struct dma_iommu_mapping *map;
+#endif
struct subsys_private *p;
};