diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-07-09 16:38:03 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-07-09 16:42:00 +0200 |
commit | d168079cecc6d4605e659fbe810b0f6fbc2683e0 (patch) | |
tree | b40bc31305922ef84fb2db3da6e4f9f2ff5646b4 /c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c | |
parent | bsp/virtex: Fix interrupt handling (diff) | |
download | rtems-d168079cecc6d4605e659fbe810b0f6fbc2683e0.tar.bz2 |
bsp/virtex: Use ppc_count_leading_zeros()
Use ppc_count_leading_zeros() to optimize interrupt processing.
Diffstat (limited to '')
-rw-r--r-- | c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c b/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c index 715dbd64fa..b863bc9237 100644 --- a/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c +++ b/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c @@ -38,6 +38,8 @@ #include <bsp/irq-generic.h> #include <bsp/vectors.h> +#include <libcpu/powerpc-utility.h> + /* * Acknowledge a mask of interrupts. */ @@ -86,21 +88,18 @@ static void BSP_irq_handle_at_opbintc(void) /* Get pending interrupts */ ipr = get_ipr(); - /* Acknowledge all pending interrupts now and service them afterwards */ - set_iar(ipr); + if (ipr != 0) { + /* Acknowledge all pending interrupts now and service them afterwards */ + set_iar(ipr); - for (i = 0; - (i < BSP_OPBINTC_PER_IRQ_NUMBER) - && (ipr != 0); - i++) { - c = (1 << i); + do { + /* Get highest priority pending interrupt */ + uint32_t i = 31 - ppc_count_leading_zeros(ipr); - if ((ipr & c) != 0) { - /* interrupt is asserted */ - ipr &= ~c; + ipr &= ~(1U << i); bsp_interrupt_handler_dispatch(i+BSP_OPBINTC_IRQ_LOWEST_OFFSET); - } + } while (ipr != 0); } } |