On 04/04/2017 11:53 AM, Daniel Vetter wrote:
> 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.
> 
> Cc: Ville Syrjälä <ville.syrj...@linux.intel.com>
> Signed-off-by: Daniel Vetter <daniel.vet...@intel.com>
> ---
>  drivers/gpu/drm/drm_irq.c            |  8 +++++++-
>  drivers/gpu/drm/i915/i915_irq.c      | 10 ++++++----
>  drivers/gpu/drm/i915/intel_display.c | 11 ++---------
>  3 files changed, 15 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
> index 6e04d05455f9..41e9818666b8 100644
> --- a/drivers/gpu/drm/drm_irq.c
> +++ b/drivers/gpu/drm/drm_irq.c
> @@ -775,8 +775,10 @@ bool drm_calc_vbltimestamp_from_scanoutpos(struct 
> drm_device *dev,
>       /* If mode timing undefined, just return as no-op:
>        * Happens during initial modesetting of a crtc.
>        */
> -     if (mode->crtc_clock == 0) {
> +     if (WARN_ON(mode->crtc_clock == 0)) {
>               DRM_DEBUG("crtc %u: Noop due to uninitialized mode.\n", pipe);
> +             WARN_ON(drm_drv_uses_atomic_modeset(dev));
> +
>               return false;
>       }
>  
> @@ -1336,6 +1338,10 @@ void drm_crtc_vblank_off(struct drm_crtc *crtc)
>               send_vblank_event(dev, e, seq, &now);
>       }
>       spin_unlock_irqrestore(&dev->event_lock, irqflags);
> +
> +     /* Will be reset by the modeset helpers when re-enabling the crtc by
> +      * calling drm_calc_timestamping_constants(). */
> +     vblank->hwmode.crtc_clock = 0;
>  }
>  EXPORT_SYMBOL(drm_crtc_vblank_off);
>  
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 6477bbd85772..a6046e3e36f5 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)
>       struct drm_i915_private *dev_priv = to_i915(dev);
>       i915_reg_t high_frame, low_frame;
>       u32 high1, high2, low, pixel, vbl_start, hsync_start, htotal;
> -     struct intel_crtc *intel_crtc = intel_get_crtc_for_pipe(dev_priv,
> -                                                             pipe);
> -     const struct drm_display_mode *mode = &intel_crtc->base.hwmode;
> +     const struct drm_display_mode *mode = &dev->vblank[pipe].hwmode;
>       unsigned long irqflags;
>  
>       htotal = mode->crtc_htotal;
> @@ -779,13 +777,17 @@ static int __intel_get_crtc_scanline(struct intel_crtc 
> *crtc)
>  {
>       struct drm_device *dev = crtc->base.dev;
>       struct drm_i915_private *dev_priv = to_i915(dev);
> -     const struct drm_display_mode *mode = &crtc->base.hwmode;
> +     const struct drm_display_mode *mode;
> +     struct drm_vblank_crtc *vblank;
>       enum pipe pipe = crtc->pipe;
>       int position, vtotal;
>  
>       if (!crtc->active)
>               return -1;
>  
> +     vblank = &crtc->base.dev->vblank[drm_crtc_index(&crtc->base)];
> +     mode = &vblank->hwmode;
> +
>       vtotal = mode->crtc_vtotal;
>       if (mode->flags & DRM_MODE_FLAG_INTERLACE)
>               vtotal /= 2;
> diff --git a/drivers/gpu/drm/i915/intel_display.c 
> b/drivers/gpu/drm/i915/intel_display.c
> index 81baa5a9780c..53e732d36fda 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -11461,12 +11461,6 @@ intel_modeset_update_crtc_state(struct 
> drm_atomic_state *state)
>       for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
>               to_intel_crtc(crtc)->config = 
> to_intel_crtc_state(new_crtc_state);
>  
> -             /* Update hwmode for vblank functions */
> -             if (new_crtc_state->active)
> -                     crtc->hwmode = new_crtc_state->adjusted_mode;
> -             else
> -                     crtc->hwmode.crtc_clock = 0;
> -
>               /*
>                * Update legacy state to satisfy fbc code. This can
>                * be removed when fbc uses the atomic state.
> @@ -15471,8 +15465,6 @@ static void intel_modeset_readout_hw_state(struct 
> drm_device *dev)
>                       to_intel_crtc_state(crtc->base.state);
>               int pixclk = 0;
>  
> -             crtc->base.hwmode = crtc_state->base.adjusted_mode;
> -
>               memset(&crtc->base.mode, 0, sizeof(crtc->base.mode));
>               if (crtc_state->base.active) {
>                       intel_mode_from_pipe_config(&crtc->base.mode, 
> crtc_state);
> @@ -15502,7 +15494,8 @@ static void intel_modeset_readout_hw_state(struct 
> drm_device *dev)
>                       if (IS_BROADWELL(dev_priv) && crtc_state->ips_enabled)
>                               pixclk = DIV_ROUND_UP(pixclk * 100, 95);
>  
> -                     drm_calc_timestamping_constants(&crtc->base, 
> &crtc->base.hwmode);
> +                     drm_calc_timestamping_constants(&crtc->base,
> +                                                     
> &crtc_state->base.adjusted_mode);
>                       update_scanline_offset(crtc);
>               }
>  
> 

Reviewed-by: Neil Armstrong <narmstr...@baylibre.com>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to