[Intel-gfx] [PATCH 4/6] drm/i915/vrr: Tell intel_crtc_update_active_timings() about VRR explicitly
Golani, Mitulkumar Ajitkumar
mitulkumar.ajitkumar.golani at intel.com
Wed Apr 5 07:10:18 UTC 2023
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces at lists.freedesktop.org> On Behalf Of Ville
> Syrjala
> Sent: 21 March 2023 02:04
> To: intel-gfx at lists.freedesktop.org
> Subject: [Intel-gfx] [PATCH 4/6] drm/i915/vrr: Tell
> intel_crtc_update_active_timings() about VRR explicitly
>
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> In order to move VRR enable/disable to a place where it's also applicable to
> fastsets we need to be prepared to configure the pipe into non-VRR mode
> initially, and then later switch to VRR mode. To that end allow the active
> timings to be configured in non-VRR mode temporarily even when the
> crtc_state says we're going to be using VRR.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_crtc.c | 3 ++-
> drivers/gpu/drm/i915/display/intel_display.c | 3 ++-
> drivers/gpu/drm/i915/display/intel_modeset_setup.c | 3 ++-
> drivers/gpu/drm/i915/display/intel_vblank.c | 12 +++++++++---
> drivers/gpu/drm/i915/display/intel_vblank.h | 3 ++-
> 5 files changed, 17 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_crtc.c
> b/drivers/gpu/drm/i915/display/intel_crtc.c
> index 41d381bbb57a..c59c4b416dcb 100644
> --- a/drivers/gpu/drm/i915/display/intel_crtc.c
> +++ b/drivers/gpu/drm/i915/display/intel_crtc.c
> @@ -692,7 +692,8 @@ void intel_pipe_update_end(struct intel_crtc_state
> *new_crtc_state)
> * FIXME Should be synchronized with the start of vblank somehow...
> */
> if (new_crtc_state->seamless_m_n &&
> intel_crtc_needs_fastset(new_crtc_state))
> - intel_crtc_update_active_timings(new_crtc_state);
> + intel_crtc_update_active_timings(new_crtc_state,
> + new_crtc_state->vrr.enable);
>
> local_irq_enable();
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> b/drivers/gpu/drm/i915/display/intel_display.c
> index 5ee93824861b..fc8eafd5fa61 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -6956,7 +6956,8 @@ static void intel_enable_crtc(struct
> intel_atomic_state *state,
> if (!intel_crtc_needs_modeset(new_crtc_state))
> return;
>
> - intel_crtc_update_active_timings(new_crtc_state);
> + intel_crtc_update_active_timings(new_crtc_state,
> + new_crtc_state->vrr.enable);
>
> dev_priv->display.funcs.display->crtc_enable(state, crtc);
>
> diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> b/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> index 4558d02641fe..64d12a13887d 100644
> --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> @@ -560,7 +560,8 @@ static void intel_modeset_readout_hw_state(struct
> drm_i915_private *i915)
> */
> crtc_state->inherited = true;
>
> - intel_crtc_update_active_timings(crtc_state);
> + intel_crtc_update_active_timings(crtc_state,
> + crtc_state-
> >vrr.enable);
>
> intel_crtc_copy_hw_to_uapi_state(crtc_state);
> }
> diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c
> b/drivers/gpu/drm/i915/display/intel_vblank.c
> index f8bf9810527d..2e4f7de199d6 100644
> --- a/drivers/gpu/drm/i915/display/intel_vblank.c
> +++ b/drivers/gpu/drm/i915/display/intel_vblank.c
> @@ -488,21 +488,27 @@ static int intel_crtc_scanline_offset(const struct
> intel_crtc_state *crtc_state)
> }
> }
>
> -void intel_crtc_update_active_timings(const struct intel_crtc_state
> *crtc_state)
> +void intel_crtc_update_active_timings(const struct intel_crtc_state
> *crtc_state,
> + bool vrr_enable)
> {
> struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> struct drm_i915_private *i915 = to_i915(crtc->base.dev);
> + u8 mode_flags = crtc_state->mode_flags;
> struct drm_display_mode adjusted_mode;
> int vmax_vblank_start = 0;
> unsigned long irqflags;
>
> drm_mode_init(&adjusted_mode, &crtc_state->hw.adjusted_mode);
>
> - if (crtc_state->vrr.enable) {
> + if (vrr_enable) {
> + drm_WARN_ON(&i915->drm, (mode_flags &
> I915_MODE_FLAG_VRR) == 0);
> +
> adjusted_mode.crtc_vtotal = crtc_state->vrr.vmax;
> adjusted_mode.crtc_vblank_end = crtc_state->vrr.vmax;
> adjusted_mode.crtc_vblank_start =
> intel_vrr_vmin_vblank_start(crtc_state);
> vmax_vblank_start =
> intel_vrr_vmax_vblank_start(crtc_state);
> + } else {
> + mode_flags &= ~I915_MODE_FLAG_VRR;
> }
>
> /*
> @@ -524,7 +530,7 @@ void intel_crtc_update_active_timings(const struct
> intel_crtc_state *crtc_state)
>
> crtc->vmax_vblank_start = vmax_vblank_start;
>
> - crtc->mode_flags = crtc_state->mode_flags;
> + crtc->mode_flags = mode_flags;
>
> crtc->scanline_offset = intel_crtc_scanline_offset(crtc_state);
>
> diff --git a/drivers/gpu/drm/i915/display/intel_vblank.h
> b/drivers/gpu/drm/i915/display/intel_vblank.h
> index 0884db7e76ae..08e706b29149 100644
> --- a/drivers/gpu/drm/i915/display/intel_vblank.h
> +++ b/drivers/gpu/drm/i915/display/intel_vblank.h
> @@ -20,6 +20,7 @@ bool intel_crtc_get_vblank_timestamp(struct drm_crtc
> *crtc, int *max_error, int intel_get_crtc_scanline(struct intel_crtc *crtc); void
> intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc); void
> intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc); -void
> intel_crtc_update_active_timings(const struct intel_crtc_state *crtc_state);
> +void intel_crtc_update_active_timings(const struct intel_crtc_state
> *crtc_state,
> + bool vrr_enable);
>
> #endif /* __INTEL_VBLANK_H__ */
> --
> 2.39.2
changes LGTM.
Thanks
Reviewed-by: Mitul Golani <mitulkumar.ajitkumar.golani at intel.com>
More information about the Intel-gfx
mailing list