drm/nouveau/hwmon: add missing alarm thresholds
Expose all the hysteresis parameters + shutdown (emergency) + fan_boost (fixed pwm trip point). Signed-off-by: Martin Peres <martin.peres@labri.fr> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
Родитель
0083b91dac
Коммит
12e32896f7
|
@ -408,6 +408,81 @@ nouveau_hwmon_show_temp(struct device *d, struct device_attribute *a, char *buf)
|
|||
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, nouveau_hwmon_show_temp,
|
||||
NULL, 0);
|
||||
|
||||
static ssize_t
|
||||
nouveau_hwmon_show_temp1_auto_point1_pwm(struct device *d,
|
||||
struct device_attribute *a, char *buf)
|
||||
{
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n", 100);
|
||||
}
|
||||
static SENSOR_DEVICE_ATTR(temp1_auto_point1_pwm, S_IRUGO,
|
||||
nouveau_hwmon_show_temp1_auto_point1_pwm, NULL, 0);
|
||||
|
||||
static ssize_t
|
||||
nouveau_hwmon_temp1_auto_point1_temp(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);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n",
|
||||
therm->attr_get(therm, NOUVEAU_THERM_ATTR_THRS_FAN_BOOST) * 1000);
|
||||
}
|
||||
static ssize_t
|
||||
nouveau_hwmon_set_temp1_auto_point1_temp(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;
|
||||
|
||||
if (kstrtol(buf, 10, &value) == -EINVAL)
|
||||
return count;
|
||||
|
||||
therm->attr_set(therm, NOUVEAU_THERM_ATTR_THRS_FAN_BOOST,
|
||||
value / 1000);
|
||||
|
||||
return count;
|
||||
}
|
||||
static SENSOR_DEVICE_ATTR(temp1_auto_point1_temp, S_IRUGO | S_IWUSR,
|
||||
nouveau_hwmon_temp1_auto_point1_temp,
|
||||
nouveau_hwmon_set_temp1_auto_point1_temp, 0);
|
||||
|
||||
static ssize_t
|
||||
nouveau_hwmon_temp1_auto_point1_temp_hyst(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);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n",
|
||||
therm->attr_get(therm, NOUVEAU_THERM_ATTR_THRS_FAN_BOOST_HYST) * 1000);
|
||||
}
|
||||
static ssize_t
|
||||
nouveau_hwmon_set_temp1_auto_point1_temp_hyst(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;
|
||||
|
||||
if (kstrtol(buf, 10, &value) == -EINVAL)
|
||||
return count;
|
||||
|
||||
therm->attr_set(therm, NOUVEAU_THERM_ATTR_THRS_FAN_BOOST_HYST,
|
||||
value / 1000);
|
||||
|
||||
return count;
|
||||
}
|
||||
static SENSOR_DEVICE_ATTR(temp1_auto_point1_temp_hyst, S_IRUGO | S_IWUSR,
|
||||
nouveau_hwmon_temp1_auto_point1_temp_hyst,
|
||||
nouveau_hwmon_set_temp1_auto_point1_temp_hyst, 0);
|
||||
|
||||
static ssize_t
|
||||
nouveau_hwmon_max_temp(struct device *d, struct device_attribute *a, char *buf)
|
||||
{
|
||||
|
@ -438,6 +513,38 @@ static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR, nouveau_hwmon_max_temp,
|
|||
nouveau_hwmon_set_max_temp,
|
||||
0);
|
||||
|
||||
static ssize_t
|
||||
nouveau_hwmon_max_temp_hyst(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);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n",
|
||||
therm->attr_get(therm, NOUVEAU_THERM_ATTR_THRS_DOWN_CLK_HYST) * 1000);
|
||||
}
|
||||
static ssize_t
|
||||
nouveau_hwmon_set_max_temp_hyst(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;
|
||||
|
||||
if (kstrtol(buf, 10, &value) == -EINVAL)
|
||||
return count;
|
||||
|
||||
therm->attr_set(therm, NOUVEAU_THERM_ATTR_THRS_DOWN_CLK_HYST,
|
||||
value / 1000);
|
||||
|
||||
return count;
|
||||
}
|
||||
static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
|
||||
nouveau_hwmon_max_temp_hyst,
|
||||
nouveau_hwmon_set_max_temp_hyst, 0);
|
||||
|
||||
static ssize_t
|
||||
nouveau_hwmon_critical_temp(struct device *d, struct device_attribute *a,
|
||||
char *buf)
|
||||
|
@ -471,6 +578,107 @@ static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO | S_IWUSR,
|
|||
nouveau_hwmon_set_critical_temp,
|
||||
0);
|
||||
|
||||
static ssize_t
|
||||
nouveau_hwmon_critical_temp_hyst(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);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n",
|
||||
therm->attr_get(therm, NOUVEAU_THERM_ATTR_THRS_CRITICAL_HYST) * 1000);
|
||||
}
|
||||
static ssize_t
|
||||
nouveau_hwmon_set_critical_temp_hyst(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;
|
||||
|
||||
if (kstrtol(buf, 10, &value) == -EINVAL)
|
||||
return count;
|
||||
|
||||
therm->attr_set(therm, NOUVEAU_THERM_ATTR_THRS_CRITICAL_HYST,
|
||||
value / 1000);
|
||||
|
||||
return count;
|
||||
}
|
||||
static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IRUGO | S_IWUSR,
|
||||
nouveau_hwmon_critical_temp_hyst,
|
||||
nouveau_hwmon_set_critical_temp_hyst, 0);
|
||||
static ssize_t
|
||||
nouveau_hwmon_emergency_temp(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);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n",
|
||||
therm->attr_get(therm, NOUVEAU_THERM_ATTR_THRS_SHUTDOWN) * 1000);
|
||||
}
|
||||
static ssize_t
|
||||
nouveau_hwmon_set_emergency_temp(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;
|
||||
|
||||
if (kstrtol(buf, 10, &value) == -EINVAL)
|
||||
return count;
|
||||
|
||||
therm->attr_set(therm, NOUVEAU_THERM_ATTR_THRS_SHUTDOWN, value / 1000);
|
||||
|
||||
return count;
|
||||
}
|
||||
static SENSOR_DEVICE_ATTR(temp1_emergency, S_IRUGO | S_IWUSR,
|
||||
nouveau_hwmon_emergency_temp,
|
||||
nouveau_hwmon_set_emergency_temp,
|
||||
0);
|
||||
|
||||
static ssize_t
|
||||
nouveau_hwmon_emergency_temp_hyst(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);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n",
|
||||
therm->attr_get(therm, NOUVEAU_THERM_ATTR_THRS_SHUTDOWN_HYST) * 1000);
|
||||
}
|
||||
static ssize_t
|
||||
nouveau_hwmon_set_emergency_temp_hyst(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;
|
||||
|
||||
if (kstrtol(buf, 10, &value) == -EINVAL)
|
||||
return count;
|
||||
|
||||
therm->attr_set(therm, NOUVEAU_THERM_ATTR_THRS_SHUTDOWN_HYST,
|
||||
value / 1000);
|
||||
|
||||
return count;
|
||||
}
|
||||
static SENSOR_DEVICE_ATTR(temp1_emergency_hyst, S_IRUGO | S_IWUSR,
|
||||
nouveau_hwmon_emergency_temp_hyst,
|
||||
nouveau_hwmon_set_emergency_temp_hyst,
|
||||
0);
|
||||
|
||||
static ssize_t nouveau_hwmon_show_name(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
|
@ -665,8 +873,15 @@ static SENSOR_DEVICE_ATTR(pwm1_max, S_IRUGO | S_IWUSR,
|
|||
|
||||
static struct attribute *hwmon_attributes[] = {
|
||||
&sensor_dev_attr_temp1_input.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_auto_point1_pwm.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_auto_point1_temp.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_auto_point1_temp_hyst.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_max.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_crit.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_crit_hyst.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_emergency.dev_attr.attr,
|
||||
&sensor_dev_attr_temp1_emergency_hyst.dev_attr.attr,
|
||||
&sensor_dev_attr_name.dev_attr.attr,
|
||||
&sensor_dev_attr_update_rate.dev_attr.attr,
|
||||
NULL
|
||||
|
|
Загрузка…
Ссылка в новой задаче