drm/nouveau/therm: if no bios trip/linear info, default to perf-suggested speed
authorBen Skeggs <bskeggs@redhat.com>
Thu, 25 Jul 2013 23:58:47 +0000 (09:58 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 8 Nov 2013 05:40:01 +0000 (15:40 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/core/subdev/therm/base.c
drivers/gpu/drm/nouveau/core/subdev/therm/fan.c

index 1f28249..836943f 100644 (file)
@@ -92,6 +92,7 @@ nouveau_therm_update(struct nouveau_therm *therm, int mode)
        struct nouveau_timer *ptimer = nouveau_timer(therm);
        struct nouveau_therm_priv *priv = (void *)therm;
        unsigned long flags;
+       bool poll = true;
        int duty;
 
        spin_lock_irqsave(&priv->lock, flags);
@@ -105,16 +106,24 @@ nouveau_therm_update(struct nouveau_therm *therm, int mode)
                duty = nouveau_therm_fan_get(therm);
                if (duty < 0)
                        duty = 100;
+               poll = false;
                break;
        case NOUVEAU_THERM_CTRL_AUTO:
-               if (priv->fan->bios.nr_fan_trip)
+               if (priv->fan->bios.nr_fan_trip) {
                        duty = nouveau_therm_update_trip(therm);
-               else
+               } else
+               if (priv->fan->bios.linear_min_temp ||
+                   priv->fan->bios.linear_max_temp) {
                        duty = nouveau_therm_update_linear(therm);
+               } else {
+                       duty = priv->cstate;
+                       poll = false;
+               }
                break;
        case NOUVEAU_THERM_CTRL_NONE:
        default:
                ptimer->alarm_cancel(ptimer, &priv->alarm);
+               poll = false;
                goto done;
        }
 
@@ -122,7 +131,7 @@ nouveau_therm_update(struct nouveau_therm *therm, int mode)
        nouveau_therm_fan_set(therm, (mode != NOUVEAU_THERM_CTRL_AUTO), duty);
 
 done:
-       if (list_empty(&priv->alarm.head) && (mode == NOUVEAU_THERM_CTRL_AUTO))
+       if (list_empty(&priv->alarm.head) && poll)
                ptimer->alarm(ptimer, 1000000000ULL, &priv->alarm);
        spin_unlock_irqrestore(&priv->lock, flags);
 }
index 39f47b9..95f6129 100644 (file)
@@ -185,8 +185,11 @@ nouveau_therm_fan_set_defaults(struct nouveau_therm *therm)
        priv->fan->bios.max_duty = 100;
        priv->fan->bios.bump_period = 500;
        priv->fan->bios.slow_down_period = 2000;
+/*XXX: talk to mupuf */
+#if 0
        priv->fan->bios.linear_min_temp = 40;
        priv->fan->bios.linear_max_temp = 85;
+#endif
 }
 
 static void