diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 36 | 
1 files changed, 25 insertions, 11 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c index e7e9655c5623..e7f06bd0f0cd 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c @@ -563,24 +563,38 @@ void amdgpu_gfx_off_ctrl(struct amdgpu_device *adev, bool enable)  	mutex_lock(&adev->gfx.gfx_off_mutex); -	if (!enable) -		adev->gfx.gfx_off_req_count++; -	else if (adev->gfx.gfx_off_req_count > 0) +	if (enable) { +		/* If the count is already 0, it means there's an imbalance bug somewhere. +		 * Note that the bug may be in a different caller than the one which triggers the +		 * WARN_ON_ONCE. +		 */ +		if (WARN_ON_ONCE(adev->gfx.gfx_off_req_count == 0)) +			goto unlock; +  		adev->gfx.gfx_off_req_count--; -	if (enable && !adev->gfx.gfx_off_state && !adev->gfx.gfx_off_req_count) { -		schedule_delayed_work(&adev->gfx.gfx_off_delay_work, GFX_OFF_DELAY_ENABLE); -	} else if (!enable && adev->gfx.gfx_off_state) { -		if (!amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, false)) { -			adev->gfx.gfx_off_state = false; +		if (adev->gfx.gfx_off_req_count == 0 && !adev->gfx.gfx_off_state) +			schedule_delayed_work(&adev->gfx.gfx_off_delay_work, GFX_OFF_DELAY_ENABLE); +	} else { +		if (adev->gfx.gfx_off_req_count == 0) { +			cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work); + +			if (adev->gfx.gfx_off_state && +			    !amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, false)) { +				adev->gfx.gfx_off_state = false; -			if (adev->gfx.funcs->init_spm_golden) { -				dev_dbg(adev->dev, "GFXOFF is disabled, re-init SPM golden settings\n"); -				amdgpu_gfx_init_spm_golden(adev); +				if (adev->gfx.funcs->init_spm_golden) { +					dev_dbg(adev->dev, +						"GFXOFF is disabled, re-init SPM golden settings\n"); +					amdgpu_gfx_init_spm_golden(adev); +				}  			}  		} + +		adev->gfx.gfx_off_req_count++;  	} +unlock:  	mutex_unlock(&adev->gfx.gfx_off_mutex);  }  | 
