Thread (31 messages) flat view 31 messages, 7 authors, 2011-02-24
STALE5640d

[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 +0200
quoted
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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help