diff options
author | Julien Grall <julien.grall@linaro.org> | 2013-04-26 17:58:18 +0100 |
---|---|---|
committer | Ian Campbell <ian.campbell@citrix.com> | 2013-05-13 11:59:58 +0100 |
commit | cd025772d02d5ff98b5a6141b8a424a305720648 (patch) | |
tree | 8c8e8345f731612cd0fde555654f62aa4d09cf62 | |
parent | 13bd8be39c077d1da3268f67837c0a0353accf89 (diff) | |
download | xen-cd025772d02d5ff98b5a6141b8a424a305720648.tar.gz xen-cd025772d02d5ff98b5a6141b8a424a305720648.tar.bz2 xen-cd025772d02d5ff98b5a6141b8a424a305720648.zip |
xen/arm: Introduce gic_irq_xlate
This function translates an interrupt specifier to an IRQ number and IRQ
type (ie: level trigger, edge trigger,...). It's GIC specific.
Signed-off-by: Julien Grall <julien.grall@linaro.org>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
-rw-r--r-- | xen/arch/arm/gic.c | 20 | ||||
-rw-r--r-- | xen/arch/arm/setup.c | 1 | ||||
-rw-r--r-- | xen/include/asm-arm/gic.h | 4 |
3 files changed, 25 insertions, 0 deletions
diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c index 4d79060b17..68f2410b91 100644 --- a/xen/arch/arm/gic.c +++ b/xen/arch/arm/gic.c @@ -329,6 +329,26 @@ static void __cpuinit gic_hyp_disable(void) GICH[GICH_HCR] = 0; } +int gic_irq_xlate(const u32 *intspec, unsigned int intsize, + unsigned int *out_hwirq, + unsigned int *out_type) +{ + if ( intsize < 3 ) + return -EINVAL; + + /* Get the interrupt number and add 16 to skip over SGIs */ + *out_hwirq = intspec[1] + 16; + + /* For SPIs, we need to add 16 more to get the GIC irq ID number */ + if ( !intspec[0] ) + *out_hwirq += 16; + + if ( out_type ) + *out_type = intspec[2] & DT_IRQ_TYPE_SENSE_MASK; + + return 0; +} + /* Set up the GIC */ void __init gic_init(void) { diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index 81bc956013..fc53117164 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -431,6 +431,7 @@ void __init start_xen(unsigned long boot_phys_offset, vm_init(); dt_unflatten_host_device_tree(); + dt_irq_xlate = gic_irq_xlate; #ifdef EARLY_UART_ADDRESS /* TODO Need to get device tree or command line for UART address */ diff --git a/xen/include/asm-arm/gic.h b/xen/include/asm-arm/gic.h index 78dd21addf..6ff217c231 100644 --- a/xen/include/asm-arm/gic.h +++ b/xen/include/asm-arm/gic.h @@ -189,6 +189,10 @@ extern void send_SGI_allbutself(enum gic_sgi sgi); /* print useful debug info */ extern void gic_dump_info(struct vcpu *v); +/* IRQ translation function for the device tree */ +int gic_irq_xlate(const u32 *intspec, unsigned int intsize, + unsigned int *out_hwirq, unsigned int *out_type); + #endif /* __ASSEMBLY__ */ #endif |