1. not start vce3.0 when hw_init
2. stop vce3.0 when vce idle.
3. pg mask used to ctrl power down/up vce.
4. change cg pg sequence in powerplay.

Change-Id: I852c4cf7066153074a12c272d81bfbe964d306a1
Signed-off-by: Rex Zhu <rex....@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/vce_v3_0.c              | 17 +++----
 .../drm/amd/powerplay/hwmgr/cz_clockpowergating.c  | 54 +++++++++++-----------
 .../amd/powerplay/hwmgr/smu7_clockpowergating.c    |  9 ++--
 3 files changed, 38 insertions(+), 42 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c 
b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
index 8db2655..a8c40ee 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
@@ -230,10 +230,6 @@ static int vce_v3_0_start(struct amdgpu_device *adev)
        struct amdgpu_ring *ring;
        int idx, r;
 
-       vce_v3_0_override_vce_clock_gating(adev, true);
-       if (!(adev->flags & AMD_IS_APU))
-               amdgpu_asic_set_vce_clocks(adev, 10000, 10000);
-
        ring = &adev->vce.ring[0];
        WREG32(mmVCE_RB_RPTR, ring->wptr);
        WREG32(mmVCE_RB_WPTR, ring->wptr);
@@ -436,9 +432,9 @@ static int vce_v3_0_hw_init(void *handle)
        int r, i;
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
-       r = vce_v3_0_start(adev);
-       if (r)
-               return r;
+       vce_v3_0_override_vce_clock_gating(adev, true);
+       if (!(adev->flags & AMD_IS_APU))
+               amdgpu_asic_set_vce_clocks(adev, 10000, 10000);
 
        for (i = 0; i < adev->vce.num_rings; i++)
                adev->vce.ring[i].ready = false;
@@ -766,12 +762,11 @@ static int vce_v3_0_set_powergating_state(void *handle,
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int ret = 0;
 
-       if (!(adev->pg_flags & AMD_PG_SUPPORT_VCE))
-               return 0;
-
        if (state == AMD_PG_STATE_GATE) {
+               ret = vce_v3_0_stop(adev);
+               if (ret)
+                       goto out;
                adev->vce.is_powergated = true;
-               /* XXX do we need a vce_v3_0_stop()? */
        } else {
                ret = vce_v3_0_start(adev);
                if (ret)
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c
index e605cad..132bde8 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c
@@ -192,34 +192,32 @@ int cz_dpm_powergate_vce(struct pp_hwmgr *hwmgr, bool 
bgate)
 
        if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
                                        PHM_PlatformCaps_VCEPowerGating)) {
-               if (cz_hwmgr->vce_power_gated != bgate) {
-                       if (bgate) {
-                               cgs_set_clockgating_state(
-                                                       hwmgr->device,
-                                                       AMD_IP_BLOCK_TYPE_VCE,
-                                                       AMD_CG_STATE_GATE);
-                               cgs_set_powergating_state(
-                                                       hwmgr->device,
-                                                       AMD_IP_BLOCK_TYPE_VCE,
-                                                       AMD_PG_STATE_GATE);
-                               cz_enable_disable_vce_dpm(hwmgr, false);
-                               cz_dpm_powerdown_vce(hwmgr);
-                               cz_hwmgr->vce_power_gated = true;
-                       } else {
-                               cz_dpm_powerup_vce(hwmgr);
-                               cz_hwmgr->vce_power_gated = false;
-                               cgs_set_powergating_state(
-                                                       hwmgr->device,
-                                                       AMD_IP_BLOCK_TYPE_VCE,
-                                                       AMD_CG_STATE_UNGATE);
-                               cgs_set_clockgating_state(
-                                                       hwmgr->device,
-                                                       AMD_IP_BLOCK_TYPE_VCE,
-                                                       AMD_PG_STATE_UNGATE);
-                               cz_dpm_update_vce_dpm(hwmgr);
-                               cz_enable_disable_vce_dpm(hwmgr, true);
-                               return 0;
-                       }
+               if (bgate) {
+                       cgs_set_powergating_state(
+                                               hwmgr->device,
+                                               AMD_IP_BLOCK_TYPE_VCE,
+                                               AMD_PG_STATE_GATE);
+                       cgs_set_clockgating_state(
+                                               hwmgr->device,
+                                               AMD_IP_BLOCK_TYPE_VCE,
+                                               AMD_CG_STATE_GATE);
+                       cz_enable_disable_vce_dpm(hwmgr, false);
+                       cz_dpm_powerdown_vce(hwmgr);
+                       cz_hwmgr->vce_power_gated = true;
+               } else {
+                       cz_dpm_powerup_vce(hwmgr);
+                       cz_hwmgr->vce_power_gated = false;
+                       cgs_set_clockgating_state(
+                                               hwmgr->device,
+                                               AMD_IP_BLOCK_TYPE_VCE,
+                                               AMD_PG_STATE_UNGATE);
+                       cgs_set_powergating_state(
+                                               hwmgr->device,
+                                               AMD_IP_BLOCK_TYPE_VCE,
+                                               AMD_CG_STATE_UNGATE);
+                       cz_dpm_update_vce_dpm(hwmgr);
+                       cz_enable_disable_vce_dpm(hwmgr, true);
+                       return 0;
                }
        } else {
                cz_hwmgr->vce_power_gated = bgate;
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_clockpowergating.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_clockpowergating.c
index 0e8800f..5418f1a 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_clockpowergating.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_clockpowergating.c
@@ -173,12 +173,12 @@ int smu7_powergate_vce(struct pp_hwmgr *hwmgr, bool bgate)
 {
        struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
 
-       if (data->vce_power_gated == bgate)
-               return 0;
-
        data->vce_power_gated = bgate;
 
        if (bgate) {
+               cgs_set_powergating_state(hwmgr->device,
+                                               AMD_IP_BLOCK_TYPE_VCE,
+                                               AMD_PG_STATE_UNGATE);
                cgs_set_clockgating_state(hwmgr->device,
                                AMD_IP_BLOCK_TYPE_VCE,
                                AMD_CG_STATE_GATE);
@@ -190,6 +190,9 @@ int smu7_powergate_vce(struct pp_hwmgr *hwmgr, bool bgate)
                cgs_set_clockgating_state(hwmgr->device,
                                AMD_IP_BLOCK_TYPE_VCE,
                                AMD_CG_STATE_UNGATE);
+               cgs_set_powergating_state(hwmgr->device,
+                                               AMD_IP_BLOCK_TYPE_VCE,
+                                               AMD_PG_STATE_UNGATE);
        }
        return 0;
 }
-- 
1.9.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to