[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 2/2] arch/arm: time: Add support for parsing interrupts by names
From: Andrei Cherechesu <andrei.cherechesu@xxxxxxx> Added support for parsing the ARM generic timer interrupts DT node by the "interrupt-names" property, if it is available. If not available, the usual parsing based on the expected IRQ order is performed. Also changed to treating returning 0 as an error case for the platform_get_irq() calls, since it is not a valid PPI ID and treating it as a valid case would only cause Xen to BUG() later, during vgic_reserve_virq(). Added the "hyp-virt" PPI to the timer PPI list, even though it's currently not in use. If the "hyp-virt" PPI is not found, the hypervisor won't panic. Signed-off-by: Andrei Cherechesu <andrei.cherechesu@xxxxxxx> --- xen/arch/arm/include/asm/time.h | 3 ++- xen/arch/arm/time.c | 27 +++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/xen/arch/arm/include/asm/time.h b/xen/arch/arm/include/asm/time.h index 4b401c1110..49ad8c1a6d 100644 --- a/xen/arch/arm/include/asm/time.h +++ b/xen/arch/arm/include/asm/time.h @@ -82,7 +82,8 @@ enum timer_ppi TIMER_PHYS_NONSECURE_PPI = 1, TIMER_VIRT_PPI = 2, TIMER_HYP_PPI = 3, - MAX_TIMER_PPI = 4, + TIMER_HYP_VIRT_PPI = 4, + MAX_TIMER_PPI = 5, }; /* diff --git a/xen/arch/arm/time.c b/xen/arch/arm/time.c index 433d7be909..868e03ecf6 100644 --- a/xen/arch/arm/time.c +++ b/xen/arch/arm/time.c @@ -38,6 +38,14 @@ uint32_t __read_mostly timer_dt_clock_frequency; static unsigned int timer_irq[MAX_TIMER_PPI]; +static const char *timer_irq_names[MAX_TIMER_PPI] = { + [TIMER_PHYS_SECURE_PPI] = "sec-phys", + [TIMER_PHYS_NONSECURE_PPI] = "phys", + [TIMER_VIRT_PPI] = "virt", + [TIMER_HYP_PPI] = "hyp-phys", + [TIMER_HYP_VIRT_PPI] = "hyp-virt", +}; + unsigned int timer_get_irq(enum timer_ppi ppi) { ASSERT(ppi >= TIMER_PHYS_SECURE_PPI && ppi < MAX_TIMER_PPI); @@ -149,15 +157,26 @@ static void __init init_dt_xen_time(void) { int res; unsigned int i; + bool has_names; + + has_names = dt_property_read_bool(timer, "interrupt-names"); /* Retrieve all IRQs for the timer */ for ( i = TIMER_PHYS_SECURE_PPI; i < MAX_TIMER_PPI; i++ ) { - res = platform_get_irq(timer, i); - - if ( res < 0 ) + if ( has_names ) + res = platform_get_irq_byname(timer, timer_irq_names[i]); + else + res = platform_get_irq(timer, i); + + if ( res > 0 ) + timer_irq[i] = res; + /* + * Do not panic if "hyp-virt" PPI is not found, since it's not + * currently used. + */ + else if ( i != TIMER_HYP_VIRT_PPI ) panic("Timer: Unable to retrieve IRQ %u from the device tree\n", i); - timer_irq[i] = res; } } -- 2.35.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |