|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/2] xen: arm: Warn if timer interrupts are not level triggered
Hi Ian,
On 19/02/15 15:24, Ian Campbell wrote:
> Edge trigger arch timer interrupts really don't make much sense, so if
> we discover we are booting on such a system issue a warning.
>
> So far this has only been seen on the fast model emulators which have
> both an incorrect DT description of the interrupt and a writeable
> ICFGR allowing us to program the incorrect configuration. Other
> platforms have incorrect DT descriptions (warned about by previous
> patch) but the corresponding ICFGR isn't actually writeable so the
> eventual configuration is level as desired.
>
> I did consider overriding the incorrect DT on such systems but since
> so far it has only been observed on emulators and we have code in
> place to deal with edge triggering here I think warning is sufficient
> for now.
>
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
> ---
> xen/arch/arm/time.c | 30 ++++++++++++++++++++++++++++++
> 1 file changed, 30 insertions(+)
>
> diff --git a/xen/arch/arm/time.c b/xen/arch/arm/time.c
> index 418748d..7304cd8 100644
> --- a/xen/arch/arm/time.c
> +++ b/xen/arch/arm/time.c
> @@ -198,6 +198,32 @@ static void vtimer_interrupt(int irq, void *dev_id,
> struct cpu_user_regs *regs)
> vgic_vcpu_inject_irq(current, current->arch.virt_timer.irq);
> }
>
> +/*
> + * Arch timer interrupt really ought to be level triggered, since the
> + * design of the timer/comparator mechanism is based around that
> + * concept.
> + *
> + * However some firmware (incorrectly) describes the interrupts as
> + * edge triggered and, worse, some hardware allows us to program the
> + * interrupt contoller as edge triggered.
controller
> + *
> + * Check each interrupt and warn if we find ourselves in this situation.
> + */
Based on the comment, would it make sense to override the type of
interrupt to level in anycase? Even if the GIC allows us to write on ICFGR.
> +static void check_timer_irq_cfg(unsigned int irq, const char *which)
> +{
> + struct irq_desc *desc = irq_to_desc(irq);
> +
> + /*
> + * The interrupt contoller driver will update desc->arch.type with
controller
> + * the actual type which ended up configured in the hardware.
> + */
> + if ( desc->arch.type & DT_IRQ_TYPE_LEVEL_LOW )
> + return;
> +
> + printk(XENLOG_WARNING
> + "WARNING: %s-timer IRQ%u is not level triggered.\n", which, irq);
> +}
> +
> /* Set up the timer interrupt on this CPU */
> void __cpuinit init_timer_interrupt(void)
> {
> @@ -215,6 +241,10 @@ void __cpuinit init_timer_interrupt(void)
> "virtimer", NULL);
> request_irq(timer_irq[TIMER_PHYS_NONSECURE_PPI], 0, timer_interrupt,
> "phytimer", NULL);
> +
> + check_timer_irq_cfg(timer_irq[TIMER_HYP_PPI], "hypervisor");
> + check_timer_irq_cfg(timer_irq[TIMER_VIRT_PPI], "virtual");
> + check_timer_irq_cfg(timer_irq[TIMER_PHYS_NONSECURE_PPI], "NS-physical");
> }
>
> /* Wait a set number of microseconds */
>
Regards,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |