Skip to content

Commit 29a2f43

Browse files
Ivan Lipskialexdeucher
authored andcommitted
drm/amd/display: Allow RX6xxx & RX7700 to invoke amdgpu_irq_get/put
[Why&How] As reported on https://gitlab.freedesktop.org/drm/amd/-/issues/3936, SMU hang can occur if the interrupts are not enabled appropriately, causing a vblank timeout. This patch reverts commit 5009628 ("drm/amd/display: Remove unnecessary amdgpu_irq_get/put"), but only for RX6xxx & RX7700 GPUs, on which the issue was observed. This will re-enable interrupts regardless of whether the user space needed it or not. Fixes: 5009628 ("drm/amd/display: Remove unnecessary amdgpu_irq_get/put") Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3936 Suggested-by: Sun peng Li <sunpeng.li@amd.com> Reviewed-by: Sun peng Li <sunpeng.li@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Signed-off-by: Ray Wu <ray.wu@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> (cherry picked from commit 95d168b) Cc: stable@vger.kernel.org
1 parent c1b6b8c commit 29a2f43

File tree

1 file changed

+38
-1
lines changed

1 file changed

+38
-1
lines changed

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8717,7 +8717,16 @@ static int amdgpu_dm_encoder_init(struct drm_device *dev,
87178717
static void manage_dm_interrupts(struct amdgpu_device *adev,
87188718
struct amdgpu_crtc *acrtc,
87198719
struct dm_crtc_state *acrtc_state)
8720-
{
8720+
{ /*
8721+
* We cannot be sure that the frontend index maps to the same
8722+
* backend index - some even map to more than one.
8723+
* So we have to go through the CRTC to find the right IRQ.
8724+
*/
8725+
int irq_type = amdgpu_display_crtc_idx_to_irq_type(
8726+
adev,
8727+
acrtc->crtc_id);
8728+
struct drm_device *dev = adev_to_drm(adev);
8729+
87218730
struct drm_vblank_crtc_config config = {0};
87228731
struct dc_crtc_timing *timing;
87238732
int offdelay;
@@ -8770,7 +8779,35 @@ static void manage_dm_interrupts(struct amdgpu_device *adev,
87708779

87718780
drm_crtc_vblank_on_config(&acrtc->base,
87728781
&config);
8782+
/* Allow RX6xxx, RX7700, RX7800 GPUs to call amdgpu_irq_get.*/
8783+
switch (amdgpu_ip_version(adev, DCE_HWIP, 0)) {
8784+
case IP_VERSION(3, 0, 0):
8785+
case IP_VERSION(3, 0, 2):
8786+
case IP_VERSION(3, 0, 3):
8787+
case IP_VERSION(3, 2, 0):
8788+
if (amdgpu_irq_get(adev, &adev->pageflip_irq, irq_type))
8789+
drm_err(dev, "DM_IRQ: Cannot get pageflip irq!\n");
8790+
#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)
8791+
if (amdgpu_irq_get(adev, &adev->vline0_irq, irq_type))
8792+
drm_err(dev, "DM_IRQ: Cannot get vline0 irq!\n");
8793+
#endif
8794+
}
8795+
87738796
} else {
8797+
/* Allow RX6xxx, RX7700, RX7800 GPUs to call amdgpu_irq_put.*/
8798+
switch (amdgpu_ip_version(adev, DCE_HWIP, 0)) {
8799+
case IP_VERSION(3, 0, 0):
8800+
case IP_VERSION(3, 0, 2):
8801+
case IP_VERSION(3, 0, 3):
8802+
case IP_VERSION(3, 2, 0):
8803+
#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)
8804+
if (amdgpu_irq_put(adev, &adev->vline0_irq, irq_type))
8805+
drm_err(dev, "DM_IRQ: Cannot put vline0 irq!\n");
8806+
#endif
8807+
if (amdgpu_irq_put(adev, &adev->pageflip_irq, irq_type))
8808+
drm_err(dev, "DM_IRQ: Cannot put pageflip irq!\n");
8809+
}
8810+
87748811
drm_crtc_vblank_off(&acrtc->base);
87758812
}
87768813
}

0 commit comments

Comments
 (0)