diff options
-rw-r--r-- | drivers/gpu/drm/drm_irq.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 11 |
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 | } |
1342 | EXPORT_SYMBOL(drm_crtc_vblank_off); | 1348 | EXPORT_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 | ||