From: Julien Grall <julien.grall@linaro.org>
To: Ian Campbell <ian.campbell@citrix.com>
Cc: stefano.stabellini@eu.citrix.com, tim@xen.org,
Pranavkumar Sawargaonkar <psawargaonkar@apm.com>,
xen-devel@lists.xen.org
Subject: Re: [PATCH 1/2] xen: arm: log warning for interrupt configuration mismatch
Date: Mon, 02 Mar 2015 12:56:49 +0000 [thread overview]
Message-ID: <54F45E11.8070305@linaro.org> (raw)
In-Reply-To: <1425294756.1886.33.camel@citrix.com>
Hi Ian,
On 02/03/15 11:12, Ian Campbell wrote:
> On Sat, 2015-02-28 at 22:12 +0000, Julien Grall wrote:
>> Hi Ian,
>>
>> On 19/02/2015 15:24, Ian Campbell wrote:
>>> The ICFGR register is not necessarily writeable, in particular it is
>>> IMPLEMENTATION DEFINED for a PPI if the configuration register is
>>> writeable. Log a warning if the hardware has ignored our write and
>>> update the actual type in the irq descriptor so subsequent code can do
>>> the right thing.
>>>
>>> This most likely implies a buggy firmware description (e.g.
>>> device-tree).
>>>
>>> The issue is observed for example on the APM Mustang board where the
>>> device tree (as shipped by Linux) describes all 3 timer interrupts as
>>> rising edge but the PPI is hard-coded to level triggered (as makes
>>> sense for an arch timer interrupt).
>>
>> BTW the cavium device tree also use edge-triggered. I guess this is an
>> error in the device tree?
>>
>>>
>>> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
>>> Cc: Pranavkumar Sawargaonkar <psawargaonkar@apm.com>
>>> ---
>>> xen/arch/arm/gic-v2.c | 16 +++++++++++++++-
>>> xen/arch/arm/gic-v3.c | 16 +++++++++++++++-
>>> 2 files changed, 30 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c
>>> index 31fb81a..6836ab6 100644
>>> --- a/xen/arch/arm/gic-v2.c
>>> +++ b/xen/arch/arm/gic-v2.c
>>> @@ -211,7 +211,7 @@ static void gicv2_set_irq_properties(struct irq_desc *desc,
>>> const cpumask_t *cpu_mask,
>>> unsigned int priority)
>>> {
>>> - uint32_t cfg, edgebit;
>>> + uint32_t cfg, actual, edgebit;
>>> unsigned int mask = gicv2_cpu_mask(cpu_mask);
>>> unsigned int irq = desc->irq;
>>> unsigned int type = desc->arch.type;
>>> @@ -229,6 +229,20 @@ static void gicv2_set_irq_properties(struct irq_desc *desc,
>>> cfg |= edgebit;
>>> writel_gicd(cfg, GICD_ICFGR + (irq / 16) * 4);
>>>
>>> + actual = readl_gicd(GICD_ICFGR + (irq / 16) * 4);
>>> + if ( ( cfg & edgebit ) ^ ( actual & edgebit ) )
>>> + {
>>> + printk(XENLOG_WARNING "GICv2: WARNING: "
>>> + "CPU%d: Failed to configure IRQ%u as %s-triggered. "
>>> + "H/w forces to %s-triggered.\n",
>>> + smp_processor_id(), desc->irq,
>>> + cfg & edgebit ? "Edge" : "Level",
>>> + actual & edgebit ? "Edge" : "Level");
>>> + desc->arch.type = actual & edgebit ?
>>> + DT_IRQ_TYPE_EDGE_RISING :
>>> + DT_IRQ_TYPE_LEVEL_LOW;
>>
>> I got some error with the interrupts configuration on FreeBSD and after
>> reading the spec and the device tree bindings, level low is invalid for
>> SPIs.
>
> You mean the gic spec? I think the DT allows for both.
I haven't been able to find the paragraph in the spec speaking about it.
The device tree bindings clearly say the high-to-low edge triggered and
active low level-sensitive is invalid for SPIs (see
Documentation/devicetree/bindings/arm/gic.txt)
>
>> SPIs can only be low-to-high edge triggered and high-level sensitive.
>
> I even reread the spec before sending and reached the same conclusion,
> but apparently managed to fail to change the actual code!
>
> Question is -- what to do about PPIs, since the CFG register cannot
> express the polarity of the edge or level. I suppose we may as well just
> assume the one that is compatible with SPIs, since we have nothing
> better to go on.
Linux seems to set edge (resp. level) bit for any edge (resp. level)
type interrupts.
> Making that assumption results in the following patch. Do you still have
> the spec(s) open to the right page, in which case can you tell me the
> section numbers or do I need to go find them again?
It doesn't seem to be clearly written on the spec. Although, the GICv3
spec has 2 diagrams to explain SPIs handling: 4.3.3 and 4.3.4
>
> Ian.
>
> 8<-------
>
> From 852f6e3fe49f7fab801f2857b8b505922556d746 Mon Sep 17 00:00:00 2001
> From: Ian Campbell <ian.campbell@citrix.com>
> Date: Mon, 2 Mar 2015 11:09:35 +0000
> Subject: [PATCH] xen: arm: Assume level triggered means high, not low.
>
> When reading back the ICFG register we cannot know the polarity of the
> configuration, just that it is level or edge.
>
> Since falling edge and low level are invalid for SPIs we should assume
> rising edge and high level (we have no better information for PPIs, so
> it'll have to do).
>
> We already assumed rising edge, switch to high level as well.
>
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Given the usage of desc->arch.type in Xen, I think this is the right
solution:
Reviewed-by: Julien Grall <julien.grall@linaro.org>
Regards,
--
Julien Grall
next prev parent reply other threads:[~2015-03-02 12:56 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-19 15:39 [PATCH 0/2] xen: arm: warn for gic and arch timer misconfiguration Ian Campbell
2015-02-19 15:24 ` [PATCH 1/2] xen: arm: log warning for interrupt configuration mismatch Ian Campbell
2015-02-19 15:45 ` Julien Grall
2015-02-28 22:12 ` Julien Grall
2015-03-02 11:12 ` Ian Campbell
2015-03-02 12:56 ` Julien Grall [this message]
2015-03-02 13:42 ` Ian Campbell
2015-03-02 13:48 ` Julien Grall
2015-03-02 13:53 ` Ian Campbell
2015-03-02 14:02 ` Julien Grall
2015-03-02 14:41 ` Ian Campbell
2015-03-02 17:01 ` Ian Campbell
2015-03-03 12:20 ` Julien Grall
2015-02-19 15:24 ` [PATCH 2/2] xen: arm: Warn if timer interrupts are not level triggered Ian Campbell
2015-02-19 15:41 ` Julien Grall
2015-02-19 16:10 ` Ian Campbell
2015-02-19 16:20 ` Julien Grall
2015-02-25 14:36 ` Ian Campbell
2015-02-28 22:20 ` Julien Grall
2015-03-02 11:13 ` Ian Campbell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54F45E11.8070305@linaro.org \
--to=julien.grall@linaro.org \
--cc=ian.campbell@citrix.com \
--cc=psawargaonkar@apm.com \
--cc=stefano.stabellini@eu.citrix.com \
--cc=tim@xen.org \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.