drm/nouveau/hwmon: return EINVAL if the GPU is powered down for sensors reads
authorKarol Herbst <kherbst@redhat.com>
Tue, 18 Jun 2019 11:01:33 +0000 (13:01 +0200)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 19 Jul 2019 06:26:51 +0000 (16:26 +1000)
fixes bogus values userspace gets from hwmon while the GPU is powered down

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Reviewed-by: Rhys Kidd <rhyskidd@gmail.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_hwmon.c

index 08a1ab6b150d00162300e9921d65adfa1ce05647..6af2d299c3f9ce78e41bfbb883d37b3f8a3f6bc6 100644 (file)
@@ -428,6 +428,8 @@ nouveau_temp_read(struct device *dev, u32 attr, int channel, long *val)
 
        switch (attr) {
        case hwmon_temp_input:
+               if (drm_dev->switch_power_state != DRM_SWITCH_POWER_ON)
+                       return -EINVAL;
                ret = nvkm_therm_temp_get(therm);
                *val = ret < 0 ? ret : (ret * 1000);
                break;
@@ -474,6 +476,8 @@ nouveau_fan_read(struct device *dev, u32 attr, int channel, long *val)
 
        switch (attr) {
        case hwmon_fan_input:
+               if (drm_dev->switch_power_state != DRM_SWITCH_POWER_ON)
+                       return -EINVAL;
                *val = nvkm_therm_fan_sense(therm);
                break;
        default:
@@ -496,6 +500,8 @@ nouveau_in_read(struct device *dev, u32 attr, int channel, long *val)
 
        switch (attr) {
        case hwmon_in_input:
+               if (drm_dev->switch_power_state != DRM_SWITCH_POWER_ON)
+                       return -EINVAL;
                ret = nvkm_volt_get(volt);
                *val = ret < 0 ? ret : (ret / 1000);
                break;
@@ -527,6 +533,8 @@ nouveau_pwm_read(struct device *dev, u32 attr, int channel, long *val)
                *val = therm->attr_get(therm, NVKM_THERM_ATTR_FAN_MODE);
                break;
        case hwmon_pwm_input:
+               if (drm_dev->switch_power_state != DRM_SWITCH_POWER_ON)
+                       return -EINVAL;
                *val = therm->fan_get(therm);
                break;
        default:
@@ -548,6 +556,8 @@ nouveau_power_read(struct device *dev, u32 attr, int channel, long *val)
 
        switch (attr) {
        case hwmon_power_input:
+               if (drm_dev->switch_power_state != DRM_SWITCH_POWER_ON)
+                       return -EINVAL;
                *val = nvkm_iccsense_read_all(iccsense);
                break;
        case hwmon_power_max: