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 | ||
