Patch "drm/amdgpu: Keep the pflip interrupts always enabled v7" has been added to the 4.2-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
drm/amdgpu: Keep the pflip interrupts always enabled v7
to the 4.2-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-amdgpu-keep-the-pflip-interrupts-always-enabled-v7.patch
and it can be found in the queue-4.2 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
f6c7aba47bcc0b1cc2085c8d8af80f8c02f28269Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <[email protected]>
Date: Thu, 8 Oct 2015 17:48:04 +0900
Subject: drm/amdgpu: Keep the pflip interrupts always enabled v7
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <[email protected]>
commit f6c7aba47bcc0b1cc2085c8d8af80f8c02f28269 upstream.
This fixes flickering issues caused by prematurely firing pflip interrupts.
v2 (chk): add commit message, fix DCE V10/V11 and DM as well
v3: Re-enable pflip interrupt wherever we re-enable a CRTC
v4: Enable pflip interrupt in DAL as well
v5: drop DAL changes for upstream
v6: (agd): only enable interrupts on crtcs that exist
v7: (agd): integrate suggestions from Michel
--- drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 2 - drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 30 ++++++++++++++++++++++++++-- drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 30 ++++++++++++++++++++++++++-- drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | 30 ++++++++++++++++++++++++++-- 4 files changed, 84 insertions(+), 8 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +0 -2
@@ -76,8 +76,6 @@ static void amdgpu_flip_work_func(struct/* We borrow the event spin lock for protecting flip_status */ spin_lock_irqsave (&crtc->dev->event_lock, flags); -/* set the proper interrupt */ -amdgpu_irq_get (adev, &adev->pageflip_irq, work->crtc_id);/* do the flip (mmio) */ adev->mode_info.funcs->page_flip (adev, work->crtc_id, work->base);/* set the flip status */
drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +28 -2
@@ -233,6 +233,24 @@ static u32 dce_v10_0_vblank_get_counter(return RREG32 (mmCRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]); } +static void dce_v10_0_pageflip_interrupt_init (struct amdgpu_device *adev) +{ +unsigned i; + +/* Enable pflip interrupts */ +for (i =0 ; i < adev->mode_info.num_crtc; i++) +amdgpu_irq_get (adev, &adev->pageflip_irq, i); +} + +static void dce_v10_0_pageflip_interrupt_fini (struct amdgpu_device *adev) +{ +unsigned i; + +/* Disable pflip interrupts */ +for (i =0 ; i < adev->mode_info.num_crtc; i++) +amdgpu_irq_put (adev, &adev->pageflip_irq, i); +} +/** * dce_v10_0_page_flip - pageflip callback. *
@@ -2641,9 +2659,10 @@ static void dce_v10_0_crtc_dpms(struct ddce_v10_0_vga_enable (crtc, true);amdgpu_atombios_crtc_blank (crtc,ATOM_DISABLE );dce_v10_0_vga_enable (crtc, false); -/* Make sure VBLANK interrupt is still enabled */ +/* Make sure VBLANK and PFLIP interrupts are still enabled */ type =amdgpu_crtc_idx_to_irq_type (adev, amdgpu_crtc->crtc_id);amdgpu_irq_update (adev, &adev->crtc_irq, type); +amdgpu_irq_update (adev, &adev->pageflip_irq, type);drm_vblank_post_modeset (dev, amdgpu_crtc->crtc_id);dce_v10_0_crtc_load_lut (crtc);break ;
@@ -3002,6 +3021,8 @@ static int dce_v10_0_hw_init(void *handldce_v10_0_audio_enable (adev, &adev->mode_info.audio.pin[i], false); } +dce_v10_0_pageflip_interrupt_init (adev); +return 0 ; }
@@ -3016,6 +3037,8 @@ static int dce_v10_0_hw_fini(void *handldce_v10_0_audio_enable (adev, &adev->mode_info.audio.pin[i], false); } +dce_v10_0_pageflip_interrupt_fini (adev); +return 0 ; }
@@ -3027,6 +3050,8 @@ static int dce_v10_0_suspend(void *handldce_v10_0_hpd_fini (adev); +dce_v10_0_pageflip_interrupt_fini (adev); +return 0 ; }
@@ -3052,6 +3077,8 @@ static int dce_v10_0_resume(void *handle/* initialize hpd */ dce_v10_0_hpd_init (adev); +dce_v10_0_pageflip_interrupt_init (adev); +return 0 ; }
@@ -3346,7 +3373,6 @@ static int dce_v10_0_pageflip_irq(structspin_unlock_irqrestore (&adev->ddev->event_lock, flags);drm_vblank_put (adev->ddev, amdgpu_crtc->crtc_id); -amdgpu_irq_put (adev, &adev->pageflip_irq, crtc_id);queue_work (amdgpu_crtc->pflip_queue, &works->unpin_work);return 0 ;
drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +28 -2
@@ -233,6 +233,24 @@ static u32 dce_v11_0_vblank_get_counter(return RREG32 (mmCRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]); } +static void dce_v11_0_pageflip_interrupt_init (struct amdgpu_device *adev) +{ +unsigned i; + +/* Enable pflip interrupts */ +for (i =0 ; i < adev->mode_info.num_crtc; i++) +amdgpu_irq_get (adev, &adev->pageflip_irq, i); +} + +static void dce_v11_0_pageflip_interrupt_fini (struct amdgpu_device *adev) +{ +unsigned i; + +/* Disable pflip interrupts */ +for (i =0 ; i < adev->mode_info.num_crtc; i++) +amdgpu_irq_put (adev, &adev->pageflip_irq, i); +} +/** * dce_v11_0_page_flip - pageflip callback. *
@@ -2640,9 +2658,10 @@ static void dce_v11_0_crtc_dpms(struct ddce_v11_0_vga_enable (crtc, true);amdgpu_atombios_crtc_blank (crtc,ATOM_DISABLE );dce_v11_0_vga_enable (crtc, false); -/* Make sure VBLANK interrupt is still enabled */ +/* Make sure VBLANK and PFLIP interrupts are still enabled */ type =amdgpu_crtc_idx_to_irq_type (adev, amdgpu_crtc->crtc_id);amdgpu_irq_update (adev, &adev->crtc_irq, type); +amdgpu_irq_update (adev, &adev->pageflip_irq, type);drm_vblank_post_modeset (dev, amdgpu_crtc->crtc_id);dce_v11_0_crtc_load_lut (crtc);break ;
@@ -3000,6 +3019,8 @@ static int dce_v11_0_hw_init(void *handldce_v11_0_audio_enable (adev, &adev->mode_info.audio.pin[i], false); } +dce_v11_0_pageflip_interrupt_init (adev); +return 0 ; }
@@ -3014,6 +3035,8 @@ static int dce_v11_0_hw_fini(void *handldce_v11_0_audio_enable (adev, &adev->mode_info.audio.pin[i], false); } +dce_v11_0_pageflip_interrupt_fini (adev); +return 0 ; }
@@ -3025,6 +3048,8 @@ static int dce_v11_0_suspend(void *handldce_v11_0_hpd_fini (adev); +dce_v11_0_pageflip_interrupt_fini (adev); +return 0 ; }
@@ -3051,6 +3076,8 @@ static int dce_v11_0_resume(void *handle/* initialize hpd */ dce_v11_0_hpd_init (adev); +dce_v11_0_pageflip_interrupt_init (adev); +return 0 ; }
@@ -3345,7 +3372,6 @@ static int dce_v11_0_pageflip_irq(structspin_unlock_irqrestore (&adev->ddev->event_lock, flags);drm_vblank_put (adev->ddev, amdgpu_crtc->crtc_id); -amdgpu_irq_put (adev, &adev->pageflip_irq, crtc_id);queue_work (amdgpu_crtc->pflip_queue, &works->unpin_work);return 0 ;
drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +28 -2
@@ -204,6 +204,24 @@ static u32 dce_v8_0_vblank_get_counter(sreturn RREG32 (mmCRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]); } +static void dce_v8_0_pageflip_interrupt_init (struct amdgpu_device *adev) +{ +unsigned i; + +/* Enable pflip interrupts */ +for (i =0 ; i < adev->mode_info.num_crtc; i++) +amdgpu_irq_get (adev, &adev->pageflip_irq, i); +} + +static void dce_v8_0_pageflip_interrupt_fini (struct amdgpu_device *adev) +{ +unsigned i; + +/* Disable pflip interrupts */ +for (i =0 ; i < adev->mode_info.num_crtc; i++) +amdgpu_irq_put (adev, &adev->pageflip_irq, i); +} +/** * dce_v8_0_page_flip - pageflip callback. *
@@ -2575,9 +2593,10 @@ static void dce_v8_0_crtc_dpms(struct drdce_v8_0_vga_enable (crtc, true);amdgpu_atombios_crtc_blank (crtc,ATOM_DISABLE );dce_v8_0_vga_enable (crtc, false); -/* Make sure VBLANK interrupt is still enabled */ +/* Make sure VBLANK and PFLIP interrupts are still enabled */ type =amdgpu_crtc_idx_to_irq_type (adev, amdgpu_crtc->crtc_id);amdgpu_irq_update (adev, &adev->crtc_irq, type); +amdgpu_irq_update (adev, &adev->pageflip_irq, type);drm_vblank_post_modeset (dev, amdgpu_crtc->crtc_id);dce_v8_0_crtc_load_lut (crtc);break ;
@@ -2933,6 +2952,8 @@ static int dce_v8_0_hw_init(void *handledce_v8_0_audio_enable (adev, &adev->mode_info.audio.pin[i], false); } +dce_v8_0_pageflip_interrupt_init (adev); +return 0 ; }
@@ -2947,6 +2968,8 @@ static int dce_v8_0_hw_fini(void *handledce_v8_0_audio_enable (adev, &adev->mode_info.audio.pin[i], false); } +dce_v8_0_pageflip_interrupt_fini (adev); +return 0 ; }
@@ -2958,6 +2981,8 @@ static int dce_v8_0_suspend(void *handledce_v8_0_hpd_fini (adev); +dce_v8_0_pageflip_interrupt_fini (adev); +return 0 ; }
@@ -2981,6 +3006,8 @@ static int dce_v8_0_resume(void *handle)/* initialize hpd */ dce_v8_0_hpd_init (adev); +dce_v8_0_pageflip_interrupt_init (adev); +return 0 ; }
@@ -3376,7 +3403,6 @@ static int dce_v8_0_pageflip_irq(structspin_unlock_irqrestore (&adev->ddev->event_lock, flags);drm_vblank_put (adev->ddev, amdgpu_crtc->crtc_id); -amdgpu_irq_put (adev, &adev->pageflip_irq, crtc_id);queue_work (amdgpu_crtc->pflip_queue, &works->unpin_work);return 0 ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.2/drm-amdgpu-keep-the-pflip-interrupts-always-enabled-v7.patch