drm/nouveau/therm: don't attempt fan control where PMU is already managing it
authorBen Skeggs <bskeggs@redhat.com>
Tue, 2 Jul 2019 04:19:12 +0000 (14:19 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 23 Aug 2019 02:55:33 +0000 (12:55 +1000)
There's already a condition in place which attempts to detect this, but
since we've begun to require a PMU subdev even on boards where we don't
load a custom FW, it's become inaccurate.

This will prevent unnecessarily running a periodic fan update thread on
GP100 and newer, where we don't yet override the default PMU FW.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/include/nvkm/subdev/pmu.h
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c

index 24fbcccd93eba821e2ae37179e10038c9f82327f..4752006880f39469648551b60f207a28796fc355 100644 (file)
@@ -30,6 +30,7 @@ struct nvkm_pmu {
 int nvkm_pmu_send(struct nvkm_pmu *, u32 reply[2], u32 process,
                  u32 message, u32 data0, u32 data1);
 void nvkm_pmu_pgob(struct nvkm_pmu *, bool enable);
+bool nvkm_pmu_fan_controlled(struct nvkm_device *);
 
 int gt215_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **);
 int gf100_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **);
index ce70a193caa7f4db194e2cb68e683b93121bc820..ea2e11771bca522e820151b204c098b230a56b22 100644 (file)
 #include <core/msgqueue.h>
 #include <subdev/timer.h>
 
+bool
+nvkm_pmu_fan_controlled(struct nvkm_device *device)
+{
+       struct nvkm_pmu *pmu = device->pmu;
+
+       /* Internal PMU FW does not currently control fans in any way,
+        * allow SW control of fans instead.
+        */
+       if (pmu && pmu->func->code.size)
+               return false;
+
+       /* Default (board-loaded, or VBIOS PMU/PREOS) PMU FW on Fermi
+        * and newer automatically control the fan speed, which would
+        * interfere with SW control.
+        */
+       return (device->chipset >= 0xc0);
+}
+
 void
 nvkm_pmu_pgob(struct nvkm_pmu *pmu, bool enable)
 {
index 07914e36939e3d80b557ee1267ab3f9f0f648ca2..4a4d1e224126464fd1881a062cbddcc1b34ad8b4 100644 (file)
  *
  * Authors: Martin Peres
  */
-#include <nvkm/core/option.h>
 #include "priv.h"
 
+#include <core/option.h>
+#include <subdev/pmu.h>
+
 int
 nvkm_therm_temp_get(struct nvkm_therm *therm)
 {
@@ -192,8 +194,7 @@ nvkm_therm_fan_mode(struct nvkm_therm *therm, int mode)
 
        /* The default PPWR ucode on fermi interferes with fan management */
        if ((mode >= ARRAY_SIZE(name)) ||
-           (mode != NVKM_THERM_CTRL_NONE && device->card_type >= NV_C0 &&
-            !device->pmu))
+           (mode != NVKM_THERM_CTRL_NONE && nvkm_pmu_fan_controlled(device)))
                return -EINVAL;
 
        /* do not allow automatic fan management if the thermal sensor is