[rtems commit] bsp/virtex: Use ppc_count_leading_zeros()
Sebastian Huber
sebh at rtems.org
Tue Jul 9 14:36:12 UTC 2013
Module: rtems
Branch: master
Commit: d168079cecc6d4605e659fbe810b0f6fbc2683e0
Changeset: http://git.rtems.org/rtems/commit/?id=d168079cecc6d4605e659fbe810b0f6fbc2683e0
Author: Sebastian Huber <sebastian.huber at embedded-brains.de>
Date: Tue Jul 9 16:38:03 2013 +0200
bsp/virtex: Use ppc_count_leading_zeros()
Use ppc_count_leading_zeros() to optimize interrupt processing.
---
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 715dbd6..b863bc9 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);
}
}
More information about the vc
mailing list