Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 329685
b: refs/heads/master
c: 2f951a5
h: refs/heads/master
i:
  329683: 6c22378
v: v3
  • Loading branch information
Martin Peres authored and Ben Skeggs committed Oct 3, 2012
1 parent c666505 commit ac9266d
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 6 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c9cbf135065c0a674d43451127a10e48a53f9054
refs/heads/master: 2f951a5db5b55f65eb02d9a90aa7cecafde9f8b8
4 changes: 4 additions & 0 deletions trunk/drivers/gpu/drm/nouveau/core/subdev/therm/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ nouveau_therm_attr_get(struct nouveau_therm *therm,
return priv->bios_fan.min_duty;
case NOUVEAU_THERM_ATTR_FAN_MAX_DUTY:
return priv->bios_fan.max_duty;
case NOUVEAU_THERM_ATTR_FAN_MODE:
return priv->fan.mode;
case NOUVEAU_THERM_ATTR_THRS_FAN_BOOST:
return priv->bios_sensor.thrs_fan_boost.temp;
case NOUVEAU_THERM_ATTR_THRS_FAN_BOOST_HYST:
Expand Down Expand Up @@ -82,6 +84,8 @@ nouveau_therm_attr_set(struct nouveau_therm *therm,
value = priv->bios_fan.min_duty;
priv->bios_fan.max_duty = value;
return 0;
case NOUVEAU_THERM_ATTR_FAN_MODE:
return nouveau_therm_fan_set_mode(therm, value);
case NOUVEAU_THERM_ATTR_THRS_FAN_BOOST:
priv->bios_sensor.thrs_fan_boost.temp = value;
return 0;
Expand Down
52 changes: 51 additions & 1 deletion trunk/drivers/gpu/drm/nouveau/core/subdev/therm/fan.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ nouveau_therm_fan_set(struct nouveau_therm *therm, int percent)
u32 divs, duty;
int ret;

if (priv->fan.mode == FAN_CONTROL_NONE)
return -EINVAL;

if (!priv->fan.pwm_set)
return -ENODEV;

Expand Down Expand Up @@ -138,7 +141,52 @@ nouveau_therm_fan_sense(struct nouveau_therm *therm)
return 0;
}

static void
int
nouveau_therm_fan_set_mode(struct nouveau_therm *therm,
enum nouveau_therm_fan_mode mode)
{
struct nouveau_therm_priv *priv = (void *)therm;

if (priv->fan.mode == mode)
return 0;

if (mode < FAN_CONTROL_NONE || mode >= FAN_CONTROL_NR)
return -EINVAL;

switch (mode)
{
case FAN_CONTROL_NONE:
nv_info(therm, "switch fan to no-control mode\n");
break;
case FAN_CONTROL_MANUAL:
nv_info(therm, "switch fan to manual mode\n");
break;
case FAN_CONTROL_NR:
break;
}

priv->fan.mode = mode;
return 0;
}

int
nouveau_therm_fan_user_get(struct nouveau_therm *therm)
{
return nouveau_therm_fan_get(therm);
}

int
nouveau_therm_fan_user_set(struct nouveau_therm *therm, int percent)
{
struct nouveau_therm_priv *priv = (void *)therm;

if (priv->fan.mode != FAN_CONTROL_MANUAL)
return -EINVAL;

return nouveau_therm_fan_set(therm, percent);
}

void
nouveau_therm_fan_set_defaults(struct nouveau_therm *therm)
{
struct nouveau_therm_priv *priv = (void *)therm;
Expand Down Expand Up @@ -180,5 +228,7 @@ nouveau_therm_fan_ctor(struct nouveau_therm *therm)
nv_error(therm, "parsing the thermal table failed\n");
nouveau_therm_fan_safety_checks(therm);

nouveau_therm_fan_set_mode(therm, FAN_CONTROL_NONE);

return 0;
}
4 changes: 2 additions & 2 deletions trunk/drivers/gpu/drm/nouveau/core/subdev/therm/nv40.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,8 @@ nv40_therm_ctor(struct nouveau_object *parent,
priv->fan.pwm_set = nv40_fan_pwm_set;

therm->temp_get = nv40_temp_get;
therm->fan_get = nouveau_therm_fan_get;
therm->fan_set = nouveau_therm_fan_set;
therm->fan_get = nouveau_therm_fan_user_get;
therm->fan_set = nouveau_therm_fan_user_set;
therm->fan_sense = nouveau_therm_fan_sense;
therm->attr_get = nouveau_therm_attr_get;
therm->attr_set = nouveau_therm_attr_set;
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/gpu/drm/nouveau/core/subdev/therm/nv50.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,8 @@ nv50_therm_ctor(struct nouveau_object *parent,
priv->fan.pwm_clock = nv50_fan_pwm_clock;

therm->temp_get = nv50_temp_get;
therm->fan_get = nouveau_therm_fan_get;
therm->fan_set = nouveau_therm_fan_set;
therm->fan_get = nouveau_therm_fan_user_get;
therm->fan_set = nouveau_therm_fan_user_set;
therm->fan_sense = nouveau_therm_fan_sense;
therm->attr_get = nouveau_therm_attr_get;
therm->attr_set = nouveau_therm_attr_set;
Expand Down
6 changes: 6 additions & 0 deletions trunk/drivers/gpu/drm/nouveau/core/subdev/therm/priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ struct nouveau_therm_priv {

/* fan priv */
struct {
enum nouveau_therm_fan_mode mode;
int percent;

int (*pwm_get)(struct nouveau_therm *, int line, u32*, u32*);
Expand All @@ -63,5 +64,10 @@ int nouveau_therm_sensor_ctor(struct nouveau_therm *therm);
int nouveau_therm_fan_ctor(struct nouveau_therm *therm);
int nouveau_therm_fan_get(struct nouveau_therm *therm);
int nouveau_therm_fan_set(struct nouveau_therm *therm, int percent);
int nouveau_therm_fan_user_get(struct nouveau_therm *therm);
int nouveau_therm_fan_user_set(struct nouveau_therm *therm, int percent);
int nouveau_therm_fan_set_mode(struct nouveau_therm *therm,
enum nouveau_therm_fan_mode mode);


int nouveau_therm_fan_sense(struct nouveau_therm *therm);
40 changes: 40 additions & 0 deletions trunk/drivers/gpu/drm/nouveau/nouveau_pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -503,6 +503,45 @@ nouveau_hwmon_show_fan0_input(struct device *d, struct device_attribute *attr,
static SENSOR_DEVICE_ATTR(fan0_input, S_IRUGO, nouveau_hwmon_show_fan0_input,
NULL, 0);

static ssize_t
nouveau_hwmon_get_pwm1_enable(struct device *d,
struct device_attribute *a, char *buf)
{
struct drm_device *dev = dev_get_drvdata(d);
struct nouveau_drm *drm = nouveau_drm(dev);
struct nouveau_therm *therm = nouveau_therm(drm->device);
int ret;

ret = therm->attr_get(therm, NOUVEAU_THERM_ATTR_FAN_MODE);
if (ret < 0)
return ret;

return sprintf(buf, "%i\n", ret);
}

static ssize_t
nouveau_hwmon_set_pwm1_enable(struct device *d, struct device_attribute *a,
const char *buf, size_t count)
{
struct drm_device *dev = dev_get_drvdata(d);
struct nouveau_drm *drm = nouveau_drm(dev);
struct nouveau_therm *therm = nouveau_therm(drm->device);
long value;
int ret;

if (strict_strtol(buf, 10, &value) == -EINVAL)
return -EINVAL;

ret = therm->attr_set(therm, NOUVEAU_THERM_ATTR_FAN_MODE, value);
if (ret)
return ret;
else
return count;
}
static SENSOR_DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR,
nouveau_hwmon_get_pwm1_enable,
nouveau_hwmon_set_pwm1_enable, 0);

static ssize_t
nouveau_hwmon_get_pwm1(struct device *d, struct device_attribute *a, char *buf)
{
Expand Down Expand Up @@ -638,6 +677,7 @@ static struct attribute *hwmon_fan_rpm_attributes[] = {
NULL
};
static struct attribute *hwmon_pwm_fan_attributes[] = {
&sensor_dev_attr_pwm1_enable.dev_attr.attr,
&sensor_dev_attr_pwm1.dev_attr.attr,
&sensor_dev_attr_pwm1_min.dev_attr.attr,
&sensor_dev_attr_pwm1_max.dev_attr.attr,
Expand Down

0 comments on commit ac9266d

Please sign in to comment.