diff options
-rw-r--r-- | drivers/iommu/iommu.c | 5 | ||||
-rw-r--r-- | drivers/remoteproc/remoteproc_core.c | 4 | ||||
-rw-r--r-- | include/linux/iommu.h | 10 |
3 files changed, 12 insertions, 7 deletions
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 2198b2dbbcd3..8b9ded88e6f5 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c | |||
@@ -119,6 +119,7 @@ EXPORT_SYMBOL_GPL(iommu_present); | |||
119 | * iommu_set_fault_handler() - set a fault handler for an iommu domain | 119 | * iommu_set_fault_handler() - set a fault handler for an iommu domain |
120 | * @domain: iommu domain | 120 | * @domain: iommu domain |
121 | * @handler: fault handler | 121 | * @handler: fault handler |
122 | * @token: user data, will be passed back to the fault handler | ||
122 | * | 123 | * |
123 | * This function should be used by IOMMU users which want to be notified | 124 | * This function should be used by IOMMU users which want to be notified |
124 | * whenever an IOMMU fault happens. | 125 | * whenever an IOMMU fault happens. |
@@ -127,11 +128,13 @@ EXPORT_SYMBOL_GPL(iommu_present); | |||
127 | * error code otherwise. | 128 | * error code otherwise. |
128 | */ | 129 | */ |
129 | void iommu_set_fault_handler(struct iommu_domain *domain, | 130 | void iommu_set_fault_handler(struct iommu_domain *domain, |
130 | iommu_fault_handler_t handler) | 131 | iommu_fault_handler_t handler, |
132 | void *token) | ||
131 | { | 133 | { |
132 | BUG_ON(!domain); | 134 | BUG_ON(!domain); |
133 | 135 | ||
134 | domain->handler = handler; | 136 | domain->handler = handler; |
137 | domain->handler_token = token; | ||
135 | } | 138 | } |
136 | EXPORT_SYMBOL_GPL(iommu_set_fault_handler); | 139 | EXPORT_SYMBOL_GPL(iommu_set_fault_handler); |
137 | 140 | ||
diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index e756a0df3664..289293a5cbb0 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c | |||
@@ -78,7 +78,7 @@ typedef int (*rproc_handle_resource_t)(struct rproc *rproc, void *, int avail); | |||
78 | * the recovery of the remote processor. | 78 | * the recovery of the remote processor. |
79 | */ | 79 | */ |
80 | static int rproc_iommu_fault(struct iommu_domain *domain, struct device *dev, | 80 | static int rproc_iommu_fault(struct iommu_domain *domain, struct device *dev, |
81 | unsigned long iova, int flags) | 81 | unsigned long iova, int flags, void *token) |
82 | { | 82 | { |
83 | dev_err(dev, "iommu fault: da 0x%lx flags 0x%x\n", iova, flags); | 83 | dev_err(dev, "iommu fault: da 0x%lx flags 0x%x\n", iova, flags); |
84 | 84 | ||
@@ -117,7 +117,7 @@ static int rproc_enable_iommu(struct rproc *rproc) | |||
117 | return -ENOMEM; | 117 | return -ENOMEM; |
118 | } | 118 | } |
119 | 119 | ||
120 | iommu_set_fault_handler(domain, rproc_iommu_fault); | 120 | iommu_set_fault_handler(domain, rproc_iommu_fault, rproc); |
121 | 121 | ||
122 | ret = iommu_attach_device(domain, dev); | 122 | ret = iommu_attach_device(domain, dev); |
123 | if (ret) { | 123 | if (ret) { |
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index d937580417ba..450293f6d68b 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h | |||
@@ -35,12 +35,13 @@ struct iommu_domain; | |||
35 | #define IOMMU_FAULT_WRITE 0x1 | 35 | #define IOMMU_FAULT_WRITE 0x1 |
36 | 36 | ||
37 | typedef int (*iommu_fault_handler_t)(struct iommu_domain *, | 37 | typedef int (*iommu_fault_handler_t)(struct iommu_domain *, |
38 | struct device *, unsigned long, int); | 38 | struct device *, unsigned long, int, void *); |
39 | 39 | ||
40 | struct iommu_domain { | 40 | struct iommu_domain { |
41 | struct iommu_ops *ops; | 41 | struct iommu_ops *ops; |
42 | void *priv; | 42 | void *priv; |
43 | iommu_fault_handler_t handler; | 43 | iommu_fault_handler_t handler; |
44 | void *handler_token; | ||
44 | }; | 45 | }; |
45 | 46 | ||
46 | #define IOMMU_CAP_CACHE_COHERENCY 0x1 | 47 | #define IOMMU_CAP_CACHE_COHERENCY 0x1 |
@@ -95,7 +96,7 @@ extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, | |||
95 | extern int iommu_domain_has_cap(struct iommu_domain *domain, | 96 | extern int iommu_domain_has_cap(struct iommu_domain *domain, |
96 | unsigned long cap); | 97 | unsigned long cap); |
97 | extern void iommu_set_fault_handler(struct iommu_domain *domain, | 98 | extern void iommu_set_fault_handler(struct iommu_domain *domain, |
98 | iommu_fault_handler_t handler); | 99 | iommu_fault_handler_t handler, void *token); |
99 | extern int iommu_device_group(struct device *dev, unsigned int *groupid); | 100 | extern int iommu_device_group(struct device *dev, unsigned int *groupid); |
100 | 101 | ||
101 | /** | 102 | /** |
@@ -132,7 +133,8 @@ static inline int report_iommu_fault(struct iommu_domain *domain, | |||
132 | * invoke it. | 133 | * invoke it. |
133 | */ | 134 | */ |
134 | if (domain->handler) | 135 | if (domain->handler) |
135 | ret = domain->handler(domain, dev, iova, flags); | 136 | ret = domain->handler(domain, dev, iova, flags, |
137 | domain->handler_token); | ||
136 | 138 | ||
137 | return ret; | 139 | return ret; |
138 | } | 140 | } |
@@ -191,7 +193,7 @@ static inline int domain_has_cap(struct iommu_domain *domain, | |||
191 | } | 193 | } |
192 | 194 | ||
193 | static inline void iommu_set_fault_handler(struct iommu_domain *domain, | 195 | static inline void iommu_set_fault_handler(struct iommu_domain *domain, |
194 | iommu_fault_handler_t handler) | 196 | iommu_fault_handler_t handler, void *token) |
195 | { | 197 | { |
196 | } | 198 | } |
197 | 199 | ||