[Nouveau] [PATCH 16/32] therm: Move the temp readout into nvkm_therm_update
Karol Herbst
karolherbst at gmail.com
Fri Nov 17 00:04:20 UTC 2017
It makes more sense to read out the temperature in the alarm, because we
want to do various things with it:
1. adjust the fans
2. notify the clk subdev about the changed temperature
v2: move into nvkm_therm_update
Signed-off-by: Karol Herbst <karolherbst at gmail.com>
---
drm/nouveau/nvkm/subdev/therm/base.c | 34 ++++++++++++++--------------------
1 file changed, 14 insertions(+), 20 deletions(-)
diff --git a/drm/nouveau/nvkm/subdev/therm/base.c b/drm/nouveau/nvkm/subdev/therm/base.c
index 8e5f6f7f..253da199 100644
--- a/drm/nouveau/nvkm/subdev/therm/base.c
+++ b/drm/nouveau/nvkm/subdev/therm/base.c
@@ -32,18 +32,13 @@ nvkm_therm_temp_get(struct nvkm_therm *therm, int *val)
}
static int
-nvkm_therm_update_trip(struct nvkm_therm *therm)
+nvkm_therm_update_trip(struct nvkm_therm *therm, int temp)
{
- int temp, ret;
struct nvbios_therm_trip_point *trip = therm->fan->bios.trip,
*cur_trip = NULL,
*last_trip = therm->last_trip;
u16 duty, i;
- ret = therm->func->temp_get(therm, &temp);
- if (ret < 0)
- return ret;
-
/* look for the trip point corresponding to the current temperature */
cur_trip = NULL;
for (i = 0; i < therm->fan->bios.nr_fan_trip; i++) {
@@ -69,15 +64,10 @@ nvkm_therm_update_trip(struct nvkm_therm *therm)
static int
nvkm_therm_compute_linear_duty(struct nvkm_therm *therm, u8 linear_min_temp,
- u8 linear_max_temp)
+ u8 linear_max_temp, int temp)
{
- int temp, ret;
u16 duty;
- ret = therm->func->temp_get(therm, &temp);
- if (ret < 0)
- return ret;
-
/* handle the non-linear part first */
if (temp < linear_min_temp)
return therm->fan->bios.min_duty;
@@ -93,18 +83,18 @@ nvkm_therm_compute_linear_duty(struct nvkm_therm *therm, u8 linear_min_temp,
}
static int
-nvkm_therm_update_linear(struct nvkm_therm *therm)
+nvkm_therm_update_linear(struct nvkm_therm *therm, int temp)
{
u8 min = therm->fan->bios.linear_min_temp;
u8 max = therm->fan->bios.linear_max_temp;
- return nvkm_therm_compute_linear_duty(therm, min, max);
+ return nvkm_therm_compute_linear_duty(therm, min, max, temp);
}
static int
-nvkm_therm_update_linear_fallback(struct nvkm_therm *therm)
+nvkm_therm_update_linear_fallback(struct nvkm_therm *therm, int temp)
{
u8 max = therm->bios_sensor.thrs_fan_boost.temp;
- return nvkm_therm_compute_linear_duty(therm, 30, max);
+ return nvkm_therm_compute_linear_duty(therm, 30, max, temp);
}
static void
@@ -116,6 +106,10 @@ nvkm_therm_update(struct nvkm_therm *therm, int mode)
bool immd = true;
bool poll = true;
int duty = -1;
+ int temp;
+
+ if (nvkm_therm_temp_get(therm, &temp))
+ return;
spin_lock_irqsave(&therm->lock, flags);
if (mode < 0)
@@ -133,17 +127,17 @@ nvkm_therm_update(struct nvkm_therm *therm, int mode)
case NVKM_THERM_CTRL_AUTO:
switch(therm->fan->bios.fan_mode) {
case NVBIOS_THERM_FAN_TRIP:
- duty = nvkm_therm_update_trip(therm);
+ duty = nvkm_therm_update_trip(therm, temp);
break;
case NVBIOS_THERM_FAN_LINEAR:
- duty = nvkm_therm_update_linear(therm);
+ duty = nvkm_therm_update_linear(therm, temp);
break;
case NVBIOS_THERM_FAN_OTHER:
if (therm->cstate)
duty = therm->cstate;
else
- duty = nvkm_therm_update_linear_fallback(therm);
- poll = false;
+ duty = nvkm_therm_update_linear_fallback(therm,
+ temp);
break;
}
immd = false;
--
2.15.0
More information about the Nouveau
mailing list