Commit 57ec0068 authored by Alex Deucher's avatar Alex Deucher Committed by Peng Zhang
Browse files

drm/amdgpu/sdma5.2: add begin/end_use ring callbacks

stable inclusion
from stable-v6.6.8
commit 3aae4ef4d799fb3d0381157640fdb251008cf0ae
bugzilla: https://gitee.com/openeuler/kernel/issues/I99K53

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=3aae4ef4d799fb3d0381157640fdb251008cf0ae

--------------------------------

commit ab4750332dbe535243def5dcebc24ca00c1f98ac upstream.

Add begin/end_use ring callbacks to disallow GFXOFF when
SDMA work is submitted and allow it again afterward.

This should avoid corner cases where GFXOFF is erroneously
entered when SDMA is still active.  For now just allow/disallow
GFXOFF in the begin and end helpers until we root cause the
issue.  This should not impact power as SDMA usage is pretty
minimal and GFXOSS should not be active when SDMA is active
anyway, this just makes it explicit.

v2: move everything into sdma5.2 code.  No reason for this
to be generic at this point.
v3: Add comments in new code

Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2220


Reviewed-by: Mario Limonciello <mario.limonciello@amd.com> (v1)
Tested-by: Mario Limonciello <mario.limonciello@amd.com> (v1)
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org # 5.15+
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarZhangPeng <zhangpeng362@huawei.com>
parent 1503ee69
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -1651,6 +1651,32 @@ static void sdma_v5_2_get_clockgating_state(void *handle, u64 *flags)
		*flags |= AMD_CG_SUPPORT_SDMA_LS;
}

static void sdma_v5_2_ring_begin_use(struct amdgpu_ring *ring)
{
	struct amdgpu_device *adev = ring->adev;

	/* SDMA 5.2.3 (RMB) FW doesn't seem to properly
	 * disallow GFXOFF in some cases leading to
	 * hangs in SDMA.  Disallow GFXOFF while SDMA is active.
	 * We can probably just limit this to 5.2.3,
	 * but it shouldn't hurt for other parts since
	 * this GFXOFF will be disallowed anyway when SDMA is
	 * active, this just makes it explicit.
	 */
	amdgpu_gfx_off_ctrl(adev, false);
}

static void sdma_v5_2_ring_end_use(struct amdgpu_ring *ring)
{
	struct amdgpu_device *adev = ring->adev;

	/* SDMA 5.2.3 (RMB) FW doesn't seem to properly
	 * disallow GFXOFF in some cases leading to
	 * hangs in SDMA.  Allow GFXOFF when SDMA is complete.
	 */
	amdgpu_gfx_off_ctrl(adev, true);
}

const struct amd_ip_funcs sdma_v5_2_ip_funcs = {
	.name = "sdma_v5_2",
	.early_init = sdma_v5_2_early_init,
@@ -1698,6 +1724,8 @@ static const struct amdgpu_ring_funcs sdma_v5_2_ring_funcs = {
	.test_ib = sdma_v5_2_ring_test_ib,
	.insert_nop = sdma_v5_2_ring_insert_nop,
	.pad_ib = sdma_v5_2_ring_pad_ib,
	.begin_use = sdma_v5_2_ring_begin_use,
	.end_use = sdma_v5_2_ring_end_use,
	.emit_wreg = sdma_v5_2_ring_emit_wreg,
	.emit_reg_wait = sdma_v5_2_ring_emit_reg_wait,
	.emit_reg_write_reg_wait = sdma_v5_2_ring_emit_reg_write_reg_wait,