Browse Source

drm/nouveau/therm: add hook for clk to suggest fanspeed to therm

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Ben Skeggs 12 years ago
parent
commit
6387e2cbdc

+ 1 - 1
drivers/gpu/drm/nouveau/core/include/core/device.h

@@ -35,8 +35,8 @@ enum nv_subdev_type {
 	NVDEV_SUBDEV_BAR,
 	NVDEV_SUBDEV_PWR,
 	NVDEV_SUBDEV_VOLT,
-	NVDEV_SUBDEV_CLOCK,
 	NVDEV_SUBDEV_THERM,
+	NVDEV_SUBDEV_CLOCK,
 
 	NVDEV_ENGINE_DMAOBJ,
 	NVDEV_ENGINE_FIFO,

+ 2 - 0
drivers/gpu/drm/nouveau/core/include/subdev/therm.h

@@ -71,6 +71,8 @@ void _nouveau_therm_dtor(struct nouveau_object *);
 int  _nouveau_therm_init(struct nouveau_object *);
 int  _nouveau_therm_fini(struct nouveau_object *, bool);
 
+int  nouveau_therm_cstate(struct nouveau_therm *, int, int);
+
 extern struct nouveau_oclass nv40_therm_oclass;
 extern struct nouveau_oclass nv50_therm_oclass;
 extern struct nouveau_oclass nv84_therm_oclass;

+ 13 - 0
drivers/gpu/drm/nouveau/core/subdev/therm/base.c

@@ -127,6 +127,19 @@ done:
 	spin_unlock_irqrestore(&priv->lock, flags);
 }
 
+int
+nouveau_therm_cstate(struct nouveau_therm *ptherm, int fan, int dir)
+{
+	struct nouveau_therm_priv *priv = (void *)ptherm;
+	if (!dir || (dir < 0 && fan < priv->cstate) ||
+		    (dir > 0 && fan > priv->cstate)) {
+		nv_debug(ptherm, "default fan speed -> %d%%\n", fan);
+		priv->cstate = fan;
+		nouveau_therm_update(ptherm, -1);
+	}
+	return 0;
+}
+
 static void
 nouveau_therm_alarm(struct nouveau_alarm *alarm)
 {

+ 1 - 0
drivers/gpu/drm/nouveau/core/subdev/therm/priv.h

@@ -76,6 +76,7 @@ struct nouveau_therm_priv {
 	spinlock_t lock;
 	struct nouveau_therm_trip_point *last_trip;
 	int mode;
+	int cstate;
 	int suspend;
 
 	/* bios */