drm/amdgpu: fix the doorbell missing when in CGPG issue for renoir.
[ Upstream commit 1c0539a6fc8a4a4b77278e35d763073890de96b9 ] If GC has entered CGPG, ringing doorbell > first page doesn't wakeup GC. Enlarge CP_MEC_DOORBELL_RANGE_UPPER to workaround this issue. Signed-off-by: Yifan Zhang <yifan1.zhang@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
@@ -1271,6 +1271,16 @@ static bool is_raven_kicker(struct amdgpu_device *adev)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool check_if_enlarge_doorbell_range(struct amdgpu_device *adev)
|
||||||
|
{
|
||||||
|
if ((adev->asic_type == CHIP_RENOIR) &&
|
||||||
|
(adev->gfx.me_fw_version >= 0x000000a5) &&
|
||||||
|
(adev->gfx.me_feature_version >= 52))
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static void gfx_v9_0_check_if_need_gfxoff(struct amdgpu_device *adev)
|
static void gfx_v9_0_check_if_need_gfxoff(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
if (gfx_v9_0_should_disable_gfxoff(adev->pdev))
|
if (gfx_v9_0_should_disable_gfxoff(adev->pdev))
|
||||||
@@ -3619,7 +3629,16 @@ static int gfx_v9_0_kiq_init_register(struct amdgpu_ring *ring)
|
|||||||
if (ring->use_doorbell) {
|
if (ring->use_doorbell) {
|
||||||
WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_LOWER,
|
WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_LOWER,
|
||||||
(adev->doorbell_index.kiq * 2) << 2);
|
(adev->doorbell_index.kiq * 2) << 2);
|
||||||
WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_UPPER,
|
/* If GC has entered CGPG, ringing doorbell > first page
|
||||||
|
* doesn't wakeup GC. Enlarge CP_MEC_DOORBELL_RANGE_UPPER to
|
||||||
|
* workaround this issue. And this change has to align with firmware
|
||||||
|
* update.
|
||||||
|
*/
|
||||||
|
if (check_if_enlarge_doorbell_range(adev))
|
||||||
|
WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_UPPER,
|
||||||
|
(adev->doorbell.size - 4));
|
||||||
|
else
|
||||||
|
WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_UPPER,
|
||||||
(adev->doorbell_index.userqueue_end * 2) << 2);
|
(adev->doorbell_index.userqueue_end * 2) << 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user