I wrote:
> This means that hpet.c must initialize the interrupt routing register
> in this case. I'll write a patch for this.
Okay, this is a quick hack, untested. It just tries to set the first
interrupt that the timer could use.
Regards,
Clemens
Index: linux/arch/i386/kernel/time_hpet.c
===================================================================
--- linux.orig/arch/i386/kernel/time_hpet.c 2005-10-02 17:23:20.000000000 +0200
+++ linux/arch/i386/kernel/time_hpet.c 2005-10-19 14:37:55.000000000 +0200
@@ -196,6 +196,12 @@ int __init hpet_enable(void)
for (i = 2, timer = &hpet->hpet_timers[2]; i < ntimer;
timer++, i++)
+ if (!(timer->hpet_config & Tn_INT_ROUTE_CNF_MASK) &&
+ !(timer->hpet_config & Tn_FSB_EN_CNF_MASK)) {
+ int irq = ffs(timer->hpet_config >> Tn_INI_ROUTE_CAP_SHIFT);
+ timer->hpet_config |= irq << Tn_INT_ROUTE_CNF_SHIFT;
+ printk(KERN_INFO "HPET: timer %d configured for IRQ %d\n", i, irq);
+ }
hd.hd_irq[i] = (timer->hpet_config &
Tn_INT_ROUTE_CNF_MASK) >>
Tn_INT_ROUTE_CNF_SHIFT;
Index: linux/arch/x86_64/kernel/time.c
===================================================================
--- linux.orig/arch/x86_64/kernel/time.c 2005-10-02 17:23:20.000000000 +0200
+++ linux/arch/x86_64/kernel/time.c 2005-10-19 14:36:23.000000000 +0200
@@ -783,6 +783,12 @@ static __init int late_hpet_init(void)
for (i = 2, timer = &hpet->hpet_timers[2]; i < ntimer;
timer++, i++)
+ if (!(timer->hpet_config & Tn_INT_ROUTE_CNF_MASK) &&
+ !(timer->hpet_config & Tn_FSB_EN_CNF_MASK)) {
+ int irq = ffs(timer->hpet_config >> Tn_INI_ROUTE_CAP_SHIFT);
+ timer->hpet_config |= irq << Tn_INT_ROUTE_CNF_SHIFT;
+ printk(KERN_INFO "HPET: timer %d configured for IRQ %d\n", i, irq);
+ }
hd.hd_irq[i] = (timer->hpet_config &
Tn_INT_ROUTE_CNF_MASK) >>
Tn_INT_ROUTE_CNF_SHIFT;
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]