diff options
| author | Alex Deucher <alexander.deucher@amd.com> | 2018-01-25 01:19:33 +0300 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2018-02-19 22:18:49 +0300 | 
| commit | 2bd376bf8f4db03f30ea9d9832a75bc29c2e6e6a (patch) | |
| tree | f6024d1799cc7e774baf2727dd06a60a5320c952 /drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | |
| parent | 5ec36e2d7030c17bd00c9766f9b97b421eae8cdf (diff) | |
| download | linux-2bd376bf8f4db03f30ea9d9832a75bc29c2e6e6a.tar.xz | |
drm/amdgpu/pm: report gpu voltages via hwmon API
Expose vddgfx and vddnb via hwmon.
Acked-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Rex Zhu <Rex.Zhu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 82 | 
1 files changed, 82 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index 18873c2286f9..eaf91d0e831e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c @@ -1096,6 +1096,80 @@ static ssize_t amdgpu_hwmon_get_fan1_input(struct device *dev,  	return sprintf(buf, "%i\n", speed);  } +static ssize_t amdgpu_hwmon_show_vddgfx(struct device *dev, +					struct device_attribute *attr, +					char *buf) +{ +	struct amdgpu_device *adev = dev_get_drvdata(dev); +	struct drm_device *ddev = adev->ddev; +	u32 vddgfx; +	int r, size = sizeof(vddgfx); + +	/* Can't get voltage when the card is off */ +	if  ((adev->flags & AMD_IS_PX) && +	     (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) +		return -EINVAL; + +	/* sanity check PP is enabled */ +	if (!(adev->powerplay.pp_funcs && +	      adev->powerplay.pp_funcs->read_sensor)) +	      return -EINVAL; + +	/* get the voltage */ +	r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_VDDGFX, +				   (void *)&vddgfx, &size); +	if (r) +		return r; + +	return snprintf(buf, PAGE_SIZE, "%d\n", vddgfx); +} + +static ssize_t amdgpu_hwmon_show_vddgfx_label(struct device *dev, +					      struct device_attribute *attr, +					      char *buf) +{ +	return snprintf(buf, PAGE_SIZE, "vddgfx\n"); +} + +static ssize_t amdgpu_hwmon_show_vddnb(struct device *dev, +				       struct device_attribute *attr, +				       char *buf) +{ +	struct amdgpu_device *adev = dev_get_drvdata(dev); +	struct drm_device *ddev = adev->ddev; +	u32 vddnb; +	int r, size = sizeof(vddnb); + +	/* only APUs have vddnb */ +	if  (adev->flags & AMD_IS_APU) +		return -EINVAL; + +	/* Can't get voltage when the card is off */ +	if  ((adev->flags & AMD_IS_PX) && +	     (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) +		return -EINVAL; + +	/* sanity check PP is enabled */ +	if (!(adev->powerplay.pp_funcs && +	      adev->powerplay.pp_funcs->read_sensor)) +	      return -EINVAL; + +	/* get the voltage */ +	r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_VDDNB, +				   (void *)&vddnb, &size); +	if (r) +		return r; + +	return snprintf(buf, PAGE_SIZE, "%d\n", vddnb); +} + +static ssize_t amdgpu_hwmon_show_vddnb_label(struct device *dev, +					      struct device_attribute *attr, +					      char *buf) +{ +	return snprintf(buf, PAGE_SIZE, "vddnb\n"); +} +  static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, amdgpu_hwmon_show_temp, NULL, 0);  static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, amdgpu_hwmon_show_temp_thresh, NULL, 0);  static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IRUGO, amdgpu_hwmon_show_temp_thresh, NULL, 1); @@ -1104,6 +1178,10 @@ static SENSOR_DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR, amdgpu_hwmon_get_pwm1_  static SENSOR_DEVICE_ATTR(pwm1_min, S_IRUGO, amdgpu_hwmon_get_pwm1_min, NULL, 0);  static SENSOR_DEVICE_ATTR(pwm1_max, S_IRUGO, amdgpu_hwmon_get_pwm1_max, NULL, 0);  static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, amdgpu_hwmon_get_fan1_input, NULL, 0); +static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, amdgpu_hwmon_show_vddgfx, NULL, 0); +static SENSOR_DEVICE_ATTR(in0_label, S_IRUGO, amdgpu_hwmon_show_vddgfx_label, NULL, 0); +static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, amdgpu_hwmon_show_vddnb, NULL, 0); +static SENSOR_DEVICE_ATTR(in1_label, S_IRUGO, amdgpu_hwmon_show_vddnb_label, NULL, 0);  static struct attribute *hwmon_attributes[] = {  	&sensor_dev_attr_temp1_input.dev_attr.attr, @@ -1114,6 +1192,10 @@ static struct attribute *hwmon_attributes[] = {  	&sensor_dev_attr_pwm1_min.dev_attr.attr,  	&sensor_dev_attr_pwm1_max.dev_attr.attr,  	&sensor_dev_attr_fan1_input.dev_attr.attr, +	&sensor_dev_attr_in0_input.dev_attr.attr, +	&sensor_dev_attr_in0_label.dev_attr.attr, +	&sensor_dev_attr_in1_input.dev_attr.attr, +	&sensor_dev_attr_in1_label.dev_attr.attr,  	NULL  }; | 
