diff options
Diffstat (limited to 'drivers/gpu/drm/amd/pm/amdgpu_pm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/pm/amdgpu_pm.c | 48 | 
1 files changed, 45 insertions, 3 deletions
| diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c b/drivers/gpu/drm/amd/pm/amdgpu_pm.c index ca2ece24e1e0..f3cb490fe79b 100644 --- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c @@ -1799,6 +1799,44 @@ static ssize_t amdgpu_set_apu_thermal_cap(struct device *dev,  	return count;  } +static int amdgpu_pm_metrics_attr_update(struct amdgpu_device *adev, +					 struct amdgpu_device_attr *attr, +					 uint32_t mask, +					 enum amdgpu_device_attr_states *states) +{ +	if (amdgpu_dpm_get_pm_metrics(adev, NULL, 0) == -EOPNOTSUPP) +		*states = ATTR_STATE_UNSUPPORTED; + +	return 0; +} + +static ssize_t amdgpu_get_pm_metrics(struct device *dev, +				     struct device_attribute *attr, char *buf) +{ +	struct drm_device *ddev = dev_get_drvdata(dev); +	struct amdgpu_device *adev = drm_to_adev(ddev); +	ssize_t size = 0; +	int ret; + +	if (amdgpu_in_reset(adev)) +		return -EPERM; +	if (adev->in_suspend && !adev->in_runpm) +		return -EPERM; + +	ret = pm_runtime_get_sync(ddev->dev); +	if (ret < 0) { +		pm_runtime_put_autosuspend(ddev->dev); +		return ret; +	} + +	size = amdgpu_dpm_get_pm_metrics(adev, buf, PAGE_SIZE); + +	pm_runtime_mark_last_busy(ddev->dev); +	pm_runtime_put_autosuspend(ddev->dev); + +	return size; +} +  /**   * DOC: gpu_metrics   * @@ -2096,6 +2134,8 @@ static struct amdgpu_device_attr amdgpu_device_attrs[] = {  	AMDGPU_DEVICE_ATTR_RW(smartshift_bias,				ATTR_FLAG_BASIC,  			      .attr_update = ss_bias_attr_update),  	AMDGPU_DEVICE_ATTR_RW(xgmi_plpd_policy,				ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RO(pm_metrics,				ATTR_FLAG_BASIC, +			      .attr_update = amdgpu_pm_metrics_attr_update),  };  static int default_attr_update(struct amdgpu_device *adev, struct amdgpu_device_attr *attr, @@ -2128,7 +2168,9 @@ static int default_attr_update(struct amdgpu_device *adev, struct amdgpu_device_  		if (amdgpu_dpm_is_overdrive_supported(adev))  			*states = ATTR_STATE_SUPPORTED;  	} else if (DEVICE_ATTR_IS(mem_busy_percent)) { -		if (adev->flags & AMD_IS_APU || gc_ver == IP_VERSION(9, 0, 1)) +		if ((adev->flags & AMD_IS_APU && +		     gc_ver != IP_VERSION(9, 4, 3)) || +		    gc_ver == IP_VERSION(9, 0, 1))  			*states = ATTR_STATE_UNSUPPORTED;  	} else if (DEVICE_ATTR_IS(pcie_bw)) {  		/* PCIe Perf counters won't work on APU nodes */ @@ -2198,10 +2240,10 @@ static int default_attr_update(struct amdgpu_device *adev, struct amdgpu_device_  	} else if (DEVICE_ATTR_IS(xgmi_plpd_policy)) {  		if (amdgpu_dpm_get_xgmi_plpd_mode(adev, NULL) == XGMI_PLPD_NONE)  			*states = ATTR_STATE_UNSUPPORTED; -	} else if (DEVICE_ATTR_IS(pp_dpm_mclk_od)) { +	} else if (DEVICE_ATTR_IS(pp_mclk_od)) {  		if (amdgpu_dpm_get_mclk_od(adev) == -EOPNOTSUPP)  			*states = ATTR_STATE_UNSUPPORTED; -	} else if (DEVICE_ATTR_IS(pp_dpm_sclk_od)) { +	} else if (DEVICE_ATTR_IS(pp_sclk_od)) {  		if (amdgpu_dpm_get_sclk_od(adev) == -EOPNOTSUPP)  			*states = ATTR_STATE_UNSUPPORTED;  	} else if (DEVICE_ATTR_IS(apu_thermal_cap)) { | 
