[PATCH v3 2/2] OMAP: IOMMU: add support to callback during fault handling
From: David Cohen <hidden>
Date: 2011-02-21 08:57:45
Also in:
linux-omap
On Mon, Feb 21, 2011 at 10:22 AM, Felipe Balbi [off-list ref] wrote:
Hi, On Mon, Feb 21, 2011 at 10:18:56AM +0200, Hiroshi DOYU wrote:quoted
From: David Cohen <redacted> Subject: [PATCH v3 2/2] OMAP: IOMMU: add support to callback during fault handling Date: Wed, 16 Feb 2011 21:35:51 +0200quoted
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 <redacted> --- ?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"
Not sure if it fits in this case. It's a different module (IOMMU user) which needs to get a callback from IOMMU when a fault happens. Is there any GENIRQ usage currently in this scenario? Br, David
-- balbi