OSDN Git Service

iommu: Add iommu_trigger_fault
authorMitchel Humpherys <mitchelh@codeaurora.org>
Thu, 9 Jul 2015 23:59:02 +0000 (16:59 -0700)
committerDavid Keitel <dkeitel@codeaurora.org>
Tue, 22 Mar 2016 18:13:32 +0000 (11:13 -0700)
It can be useful to trigger an IOMMU fault during development and
debugging.  Add support to the IOMMU framework to do so.

Change-Id: I908c9f5b52c6abe937f031de546d290027ba64b5
Signed-off-by: Mitchel Humpherys <mitchelh@codeaurora.org>
drivers/iommu/iommu.c
include/linux/iommu.h

index 9821a73..9959b48 100644 (file)
@@ -886,6 +886,21 @@ void iommu_set_fault_handler(struct iommu_domain *domain,
 }
 EXPORT_SYMBOL_GPL(iommu_set_fault_handler);
 
+/**
+ * iommu_trigger_fault() - trigger an IOMMU fault
+ * @domain: iommu domain
+ *
+ * Triggers a fault on the device to which this domain is attached.
+ *
+ * This function should only be used for debugging purposes, for obvious
+ * reasons.
+ */
+void iommu_trigger_fault(struct iommu_domain *domain)
+{
+       if (domain->ops->trigger_fault)
+               domain->ops->trigger_fault(domain);
+}
+
 struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
 {
        struct iommu_domain *domain;
index 2e5b071..520cc5b 100644 (file)
@@ -116,6 +116,7 @@ enum iommu_attr {
  * @domain_get_attr: Query domain attributes
  * @domain_set_attr: Change domain attributes
  * @pgsize_bitmap: bitmap of supported page sizes
+ * @trigger_fault: trigger a fault on the device attached to an iommu domain
  */
 struct iommu_ops {
        bool (*capable)(enum iommu_cap);
@@ -150,6 +151,7 @@ struct iommu_ops {
        u32 (*domain_get_windows)(struct iommu_domain *domain);
        int (*dma_supported)(struct iommu_domain *domain, struct device *dev,
                             u64 mask);
+       void (*trigger_fault)(struct iommu_domain *domain);
 
        unsigned long pgsize_bitmap;
 };
@@ -185,6 +187,7 @@ extern phys_addr_t iommu_iova_to_phys_hard(struct iommu_domain *domain,
                                           dma_addr_t iova);
 extern void iommu_set_fault_handler(struct iommu_domain *domain,
                        iommu_fault_handler_t handler, void *token);
+extern void iommu_trigger_fault(struct iommu_domain *domain);
 
 extern int iommu_attach_group(struct iommu_domain *domain,
                              struct iommu_group *group);
@@ -374,6 +377,10 @@ static inline void iommu_set_fault_handler(struct iommu_domain *domain,
 {
 }
 
+static inline void iommu_trigger_fault(struct iommu_domain *domain)
+{
+}
+
 static inline int iommu_attach_group(struct iommu_domain *domain,
                                     struct iommu_group *group)
 {