| From 0e28804507dcc46d0a1df142d40260ccaa5ef664 Mon Sep 17 00:00:00 2001 |
| From: Sandeep Raghuraman <sandy.8925@gmail.com> |
| Date: Thu, 6 Aug 2020 22:52:20 +0530 |
| Subject: [PATCH] drm/amdgpu: Fix bug where DPM is not enabled after hibernate |
| and resume |
| |
| commit f87812284172a9809820d10143b573d833cd3f75 upstream. |
| |
| Reproducing bug report here: |
| After hibernating and resuming, DPM is not enabled. This remains the case |
| even if you test hibernate using the steps here: |
| https://www.kernel.org/doc/html/latest/power/basic-pm-debugging.html |
| |
| I debugged the problem, and figured out that in the file hardwaremanager.c, |
| in the function, phm_enable_dynamic_state_management(), the check |
| 'if (!hwmgr->pp_one_vf && smum_is_dpm_running(hwmgr) && !amdgpu_passthrough(adev) && adev->in_suspend)' |
| returns true for the hibernate case, and false for the suspend case. |
| |
| This means that for the hibernate case, the AMDGPU driver doesn't enable DPM |
| (even though it should) and simply returns from that function. |
| In the suspend case, it goes ahead and enables DPM, even though it doesn't need to. |
| |
| I debugged further, and found out that in the case of suspend, for the |
| CIK/Hawaii GPUs, smum_is_dpm_running(hwmgr) returns false, while in the case of |
| hibernate, smum_is_dpm_running(hwmgr) returns true. |
| |
| For CIK, the ci_is_dpm_running() function calls the ci_is_smc_ram_running() function, |
| which is ultimately used to determine if DPM is currently enabled or not, |
| and this seems to provide the wrong answer. |
| |
| I've changed the ci_is_dpm_running() function to instead use the same method that |
| some other AMD GPU chips do (e.g Fiji), which seems to read the voltage controller. |
| I've tested on my R9 390 and it seems to work correctly for both suspend and |
| hibernate use cases, and has been stable so far. |
| |
| Bug: https://bugzilla.kernel.org/show_bug.cgi?id=208839 |
| Signed-off-by: Sandeep Raghuraman <sandy.8925@gmail.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c |
| index 7627792cda93..4de562758436 100644 |
| --- a/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c |
| +++ b/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c |
| @@ -2724,7 +2724,10 @@ static int ci_initialize_mc_reg_table(struct pp_hwmgr *hwmgr) |
| |
| static bool ci_is_dpm_running(struct pp_hwmgr *hwmgr) |
| { |
| - return ci_is_smc_ram_running(hwmgr); |
| + return (1 == PHM_READ_INDIRECT_FIELD(hwmgr->device, |
| + CGS_IND_REG__SMC, FEATURE_STATUS, |
| + VOLTAGE_CONTROLLER_ON)) |
| + ? true : false; |
| } |
| |
| static int ci_smu_init(struct pp_hwmgr *hwmgr) |
| -- |
| 2.27.0 |
| |