Hi, On Mon, Feb 21, 2011 at 10:18:56AM +0200, Hiroshi DOYU wrote: > From: David Cohen <dacohen@xxxxxxxxx> > Subject: [PATCH v3 2/2] OMAP: IOMMU: add support to callback during fault handling > Date: Wed, 16 Feb 2011 21:35:51 +0200 > > > Add support to register an isr for IOMMU fault situations and adapt it > > to allow such (*isr)() to be used as fault callback. Drivers using IOMMU > > module might want to be informed when errors happen in order to debug it > > or react. > > > > Signed-off-by: David Cohen <dacohen@xxxxxxxxx> > > --- > > arch/arm/mach-omap2/iommu2.c | 17 +++++++++- > > arch/arm/plat-omap/include/plat/iommu.h | 14 ++++++++- > > arch/arm/plat-omap/iommu.c | 52 ++++++++++++++++++++++--------- > > 3 files changed, 65 insertions(+), 18 deletions(-) > > > > diff --git a/arch/arm/mach-omap2/iommu2.c b/arch/arm/mach-omap2/iommu2.c > > index 49a1e5e..adb083e 100644 > > --- a/arch/arm/mach-omap2/iommu2.c > > +++ b/arch/arm/mach-omap2/iommu2.c > > @@ -146,18 +146,31 @@ static void omap2_iommu_set_twl(struct iommu *obj, bool on) > > static u32 omap2_iommu_fault_isr(struct iommu *obj, u32 *ra) > > { > > u32 stat, da; > > + u32 errs = 0; > > > > stat = iommu_read_reg(obj, MMU_IRQSTATUS); > > stat &= MMU_IRQ_MASK; > > - if (!stat) > > + if (!stat) { > > + *ra = 0; > > return 0; > > + } > > > > da = iommu_read_reg(obj, MMU_FAULT_AD); > > *ra = da; > > > > + if (stat & MMU_IRQ_TLBMISS) > > + errs |= OMAP_IOMMU_ERR_TLB_MISS; > > + if (stat & MMU_IRQ_TRANSLATIONFAULT) > > + errs |= OMAP_IOMMU_ERR_TRANS_FAULT; > > + if (stat & MMU_IRQ_EMUMISS) > > + errs |= OMAP_IOMMU_ERR_EMU_MISS; > > + if (stat & MMU_IRQ_TABLEWALKFAULT) > > + errs |= OMAP_IOMMU_ERR_TBLWALK_FAULT; > > + if (stat & MMU_IRQ_MULTIHITFAULT) > > + errs |= OMAP_IOMMU_ERR_MULTIHIT_FAULT; > > iommu_write_reg(obj, stat, MMU_IRQSTATUS); > > > > - return stat; > > + return errs; > > } > > > > static void omap2_tlb_read_cr(struct iommu *obj, struct cr_regs *cr) > > diff --git a/arch/arm/plat-omap/include/plat/iommu.h b/arch/arm/plat-omap/include/plat/iommu.h > > index 19cbb5e..174f1b9 100644 > > --- a/arch/arm/plat-omap/include/plat/iommu.h > > +++ b/arch/arm/plat-omap/include/plat/iommu.h > > @@ -31,6 +31,7 @@ struct iommu { > > struct clk *clk; > > void __iomem *regbase; > > struct device *dev; > > + void *isr_priv; > > Ideally I'd like to avoid having "isr_priv" in iommu since it's not > used for iommu but client needs the place to pass its info to its > custom handler. Any better idea? I'm not sure if it makes sense as I don't know the mailbox block, but maybe moving to GENIRQ ? Then IRQ subsystem would take care of the "dev_id" -- balbi -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html