Message ID | 1396557727-19102-2-git-send-email-julien.grall@linaro.org |
---|---|
State | Superseded, archived |
Headers | show |
On Thu, 2014-04-03 at 21:41 +0100, Julien Grall wrote: > The function is nearly only used to retrieve the IRQ number. > > There is one place where the IRQ type is used (in domain_build.c) but > as the timer IRQ is virtualised for guest we might not have the same property > (e.g active-low level sensitive interrupt). Is this statement impacted at all by Stefano switching things to use the LR.HW bit? > > Replace timer_dt_irq by timer_get_irq which will return the IRQ number. > > Signed-off-by: Julien Grall <julien.grall@linaro.org> > @@ -647,17 +647,20 @@ static int make_timer_node(const struct domain *d, void *fdt, > if ( res ) > return res; > > - irq = timer_dt_irq(TIMER_PHYS_SECURE_PPI); > - DPRINT(" Secure interrupt %u\n", irq->irq); > - set_interrupt_ppi(intrs[0], irq->irq, 0xf, irq->type); > + /* The timer IRQ is emulated by Xen. It always exposes an active-low > + * level-sensitive interrupt */ > > - irq = timer_dt_irq(TIMER_PHYS_NONSECURE_PPI); > - DPRINT(" Non secure interrupt %u\n", irq->irq); > - set_interrupt_ppi(intrs[1], irq->irq, 0xf, irq->type); > + irq = timer_get_irq(TIMER_PHYS_SECURE_PPI); > + DPRINT(" Secure interrupt %u\n", irq); > + set_interrupt_ppi(intrs[0], irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW); > > - irq = timer_dt_irq(TIMER_VIRT_PPI); > - DPRINT(" Virt interrupt %u\n", irq->irq); > - set_interrupt_ppi(intrs[2], irq->irq, 0xf, irq->type); > + irq = timer_get_irq(TIMER_PHYS_NONSECURE_PPI); > + DPRINT(" Non secure interrupt %u\n", irq); > + set_interrupt_ppi(intrs[1], irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW); > + > + irq = timer_get_irq(TIMER_VIRT_PPI); > + DPRINT(" Virt interrupt %u\n", irq); > + set_interrupt_ppi(intrs[2], irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW); > > res = fdt_property_interrupts(fdt, intrs, 3); > if ( res )
On 04/07/2014 02:10 PM, Ian Campbell wrote: > On Thu, 2014-04-03 at 21:41 +0100, Julien Grall wrote: >> The function is nearly only used to retrieve the IRQ number. >> >> There is one place where the IRQ type is used (in domain_build.c) but >> as the timer IRQ is virtualised for guest we might not have the same property >> (e.g active-low level sensitive interrupt). > > Is this statement impacted at all by Stefano switching things to use the > LR.HW bit? The LR.HW is only used for physical interrupt routed to the guest. As the timer interrupt is virtualised it should not impact anything. Regards,
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 502db84..2035390 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -620,7 +620,7 @@ static int make_timer_node(const struct domain *d, void *fdt, u32 len; const void *compatible; int res; - const struct dt_irq *irq; + unsigned int irq; gic_interrupt_t intrs[3]; DPRINT("Create timer node\n"); @@ -647,17 +647,20 @@ static int make_timer_node(const struct domain *d, void *fdt, if ( res ) return res; - irq = timer_dt_irq(TIMER_PHYS_SECURE_PPI); - DPRINT(" Secure interrupt %u\n", irq->irq); - set_interrupt_ppi(intrs[0], irq->irq, 0xf, irq->type); + /* The timer IRQ is emulated by Xen. It always exposes an active-low + * level-sensitive interrupt */ - irq = timer_dt_irq(TIMER_PHYS_NONSECURE_PPI); - DPRINT(" Non secure interrupt %u\n", irq->irq); - set_interrupt_ppi(intrs[1], irq->irq, 0xf, irq->type); + irq = timer_get_irq(TIMER_PHYS_SECURE_PPI); + DPRINT(" Secure interrupt %u\n", irq); + set_interrupt_ppi(intrs[0], irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW); - irq = timer_dt_irq(TIMER_VIRT_PPI); - DPRINT(" Virt interrupt %u\n", irq->irq); - set_interrupt_ppi(intrs[2], irq->irq, 0xf, irq->type); + irq = timer_get_irq(TIMER_PHYS_NONSECURE_PPI); + DPRINT(" Non secure interrupt %u\n", irq); + set_interrupt_ppi(intrs[1], irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW); + + irq = timer_get_irq(TIMER_VIRT_PPI); + DPRINT(" Virt interrupt %u\n", irq); + set_interrupt_ppi(intrs[2], irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW); res = fdt_property_interrupts(fdt, intrs, 3); if ( res ) diff --git a/xen/arch/arm/time.c b/xen/arch/arm/time.c index 8dd4bea..7cad888 100644 --- a/xen/arch/arm/time.c +++ b/xen/arch/arm/time.c @@ -50,11 +50,11 @@ unsigned long __read_mostly cpu_khz; /* CPU clock frequency in kHz. */ static struct dt_irq timer_irq[MAX_TIMER_PPI]; -const struct dt_irq *timer_dt_irq(enum timer_ppi ppi) +unsigned int timer_get_irq(enum timer_ppi ppi) { ASSERT(ppi >= TIMER_PHYS_SECURE_PPI && ppi < MAX_TIMER_PPI); - return &timer_irq[ppi]; + return timer_irq[ppi].irq; } /*static inline*/ s_time_t ticks_to_ns(uint64_t ticks) diff --git a/xen/arch/arm/vtimer.c b/xen/arch/arm/vtimer.c index 3d6a721..5742303 100644 --- a/xen/arch/arm/vtimer.c +++ b/xen/arch/arm/vtimer.c @@ -64,7 +64,7 @@ int vcpu_vtimer_init(struct vcpu *v) t->ctl = 0; t->cval = NOW(); t->irq = d0 - ? timer_dt_irq(TIMER_PHYS_NONSECURE_PPI)->irq + ? timer_get_irq(TIMER_PHYS_NONSECURE_PPI) : GUEST_TIMER_PHYS_NS_PPI; t->v = v; @@ -72,7 +72,7 @@ int vcpu_vtimer_init(struct vcpu *v) init_timer(&t->timer, virt_timer_expired, t, v->processor); t->ctl = 0; t->irq = d0 - ? timer_dt_irq(TIMER_VIRT_PPI)->irq + ? timer_get_irq(TIMER_VIRT_PPI) : GUEST_TIMER_VIRT_PPI; t->v = v; diff --git a/xen/include/asm-arm/time.h b/xen/include/asm-arm/time.h index d10c737..9bbab0b 100644 --- a/xen/include/asm-arm/time.h +++ b/xen/include/asm-arm/time.h @@ -22,8 +22,8 @@ enum timer_ppi MAX_TIMER_PPI = 4, }; -/* Get one of the timer IRQ description */ -const struct dt_irq* timer_dt_irq(enum timer_ppi ppi); +/* Get one of the timer IRQ number */ +unsigned int timer_get_irq(enum timer_ppi ppi); /* Route timer's IRQ on this CPU */ extern void __cpuinit route_timer_interrupt(void);
The function is nearly only used to retrieve the IRQ number. There is one place where the IRQ type is used (in domain_build.c) but as the timer IRQ is virtualised for guest we might not have the same property (e.g active-low level sensitive interrupt). Replace timer_dt_irq by timer_get_irq which will return the IRQ number. Signed-off-by: Julien Grall <julien.grall@linaro.org> --- Changes in v2: - Patch added --- xen/arch/arm/domain_build.c | 23 +++++++++++++---------- xen/arch/arm/time.c | 4 ++-- xen/arch/arm/vtimer.c | 4 ++-- xen/include/asm-arm/time.h | 4 ++-- 4 files changed, 19 insertions(+), 16 deletions(-)