aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien Grall <julien.grall@linaro.org>2013-04-26 17:58:18 +0100
committerIan Campbell <ian.campbell@citrix.com>2013-05-13 11:59:58 +0100
commitcd025772d02d5ff98b5a6141b8a424a305720648 (patch)
tree8c8e8345f731612cd0fde555654f62aa4d09cf62
parent13bd8be39c077d1da3268f67837c0a0353accf89 (diff)
downloadxen-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.c20
-rw-r--r--xen/arch/arm/setup.c1
-rw-r--r--xen/include/asm-arm/gic.h4
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