Commit e95a14a9 authored by Tom St Denis's avatar Tom St Denis Committed by Alex Deucher
Browse files

drm/amd/amdgpu: add mutex locking for both DPM and PP based powergating for UVD/VCE



This adds a mutex lock for both DPM/PP around the changes in
power gating state so that userspace can poll registers without
a race condition on power state.

Signed-off-by: default avatarTom St Denis <tom.stdenis@amd.com>
Reviewed-by: default avatarRex Zhu <Rex.Zhu@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 70bb2461
Loading
Loading
Loading
Loading
+25 −33
Original line number Diff line number Diff line
@@ -1106,12 +1106,9 @@ force:

void amdgpu_dpm_enable_uvd(struct amdgpu_device *adev, bool enable)
{
	if (adev->pp_enabled)
		amdgpu_dpm_powergate_uvd(adev, !enable);
	else {
		if (adev->pm.funcs->powergate_uvd) {
			mutex_lock(&adev->pm.mutex);
	if (adev->pp_enabled || adev->pm.funcs->powergate_uvd) {
		/* enable/disable UVD */
		mutex_lock(&adev->pm.mutex);
		amdgpu_dpm_powergate_uvd(adev, !enable);
		mutex_unlock(&adev->pm.mutex);
	} else {
@@ -1127,16 +1124,12 @@ void amdgpu_dpm_enable_uvd(struct amdgpu_device *adev, bool enable)
		}
		amdgpu_pm_compute_clocks(adev);
	}

	}
}

void amdgpu_dpm_enable_vce(struct amdgpu_device *adev, bool enable)
{
	if (adev->pp_enabled)
		amdgpu_dpm_powergate_vce(adev, !enable);
	else {
		if (adev->pm.funcs->powergate_vce) {
	if (adev->pp_enabled || adev->pm.funcs->powergate_vce) {
		/* enable/disable VCE */
		mutex_lock(&adev->pm.mutex);
		amdgpu_dpm_powergate_vce(adev, !enable);
		mutex_unlock(&adev->pm.mutex);
@@ -1155,7 +1148,6 @@ void amdgpu_dpm_enable_vce(struct amdgpu_device *adev, bool enable)
		amdgpu_pm_compute_clocks(adev);
	}
}
}

void amdgpu_pm_print_power_states(struct amdgpu_device *adev)
{