drm/amd/amdgpu: enable clockgating only after late init
authorArindam Nath <arindam.nath@amd.com>
Fri, 7 Oct 2016 13:31:37 +0000 (19:01 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 12 Oct 2016 19:44:15 +0000 (15:44 -0400)
Sometimes during multiple reboots, the system hangs
during bootup. The issue is very random and happens
once in around 50 reboots or so.

It seems if clockgating is enabled before late init,
the GFX engine sometimes does not respond.

This patch changes the ordering a little so that
both powergating and clockgating are enabled only
after late init calls.

Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Arindam Nath <arindam.nath@amd.com>
Tested-by: Sunil Uttarwar <Sunil.Uttarwar1@amd.com>
Reviewed-by: Tom St Denis <tom.stdenis@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

index a58513f271e3fdf410385d3e1b801c7fe413e256..928774f5a7e0f16929922c3d39f81844d9c4183c 100644 (file)
@@ -1411,13 +1411,6 @@ static int amdgpu_late_init(struct amdgpu_device *adev)
                if (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_UVD ||
                        adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_VCE)
                        continue;
-               /* enable clockgating to save power */
-               r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev,
-                                                                   AMD_CG_STATE_GATE);
-               if (r) {
-                       DRM_ERROR("set_clockgating_state(gate) of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r);
-                       return r;
-               }
                if (adev->ip_blocks[i].funcs->late_init) {
                        r = adev->ip_blocks[i].funcs->late_init((void *)adev);
                        if (r) {
@@ -1426,6 +1419,13 @@ static int amdgpu_late_init(struct amdgpu_device *adev)
                        }
                        adev->ip_block_status[i].late_initialized = true;
                }
+               /* enable clockgating to save power */
+               r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev,
+                                                                   AMD_CG_STATE_GATE);
+               if (r) {
+                       DRM_ERROR("set_clockgating_state(gate) of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r);
+                       return r;
+               }
        }
 
        return 0;