* iommu_set_fault_handler() - set a fault handler for an iommu domain
  * @domain: iommu domain
  * @handler: fault handler
+ * @token: user data, will be passed back to the fault handler
  *
  * This function should be used by IOMMU users which want to be notified
  * whenever an IOMMU fault happens.
  * error code otherwise.
  */
 void iommu_set_fault_handler(struct iommu_domain *domain,
-                                       iommu_fault_handler_t handler)
+                                       iommu_fault_handler_t handler,
+                                       void *token)
 {
        BUG_ON(!domain);
 
        domain->handler = handler;
+       domain->handler_token = token;
 }
 EXPORT_SYMBOL_GPL(iommu_set_fault_handler);
 
 
  * the recovery of the remote processor.
  */
 static int rproc_iommu_fault(struct iommu_domain *domain, struct device *dev,
-               unsigned long iova, int flags)
+               unsigned long iova, int flags, void *token)
 {
        dev_err(dev, "iommu fault: da 0x%lx flags 0x%x\n", iova, flags);
 
                return -ENOMEM;
        }
 
-       iommu_set_fault_handler(domain, rproc_iommu_fault);
+       iommu_set_fault_handler(domain, rproc_iommu_fault, rproc);
 
        ret = iommu_attach_device(domain, dev);
        if (ret) {
 
 #define IOMMU_FAULT_WRITE      0x1
 
 typedef int (*iommu_fault_handler_t)(struct iommu_domain *,
-                               struct device *, unsigned long, int);
+                       struct device *, unsigned long, int, void *);
 
 struct iommu_domain {
        struct iommu_ops *ops;
        void *priv;
        iommu_fault_handler_t handler;
+       void *handler_token;
 };
 
 #define IOMMU_CAP_CACHE_COHERENCY      0x1
 extern int iommu_domain_has_cap(struct iommu_domain *domain,
                                unsigned long cap);
 extern void iommu_set_fault_handler(struct iommu_domain *domain,
-                                       iommu_fault_handler_t handler);
+                       iommu_fault_handler_t handler, void *token);
 extern int iommu_device_group(struct device *dev, unsigned int *groupid);
 
 /**
         * invoke it.
         */
        if (domain->handler)
-               ret = domain->handler(domain, dev, iova, flags);
+               ret = domain->handler(domain, dev, iova, flags,
+                                               domain->handler_token);
 
        return ret;
 }
 }
 
 static inline void iommu_set_fault_handler(struct iommu_domain *domain,
-                                       iommu_fault_handler_t handler)
+                               iommu_fault_handler_t handler, void *token)
 {
 }