x86: hpet: Disable HPET MSI on Lenovo W510
RFC PATCH 1/1 x86: hpet: Disable HPET MSI on Lenovo W510
Subject: x86: hpet: Disable MSI on Lenovo W510
From: Thomas Gleixner <[email protected]>
Date: Fri, 30 Sep 2011 20:03:37 +0200
MSI based per cpu timers lose interrupts when intel_idle() is enabled independent of the effective c-state. With idle=poll the problem cannot be observed.
We have no idea yet, whether this is a W510 specific issue or a general chipset oddity. Blacklist the known problem machine.
Reported-by Luis Claudio R. Goncalves <[email protected]>
Signed-off-by Thomas Gleixner <[email protected]>
--- arch/x86/kernel/hpet.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)
arch/x86/kernel/hpet.c +26 -0
@@ -7,6 +7,7 @@#include <linux/slab.h> #include <linux/hpet.h> #include <linux/init.h> +#include <linux/dmi.h> #include <linux/cpu.h> #include <linux/pm.h> #include <linux/io.h>
@@ -566,6 +567,29 @@ static void init_one_hpet_msi_clockevent#define RESERVE_TIMERS 0#endif +static int __init dmi_disable_hpet_msi (const struct dmi_system_id *d) +{ + hpet_msi_disable =1 ; +} + +static struct dmi_system_id __initdata dmi_hpet_table[] = { +/* +* MSI based per cpu timers lose interrupts when intel_idle() +* is enabled - independent of the c-state. With idle=poll the +* problem cannot be observed. We have no idea yet, whether +* this is a W510 specific issue or a general chipset oddity. +*/ + { + .callback = dmi_disable_hpet_msi, + .ident ="Lenovo W510" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), +DMI_MATCH (DMI_PRODUCT_VERSION ,"ThinkPad W510" ), + }, + }, + {} +}; +static void hpet_msi_capability_lookup (unsigned int start_timer) {unsigned int id;
@@ -573,6 +597,8 @@ static void hpet_msi_capability_lookup(uunsigned int num_timers_used =0 ;int i; +dmi_check_system (dmi_hpet_table); +if (hpet_msi_disable)return ;