linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] IOMMU fault callback support
@ 2011-02-15 13:20 David Cohen
  2011-02-15 13:20 ` [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg() David Cohen
                   ` (2 more replies)
  0 siblings, 3 replies; 17+ messages in thread
From: David Cohen @ 2011-02-15 13:20 UTC (permalink / raw)
  To: linux-arm-kernel

Hi,

This patch set adds fault callback support to allow IOMMU users to debug or
react when a fault happens.
IOMMU faults might be very difficult to reproduce and then to figure out
the source of the problem. Currently IOMMU driver prints not so useful
debug message and does not notice user about such issue.
With a fault callback, IOMMU user may debug much more useful information
and/or react to go back to a valid state.

Br,

David
---

David Cohen (2):
  OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg()
  OMAP: IOMMU: add support to callback during fault handling

 arch/arm/mach-omap2/iommu2.c            |   27 ++++++++++++++++----
 arch/arm/plat-omap/include/plat/iommu.h |   15 ++++++++++-
 arch/arm/plat-omap/iommu.c              |   41 ++++++++++++++++++++++++++++---
 3 files changed, 72 insertions(+), 11 deletions(-)

-- 
1.7.2.3

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg()
  2011-02-15 13:20 [PATCH 0/2] IOMMU fault callback support David Cohen
@ 2011-02-15 13:20 ` David Cohen
  2011-02-15 13:38   ` Sergei Shtylyov
  2011-02-15 13:20 ` [PATCH 2/2] OMAP: IOMMU: add support to callback during fault handling David Cohen
  2011-02-15 13:32 ` [PATCH 0/2] IOMMU fault callback support David Cohen
  2 siblings, 1 reply; 17+ messages in thread
From: David Cohen @ 2011-02-15 13:20 UTC (permalink / raw)
  To: linux-arm-kernel

IOMMU upper layer is already printing error message. OMAP2+ specific
layer may print error message only for debug purpose.

Signed-off-by: David Cohen <dacohen@gmail.com>
---
 arch/arm/mach-omap2/iommu2.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/arch/arm/mach-omap2/iommu2.c b/arch/arm/mach-omap2/iommu2.c
index 14ee686..4244a07 100644
--- a/arch/arm/mach-omap2/iommu2.c
+++ b/arch/arm/mach-omap2/iommu2.c
@@ -163,13 +163,13 @@ static u32 omap2_iommu_fault_isr(struct iommu *obj, u32 *ra)
 	da = iommu_read_reg(obj, MMU_FAULT_AD);
 	*ra = da;
 
-	dev_err(obj->dev, "%s:\tda:%08x ", __func__, da);
+	dev_dbg(obj->dev, "%s:\tda:%08x ", __func__, da);
 
 	for (i = 0; i < ARRAY_SIZE(err_msg); i++) {
 		if (stat & (1 << i))
-			printk("%s ", err_msg[i]);
+			printk(KERN_DEBUG "%s ", err_msg[i]);
 	}
