Skip to content

Commit

Permalink
iommu/omap: Migrate to the generic fault report mechanism
Browse files Browse the repository at this point in the history
Start using the generic fault report mechanism, as provided by
the IOMMU core, and remove its now-redundant omap_iommu_set_isr API.

Currently we're only interested in letting upper layers know about the
fault, so in case the faulting device is a remote processor, they could
restart it.

Dynamic PTE/TLB loading is not supported.

Signed-off-by: Ohad Ben-Cohen <ohad@wizery.com>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
  • Loading branch information
Ohad Ben-Cohen authored and Joerg Roedel committed Sep 14, 2011
1 parent 4f3f8d9 commit e7f10f0
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 30 deletions.
3 changes: 1 addition & 2 deletions arch/arm/plat-omap/include/plat/iommu.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ struct omap_iommu {
void __iomem *regbase;
struct device *dev;
void *isr_priv;
struct iommu_domain *domain;

unsigned int refcount;
spinlock_t iommu_lock; /* global for this whole object */
Expand All @@ -48,8 +49,6 @@ struct omap_iommu {
struct list_head mmap;
struct mutex mmap_lock; /* protect mmap */

int (*isr)(struct omap_iommu *obj, u32 da, u32 iommu_errs, void *priv);

void *ctx; /* iommu context: registres saved area */
u32 da_start;
u32 da_end;
Expand Down
31 changes: 3 additions & 28 deletions drivers/iommu/omap-iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -775,6 +775,7 @@ static irqreturn_t iommu_fault_handler(int irq, void *data)
u32 da, errs;
u32 *iopgd, *iopte;
struct omap_iommu *obj = data;
struct iommu_domain *domain = obj->domain;

if (!obj->refcount)
return IRQ_NONE;
Expand All @@ -786,7 +787,7 @@ static irqreturn_t iommu_fault_handler(int irq, void *data)
return IRQ_HANDLED;

/* Fault callback or TLB/PTE Dynamic loading */
if (obj->isr && !obj->isr(obj, da, errs, obj->isr_priv))
if (!report_iommu_fault(domain, obj->dev, da, 0))
return IRQ_HANDLED;

iommu_disable(obj);
Expand Down Expand Up @@ -904,33 +905,6 @@ static void omap_iommu_detach(struct omap_iommu *obj)
dev_dbg(obj->dev, "%s: %s\n", __func__, obj->name);
}

int omap_iommu_set_isr(const char *name,
int (*isr)(struct omap_iommu *obj, u32 da, u32 iommu_errs,
void *priv),
void *isr_priv)
{
struct device *dev;
struct omap_iommu *obj;

dev = driver_find_device(&omap_iommu_driver.driver, NULL, (void *)name,
device_match_by_alias);
if (!dev)
return -ENODEV;

obj = to_iommu(dev);
spin_lock(&obj->iommu_lock);
if (obj->refcount != 0) {
spin_unlock(&obj->iommu_lock);
return -EBUSY;
}
obj->isr = isr;
obj->isr_priv = isr_priv;
spin_unlock(&obj->iommu_lock);

return 0;
}
EXPORT_SYMBOL_GPL(omap_iommu_set_isr);

/*
* OMAP Device MMU(IOMMU) detection
*/
Expand Down Expand Up @@ -1115,6 +1089,7 @@ omap_iommu_attach_dev(struct iommu_domain *domain, struct device *dev)
}

omap_domain->iommu_dev = oiommu;
oiommu->domain = domain;

out:
spin_unlock(&omap_domain->lock);
Expand Down

0 comments on commit e7f10f0

Please sign in to comment.