https://bugs.freedesktop.org/show_bug.cgi?id=107277
Paul Menzel pmenzel+bugs.freedesktop@molgen.mpg.de changed:
What |Removed |Added ---------------------------------------------------------------------------- Status|NEEDINFO |NEW
--- Comment #6 from Paul Menzel pmenzel+bugs.freedesktop@molgen.mpg.de --- (In reply to Paul Menzel from comment #3)
(In reply to Christian König from comment #2)
[…]
amdgpu_device_ip_suspend [amdgpu] (694.390 ms @ 75.000977)
This is hardware teardown and rather interesting and the only point we could actually do something. Can you figure out what takes so long here?
I’ll try to figure that out.
I increased the maximum depth to 10, and according to the trace the loop in `gfx_v9_0_enter_rlc_safe_mode()` is the culprit. Also, in all the function is called three times.
static void gfx_v9_0_enter_rlc_safe_mode(struct amdgpu_device *adev) { uint32_t rlc_setting, data; unsigned i;
if (adev->gfx.rlc.in_safe_mode) return;
/* if RLC is not enabled, do nothing */ rlc_setting = RREG32_SOC15(GC, 0, mmRLC_CNTL); if (!(rlc_setting & RLC_CNTL__RLC_ENABLE_F32_MASK)) return;
if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG | AMD_CG_SUPPORT_GFX_3D_CGCG)) { data = RLC_SAFE_MODE__CMD_MASK; data |= (1 << RLC_SAFE_MODE__MESSAGE__SHIFT); WREG32_SOC15(GC, 0, mmRLC_SAFE_MODE, data);
/* wait for RLC_SAFE_MODE */ for (i = 0; i < adev->usec_timeout; i++) { if (!REG_GET_FIELD(SOC15_REG_OFFSET(GC, 0, mmRLC_SAFE_MODE), RLC_SAFE_MODE, CMD)) break; udelay(1); } adev->gfx.rlc.in_safe_mode = true; } }