drm/amd/pp: Add gfx pg support in smu through set_powergating_by_smu
authorRex Zhu <Rex.Zhu@amd.com>
Thu, 14 Jun 2018 05:07:19 +0000 (13:07 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 5 Jul 2018 21:38:49 +0000 (16:38 -0500)
gfx ip block can call set_powergating_by_smu to set gfx pg state if
necessary.

Reviewed-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
drivers/gpu/drm/amd/powerplay/amd_powerplay.c

index 4201f3d..e69fbc9 100644 (file)
@@ -5606,14 +5606,12 @@ static int gfx_v8_0_late_init(void *handle)
 static void gfx_v8_0_enable_gfx_static_mg_power_gating(struct amdgpu_device *adev,
                                                       bool enable)
 {
-       if ((adev->asic_type == CHIP_POLARIS11) ||
+       if (((adev->asic_type == CHIP_POLARIS11) ||
            (adev->asic_type == CHIP_POLARIS12) ||
-           (adev->asic_type == CHIP_VEGAM))
+           (adev->asic_type == CHIP_VEGAM)) &&
+           adev->powerplay.pp_funcs->set_powergating_by_smu)
                /* Send msg to SMU via Powerplay */
-               amdgpu_device_ip_set_powergating_state(adev,
-                                                      AMD_IP_BLOCK_TYPE_SMC,
-                                                      enable ?
-                                                      AMD_PG_STATE_GATE : AMD_PG_STATE_UNGATE);
+               amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, enable);
 
        WREG32_FIELD(RLC_PG_CNTL, STATIC_PER_CU_PG_ENABLE, enable ? 1 : 0);
 }
index f68551f..ef4884b 100644 (file)
@@ -236,14 +236,7 @@ static int pp_set_powergating_state(void *handle,
                        pr_err("gfx off control failed!\n");
        }
 
-       if (hwmgr->hwmgr_func->powergate_gfx == NULL) {
-               pr_info("%s was not implemented.\n", __func__);
-               return 0;
-       }
-
-       /* Enable/disable GFX per cu powergating through SMU */
-       return hwmgr->hwmgr_func->powergate_gfx(hwmgr,
-                       state == AMD_PG_STATE_GATE);
+       return 0;
 
 }
 
@@ -1184,6 +1177,21 @@ static int pp_dpm_powergate_mmhub(void *handle)
        return hwmgr->hwmgr_func->powergate_mmhub(hwmgr);
 }
 
+static int pp_dpm_powergate_gfx(void *handle, bool gate)
+{
+       struct pp_hwmgr *hwmgr = handle;
+
+       if (!hwmgr || !hwmgr->pm_en)
+               return 0;
+
+       if (hwmgr->hwmgr_func->powergate_gfx == NULL) {
+               pr_info("%s was not implemented.\n", __func__);
+               return 0;
+       }
+
+       return hwmgr->hwmgr_func->powergate_gfx(hwmgr, gate);
+}
+
 static int pp_set_powergating_by_smu(void *handle,
                                uint32_t block_type, bool gate)
 {
@@ -1201,6 +1209,7 @@ static int pp_set_powergating_by_smu(void *handle,
                pp_dpm_powergate_mmhub(handle);
                break;
        case AMD_IP_BLOCK_TYPE_GFX:
+               ret = pp_dpm_powergate_gfx(handle, gate);
                break;
        default:
                break;