diff options
author | Arnd Bergmann <arnd@arndb.de> | 2014-12-05 11:45:38 -0500 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2014-12-05 11:45:38 -0500 |
commit | fd522d279235b8bcafc39c1040895fe2d938d1e7 (patch) | |
tree | e6f54fe900945b7c1939757a59aeabc510605a27 /include/linux | |
parent | 5d01410fe4d92081f349b013a2e7a95429e4f2c9 (diff) | |
parent | a42a7a1fb5f1f9004b023594609dc22da02fc08b (diff) |
Merge tag 'of-iommu-configure' of git://git.kernel.org/pub/scm/linux/kernel/git/will/linux into next/iommu-config
Pull "Automatic DMA configuration for OF-based IOMMU masters" from Will Deacon:
This series adds automatic IOMMU and DMA-mapping configuration for
OF-based DMA masters described using the generic IOMMU devicetree
bindings. Although there is plenty of future work around splitting up
iommu_ops, adding default IOMMU domains and sorting out automatic IOMMU
group creation for the platform_bus, this is already useful enough for
people to port over their IOMMU drivers and start using the new probing
infrastructure (indeed, Marek has patches queued for the Exynos IOMMU).
* tag 'of-iommu-configure' of git://git.kernel.org/pub/scm/linux/kernel/git/will/linux:
iommu: store DT-probed IOMMU data privately
arm: dma-mapping: plumb our iommu mapping ops into arch_setup_dma_ops
arm: call iommu_init before of_platform_populate
dma-mapping: detect and configure IOMMU in of_dma_configure
iommu: fix initialization without 'add_device' callback
iommu: provide helper function to configure an IOMMU for an of master
iommu: add new iommu_ops callback for adding an OF device
dma-mapping: replace set_arch_dma_coherent_ops with arch_setup_dma_ops
iommu: provide early initialisation hook for IOMMU drivers
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/dma-mapping.h | 13 | ||||
-rw-r--r-- | include/linux/iommu.h | 8 | ||||
-rw-r--r-- | include/linux/of_iommu.h | 23 |
3 files changed, 39 insertions, 5 deletions
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index d5d388160f42..c3007cb4bfa6 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h | |||
@@ -129,11 +129,14 @@ static inline int dma_coerce_mask_and_coherent(struct device *dev, u64 mask) | |||
129 | 129 | ||
130 | extern u64 dma_get_required_mask(struct device *dev); | 130 | extern u64 dma_get_required_mask(struct device *dev); |
131 | 131 | ||
132 | #ifndef set_arch_dma_coherent_ops | 132 | #ifndef arch_setup_dma_ops |
133 | static inline int set_arch_dma_coherent_ops(struct device *dev) | 133 | static inline void arch_setup_dma_ops(struct device *dev, u64 dma_base, |
134 | { | 134 | u64 size, struct iommu_ops *iommu, |
135 | return 0; | 135 | bool coherent) { } |
136 | } | 136 | #endif |
137 | |||
138 | #ifndef arch_teardown_dma_ops | ||
139 | static inline void arch_teardown_dma_ops(struct device *dev) { } | ||
137 | #endif | 140 | #endif |
138 | 141 | ||
139 | static inline unsigned int dma_get_max_seg_size(struct device *dev) | 142 | static inline unsigned int dma_get_max_seg_size(struct device *dev) |
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index e6a7c9ff72f2..415c7613d02c 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h | |||
@@ -21,6 +21,7 @@ | |||
21 | 21 | ||
22 | #include <linux/errno.h> | 22 | #include <linux/errno.h> |
23 | #include <linux/err.h> | 23 | #include <linux/err.h> |
24 | #include <linux/of.h> | ||
24 | #include <linux/types.h> | 25 | #include <linux/types.h> |
25 | #include <trace/events/iommu.h> | 26 | #include <trace/events/iommu.h> |
26 | 27 | ||
@@ -102,7 +103,9 @@ enum iommu_attr { | |||
102 | * @remove_device: remove device from iommu grouping | 103 | * @remove_device: remove device from iommu grouping |
103 | * @domain_get_attr: Query domain attributes | 104 | * @domain_get_attr: Query domain attributes |
104 | * @domain_set_attr: Change domain attributes | 105 | * @domain_set_attr: Change domain attributes |
106 | * @of_xlate: add OF master IDs to iommu grouping | ||
105 | * @pgsize_bitmap: bitmap of supported page sizes | 107 | * @pgsize_bitmap: bitmap of supported page sizes |
108 | * @priv: per-instance data private to the iommu driver | ||
106 | */ | 109 | */ |
107 | struct iommu_ops { | 110 | struct iommu_ops { |
108 | bool (*capable)(enum iommu_cap); | 111 | bool (*capable)(enum iommu_cap); |
@@ -132,7 +135,12 @@ struct iommu_ops { | |||
132 | /* Get the numer of window per domain */ | 135 | /* Get the numer of window per domain */ |
133 | u32 (*domain_get_windows)(struct iommu_domain *domain); | 136 | u32 (*domain_get_windows)(struct iommu_domain *domain); |
134 | 137 | ||
138 | #ifdef CONFIG_OF_IOMMU | ||
139 | int (*of_xlate)(struct device *dev, struct of_phandle_args *args); | ||
140 | #endif | ||
141 | |||
135 | unsigned long pgsize_bitmap; | 142 | unsigned long pgsize_bitmap; |
143 | void *priv; | ||
136 | }; | 144 | }; |
137 | 145 | ||
138 | #define IOMMU_GROUP_NOTIFY_ADD_DEVICE 1 /* Device added */ | 146 | #define IOMMU_GROUP_NOTIFY_ADD_DEVICE 1 /* Device added */ |
diff --git a/include/linux/of_iommu.h b/include/linux/of_iommu.h index 51a560f34bca..16c75547d725 100644 --- a/include/linux/of_iommu.h +++ b/include/linux/of_iommu.h | |||
@@ -1,12 +1,19 @@ | |||
1 | #ifndef __OF_IOMMU_H | 1 | #ifndef __OF_IOMMU_H |
2 | #define __OF_IOMMU_H | 2 | #define __OF_IOMMU_H |
3 | 3 | ||
4 | #include <linux/device.h> | ||
5 | #include <linux/iommu.h> | ||
6 | #include <linux/of.h> | ||
7 | |||
4 | #ifdef CONFIG_OF_IOMMU | 8 | #ifdef CONFIG_OF_IOMMU |
5 | 9 | ||
6 | extern int of_get_dma_window(struct device_node *dn, const char *prefix, | 10 | extern int of_get_dma_window(struct device_node *dn, const char *prefix, |
7 | int index, unsigned long *busno, dma_addr_t *addr, | 11 | int index, unsigned long *busno, dma_addr_t *addr, |
8 | size_t *size); | 12 | size_t *size); |
9 | 13 | ||
14 | extern void of_iommu_init(void); | ||
15 | extern struct iommu_ops *of_iommu_configure(struct device *dev); | ||
16 | |||
10 | #else | 17 | #else |
11 | 18 | ||
12 | static inline int of_get_dma_window(struct device_node *dn, const char *prefix, | 19 | static inline int of_get_dma_window(struct device_node *dn, const char *prefix, |
@@ -16,6 +23,22 @@ static inline int of_get_dma_window(struct device_node *dn, const char *prefix, | |||
16 | return -EINVAL; | 23 | return -EINVAL; |
17 | } | 24 | } |
18 | 25 | ||
26 | static inline void of_iommu_init(void) { } | ||
27 | static inline struct iommu_ops *of_iommu_configure(struct device *dev) | ||
28 | { | ||
29 | return NULL; | ||
30 | } | ||
31 | |||
19 | #endif /* CONFIG_OF_IOMMU */ | 32 | #endif /* CONFIG_OF_IOMMU */ |
20 | 33 | ||
34 | void of_iommu_set_ops(struct device_node *np, struct iommu_ops *ops); | ||
35 | struct iommu_ops *of_iommu_get_ops(struct device_node *np); | ||
36 | |||
37 | extern struct of_device_id __iommu_of_table; | ||
38 | |||
39 | typedef int (*of_iommu_init_fn)(struct device_node *); | ||
40 | |||
41 | #define IOMMU_OF_DECLARE(name, compat, fn) \ | ||
42 | _OF_DECLARE(iommu, name, compat, fn, of_iommu_init_fn) | ||
43 | |||
21 | #endif /* __OF_IOMMU_H */ | 44 | #endif /* __OF_IOMMU_H */ |