77 lines
1.9 KiB
Diff
77 lines
1.9 KiB
Diff
# Fix broken interrupt routing for sb1, from linux-mips.org
|
|
# 2.6.18-stable, also in kernel.org mainline.
|
|
|
|
|
|
diff --git a/arch/mips/sibyte/bcm1480/irq.c b/arch/mips/sibyte/bcm1480/irq.c
|
|
index ed325f0..a0222fa 100644
|
|
--- a/arch/mips/sibyte/bcm1480/irq.c
|
|
+++ b/arch/mips/sibyte/bcm1480/irq.c
|
|
@@ -469,21 +469,6 @@ void bcm1480_kgdb_interrupt(struct pt_re
|
|
|
|
#endif /* CONFIG_KGDB */
|
|
|
|
-static inline int dclz(unsigned long long x)
|
|
-{
|
|
- int lz;
|
|
-
|
|
- __asm__ (
|
|
- " .set push \n"
|
|
- " .set mips64 \n"
|
|
- " dclz %0, %1 \n"
|
|
- " .set pop \n"
|
|
- : "=r" (lz)
|
|
- : "r" (x));
|
|
-
|
|
- return lz;
|
|
-}
|
|
-
|
|
extern void bcm1480_timer_interrupt(struct pt_regs *regs);
|
|
extern void bcm1480_mailbox_interrupt(struct pt_regs *regs);
|
|
extern void bcm1480_kgdb_interrupt(struct pt_regs *regs);
|
|
@@ -536,9 +521,9 @@ #endif
|
|
|
|
if (mask_h) {
|
|
if (mask_h ^ 1)
|
|
- do_IRQ(63 - dclz(mask_h), regs);
|
|
+ do_IRQ(fls64(mask_h) - 1, regs);
|
|
else
|
|
- do_IRQ(127 - dclz(mask_l), regs);
|
|
+ do_IRQ(63 + fls64(mask_l), regs);
|
|
}
|
|
}
|
|
}
|
|
diff --git a/arch/mips/sibyte/sb1250/irq.c b/arch/mips/sibyte/sb1250/irq.c
|
|
index 1de71ad..a451b4c 100644
|
|
--- a/arch/mips/sibyte/sb1250/irq.c
|
|
+++ b/arch/mips/sibyte/sb1250/irq.c
|
|
@@ -419,21 +419,6 @@ static void sb1250_kgdb_interrupt(struct
|
|
|
|
#endif /* CONFIG_KGDB */
|
|
|
|
-static inline int dclz(unsigned long long x)
|
|
-{
|
|
- int lz;
|
|
-
|
|
- __asm__ (
|
|
- " .set push \n"
|
|
- " .set mips64 \n"
|
|
- " dclz %0, %1 \n"
|
|
- " .set pop \n"
|
|
- : "=r" (lz)
|
|
- : "r" (x));
|
|
-
|
|
- return lz;
|
|
-}
|
|
-
|
|
extern void sb1250_timer_interrupt(struct pt_regs *regs);
|
|
extern void sb1250_mailbox_interrupt(struct pt_regs *regs);
|
|
extern void sb1250_kgdb_interrupt(struct pt_regs *regs);
|
|
@@ -490,6 +475,6 @@ #endif
|
|
mask = __raw_readq(IOADDR(A_IMR_REGISTER(smp_processor_id(),
|
|
R_IMR_INTERRUPT_STATUS_BASE)));
|
|
if (mask)
|
|
- do_IRQ(63 - dclz(mask), regs);
|
|
+ do_IRQ(fls64(mask) - 1, regs);
|
|
}
|
|
}
|