2012/12/25 Vadim Zhukov <persg...@gmail.com>: > 2012/12/10 Vadim Zhukov <persg...@gmail.com>: >> 2012/12/10 Christian Schulte <c...@schulte.it>: >>> Am 12/10/12 05:00, schrieb Vadim Zhukov: >>>> 10.12.2012 1:43 пользователь "Christian Schulte" <c...@schulte.it> написал: >>>>> >>>>> Am 12/09/12 20:58, schrieb Vadim Zhukov: >>>>>> Hello all. >>>>>> >>>>>> This is a bit improved version of the patch showed up on tech@ in... >>>>>> er-r-r... don't mind. This makes my ThinkPad usable under high load >>>>>> for more than a year, and should not cause problems mentioned before >>>>>> (spinning higher and lower constantly) by using two temperature marks >>>>>> instead of one. >>>>>> >>>>>> I also found that disengaged mode should be enabled separately off >>>>>> other modes, so now Alexander Polyakov's X100e should behave correctly. >>>>>> >>>>>> Any ThinkPad users willing to test? >>>>> >>>>> Hello, >>>>> >>>>> I am using a previous version of the patch with some temperature >>>>> constants modified to match the temperatures my R60 produces. My R60 >>>>> overheats (screen starts to flicker - system freezes) even when running >>>>> the fan in disengaged mode constantly. I bet the patch will only >>>>> increase the time it takes for the system to overheat. Ever run at 100% >>>>> load for a few hours with a disengaged fan without problems ? >>>> >>>> Well, I didn't need disengaged mode on X60 Tablet, it overhearted rarely, >>>> especially if you clean up fan at least once a year. And X201i with i5 runs >>>> fine with this patch, if you doesn't place it on the wool. Could you please >>>> show "dmesg" and "sysctl hw.sensors" output from your system with any >>>> version of the patch being applied? >>>> >>> >>> I did not manage to solve the thermal problems I am having with the R60 >>> in any way. Without your patch, I cannot use the machine for more than >>> 10 minutes without overheating even when nearly idle. It also happened >>> when the machine was brandnew. The problem was there right from the >>> start. Replaced the fan two times already due to defects. >>> >>> With the latest patch applied I noticed the following: >>> >>> hw.sensors.acpithinkpad0.fan0=2652 RPM >>> hw.sensors.acpithinkpad0.raw0=128 (fan mode: disengaged), WARNING >>> >>> It reads (fan mode: disengaged) although the fan isn't spinning >>> full-speed. It does start spinning full-speed when getting hot. So the >>> fan-mode string seems to not get updated correctly when switching from >>> disengaged mode back to auto or somethng like that. >> >> Thanks, somehow I missed the obvious path in the source... >> >>> dmesg and sysctl hw.sensors with your latest patch applied. >> >> Thanks again. >> >>> Script started on Mon Dec 10 05:44:39 2012 >>> # uptime >>> 5:44AM up 5:30, 0 users, load averages: 0.12, 0.20, 0.26 >>> # dmesg >>> OpenBSD 5.2-current (GENERIC.MP) #1: Mon Dec 10 00:05:29 CET 2012 >>> r...@r60.schulte.it:/usr/src/sys/arch/i386/compile/GENERIC.MP >>> cpu0: Intel(R) Core(TM)2 CPU T5600 @ 1.83GHz ("GenuineIntel" 686-class) >>> 1.83 GHz >>> cpu0: >>> FPU,V86,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,NXE,LONG,SSE3,DTES64,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,LAHF,PERF >>> >>> real mem = 3219517440 (3070MB) >>> avail mem = 3155935232 (3009MB) >>> mainbus0 at root >>> bios0 at mainbus0: AT/286+ BIOS, date 08/28/09, BIOS32 rev. 0 @ 0xfd690, >>> SMBIOS rev. 2.4 @ 0xe0010 (68 entries) >>> bios0: vendor LENOVO version "7CETD3WW (2.23 )" date 08/28/2009 >>> bios0: LENOVO 9461DXG >>> acpi0 at bios0: rev 2 >>> acpi0: sleep states S0 S3 S4 S5 >>> acpi0: tables DSDT FACP SSDT ECDT TCPA APIC MCFG HPET SLIC BOOT SSDT >>> SSDT SSDT SSDT >>> acpi0: wakeup devices LID_(S3) SLPB(S3) LURT(S3) DURT(S3) EXP0(S4) >>> EXP1(S4) EXP2(S4) EXP3(S4) PCI1(S4) USB0(S3) USB1(S3) USB2(S3) USB7(S3) >>> HDEF(S4) >>> acpitimer0 at acpi0: 3579545 Hz, 24 bits >>> acpiec0 at acpi0 >>> acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat >>> cpu0 at mainbus0: apid 0 (boot processor) >>> cpu0: apic clock running at 166MHz >>> cpu1 at mainbus0: apid 1 (application processor) >>> cpu1: Intel(R) Core(TM)2 CPU T5600 @ 1.83GHz ("GenuineIntel" 686-class) >>> 1.83 GHz >>> cpu1: >>> FPU,V86,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,NXE,LONG,SSE3,DTES64,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,LAHF,PERF >>> >>> ioapic0 at mainbus0: apid 1 pa 0xfec00000, version 20, 24 pins >>> ioapic0: misconfigured as apic 2, remapped to apid 1 >>> acpimcfg0 at acpi0 addr 0xf0000000, bus 0-63 >>> acpihpet0 at acpi0: 14318179 Hz >>> acpiprt0 at acpi0: bus 0 (PCI0) >>> acpiprt1 at acpi0: bus 1 (AGP_) >>> acpiprt2 at acpi0: bus 2 (EXP0) >>> acpiprt3 at acpi0: bus 3 (EXP1) >>> acpiprt4 at acpi0: bus 4 (EXP2) >>> acpiprt5 at acpi0: bus 12 (EXP3) >>> acpiprt6 at acpi0: bus 21 (PCI1) >>> acpicpu0 at acpi0: C3, C2, C1, PSS >>> acpicpu1 at acpi0: C3, C2, C1, PSS >>> acpipwrres0 at acpi0: PUBS >>> acpitz0 at acpi0: critical temperature is 127 degC >>> acpitz1 at acpi0: critical temperature is 100 degC >> >> I'm thinking about looking for acpitz* internals critical temperature >> in acpithinkpad_attach(), and using it for heuristics to detect high >> and low temperature marks. But direct messing with acpitz(4) >> structures is indeed ugly... Can any kernel drivers hacker give an >> advice here, please? > > Ping. Updated patch (fixing a printout bug spotted by Christian Schulte) > is below. > > I have two successful reports for this version, including myself, and > at least one successful report for previous one (with only one > OUCH_MARK). May this deserve a commit? *SHREKCATSMILE*
Ping #2?.. > Index: acpithinkpad.c > =================================================================== > RCS file: /cvs/src/sys/dev/acpi/acpithinkpad.c,v > retrieving revision 1.28 > diff -u -p -r1.28 acpithinkpad.c > --- acpithinkpad.c 6 Jun 2011 06:13:46 -0000 1.28 > +++ acpithinkpad.c 25 Dec 2012 15:19:25 -0000 > @@ -76,11 +76,25 @@ > #define THINKPAD_POWER_CHANGED 0x6030 > #define THINKPAD_SWITCH_WIRELESS 0x7000 > > -#define THINKPAD_NSENSORS 9 > -#define THINKPAD_NTEMPSENSORS 8 > +#define THINKPAD_NSENSORS 10 > +#define THINKPAD_NTEMPSENSORS 8 > + > +#define THINKPAD_SENSOR_FANRPM (THINKPAD_NTEMPSENSORS + 0) > +#define THINKPAD_SENSOR_FANMODE (THINKPAD_NTEMPSENSORS + 1) > > #define THINKPAD_ECOFFSET_FANLO 0x84 > #define THINKPAD_ECOFFSET_FANHI 0x85 > +#define THINKPAD_ECOFFSET_FANMODE 0x2f > + > +/* not used: #define THINKPAD_FANMODE_MIN 0x00 */ > +#define THINKPAD_FANMODE_MAX 0x07 > +#define THINKPAD_FANMODE_AUTO 0x80 > +#define THINKPAD_FANMODE_DISENGAGED 0x40 > +#define THINKPAD_FANMODE_FORCEMAX (THINKPAD_FANMODE_MAX | > THINKPAD_FANMODE_DISENGAGED) > + > +/* critical temperature marks, in Celsius */ > +#define THINKPAD_TEMP_OUCH_HMARK 80 > +#define THINKPAD_TEMP_OUCH_LMARK 70 > > struct acpithinkpad_softc { > struct device sc_dev; > @@ -90,7 +104,10 @@ struct acpithinkpad_softc { > struct aml_node *sc_devnode; > > struct ksensor sc_sens[THINKPAD_NSENSORS]; > +#define sc_sensfanmode sc_sens[THINKPAD_SENSOR_FANMODE] > struct ksensordev sc_sensdev; > + > + u_int8_t sc_fanmodeinit; > }; > > extern void acpiec_read(struct acpiec_softc *, u_int8_t, int, u_int8_t *); > @@ -108,7 +125,7 @@ int thinkpad_volume_mute(struct acpithin > int thinkpad_brightness_up(struct acpithinkpad_softc *); > int thinkpad_brightness_down(struct acpithinkpad_softc *); > > -void thinkpad_sensor_attach(struct acpithinkpad_softc *sc); > +void thinkpad_sensor_attach(struct acpithinkpad_softc *); > void thinkpad_sensor_refresh(void *); > > #if NAUDIO > 0 && NWSKBD > 0 > @@ -165,8 +182,14 @@ thinkpad_sensor_attach(struct acpithinkp > } > > /* Add fan probe */ > - sc->sc_sens[i].type = SENSOR_FANRPM; > - sensor_attach(&sc->sc_sensdev, &sc->sc_sens[i]); > + sc->sc_sens[THINKPAD_SENSOR_FANRPM].type = SENSOR_FANRPM; > + sensor_attach(&sc->sc_sensdev, &sc->sc_sens[THINKPAD_SENSOR_FANRPM]); > + > + /* Add fan mode indicator */ > + sc->sc_sens[THINKPAD_SENSOR_FANMODE].type = SENSOR_INTEGER; > + sensor_attach(&sc->sc_sensdev, &sc->sc_sens[THINKPAD_SENSOR_FANMODE]); > + acpiec_read(sc->sc_ec, THINKPAD_ECOFFSET_FANMODE, 1, > + &sc->sc_fanmodeinit); > > sensordev_install(&sc->sc_sensdev); > } > @@ -176,8 +199,10 @@ thinkpad_sensor_refresh(void *arg) > { > struct acpithinkpad_softc *sc = arg; > u_int8_t lo, hi, i; > - int64_t tmp; > + int64_t tmp, maxtmp = -127; /* minimal correct value, see below */ > + int updatemode = 0; /* should we bother BIOS? */ > char sname[5]; > + const char *desc; > > /* Refresh sensor readings */ > for (i=0; i<THINKPAD_NTEMPSENSORS; i++) { > @@ -185,14 +210,60 @@ thinkpad_sensor_refresh(void *arg) > aml_evalinteger(sc->sc_acpi, sc->sc_ec->sc_devnode, > sname, 0, 0, &tmp); > sc->sc_sens[i].value = (tmp * 1000000) + 273150000; > - if (tmp > 127 || tmp < -127) > + if (tmp > 127 || tmp < -127) { > sc->sc_sens[i].flags = SENSOR_FINVALID; > + sc->sc_sens[i].status = SENSOR_S_UNKNOWN; > + } > + if ((sc->sc_sens[i].flags & SENSOR_FINVALID) == > SENSOR_FINVALID) > + continue; > + if (tmp > maxtmp) > + maxtmp = tmp; > + if (tmp > THINKPAD_TEMP_OUCH_HMARK) > + sc->sc_sens[i].status = SENSOR_S_CRIT; > + else if (tmp > THINKPAD_TEMP_OUCH_LMARK) > + sc->sc_sens[i].status = SENSOR_S_WARN; > + else > + sc->sc_sens[i].status = SENSOR_S_OK; > } > > /* Read fan RPM */ > acpiec_read(sc->sc_ec, THINKPAD_ECOFFSET_FANLO, 1, &lo); > acpiec_read(sc->sc_ec, THINKPAD_ECOFFSET_FANHI, 1, &hi); > - sc->sc_sens[i].value = ((hi << 8L) + lo); > + sc->sc_sens[THINKPAD_SENSOR_FANRPM].value = ((hi << 8L) + lo); > + > + /* > + * Update fan mode based on max temperature seen. > + * If temperature is between THINKPAD_TEMP_OUCH_LMARK and > + * THINKPAD_TEMP_OUCH_HMARK, we try to avoid setting fan mode > + * to avoid extra spinning. > + */ > + > + if (maxtmp > THINKPAD_TEMP_OUCH_HMARK) { > + sc->sc_sensfanmode.value = THINKPAD_FANMODE_FORCEMAX; > + sc->sc_sensfanmode.status = SENSOR_S_CRIT; > + desc = "disengaged"; > + updatemode = 1; > + } else if (maxtmp <= THINKPAD_TEMP_OUCH_LMARK) { > + sc->sc_sensfanmode.value = sc->sc_fanmodeinit; > + sc->sc_sensfanmode.status = SENSOR_S_OK; > + desc = "auto"; > + updatemode = 1; > + } else { > + if (sc->sc_sensfanmode.status == SENSOR_S_UNSPEC) { > + /* Better safe than sorry */ > + sc->sc_sensfanmode.value = THINKPAD_FANMODE_FORCEMAX; > + desc = "disengaged"; > + updatemode = 1; > + } > + sc->sc_sensfanmode.status = SENSOR_S_WARN; > + } > + > + if (updatemode) { > + snprintf(sc->sc_sensfanmode.desc, > + sizeof(sc->sc_sensfanmode.desc), "fan mode: %s", desc); > + acpiec_write(sc->sc_ec, THINKPAD_ECOFFSET_FANMODE, 1, > + (u_int8_t*)&sc->sc_sensfanmode.value); > + } > } > > void -- WBR, Vadim Zhukov