diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 34 | 
1 files changed, 34 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index eaf91d0e831e..17f9f3ad9bd1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c @@ -1170,6 +1170,38 @@ static ssize_t amdgpu_hwmon_show_vddnb_label(struct device *dev,  	return snprintf(buf, PAGE_SIZE, "vddnb\n");  } +static ssize_t amdgpu_hwmon_show_power_avg(struct device *dev, +					   struct device_attribute *attr, +					   char *buf) +{ +	struct amdgpu_device *adev = dev_get_drvdata(dev); +	struct drm_device *ddev = adev->ddev; +	struct pp_gpu_power query = {0}; +	int r, size = sizeof(query); +	unsigned uw; + +	/* Can't get power 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_GPU_POWER, +				   (void *)&query, &size); +	if (r) +		return r; + +	/* convert to microwatts */ +	uw = (query.average_gpu_power >> 8) * 1000000; + +	return snprintf(buf, PAGE_SIZE, "%u\n", uw); +} +  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); @@ -1182,6 +1214,7 @@ 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 SENSOR_DEVICE_ATTR(power1_average, S_IRUGO, amdgpu_hwmon_show_power_avg, NULL, 0);  static struct attribute *hwmon_attributes[] = {  	&sensor_dev_attr_temp1_input.dev_attr.attr, @@ -1196,6 +1229,7 @@ static struct attribute *hwmon_attributes[] = {  	&sensor_dev_attr_in0_label.dev_attr.attr,  	&sensor_dev_attr_in1_input.dev_attr.attr,  	&sensor_dev_attr_in1_label.dev_attr.attr, +	&sensor_dev_attr_power1_average.dev_attr.attr,  	NULL  }; | 
