diff options
| author | Ingo Molnar <mingo@kernel.org> | 2015-02-04 01:58:29 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2015-02-04 01:58:29 -0500 |
| commit | 8f4bf4bcc4d6f70a47baec5d73bd411e572842e0 (patch) | |
| tree | 8ed86ebd19c32a629bfcfb43378bf32acd14c7d6 /arch/arm/mm/dma-mapping.c | |
| parent | 1ed39bac21c3c2934b18de34df9478ad7b8edf1f (diff) | |
| parent | e36f014edff70fc02b3d3d79cead1d58f289332e (diff) | |
Merge tag 'v3.19-rc7' into perf/core, to merge fixes before applying new changes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/arm/mm/dma-mapping.c')
| -rw-r--r-- | arch/arm/mm/dma-mapping.c | 53 |
1 files changed, 38 insertions, 15 deletions
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 7864797609b3..a673c7f7e208 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
| @@ -1940,13 +1940,32 @@ void arm_iommu_release_mapping(struct dma_iommu_mapping *mapping) | |||
| 1940 | } | 1940 | } |
| 1941 | EXPORT_SYMBOL_GPL(arm_iommu_release_mapping); | 1941 | EXPORT_SYMBOL_GPL(arm_iommu_release_mapping); |
| 1942 | 1942 | ||
| 1943 | static int __arm_iommu_attach_device(struct device *dev, | ||
| 1944 | struct dma_iommu_mapping *mapping) | ||
| 1945 | { | ||
| 1946 | int err; | ||
| 1947 | |||
| 1948 | err = iommu_attach_device(mapping->domain, dev); | ||
| 1949 | if (err) | ||
| 1950 | return err; | ||
| 1951 | |||
| 1952 | kref_get(&mapping->kref); | ||
| 1953 | dev->archdata.mapping = mapping; | ||
| 1954 | |||
| 1955 | pr_debug("Attached IOMMU controller to %s device.\n", dev_name(dev)); | ||
| 1956 | return 0; | ||
| 1957 | } | ||
| 1958 | |||
| 1943 | /** | 1959 | /** |
| 1944 | * arm_iommu_attach_device | 1960 | * arm_iommu_attach_device |
| 1945 | * @dev: valid struct device pointer | 1961 | * @dev: valid struct device pointer |
| 1946 | * @mapping: io address space mapping structure (returned from | 1962 | * @mapping: io address space mapping structure (returned from |
| 1947 | * arm_iommu_create_mapping) | 1963 | * arm_iommu_create_mapping) |
| 1948 | * | 1964 | * |
| 1949 | * Attaches specified io address space mapping to the provided device, | 1965 | * Attaches specified io address space mapping to the provided device. |
| 1966 | * This replaces the dma operations (dma_map_ops pointer) with the | ||
| 1967 | * IOMMU aware version. | ||
| 1968 | * | ||
| 1950 | * More than one client might be attached to the same io address space | 1969 | * More than one client might be attached to the same io address space |
| 1951 | * mapping. | 1970 | * mapping. |
| 1952 | */ | 1971 | */ |
| @@ -1955,25 +1974,16 @@ int arm_iommu_attach_device(struct device *dev, | |||
| 1955 | { | 1974 | { |
| 1956 | int err; | 1975 | int err; |
| 1957 | 1976 | ||
| 1958 | err = iommu_attach_device(mapping->domain, dev); | 1977 | err = __arm_iommu_attach_device(dev, mapping); |
| 1959 | if (err) | 1978 | if (err) |
| 1960 | return err; | 1979 | return err; |
| 1961 | 1980 | ||
| 1962 | kref_get(&mapping->kref); | 1981 | set_dma_ops(dev, &iommu_ops); |
| 1963 | dev->archdata.mapping = mapping; | ||
| 1964 | |||
| 1965 | pr_debug("Attached IOMMU controller to %s device.\n", dev_name(dev)); | ||
| 1966 | return 0; | 1982 | return 0; |
| 1967 | } | 1983 | } |
| 1968 | EXPORT_SYMBOL_GPL(arm_iommu_attach_device); | 1984 | EXPORT_SYMBOL_GPL(arm_iommu_attach_device); |
| 1969 | 1985 | ||
| 1970 | /** | 1986 | static void __arm_iommu_detach_device(struct device *dev) |
| 1971 | * arm_iommu_detach_device | ||
| 1972 | * @dev: valid struct device pointer | ||
| 1973 | * | ||
| 1974 | * Detaches the provided device from a previously attached map. | ||
| 1975 | */ | ||
| 1976 | void arm_iommu_detach_device(struct device *dev) | ||
| 1977 | { | 1987 | { |
| 1978 | struct dma_iommu_mapping *mapping; | 1988 | struct dma_iommu_mapping *mapping; |
| 1979 | 1989 | ||
| @@ -1989,6 +1999,19 @@ void arm_iommu_detach_device(struct device *dev) | |||
| 1989 | 1999 | ||
| 1990 | pr_debug("Detached IOMMU controller from %s device.\n", dev_name(dev)); | 2000 | pr_debug("Detached IOMMU controller from %s device.\n", dev_name(dev)); |
| 1991 | } | 2001 | } |
| 2002 | |||
| 2003 | /** | ||
| 2004 | * arm_iommu_detach_device | ||
| 2005 | * @dev: valid struct device pointer | ||
| 2006 | * | ||
| 2007 | * Detaches the provided device from a previously attached map. | ||
| 2008 | * This voids the dma operations (dma_map_ops pointer) | ||
| 2009 | */ | ||
| 2010 | void arm_iommu_detach_device(struct device *dev) | ||
| 2011 | { | ||
| 2012 | __arm_iommu_detach_device(dev); | ||
| 2013 | set_dma_ops(dev, NULL); | ||
| 2014 | } | ||
| 1992 | EXPORT_SYMBOL_GPL(arm_iommu_detach_device); | 2015 | EXPORT_SYMBOL_GPL(arm_iommu_detach_device); |
| 1993 | 2016 | ||
| 1994 | static struct dma_map_ops *arm_get_iommu_dma_map_ops(bool coherent) | 2017 | static struct dma_map_ops *arm_get_iommu_dma_map_ops(bool coherent) |
| @@ -2011,7 +2034,7 @@ static bool arm_setup_iommu_dma_ops(struct device *dev, u64 dma_base, u64 size, | |||
| 2011 | return false; | 2034 | return false; |
| 2012 | } | 2035 | } |
| 2013 | 2036 | ||
| 2014 | if (arm_iommu_attach_device(dev, mapping)) { | 2037 | if (__arm_iommu_attach_device(dev, mapping)) { |
| 2015 | pr_warn("Failed to attached device %s to IOMMU_mapping\n", | 2038 | pr_warn("Failed to attached device %s to IOMMU_mapping\n", |
| 2016 | dev_name(dev)); | 2039 | dev_name(dev)); |
| 2017 | arm_iommu_release_mapping(mapping); | 2040 | arm_iommu_release_mapping(mapping); |
| @@ -2025,7 +2048,7 @@ static void arm_teardown_iommu_dma_ops(struct device *dev) | |||
| 2025 | { | 2048 | { |
| 2026 | struct dma_iommu_mapping *mapping = dev->archdata.mapping; | 2049 | struct dma_iommu_mapping *mapping = dev->archdata.mapping; |
| 2027 | 2050 | ||
| 2028 | arm_iommu_detach_device(dev); | 2051 | __arm_iommu_detach_device(dev); |
| 2029 | arm_iommu_release_mapping(mapping); | 2052 | arm_iommu_release_mapping(mapping); |
| 2030 | } | 2053 | } |
| 2031 | 2054 | ||
