summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-07-09 16:38:03 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-07-09 16:42:00 +0200
commitd168079cecc6d4605e659fbe810b0f6fbc2683e0 (patch)
treeb40bc31305922ef84fb2db3da6e4f9f2ff5646b4 /c
parentbsp/virtex: Fix interrupt handling (diff)
downloadrtems-d168079cecc6d4605e659fbe810b0f6fbc2683e0.tar.bz2
bsp/virtex: Use ppc_count_leading_zeros()
Use ppc_count_leading_zeros() to optimize interrupt processing.
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c21
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);
}
}