aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-10-02 11:54:35 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-10-04 04:33:43 -0400
commit74d44445afb9f50126eba052adeb89827cee88f3 (patch)
tree763925fb8f2080134b9c75aa2f24e99742c96e25
parent4d0f817e7482969a31c2295a530c966f135faa7e (diff)
drm/i915: call drm_handle_vblank before finish_page_flip
... since finish_page_flip needs the vblank timestamp generated in drm_handle_vblank. Somehow all the gmch platforms get it right, but all the pch platform irq handlers get is wrong. Hooray for copy& pasting! Currently this gets papered over by a gross hack in finish_page_flip. A second patch will remove that. Note that without this, the new timestamp sanity checks in flip_test occasionally get tripped up, hence the cc: stable tag. Cc: stable@vger.kernel.org Reviewed-by: mario.kleiner@tuebingen.mpg.de Tested-by: Imre Deak <imre.deak@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index d7f0066538a9..1fc2489bf847 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -698,12 +698,12 @@ static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS)
698 intel_opregion_gse_intr(dev); 698 intel_opregion_gse_intr(dev);
699 699
700 for (i = 0; i < 3; i++) { 700 for (i = 0; i < 3; i++) {
701 if (de_iir & (DE_PIPEA_VBLANK_IVB << (5 * i)))
702 drm_handle_vblank(dev, i);
701 if (de_iir & (DE_PLANEA_FLIP_DONE_IVB << (5 * i))) { 703 if (de_iir & (DE_PLANEA_FLIP_DONE_IVB << (5 * i))) {
702 intel_prepare_page_flip(dev, i); 704 intel_prepare_page_flip(dev, i);
703 intel_finish_page_flip_plane(dev, i); 705 intel_finish_page_flip_plane(dev, i);
704 } 706 }
705 if (de_iir & (DE_PIPEA_VBLANK_IVB << (5 * i)))
706 drm_handle_vblank(dev, i);
707 } 707 }
708 708
709 /* check event from PCH */ 709 /* check event from PCH */
@@ -785,6 +785,12 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS)
785 if (de_iir & DE_GSE) 785 if (de_iir & DE_GSE)
786 intel_opregion_gse_intr(dev); 786 intel_opregion_gse_intr(dev);
787 787
788 if (de_iir & DE_PIPEA_VBLANK)
789 drm_handle_vblank(dev, 0);
790
791 if (de_iir & DE_PIPEB_VBLANK)
792 drm_handle_vblank(dev, 1);
793
788 if (de_iir & DE_PLANEA_FLIP_DONE) { 794 if (de_iir & DE_PLANEA_FLIP_DONE) {
789 intel_prepare_page_flip(dev, 0); 795 intel_prepare_page_flip(dev, 0);
790 intel_finish_page_flip_plane(dev, 0); 796 intel_finish_page_flip_plane(dev, 0);
@@ -795,12 +801,6 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS)
795 intel_finish_page_flip_plane(dev, 1); 801 intel_finish_page_flip_plane(dev, 1);
796 } 802 }
797 803
798 if (de_iir & DE_PIPEA_VBLANK)
799 drm_handle_vblank(dev, 0);
800
801 if (de_iir & DE_PIPEB_VBLANK)
802 drm_handle_vblank(dev, 1);
803
804 /* check event from PCH */ 804 /* check event from PCH */
805 if (de_iir & DE_PCH_EVENT) { 805 if (de_iir & DE_PCH_EVENT) {
806 if (pch_iir & hotplug_mask) 806 if (pch_iir & hotplug_mask)