This patch enables passive cooling support in the ACPITZ module;
please test this if your system overheats in normal usage.
It is a little noisy for now.

? acpitz.c.fix
? msg
? passive.diff
Index: acpitz.c
===================================================================
RCS file: /cvs/src/sys/dev/acpi/acpitz.c,v
retrieving revision 1.31
diff -u -p -u -p -b -r1.31 acpitz.c
--- acpitz.c    26 Apr 2009 02:20:58 -0000      1.31
+++ acpitz.c    24 Aug 2009 15:54:50 -0000
@@ -79,6 +79,10 @@ int  acpitz_setfan(struct acpitz_softc *,
 int    acpitz_setcpu(struct acpitz_softc *, int);
 #endif

+extern void (*cpu_setperf)(int);
+extern int perflevel;
+#define PERFSTEP 10
+
 int
 acpitz_match(struct device *parent, void *match, void *aux)
 {
@@ -280,7 +284,7 @@ void
 acpitz_refresh(void *arg)
 {
        struct acpitz_softc     *sc = arg;
-       int                     i, perc;
+       int                     i, trend, nperf;

        dnprintf(30, "%s: %s: refresh\n", DEVNAME(sc),
            sc->sc_devnode->name);
@@ -309,18 +313,29 @@ acpitz_refresh(void *arg)
                dnprintf(30, "%s: passive cooling: lasttmp: %d tc1: %d "
                    "tc2: %d psv: %d\n", DEVNAME(sc), sc->sc_lasttmp,
                    sc->sc_tc1, sc->sc_tc2, sc->sc_psv);
+
+               printf("%s: tmp:%d last:%d psv:%d crt:%d\n",
+                   DEVNAME(sc), sc->sc_tmp, sc->sc_lasttmp,
+                   sc->sc_psv, sc->sc_crt);
+
+               /* Default: Increase performance PERFSTEP% */
+               nperf = perflevel;
+               if ((nperf += PERFSTEP) >= 100)
+                       nperf = 100;
                if (sc->sc_psv <= sc->sc_tmp) {
-                       sc->sc_pse = 1;
-                       perc = sc->sc_tc1 * (sc->sc_tmp - sc->sc_lasttmp) +
+                       trend = sc->sc_tc1 * (sc->sc_tmp - sc->sc_lasttmp) +
                            sc->sc_tc2 * (sc->sc_tmp - sc->sc_psv);
-                       perc /= 10;
-                       if (perc < 0)
-                               perc = 0;
-                       else if (perc > 100)
-                               perc = 100;
-                       /* printf("_TZ perc = %d\n", perc); */
-               } else if (sc->sc_pse)
-                       sc->sc_pse = 0;
+
+                       /* Heating up.. decrease performance X% */
+                       if (trend > 0 && (nperf -= 2*PERFSTEP) < 0)
+                               nperf = 0;
+                       printf("Trend: %d\n", trend);
+               }
+               printf("lastperf: %d\n", nperf);
+               if (cpu_setperf && nperf != perflevel) {
+                       perflevel = nperf;
+                       cpu_setperf(nperf);
+               }
        }
        sc->sc_lasttmp = sc->sc_tmp;

Reply via email to