-	printk("\n");
+	printk(KERN_DEBUG "\n");
 
 	iommu_write_reg(obj, stat, MMU_IRQSTATUS);
 
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 2/2] OMAP: IOMMU: add support to callback during fault handling
  2011-02-15 13:20 [PATCH 0/2] IOMMU fault callback support David Cohen
  2011-02-15 13:20 ` [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg() David Cohen
@ 2011-02-15 13:20 ` David Cohen
  2011-02-15 13:32 ` [PATCH 0/2] IOMMU fault callback support David Cohen
  2 siblings, 0 replies; 17+ messages in thread
From: David Cohen @ 2011-02-15 13:20 UTC (permalink / raw)
  To: linux-arm-kernel

Add support to register a callback for IOMMU fault situations. Drivers using
IOMMU module might want to be informed when such errors happen in order to
debug it or react.

Signed-off-by: David Cohen <dacohen@gmail.com>
---
 arch/arm/mach-omap2/iommu2.c            |   21 +++++++++++++--
 arch/arm/plat-omap/include/plat/iommu.h |   15 ++++++++++-
 arch/arm/plat-omap/iommu.c              |   41 ++++++++++++++++++++++++++++---
 3 files changed, 69 insertions(+), 8 deletions(-)

diff --git a/arch/arm/mach-omap2/iommu2.c b/arch/arm/mach-omap2/iommu2.c
index 4244a07..559a066 100644
--- a/arch/arm/mach-omap2/iommu2.c
+++ b/arch/arm/mach-omap2/iommu2.c
@@ -143,10 +143,10 @@ static void omap2_iommu_set_twl(struct iommu *obj, bool on)
 	__iommu_set_twl(obj, false);
 }
 
-static u32 omap2_iommu_fault_isr(struct iommu *obj, u32 *ra)
+static u32 omap2_iommu_fault_isr(struct iommu *obj, u32 *ra, u32 *iommu_errs)
 {
 	int i;
-	u32 stat, da;
+	u32 stat, da, errs;
 	const char *err_msg[] =	{
 		"tlb miss",
 		"translation fault",
@@ -157,8 +157,10 @@ static u32 omap2_iommu_fault_isr(struct iommu *obj, u32 *ra)
 
 	stat = iommu_read_reg(obj, MMU_IRQSTATUS);
 	stat &= MMU_IRQ_MASK;
-	if (!stat)
+	if (!stat) {
+		*iommu_errs = 0;
 		return 0;
+	}
 
 	da = iommu_read_reg(obj, MMU_FAULT_AD);
 	*ra = da;
@@ -171,6 +173,19 @@ static u32 omap2_iommu_fault_isr(struct iommu *obj, u32 *ra)
 	}
 	printk(KERN_DEBUG "\n");
 
+	errs = 0;
+	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_errs = errs;
+
 	iommu_write_reg(obj, stat, MMU_IRQSTATUS);
 
 	return stat;
diff --git a/arch/arm/plat-omap/include/plat/iommu.h b/arch/arm/plat-omap/include/plat/iommu.h
index 19cbb5e..5a2475f 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		*fault_cb_priv;
 
 	unsigned int	refcount;
 	struct mutex	iommu_lock;	/* global for this whole object */
@@ -48,6 +49,7 @@ struct iommu {
 	struct mutex		mmap_lock; /* protect mmap */
 
 	int (*isr)(struct iommu *obj);
+	void (*fault_cb)(struct iommu *obj, u32 da, u32 iommu_errs, void *priv);
 
 	void *ctx; /* iommu context: registres saved area */
 	u32 da_start;
@@ -83,7 +85,7 @@ struct iommu_functions {
 	int (*enable)(struct iommu *obj);
 	void (*disable)(struct iommu *obj);
 	void (*set_twl)(struct iommu *obj, bool on);
-	u32 (*fault_isr)(struct iommu *obj, u32 *ra);
+	u32 (*fault_isr)(struct iommu *obj, u32 *ra, u32 *iommu_errs);
 
 	void (*tlb_read_cr)(struct iommu *obj, struct cr_regs *cr);
 	void (*tlb_load_cr)(struct iommu *obj, struct cr_regs *cr);
@@ -109,6 +111,13 @@ struct iommu_platform_data {
 	u32 da_end;
 };
 
+/* IOMMU errors */
+#define OMAP_IOMMU_ERR_TLB_MISS		(1 << 0)
+#define OMAP_IOMMU_ERR_TRANS_FAULT	(1 << 1)
+#define OMAP_IOMMU_ERR_EMU_MISS		(1 << 2)
+#define OMAP_IOMMU_ERR_TBLWALK_FAULT	(1 << 3)
+#define OMAP_IOMMU_ERR_MULTIHIT_FAULT	(1 << 4)
+
 #if defined(CONFIG_ARCH_OMAP1)
 #error "iommu for this processor not implemented yet"
 #else
@@ -161,6 +170,10 @@ extern size_t iopgtable_clear_entry(struct iommu *obj, u32 iova);
 extern int iommu_set_da_range(struct iommu *obj, u32 start, u32 end);
 extern struct iommu *iommu_get(const char *name);
 extern void iommu_put(struct iommu *obj);
+extern int iommu_set_fault_callback(const char *name,
+				    void (*fault_cb)(struct iommu *obj, u32 da,
+						     u32 errs, void *priv),
+				    void *fault_cb_priv);
 
 extern void iommu_save_ctx(struct iommu *obj);
 extern void iommu_restore_ctx(struct iommu *obj);
diff --git a/arch/arm/plat-omap/iommu.c b/arch/arm/plat-omap/iommu.c
index b1107c0..7f780ee 100644
--- a/arch/arm/plat-omap/iommu.c
+++ b/arch/arm/plat-omap/iommu.c
@@ -163,9 +163,9 @@ static u32 get_iopte_attr(struct iotlb_entry *e)
 	return arch_iommu->get_pte_attr(e);
 }
 
-static u32 iommu_report_fault(struct iommu *obj, u32 *da)
+static u32 iommu_report_fault(struct iommu *obj, u32 *da, u32 *iommu_errs)
 {
-	return arch_iommu->fault_isr(obj, da);
+	return arch_iommu->fault_isr(obj, da, iommu_errs);
 }
 
 static void iotlb_lock_get(struct iommu *obj, struct iotlb_lock *l)
@@ -780,7 +780,7 @@ static void iopgtable_clear_entry_all(struct iommu *obj)
  */
 static irqreturn_t iommu_fault_handler(int irq, void *data)
 {
-	u32 stat, da;
+	u32 stat, da, errs;
 	u32 *iopgd, *iopte;
 	int err = -EIO;
 	struct iommu *obj = data;
@@ -796,13 +796,19 @@ static irqreturn_t iommu_fault_handler(int irq, void *data)
 		return IRQ_HANDLED;
 
 	clk_enable(obj->clk);
-	stat = iommu_report_fault(obj, &da);
+	stat = iommu_report_fault(obj, &da, &errs);
 	clk_disable(obj->clk);
 	if (!stat)
 		return IRQ_HANDLED;
 
 	iommu_disable(obj);
 
+	if (obj->fault_cb) {
+		obj->fault_cb(obj, da, errs, obj->fault_cb_priv);
+		/* No need to print error message as callback is called */
+		return IRQ_NONE;
+	}
+
 	iopgd = iopgd_offset(obj, da);
 
 	if (!iopgd_is_table(*iopgd)) {
@@ -917,6 +923,33 @@ void iommu_put(struct iommu *obj)
 }
 EXPORT_SYMBOL_GPL(iommu_put);
 
+int iommu_set_fault_callback(const char *name,
+			     void (*fault_cb)(struct iommu *obj, u32 da,
+					      u32 iommu_errs, void *priv),
+			     void *fault_cb_priv)
+{
+	struct device *dev;
+	struct 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);
+	mutex_lock(&obj->iommu_lock);
+	if (obj->refcount != 0) {
+		mutex_unlock(&obj->iommu_lock);
+		return -EBUSY;
+	}
+	obj->fault_cb = fault_cb;
+	obj->fault_cb_priv = fault_cb_priv;
+	mutex_unlock(&obj->iommu_lock);
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(iommu_set_fault_callback);
+
 /*
  *	OMAP Device MMU(IOMMU) detection
  */
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 0/2] IOMMU fault callback support
  2011-02-15 13:20 [PATCH 0/2] IOMMU fault callback support David Cohen
  2011-02-15 13:20 ` [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg() David Cohen
  2011-02-15 13:20 ` [PATCH 2/2] OMAP: IOMMU: add support to callback during fault handling David Cohen
@ 2011-02-15 13:32 ` David Cohen
  2 siblings, 0 replies; 17+ messages in thread
From: David Cohen @ 2011-02-15 13:32 UTC (permalink / raw)
  To: linux-arm-kernel

A missing prefix in the cover letter's subject. It's: OMAP: IOMMU:

Br,

David

On Tue, Feb 15, 2011 at 3:20 PM, David Cohen <dacohen@gmail.com> wrote:
> Hi,
>
> This patch set adds fault callback support to allow IOMMU users to debug or
> react when a fault happens.
> IOMMU faults might be very difficult to reproduce and then to figure out
> the source of the problem. Currently IOMMU driver prints not so useful
> debug message and does not notice user about such issue.
> With a fault callback, IOMMU user may debug much more useful information
> and/or react to go back to a valid state.
>
> Br,
>
> David
> ---
>
> David Cohen (2):
> ?OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg()
> ?OMAP: IOMMU: add support to callback during fault handling
>
> ?arch/arm/mach-omap2/iommu2.c ? ? ? ? ? ?| ? 27 ++++++++++++++++----
> ?arch/arm/plat-omap/include/plat/iommu.h | ? 15 ++++++++++-
> ?arch/arm/plat-omap/iommu.c ? ? ? ? ? ? ?| ? 41 ++++++++++++++++++++++++++++---
> ?3 files changed, 72 insertions(+), 11 deletions(-)
>
> --
> 1.7.2.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at ?http://vger.kernel.org/majordomo-info.html
>

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg()
  2011-02-15 13:20 ` [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg() David Cohen
@ 2011-02-15 13:38   ` Sergei Shtylyov
  2011-02-15 13:44     ` David Cohen
  2011-02-15 14:29     ` Russell King - ARM Linux
  0 siblings, 2 replies; 17+ messages in thread
From: Sergei Shtylyov @ 2011-02-15 13:38 UTC (permalink / raw)
  To: linux-arm-kernel

Hello.

On 15-02-2011 16:20, David Cohen wrote:

> IOMMU upper layer is already printing error message. OMAP2+ specific
> layer may print error message only for debug purpose.

> Signed-off-by: David Cohen<dacohen@gmail.com>
> ---
>   arch/arm/mach-omap2/iommu2.c |    6 +++---
>   1 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/iommu2.c b/arch/arm/mach-omap2/iommu2.c
> index 14ee686..4244a07 100644
> --- a/arch/arm/mach-omap2/iommu2.c
> +++ b/arch/arm/mach-omap2/iommu2.c
> @@ -163,13 +163,13 @@ static u32 omap2_iommu_fault_isr(struct iommu *obj, u32 *ra)
>   	da = iommu_read_reg(obj, MMU_FAULT_AD);
>   	*ra = da;
>
> -	dev_err(obj->dev, "%s:\tda:%08x ", __func__, da);
> +	dev_dbg(obj->dev, "%s:\tda:%08x ", __func__, da);

    Note that dev_dbg() will only print something if either DEBUG or 
CONFIG_DYNAMIC_DEBUG are defined...

>
>   	for (i = 0; i<  ARRAY_SIZE(err_msg); i++) {
>   		if (stat & (1<<  i))
> -			printk("%s ", err_msg[i]);
> +			printk(KERN_DEBUG "%s ", err_msg[i]);

    ... unlike printk(KERN_DEBUG...). You probably want to use pr_debug() instead.

>   	}
> -	printk("\n");
> +	printk(KERN_DEBUG "\n");

    Here too... Although wait, it should be KERN_CONT instead! Debug levels 
are only attributed to the whole lines.

WBR, Sergei

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg()
  2011-02-15 13:38   ` Sergei Shtylyov
@ 2011-02-15 13:44     ` David Cohen
  2011-02-15 13:56       ` Sergei Shtylyov
  2011-02-15 13:59       ` Jarkko Nikula
  2011-02-15 14:29     ` Russell King - ARM Linux
  1 sibling, 2 replies; 17+ messages in thread
From: David Cohen @ 2011-02-15 13:44 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Feb 15, 2011 at 3:38 PM, Sergei Shtylyov <sshtylyov@mvista.com> wrote:
> Hello.

Hi,

>
> On 15-02-2011 16:20, David Cohen wrote:
>
>> IOMMU upper layer is already printing error message. OMAP2+ specific
>> layer may print error message only for debug purpose.
>
>> Signed-off-by: David Cohen<dacohen@gmail.com>
>> ---
>> ?arch/arm/mach-omap2/iommu2.c | ? ?6 +++---
>> ?1 files changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/arch/arm/mach-omap2/iommu2.c b/arch/arm/mach-omap2/iommu2.c
>> index 14ee686..4244a07 100644
>> --- a/arch/arm/mach-omap2/iommu2.c
>> +++ b/arch/arm/mach-omap2/iommu2.c
>> @@ -163,13 +163,13 @@ static u32 omap2_iommu_fault_isr(struct iommu *obj,
>> u32 *ra)
>> ? ? ? ?da = iommu_read_reg(obj, MMU_FAULT_AD);
>> ? ? ? ?*ra = da;
>>
>> - ? ? ? dev_err(obj->dev, "%s:\tda:%08x ", __func__, da);
>> + ? ? ? dev_dbg(obj->dev, "%s:\tda:%08x ", __func__, da);
>
> ? Note that dev_dbg() will only print something if either DEBUG or
> CONFIG_DYNAMIC_DEBUG are defined...

That's my plan.

>
>>
>> ? ? ? ?for (i = 0; i< ?ARRAY_SIZE(err_msg); i++) {
>> ? ? ? ? ? ? ? ?if (stat & (1<< ?i))
>> - ? ? ? ? ? ? ? ? ? ? ? printk("%s ", err_msg[i]);
>> + ? ? ? ? ? ? ? ? ? ? ? printk(KERN_DEBUG "%s ", err_msg[i]);
>
> ? ... unlike printk(KERN_DEBUG...). You probably want to use pr_debug()
> instead.
>
>> ? ? ? ?}
>> - ? ? ? printk("\n");
>> + ? ? ? printk(KERN_DEBUG "\n");
>
> ? Here too... Although wait, it should be KERN_CONT instead! Debug levels
> are only attributed to the whole lines.

But your observation is correct. I'll resend it with KERN_CONT instead.

Regards,

David

>
> WBR, Sergei
>

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg()
  2011-02-15 13:44     ` David Cohen
@ 2011-02-15 13:56       ` Sergei Shtylyov
  2011-02-15 14:01         ` David Cohen
  2011-02-15 13:59       ` Jarkko Nikula
  1 sibling, 1 reply; 17+ messages in thread
From: Sergei Shtylyov @ 2011-02-15 13:56 UTC (permalink / raw)
  To: linux-arm-kernel

On 15-02-2011 16:44, David Cohen wrote:

>>> IOMMU upper layer is already printing error message. OMAP2+ specific
>>> layer may print error message only for debug purpose.

>>> Signed-off-by: David Cohen<dacohen@gmail.com>
>>> ---
>>>   arch/arm/mach-omap2/iommu2.c |    6 +++---
>>>   1 files changed, 3 insertions(+), 3 deletions(-)

>>> diff --git a/arch/arm/mach-omap2/iommu2.c b/arch/arm/mach-omap2/iommu2.c
>>> index 14ee686..4244a07 100644
>>> --- a/arch/arm/mach-omap2/iommu2.c
>>> +++ b/arch/arm/mach-omap2/iommu2.c
>>> @@ -163,13 +163,13 @@ static u32 omap2_iommu_fault_isr(struct iommu *obj,
>>> u32 *ra)
>>>         da = iommu_read_reg(obj, MMU_FAULT_AD);
>>>         *ra = da;
>>>
>>> -       dev_err(obj->dev, "%s:\tda:%08x ", __func__, da);
>>> +       dev_dbg(obj->dev, "%s:\tda:%08x ", __func__, da);

>>    Note that dev_dbg() will only print something if either DEBUG or
>> CONFIG_DYNAMIC_DEBUG are defined...

> That's my plan.

>>>         for (i = 0; i < ARRAY_SIZE(err_msg); i++) {
>>>                 if (stat&  (1<<    i))
>>> -                       printk("%s ", err_msg[i]);
>>> +                       printk(KERN_DEBUG "%s ", err_msg[i]);

>>    ... unlike printk(KERN_DEBUG...). You probably want to use pr_debug()
>> instead.

>>>         }
>>> -       printk("\n");
>>> +       printk(KERN_DEBUG "\n");

>>    Here too... Although wait, it should be KERN_CONT instead! Debug levels
>> are only attributed to the whole lines.

> But your observation is correct. I'll resend it with KERN_CONT instead.

    This won't play out correctly anyway. If DEBUG is not #define'd, the 
beginning of line won't be printed but the continuations will. You just can't 
do it correctly with dev_dbg(), unless you break the single line into several 
ones.

> Regards,

> David

WBR, Sergei

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg()
  2011-02-15 13:44     ` David Cohen
  2011-02-15 13:56       ` Sergei Shtylyov
@ 2011-02-15 13:59       ` Jarkko Nikula
  2011-02-15 14:08         ` David Cohen
  1 sibling, 1 reply; 17+ messages in thread
From: Jarkko Nikula @ 2011-02-15 13:59 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, 15 Feb 2011 15:44:27 +0200
David Cohen <dacohen@gmail.com> wrote:

> >> @@ -163,13 +163,13 @@ static u32 omap2_iommu_fault_isr(struct iommu *obj,
> >> u32 *ra)
> >> ? ? ? ?da = iommu_read_reg(obj, MMU_FAULT_AD);
> >> ? ? ? ?*ra = da;
> >>
> >> - ? ? ? dev_err(obj->dev, "%s:\tda:%08x ", __func__, da);
> >> + ? ? ? dev_dbg(obj->dev, "%s:\tda:%08x ", __func__, da);
> >
> > ? Note that dev_dbg() will only print something if either DEBUG or
> > CONFIG_DYNAMIC_DEBUG are defined...
> 
> That's my plan.
> 
So it's sure that a developer won't need these error dumps when
receiving an error report? I.e. IOMMU upper level errors give enough
information to start doing own debugging?

Just my 2 cents.

-- 
Jarkko

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg()
  2011-02-15 13:56       ` Sergei Shtylyov
@ 2011-02-15 14:01         ` David Cohen
  0 siblings, 0 replies; 17+ messages in thread
From: David Cohen @ 2011-02-15 14:01 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Feb 15, 2011 at 3:56 PM, Sergei Shtylyov <sshtylyov@mvista.com> wrote:
> On 15-02-2011 16:44, David Cohen wrote:
>
>>>> IOMMU upper layer is already printing error message. OMAP2+ specific
>>>> layer may print error message only for debug purpose.
>
>>>> Signed-off-by: David Cohen<dacohen@gmail.com>
>>>> ---
>>>> ?arch/arm/mach-omap2/iommu2.c | ? ?6 +++---
>>>> ?1 files changed, 3 insertions(+), 3 deletions(-)
>
>>>> diff --git a/arch/arm/mach-omap2/iommu2.c b/arch/arm/mach-omap2/iommu2.c
>>>> index 14ee686..4244a07 100644
>>>> --- a/arch/arm/mach-omap2/iommu2.c
>>>> +++ b/arch/arm/mach-omap2/iommu2.c
>>>> @@ -163,13 +163,13 @@ static u32 omap2_iommu_fault_isr(struct iommu
>>>> *obj,
>>>> u32 *ra)
>>>> ? ? ? ?da = iommu_read_reg(obj, MMU_FAULT_AD);
>>>> ? ? ? ?*ra = da;
>>>>
>>>> - ? ? ? dev_err(obj->dev, "%s:\tda:%08x ", __func__, da);
>>>> + ? ? ? dev_dbg(obj->dev, "%s:\tda:%08x ", __func__, da);
>
>>> ? Note that dev_dbg() will only print something if either DEBUG or
>>> CONFIG_DYNAMIC_DEBUG are defined...
>
>> That's my plan.
>
>>>> ? ? ? ?for (i = 0; i < ARRAY_SIZE(err_msg); i++) {
>>>> ? ? ? ? ? ? ? ?if (stat& ?(1<< ? ?i))
>>>> - ? ? ? ? ? ? ? ? ? ? ? printk("%s ", err_msg[i]);
>>>> + ? ? ? ? ? ? ? ? ? ? ? printk(KERN_DEBUG "%s ", err_msg[i]);
>
>>> ? ... unlike printk(KERN_DEBUG...). You probably want to use pr_debug()
>>> instead.
>
>>>> ? ? ? ?}
>>>> - ? ? ? printk("\n");
>>>> + ? ? ? printk(KERN_DEBUG "\n");
>
>>> ? Here too... Although wait, it should be KERN_CONT instead! Debug levels
>>> are only attributed to the whole lines.
>
>> But your observation is correct. I'll resend it with KERN_CONT instead.
>
> ? This won't play out correctly anyway. If DEBUG is not #define'd, the
> beginning of line won't be printed but the continuations will. You just
> can't do it correctly with dev_dbg(), unless you break the single line into
> several ones.

Yes, I got this situation. I'm coming with a proper solution on next version.

Br,

David

>
>> Regards,
>
>> David
>
> WBR, Sergei
>

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg()
  2011-02-15 13:59       ` Jarkko Nikula
@ 2011-02-15 14:08         ` David Cohen
  2011-02-15 14:21           ` David Cohen
  2011-02-15 14:30           ` Jarkko Nikula
  0 siblings, 2 replies; 17+ messages in thread
From: David Cohen @ 2011-02-15 14:08 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Feb 15, 2011 at 3:59 PM, Jarkko Nikula <jhnikula@gmail.com> wrote:
> On Tue, 15 Feb 2011 15:44:27 +0200
> David Cohen <dacohen@gmail.com> wrote:
>
>> >> @@ -163,13 +163,13 @@ static u32 omap2_iommu_fault_isr(struct iommu *obj,
>> >> u32 *ra)
>> >> ? ? ? ?da = iommu_read_reg(obj, MMU_FAULT_AD);
>> >> ? ? ? ?*ra = da;
>> >>
>> >> - ? ? ? dev_err(obj->dev, "%s:\tda:%08x ", __func__, da);
>> >> + ? ? ? dev_dbg(obj->dev, "%s:\tda:%08x ", __func__, da);
>> >
>> > ? Note that dev_dbg() will only print something if either DEBUG or
>> > CONFIG_DYNAMIC_DEBUG are defined...
>>
>> That's my plan.
>>
> So it's sure that a developer won't need these error dumps when
> receiving an error report? I.e. IOMMU upper level errors give enough
> information to start doing own debugging?

Yes, developers do need this information.
But it's a bit useless tell only we've got an iommu fault, due to many
places might be causing it. My purpose is to let the debug
responsibility to IOMMU users. They have access to the iovmm layer as
well and can provide a much more useful information.
e.g. OMAP3 ISP has many submodules using IOMMU. With a fault callback,
it can dump all the iovm areas and the faulty 'da' too. It might
indicate which submodule was responsible for the issue.

Of course we can just let this debug messages the way they are and
print this redundant information. But IMO it's not necessary.

Regards,

David

>
> Just my 2 cents.
>
> --
> Jarkko
>

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg()
  2011-02-15 14:08         ` David Cohen
@ 2011-02-15 14:21           ` David Cohen
  2011-02-15 14:30           ` Jarkko Nikula
  1 sibling, 0 replies; 17+ messages in thread
From: David Cohen @ 2011-02-15 14:21 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Feb 15, 2011 at 4:08 PM, David Cohen <dacohen@gmail.com> wrote:
> On Tue, Feb 15, 2011 at 3:59 PM, Jarkko Nikula <jhnikula@gmail.com> wrote:
>> On Tue, 15 Feb 2011 15:44:27 +0200
>> David Cohen <dacohen@gmail.com> wrote:
>>
>>> >> @@ -163,13 +163,13 @@ static u32 omap2_iommu_fault_isr(struct iommu *obj,
>>> >> u32 *ra)
>>> >> ? ? ? ?da = iommu_read_reg(obj, MMU_FAULT_AD);
>>> >> ? ? ? ?*ra = da;
>>> >>
>>> >> - ? ? ? dev_err(obj->dev, "%s:\tda:%08x ", __func__, da);
>>> >> + ? ? ? dev_dbg(obj->dev, "%s:\tda:%08x ", __func__, da);
>>> >
>>> > ? Note that dev_dbg() will only print something if either DEBUG or
>>> > CONFIG_DYNAMIC_DEBUG are defined...
>>>
>>> That's my plan.
>>>
>> So it's sure that a developer won't need these error dumps when
>> receiving an error report? I.e. IOMMU upper level errors give enough
>> information to start doing own debugging?
>
> Yes, developers do need this information.
> But it's a bit useless tell only we've got an iommu fault, due to many
> places might be causing it. My purpose is to let the debug
> responsibility to IOMMU users. They have access to the iovmm layer as
> well and can provide a much more useful information.
> e.g. OMAP3 ISP has many submodules using IOMMU. With a fault callback,
> it can dump all the iovm areas and the faulty 'da' too. It might
> indicate which submodule was responsible for the issue.
>
> Of course we can just let this debug messages the way they are and
> print this redundant information. But IMO it's not necessary.

Indeed, we can leave this discussion for future. My main purpose now
is the fault callback. I'll drop this patch 1/2 for now.

Regards,

David

>
> Regards,
>
> David
>
>>
>> Just my 2 cents.
>>
>> --
>> Jarkko
>>
>

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg()
  2011-02-15 13:38   ` Sergei Shtylyov
  2011-02-15 13:44     ` David Cohen
@ 2011-02-15 14:29     ` Russell King - ARM Linux
  2011-02-15 14:36       ` David Cohen
  1 sibling, 1 reply; 17+ messages in thread
From: Russell King - ARM Linux @ 2011-02-15 14:29 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Feb 15, 2011 at 04:38:32PM +0300, Sergei Shtylyov wrote:
>> diff --git a/arch/arm/mach-omap2/iommu2.c b/arch/arm/mach-omap2/iommu2.c
>> index 14ee686..4244a07 100644
>> --- a/arch/arm/mach-omap2/iommu2.c
>> +++ b/arch/arm/mach-omap2/iommu2.c
>> @@ -163,13 +163,13 @@ static u32 omap2_iommu_fault_isr(struct iommu *obj, u32 *ra)
>>   	da = iommu_read_reg(obj, MMU_FAULT_AD);
>>   	*ra = da;
>>
>> -	dev_err(obj->dev, "%s:\tda:%08x ", __func__, da);
>> +	dev_dbg(obj->dev, "%s:\tda:%08x ", __func__, da);
>
>    Note that dev_dbg() will only print something if either DEBUG or  
> CONFIG_DYNAMIC_DEBUG are defined...
>
>>
>>   	for (i = 0; i<  ARRAY_SIZE(err_msg); i++) {
>>   		if (stat & (1<<  i))
>> -			printk("%s ", err_msg[i]);
>> +			printk(KERN_DEBUG "%s ", err_msg[i]);
>
>    ... unlike printk(KERN_DEBUG...). You probably want to use pr_debug() instead.

No - this isn't starting a new line.  pr_cont() here.

>>   	}
>> -	printk("\n");
>> +	printk(KERN_DEBUG "\n");
>
>    Here too... Although wait, it should be KERN_CONT instead! Debug 
> levels are only attributed to the whole lines.

And pr_cont() here too.  If you care about using KERN_CONT which is
just a static marker to allow automated printk level checking easier.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg()
  2011-02-15 14:08         ` David Cohen
  2011-02-15 14:21           ` David Cohen
@ 2011-02-15 14:30           ` Jarkko Nikula
  1 sibling, 0 replies; 17+ messages in thread
From: Jarkko Nikula @ 2011-02-15 14:30 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, 15 Feb 2011 16:08:32 +0200
David Cohen <dacohen@gmail.com> wrote:

> > So it's sure that a developer won't need these error dumps when
> > receiving an error report? I.e. IOMMU upper level errors give enough
> > information to start doing own debugging?
> 
> Yes, developers do need this information.
> But it's a bit useless tell only we've got an iommu fault, due to many
> places might be causing it. My purpose is to let the debug
> responsibility to IOMMU users. They have access to the iovmm layer as
> well and can provide a much more useful information.
> e.g. OMAP3 ISP has many submodules using IOMMU. With a fault callback,
> it can dump all the iovm areas and the faulty 'da' too. It might
> indicate which submodule was responsible for the issue.
> 
> Of course we can just let this debug messages the way they are and
> print this redundant information. But IMO it's not necessary.
> 
Sounds fair enough and if I understood correctly this is not something
what end user will hit but more like another developer. In that case
the debug messages are the right thing.

-- 
Jarkko

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg()
  2011-02-15 14:29     ` Russell King - ARM Linux
@ 2011-02-15 14:36       ` David Cohen
  2011-02-15 14:44         ` Russell King - ARM Linux
  0 siblings, 1 reply; 17+ messages in thread
From: David Cohen @ 2011-02-15 14:36 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Feb 15, 2011 at 4:29 PM, Russell King - ARM Linux
<linux@arm.linux.org.uk> wrote:
> On Tue, Feb 15, 2011 at 04:38:32PM +0300, Sergei Shtylyov wrote:
>>> diff --git a/arch/arm/mach-omap2/iommu2.c b/arch/arm/mach-omap2/iommu2.c
>>> index 14ee686..4244a07 100644
>>> --- a/arch/arm/mach-omap2/iommu2.c
>>> +++ b/arch/arm/mach-omap2/iommu2.c
>>> @@ -163,13 +163,13 @@ static u32 omap2_iommu_fault_isr(struct iommu *obj, u32 *ra)
>>> ? ? ?da = iommu_read_reg(obj, MMU_FAULT_AD);
>>> ? ? ?*ra = da;
>>>
>>> - ? ?dev_err(obj->dev, "%s:\tda:%08x ", __func__, da);
>>> + ? ?dev_dbg(obj->dev, "%s:\tda:%08x ", __func__, da);
>>
>> ? ?Note that dev_dbg() will only print something if either DEBUG or
>> CONFIG_DYNAMIC_DEBUG are defined...
>>
>>>
>>> ? ? ?for (i = 0; i< ?ARRAY_SIZE(err_msg); i++) {
>>> ? ? ? ? ? ? ?if (stat & (1<< ?i))
>>> - ? ? ? ? ? ? ? ? ? ?printk("%s ", err_msg[i]);
>>> + ? ? ? ? ? ? ? ? ? ?printk(KERN_DEBUG "%s ", err_msg[i]);
>>
>> ? ?... unlike printk(KERN_DEBUG...). You probably want to use pr_debug() instead.
>
> No - this isn't starting a new line. ?pr_cont() here.

But pr_cont() would be wrong in case of DEBUG isn't set, isn't it?

>
>>> ? ? ?}
>>> - ? ?printk("\n");
>>> + ? ?printk(KERN_DEBUG "\n");
>>
>> ? ?Here too... Although wait, it should be KERN_CONT instead! Debug
>> levels are only attributed to the whole lines.
>
> And pr_cont() here too. ?If you care about using KERN_CONT which is
> just a static marker to allow automated printk level checking easier.

The same situation here.

But this patch was dropped in the next version.

Br,

David

>

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg()
  2011-02-15 14:36       ` David Cohen
@ 2011-02-15 14:44         ` Russell King - ARM Linux
  2011-02-15 14:50           ` David Cohen
  0 siblings, 1 reply; 17+ messages in thread
From: Russell King - ARM Linux @ 2011-02-15 14:44 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Feb 15, 2011 at 04:36:26PM +0200, David Cohen wrote:
> But pr_cont() would be wrong in case of DEBUG isn't set, isn't it?

Yes.  One other solution you could do is:

	char buf[80], *p = buf;

	buf[0] = '\0';
	for (i = 0; i < ARRAY_SIZE(err_msg); i++)
		if (stat & (1 << i))
			p += scnprintf(p, sizeof(buf) - (p - buf),
					" %s", err_msg[i]);

	dev_dbg(obj->dev, "%s: da:%08x%s\n", __func__, da, buf);

which means that you're then printing the entire string in one go -
and there's no chance for another message to come in the middle of it.

Note that I've placed the ' ' at the beginning of the format string so
that we don't end up with useless trailing space in messages.  Minor
point but it's easy to do here.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg()
  2011-02-15 14:44         ` Russell King - ARM Linux
@ 2011-02-15 14:50           ` David Cohen
  2011-02-15 15:51             ` Russell King - ARM Linux
  0 siblings, 1 reply; 17+ messages in thread
From: David Cohen @ 2011-02-15 14:50 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Feb 15, 2011 at 4:44 PM, Russell King - ARM Linux
<linux@arm.linux.org.uk> wrote:
> On Tue, Feb 15, 2011 at 04:36:26PM +0200, David Cohen wrote:
>> But pr_cont() would be wrong in case of DEBUG isn't set, isn't it?
>
> Yes. ?One other solution you could do is:
>
> ? ? ? ?char buf[80], *p = buf;
>
> ? ? ? ?buf[0] = '\0';
> ? ? ? ?for (i = 0; i < ARRAY_SIZE(err_msg); i++)
> ? ? ? ? ? ? ? ?if (stat & (1 << i))
> ? ? ? ? ? ? ? ? ? ? ? ?p += scnprintf(p, sizeof(buf) - (p - buf),
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?" %s", err_msg[i]);
>
> ? ? ? ?dev_dbg(obj->dev, "%s: da:%08x%s\n", __func__, da, buf);
>
> which means that you're then printing the entire string in one go -
> and there's no chance for another message to come in the middle of it.
>
> Note that I've placed the ' ' at the beginning of the format string so
> that we don't end up with useless trailing space in messages. ?Minor
> point but it's easy to do here.

That could be my choice.
I'm not planing to resend this patch, but how good/bad it sounds to
you to have dev_dbg_cont() for such situation?

Br,

David

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg()
  2011-02-15 14:50           ` David Cohen
@ 2011-02-15 15:51             ` Russell King - ARM Linux
  0 siblings, 0 replies; 17+ messages in thread
From: Russell King - ARM Linux @ 2011-02-15 15:51 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Feb 15, 2011 at 04:50:29PM +0200, David Cohen wrote:
> That could be my choice.
> I'm not planing to resend this patch, but how good/bad it sounds to
> you to have dev_dbg_cont() for such situation?

That doesn't help when the message gets corrupted by another thread,
so I'd much prefer the "format line then print" approach rather than
the blah_CONT stuff.

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2011-02-15 15:51 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-02-15 13:20 [PATCH 0/2] IOMMU fault callback support David Cohen
2011-02-15 13:20 ` [PATCH 1/2] OMAP2+: IOMMU: change OMAP2+ error message to dev_dbg() David Cohen
2011-02-15 13:38   ` Sergei Shtylyov
2011-02-15 13:44     ` David Cohen
2011-02-15 13:56       ` Sergei Shtylyov
2011-02-15 14:01         ` David Cohen
2011-02-15 13:59       ` Jarkko Nikula
2011-02-15 14:08         ` David Cohen
2011-02-15 14:21           ` David Cohen
2011-02-15 14:30           ` Jarkko Nikula
2011-02-15 14:29     ` Russell King - ARM Linux
2011-02-15 14:36       ` David Cohen
2011-02-15 14:44         ` Russell King - ARM Linux
2011-02-15 14:50           ` David Cohen
2011-02-15 15:51             ` Russell King - ARM Linux
2011-02-15 13:20 ` [PATCH 2/2] OMAP: IOMMU: add support to callback during fault handling David Cohen
2011-02-15 13:32 ` [PATCH 0/2] IOMMU fault callback support David Cohen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).