diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 65 | 
1 files changed, 59 insertions, 6 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index d8828a37e43a..71176f915457 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c @@ -269,8 +269,11 @@ static ssize_t amdgpu_get_dpm_forced_performance_level(struct device *dev,  	struct amdgpu_device *adev = ddev->dev_private;  	enum amd_dpm_forced_level level = 0xff; -	if  ((adev->flags & AMD_IS_PX) && -	     (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) +	if (amdgpu_sriov_vf(adev)) +		return 0; + +	if ((adev->flags & AMD_IS_PX) && +	    (ddev->switch_power_state != DRM_SWITCH_POWER_ON))  		return snprintf(buf, PAGE_SIZE, "off\n");  	if (is_support_sw_smu(adev)) @@ -308,10 +311,12 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev,  	     (ddev->switch_power_state != DRM_SWITCH_POWER_ON))  		return -EINVAL; -	if (is_support_sw_smu(adev)) -		current_level = smu_get_performance_level(&adev->smu); -	else if (adev->powerplay.pp_funcs->get_performance_level) -		current_level = amdgpu_dpm_get_performance_level(adev); +	if (!amdgpu_sriov_vf(adev)) { +		if (is_support_sw_smu(adev)) +			current_level = smu_get_performance_level(&adev->smu); +		else if (adev->powerplay.pp_funcs->get_performance_level) +			current_level = amdgpu_dpm_get_performance_level(adev); +	}  	if (strncmp("low", buf, strlen("low")) == 0) {  		level = AMD_DPM_FORCED_LEVEL_LOW; @@ -885,6 +890,9 @@ static ssize_t amdgpu_set_pp_dpm_sclk(struct device *dev,  	int ret;  	uint32_t mask = 0; +	if (amdgpu_sriov_vf(adev)) +		return 0; +  	ret = amdgpu_read_mask(buf, count, &mask);  	if (ret)  		return ret; @@ -907,6 +915,10 @@ static ssize_t amdgpu_get_pp_dpm_mclk(struct device *dev,  	struct drm_device *ddev = dev_get_drvdata(dev);  	struct amdgpu_device *adev = ddev->dev_private; +	if (amdgpu_sriov_vf(adev) && amdgim_is_hwperf(adev) && +	    adev->virt.ops->get_pp_clk) +		return adev->virt.ops->get_pp_clk(adev, PP_MCLK, buf); +  	if (is_support_sw_smu(adev))  		return smu_print_clk_levels(&adev->smu, PP_MCLK, buf);  	else if (adev->powerplay.pp_funcs->print_clock_levels) @@ -925,6 +937,9 @@ static ssize_t amdgpu_set_pp_dpm_mclk(struct device *dev,  	int ret;  	uint32_t mask = 0; +	if (amdgpu_sriov_vf(adev)) +		return 0; +  	ret = amdgpu_read_mask(buf, count, &mask);  	if (ret)  		return ret; @@ -2698,6 +2713,44 @@ void amdgpu_pm_print_power_states(struct amdgpu_device *adev)  } +int amdgpu_pm_virt_sysfs_init(struct amdgpu_device *adev) +{ +	int ret = 0; + +	if (!(amdgpu_sriov_vf(adev) && amdgim_is_hwperf(adev))) +		return ret; + +	ret = device_create_file(adev->dev, &dev_attr_pp_dpm_sclk); +	if (ret) { +		DRM_ERROR("failed to create device file pp_dpm_sclk\n"); +		return ret; +	} + +	ret = device_create_file(adev->dev, &dev_attr_pp_dpm_mclk); +	if (ret) { +		DRM_ERROR("failed to create device file pp_dpm_mclk\n"); +		return ret; +	} + +	ret = device_create_file(adev->dev, &dev_attr_power_dpm_force_performance_level); +	if (ret) { +		DRM_ERROR("failed to create device file for dpm state\n"); +		return ret; +	} + +	return ret; +} + +void amdgpu_pm_virt_sysfs_fini(struct amdgpu_device *adev) +{ +	if (!(amdgpu_sriov_vf(adev) && amdgim_is_hwperf(adev))) +		return; + +	device_remove_file(adev->dev, &dev_attr_power_dpm_force_performance_level); +	device_remove_file(adev->dev, &dev_attr_pp_dpm_sclk); +	device_remove_file(adev->dev, &dev_attr_pp_dpm_mclk); +} +  int amdgpu_pm_load_smu_firmware(struct amdgpu_device *adev, uint32_t *smu_version)  {  	int r = -EINVAL; | 
