diff options
| author | Alex Deucher <alexander.deucher@amd.com> | 2016-10-26 15:27:45 -0400 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2016-10-27 13:59:24 -0400 |
| commit | 71451bdfc2f7bc67cf0b7a5d51bc1489aaa55701 (patch) | |
| tree | a3aca04cbee110e65853f5df9f4dd83deb0a10ee /drivers/gpu/drm/amd/amdgpu | |
| parent | 7dc86ef5ac91642dfc3eb93ee0f0458e702a343e (diff) | |
drm/amdgpu/si_dpm: workaround for SI kickers
Consolidate existing quirks. Fixes stability issues
on some kickers.
Acked-by: Huang Rui <ray.huang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/si_dpm.c | 59 |
1 files changed, 43 insertions, 16 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c b/drivers/gpu/drm/amd/amdgpu/si_dpm.c index ee77e9cb55b1..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, | |||
| 3477 | int i; | 3477 | int i; |
| 3478 | struct si_dpm_quirk *p = si_dpm_quirk_list; | 3478 | struct si_dpm_quirk *p = si_dpm_quirk_list; |
| 3479 | 3479 | ||
| 3480 | /* limit all SI kickers */ | ||
| 3481 | if (adev->asic_type == CHIP_PITCAIRN) { | ||
| 3482 | if ((adev->pdev->revision == 0x81) || | ||
| 3483 | (adev->pdev->device == 0x6810) || | ||
| 3484 | (adev->pdev->device == 0x6811) || | ||
| 3485 | (adev->pdev->device == 0x6816) || | ||
| 3486 | (adev->pdev->device == 0x6817) || | ||
| 3487 | (adev->pdev->device == 0x6806)) | ||
| 3488 | max_mclk = 120000; | ||
| 3489 | } else if (adev->asic_type == CHIP_VERDE) { | ||
| 3490 | if ((adev->pdev->revision == 0x81) || | ||
| 3491 | (adev->pdev->revision == 0x83) || | ||
| 3492 | (adev->pdev->revision == 0x87) || | ||
| 3493 | (adev->pdev->device == 0x6820) || | ||
| 3494 | (adev->pdev->device == 0x6821) || | ||
| 3495 | (adev->pdev->device == 0x6822) || | ||
| 3496 | (adev->pdev->device == 0x6823) || | ||
| 3497 | (adev->pdev->device == 0x682A) || | ||
| 3498 | (adev->pdev->device == 0x682B)) { | ||
| 3499 | max_sclk = 75000; | ||
| 3500 | max_mclk = 80000; | ||
| 3501 | } | ||
| 3502 | } else if (adev->asic_type == CHIP_OLAND) { | ||
| 3503 | if ((adev->pdev->revision == 0xC7) || | ||
| 3504 | (adev->pdev->revision == 0x80) || | ||
| 3505 | (adev->pdev->revision == 0x81) || | ||
| 3506 | (adev->pdev->revision == 0x83) || | ||
| 3507 | (adev->pdev->device == 0x6604) || | ||
| 3508 | (adev->pdev->device == 0x6605)) { | ||
| 3509 | max_sclk = 75000; | ||
| 3510 | max_mclk = 80000; | ||
| 3511 | } | ||
| 3512 | } else if (adev->asic_type == CHIP_HAINAN) { | ||
| 3513 | if ((adev->pdev->revision == 0x81) || | ||
| 3514 | (adev->pdev->revision == 0x83) || | ||
| 3515 | (adev->pdev->revision == 0xC3) || | ||
| 3516 | (adev->pdev->device == 0x6664) || | ||
| 3517 | (adev->pdev->device == 0x6665) || | ||
| 3518 | (adev->pdev->device == 0x6667)) { | ||
| 3519 | max_sclk = 75000; | ||
| 3520 | max_mclk = 80000; | ||
| 3521 | } | ||
| 3522 | } | ||
| 3480 | /* Apply dpm quirks */ | 3523 | /* Apply dpm quirks */ |
| 3481 | while (p && p->chip_device != 0) { | 3524 | while (p && p->chip_device != 0) { |
| 3482 | if (adev->pdev->vendor == p->chip_vendor && | 3525 | if (adev->pdev->vendor == p->chip_vendor && |
| @@ -3489,22 +3532,6 @@ static void si_apply_state_adjust_rules(struct amdgpu_device *adev, | |||
| 3489 | } | 3532 | } |
| 3490 | ++p; | 3533 | ++p; |
| 3491 | } | 3534 | } |
| 3492 | /* limit mclk on all R7 370 parts for stability */ | ||
| 3493 | if (adev->pdev->device == 0x6811 && | ||
| 3494 | adev->pdev->revision == 0x81) | ||
| 3495 | max_mclk = 120000; | ||
| 3496 | /* limit sclk/mclk on Jet parts for stability */ | ||
| 3497 | if (adev->pdev->device == 0x6665 && | ||
| 3498 | adev->pdev->revision == 0xc3) { | ||
| 3499 | max_sclk = 75000; | ||
| 3500 | max_mclk = 80000; | ||
| 3501 | } | ||
| 3502 | /* Limit clocks for some HD8600 parts */ | ||
| 3503 | if (adev->pdev->device == 0x6660 && | ||
| 3504 | adev->pdev->revision == 0x83) { | ||
| 3505 | max_sclk = 75000; | ||
| 3506 | max_mclk = 80000; | ||
| 3507 | } | ||
| 3508 | 3535 | ||
| 3509 | if (rps->vce_active) { | 3536 | if (rps->vce_active) { |
| 3510 | rps->evclk = adev->pm.dpm.vce_states[adev->pm.dpm.vce_level].evclk; | 3537 | rps->evclk = adev->pm.dpm.vce_states[adev->pm.dpm.vce_level].evclk; |
