aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2017-05-09 10:03:29 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2017-05-10 04:21:37 -0400
commit5caa0feafcc60a2457d8187c2fa06a3df67c8ba2 (patch)
tree20a58546ad27af39f82526c55422684e9831d737
parent1bf6ad622b9be58484279978f85716fbb10d545b (diff)
drm/vblank: Lock down vblank->hwmode more
In the previous patch we've implemented hwmode tracking a la i915 for the vblank timestamp calculations. But that was just the basic semantics, i915 has some nice sanity checks to make sure we keep getting this right. Move them over too. v2: - WARN_ON_ONCE to avoid excessive spam (Ville) - Really only WARN on atomic drivers. Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Neil Armstrong <narmstrong@baylibre.com> Acked-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20170509140329.24114-5-daniel.vetter@ffwll.ch
-rw-r--r--drivers/gpu/drm/drm_irq.c6
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c10
-rw-r--r--drivers/gpu/drm/i915/intel_display.c11
3 files changed, 14 insertions, 13 deletions
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index 89f0928b042a..c7debaad67f8 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -777,6 +777,8 @@ bool drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
777 */ 777 */
778 if (mode->crtc_clock == 0) { 778 if (mode->crtc_clock == 0) {
779 DRM_DEBUG("crtc %u: Noop due to uninitialized mode.\n", pipe); 779 DRM_DEBUG("crtc %u: Noop due to uninitialized mode.\n", pipe);
780 WARN_ON_ONCE(drm_drv_uses_atomic_modeset(dev));
781
780 return false; 782 return false;
781 } 783 }
782 784
@@ -1338,6 +1340,10 @@ void drm_crtc_vblank_off(struct drm_crtc *crtc)
1338 send_vblank_event(dev, e, seq, &now); 1340 send_vblank_event(dev, e, seq, &now);
1339 } 1341 }
1340 spin_unlock_irqrestore(&dev->event_lock, irqflags); 1342 spin_unlock_irqrestore(&dev->event_lock, irqflags);
1343
1344 /* Will be reset by the modeset helpers when re-enabling the crtc by
1345 * calling drm_calc_timestamping_constants(). */
1346 vblank->hwmode.crtc_clock = 0;
1341} 1347}
1342EXPORT_SYMBOL(drm_crtc_vblank_off); 1348EXPORT_SYMBOL(drm_crtc_vblank_off);
1343 1349
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index dccb7c2560fe..04493ef1d2f7 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -720,9 +720,7 @@ static u32 i915_get_vblank_counter(struct drm_device *dev, unsigned int pipe)
720 struct drm_i915_private *dev_priv = to_i915(dev); 720 struct drm_i915_private *dev_priv = to_i915(dev);
721 i915_reg_t high_frame, low_frame; 721 i915_reg_t high_frame, low_frame;
722 u32 high1, high2, low, pixel, vbl_start, hsync_start, htotal; 722 u32 high1, high2, low, pixel, vbl_start, hsync_start, htotal;
723 struct intel_crtc *intel_crtc = intel_get_crtc_for_pipe(dev_priv, 723 const struct drm_display_mode *mode = &dev->vblank[pipe].hwmode;
724 pipe);
725 const struct drm_display_mode *mode = &intel_crtc->base.hwmode;
726 unsigned long irqflags; 724 unsigned long irqflags;
727 725
728 htotal = mode->crtc_htotal; 726 htotal = mode->crtc_htotal;
@@ -779,13 +777,17 @@ static int __intel_get_crtc_scanline(struct intel_crtc *crtc)
779{ 777{
780 struct drm_device *dev = crtc->base.dev; 778 struct drm_device *dev = crtc->base.dev;
781 struct drm_i915_private *dev_priv = to_i915(dev); 779 struct drm_i915_private *dev_priv = to_i915(dev);
782 const struct drm_display_mode *mode = &crtc->base.hwmode; 780 const struct drm_display_mode *mode;
781 struct drm_vblank_crtc *vblank;
783 enum pipe pipe = crtc->pipe; 782 enum pipe pipe = crtc->pipe;
784 int position, vtotal; 783 int position, vtotal;
785 784
786 if (!crtc->active) 785 if (!crtc->active)
787 return -1; 786 return -1;
788 787
788 vblank = &crtc->base.dev->vblank[drm_crtc_index(&crtc->base)];
789 mode = &vblank->hwmode;
790
789 vtotal = mode->crtc_vtotal; 791 vtotal = mode->crtc_vtotal;
790 if (mode->flags & DRM_MODE_FLAG_INTERLACE) 792 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
791 vtotal /= 2; 793 vtotal /= 2;
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 3617927af269..2f2bb623cf5f 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -11444,12 +11444,6 @@ intel_modeset_update_crtc_state(struct drm_atomic_state *state)
11444 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) { 11444 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
11445 to_intel_crtc(crtc)->config = to_intel_crtc_state(new_crtc_state); 11445 to_intel_crtc(crtc)->config = to_intel_crtc_state(new_crtc_state);
11446 11446
11447 /* Update hwmode for vblank functions */
11448 if (new_crtc_state->active)
11449 crtc->hwmode = new_crtc_state->adjusted_mode;
11450 else
11451 crtc->hwmode.crtc_clock = 0;
11452
11453 /* 11447 /*
11454 * Update legacy state to satisfy fbc code. This can 11448 * Update legacy state to satisfy fbc code. This can
11455 * be removed when fbc uses the atomic state. 11449 * be removed when fbc uses the atomic state.
@@ -15425,8 +15419,6 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
15425 to_intel_crtc_state(crtc->base.state); 15419 to_intel_crtc_state(crtc->base.state);
15426 int pixclk = 0; 15420 int pixclk = 0;
15427 15421
15428 crtc->base.hwmode = crtc_state->base.adjusted_mode;
15429
15430 memset(&crtc->base.mode, 0, sizeof(crtc->base.mode)); 15422 memset(&crtc->base.mode, 0, sizeof(crtc->base.mode));
15431 if (crtc_state->base.active) { 15423 if (crtc_state->base.active) {
15432 intel_mode_from_pipe_config(&crtc->base.mode, crtc_state); 15424 intel_mode_from_pipe_config(&crtc->base.mode, crtc_state);
@@ -15456,7 +15448,8 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
15456 if (IS_BROADWELL(dev_priv) && crtc_state->ips_enabled) 15448 if (IS_BROADWELL(dev_priv) && crtc_state->ips_enabled)
15457 pixclk = DIV_ROUND_UP(pixclk * 100, 95); 15449 pixclk = DIV_ROUND_UP(pixclk * 100, 95);
15458 15450
15459 drm_calc_timestamping_constants(&crtc->base, &crtc->base.hwmode); 15451 drm_calc_timestamping_constants(&crtc->base,
15452 &crtc_state->base.adjusted_mode);
15460 update_scanline_offset(crtc); 15453 update_scanline_offset(crtc);
15461 } 15454 }
15462 15455