diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/si_dpm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/si_dpm.c | 55 | 
1 files changed, 45 insertions, 10 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c b/drivers/gpu/drm/amd/amdgpu/si_dpm.c index 8bd08925b370..d6f85b1a0b93 100644 --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c @@ -3477,6 +3477,49 @@ static void si_apply_state_adjust_rules(struct amdgpu_device *adev,  	int i;  	struct si_dpm_quirk *p = si_dpm_quirk_list; +	/* limit all SI kickers */ +	if (adev->asic_type == CHIP_PITCAIRN) { +		if ((adev->pdev->revision == 0x81) || +		    (adev->pdev->device == 0x6810) || +		    (adev->pdev->device == 0x6811) || +		    (adev->pdev->device == 0x6816) || +		    (adev->pdev->device == 0x6817) || +		    (adev->pdev->device == 0x6806)) +			max_mclk = 120000; +	} else if (adev->asic_type == CHIP_VERDE) { +		if ((adev->pdev->revision == 0x81) || +		    (adev->pdev->revision == 0x83) || +		    (adev->pdev->revision == 0x87) || +		    (adev->pdev->device == 0x6820) || +		    (adev->pdev->device == 0x6821) || +		    (adev->pdev->device == 0x6822) || +		    (adev->pdev->device == 0x6823) || +		    (adev->pdev->device == 0x682A) || +		    (adev->pdev->device == 0x682B)) { +			max_sclk = 75000; +			max_mclk = 80000; +		} +	} else if (adev->asic_type == CHIP_OLAND) { +		if ((adev->pdev->revision == 0xC7) || +		    (adev->pdev->revision == 0x80) || +		    (adev->pdev->revision == 0x81) || +		    (adev->pdev->revision == 0x83) || +		    (adev->pdev->device == 0x6604) || +		    (adev->pdev->device == 0x6605)) { +			max_sclk = 75000; +			max_mclk = 80000; +		} +	} else if (adev->asic_type == CHIP_HAINAN) { +		if ((adev->pdev->revision == 0x81) || +		    (adev->pdev->revision == 0x83) || +		    (adev->pdev->revision == 0xC3) || +		    (adev->pdev->device == 0x6664) || +		    (adev->pdev->device == 0x6665) || +		    (adev->pdev->device == 0x6667)) { +			max_sclk = 75000; +			max_mclk = 80000; +		} +	}  	/* Apply dpm quirks */  	while (p && p->chip_device != 0) {  		if (adev->pdev->vendor == p->chip_vendor && @@ -3489,16 +3532,6 @@ static void si_apply_state_adjust_rules(struct amdgpu_device *adev,  		}  		++p;  	} -	/* limit mclk on all R7 370 parts for stability */ -	if (adev->pdev->device == 0x6811 && -	    adev->pdev->revision == 0x81) -		max_mclk = 120000; -	/* limit sclk/mclk on Jet parts for stability */ -	if (adev->pdev->device == 0x6665 && -	    adev->pdev->revision == 0xc3) { -		max_sclk = 75000; -		max_mclk = 80000; -	}  	if (rps->vce_active) {  		rps->evclk = adev->pm.dpm.vce_states[adev->pm.dpm.vce_level].evclk; @@ -7771,6 +7804,8 @@ static int si_dpm_sw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	flush_work(&adev->pm.dpm.thermal.work); +  	mutex_lock(&adev->pm.mutex);  	amdgpu_pm_sysfs_fini(adev);  	si_dpm_fini(adev);  |