RE: 2.6.31.4: WARNING: at arch/x86/kernel/hpet.c:390 hpet_next_event+0x70/0x80() [occurs when ACPI_PROCESSOR=y]

Justin Piszcz
2009-11-13T18:43:54Z

On Fri, 13 Nov 2009, Pallipadi, Venkatesh wrote:

> On Fri, 2009-11-13 at 01:38 -0800, Thomas Gleixner wrote:
>> On Thu, 12 Nov 2009, Pallipadi, Venkatesh wrote:
>>> Yes. Yes. This is a hardware errata. I have a patch to workaround this and
>>> waiting on the errata description to get published..
>>
>> Can we at least have some PCI quirk or whatever until you can push the
>> final workaround out so peoples machines do not explode ?
>
> Its a harmless bug functionality-wise and should not have any side
> effect other than triggering the WARN_ON_ONCE in hpet next event code.
>
> Thanks,
> Venki
>

Venki,

When the following patch is applied though: (courtesy of john stultz)

--- a/arch/x86/kernel/hpet.c
+++ b/arch/x86/kernel/hpet.c
@@ -376,7 +376,7 @@ static void hpet_set_mode(enum clock_event_mode mode,
static int hpet_next_event(unsigned long delta,
struct clock_event_device *evt, int timer)
{
- u32 cnt;
+ u32 cnt, check;

cnt = hpet_readl(HPET_COUNTER);
cnt += (u32) delta;
@@ -387,7 +387,12 @@ static int hpet_next_event(unsigned long delta,
* what we wrote hit the chip before we compare it to the
* counter.
*/
- WARN_ON_ONCE((u32)hpet_readl(HPET_Tn_CMP(timer)) != cnt);
+ check = (u32)hpet_readl(HPET_Tn_CMP(timer));
+ if(check != cnt) {
+ printk("hpet_next_event: hpet_writel failed: 0x%x != 0x%x\n",
+ check, cnt);
+ hpet_writel(cnt, HPET_Tn_CMP(timer));
+ }

return (s32)((u32)hpet_readl(HPET_COUNTER) - cnt) >= 0 ? -ETIME : 0;
}

You can see what it is doing with this patch:

[ 22.856850] hpet_next_event: hpet_writel failed: 0x13b7690a != 0x138c5241
[ 22.900424] hpet_next_event: hpet_writel failed: 0x138c5241 != 0x13b7691a
[ 22.906429] hpet_next_event: hpet_writel failed: 0x13b7691a != 0x1391467c
[ 22.923096] hpet_next_event: hpet_writel failed: 0x1391467c != 0x13974b5f
[ 22.950698] hpet_next_event: hpet_writel failed: 0x13974b5f != 0x13b7692c
[ 22.959424] hpet_next_event: hpet_writel failed: 0x13ad247d != 0x139cdade
[ 22.976065] hpet_next_event: hpet_writel failed: 0x139cdade != 0x13ad247c
[ 23.003919] hpet_next_event: hpet_writel failed: 0x13ad247c != 0x13a69410
[ 23.020581] hpet_next_event: hpet_writel failed: 0x13a69410 != 0x13ad2489
[ 23.050692] hpet_next_event: hpet_writel failed: 0x13ad2489 != 0x13b7694d
[ 23.069921] hpet_next_event: hpet_writel failed: 0x13b7694d != 0x13b50004
[ 23.086577] hpet_next_event: hpet_writel failed: 0x13b50004 != 0x13b8a43d
[ 23.103251] hpet_next_event: hpet_writel failed: 0x13b8a43d != 0x13db0607
[ 23.124690] hpet_next_event: hpet_writel failed: 0x13bd5467 != 0x13c2fdba
[ 23.150604] hpet_next_event: hpet_writel failed: 0x13c2fdba != 0x13db061a
[ 23.155307] hpet_next_event: hpet_writel failed: 0x13db061a != 0x13c7a97e
[ 23.171975] hpet_next_event: hpet_writel failed: 0x13c7a97e != 0x13d8d6d4
[ 23.202978] hpet_next_event: hpet_writel failed: 0x13d8d6d4 != 0x13d21457
[ 23.219647] hpet_next_event: hpet_writel failed: 0x13d21457 != 0x13d5b8b8

It makes a high-pitch squeal when this is occurring, is that OK for the HW?

For your patch, will it allow Turbo Mode and the processor module to both
function properly?

Without the patch/processor module, is there any other way to achieve turbo
mode via a BIOS setting or am I stuck with the max CPU multiplier non-turbo?

If your patch is working, do you have it available for testing?

Justin.