Avoid critical temp shutdowns on specific ThinkPad T4x(p) and R50p

Thomas Renninger
2008-07-30T13:56:01Z

This came in in OpenSUSE 10.3. When we still had overriden thermal polling
frequency (what we probably will do again soon). It has been tested that
specific ThinkPads do not throw a thermal event when exceeding the passive
trip point. Even thermal polling was not enough...
As no other solution has been found meanwhile and it seems Windows is also
using a virtual passive trip point:
[Bug 10658] thermal shutdown - Dell Precision M20, Latitude D610
http://bugzilla.kernel.org/show_bug.cgi?id=10658
it would be great to get this integrated into the mainline kernel.

BTW, the patch from Matthew in above bug, will this in some way be
integerated mainline? Otherwise we'll have to maintain this one ourself.

Thomas

From: Thomas Renninger <trenn-l3A5Bk7waGM@public.gmane.org>
Subject: Avoid critical temp shutdowns on specific ThinkPad T4x(p) and R50p
References: https://bugzilla.novell.com/show_bug.cgi?id=333043

---
drivers/acpi/thermal.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 73 insertions(+)

Index: linux-2.6.25-SL110_BRANCH/drivers/acpi/thermal.c
===================================================================
--- linux-2.6.25-SL110_BRANCH.orig/drivers/acpi/thermal.c
+++ linux-2.6.25-SL110_BRANCH/drivers/acpi/thermal.c
@@ -42,6 +42,7 @@
#include <linux/kmod.h>
#include <linux/seq_file.h>
#include <linux/reboot.h>
+#include <linux/dmi.h>
#include <asm/uaccess.h>
#include <linux/thermal.h>
#include <acpi/acpi_bus.h>
@@ -1576,6 +1577,66 @@ static int acpi_thermal_get_info(struct
return 0;
}

+static struct dmi_system_id thermal_psv_dmi_table[] = {
+ {
+ .ident = "IBM ThinkPad T41",
+ .matches = {
+ DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+ DMI_MATCH(DMI_PRODUCT_VERSION,"ThinkPad T41"),
+ },
+ },
+ {
+ .ident = "IBM ThinkPad T42",
+ .matches = {
+ DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+ DMI_MATCH(DMI_PRODUCT_VERSION,"ThinkPad T42"),
+ },
+ },
+ {
+ .ident = "IBM ThinkPad T43",
+ .matches = {
+ DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+ DMI_MATCH(DMI_PRODUCT_VERSION,"ThinkPad T43"),
+ },
+ },
+ {
+ .ident = "IBM ThinkPad T41p",
+ .matches = {
+ DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+ DMI_MATCH(DMI_PRODUCT_VERSION,"ThinkPad T41p"),
+ },
+ },
+ {
+ .ident = "IBM ThinkPad T42p",
+ .matches = {
+ DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+ DMI_MATCH(DMI_PRODUCT_VERSION,"ThinkPad T42p"),
+ },
+ },
+ {
+ .ident = "IBM ThinkPad T43p",
+ .matches = {
+ DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+ DMI_MATCH(DMI_PRODUCT_VERSION,"ThinkPad T43p"),
+ },
+ },
+ {
+ .ident = "IBM ThinkPad R40",
+ .matches = {
+ DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+ DMI_MATCH(DMI_PRODUCT_VERSION,"ThinkPad R40"),
+ },
+ },
+ {
+ .ident = "IBM ThinkPad R50p",
+ .matches = {
+ DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+ DMI_MATCH(DMI_PRODUCT_VERSION,"ThinkPad R50p"),
+ },
+ },
+ {},
+};
+
static int acpi_thermal_add(struct acpi_device *device)
{
int result = 0;
@@ -1606,6 +1667,18 @@ static int acpi_thermal_add(struct acpi_
if (result)
goto free_memory;

+ if (dmi_check_system(thermal_psv_dmi_table)) {
+ if (tz->trips.passive.flags.valid &&
+ tz->trips.passive.temperature > CELSIUS_TO_KELVIN(85)) {
+ printk (KERN_INFO "Adjust passive trip point from %lu"
+ " to %lu\n",
+ KELVIN_TO_CELSIUS(tz->trips.passive.temperature),
+ KELVIN_TO_CELSIUS(tz->trips.passive.temperature - 150));
+ tz->trips.passive.temperature -= 150;
+ acpi_thermal_set_polling(tz, 5);
+ }
+ }
+
result = acpi_thermal_add_fs(device);
if (result)
goto unregister_thermal_zone;

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world