[Intel-gfx] [PATCH 1/5] drm/i915: Mark FIFO underrun disabled earlier

Govindapillai, Vinod vinod.govindapillai at intel.com
Thu Feb 23 09:17:45 UTC 2023


Thanks

Reviewed-by: Vinod Govindapillai <vinod.govindapillai at intel.com>

BR
Vinod

On Wed, 2023-01-25 at 20:52 +0200, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> At least on some platforms (tested on ctg) the way
> vgacon does screen blanking seems to flag constant
> FIFO underruns, which means we have to be prepared
> for them while the driver is loading. Currently
> there is a time window between drm_crtc_init() and
> intel_sanitize_fifo_underrun_reporting() during
> which FIFO underrun reporting is in fact marked as
> enabled. Thus we may end up mistakenly detecting
> these bogus underruns during driver init.
> 
> Close the race by marking FIFO underrun reporting
> as disabled prior to even registering the crtc.
> intel_sanitize_fifo_underrun_reporting()/etc. will
> re-enable it later if needed.
> 
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_crtc.c     |  3 +++
>  .../drm/i915/display/intel_fifo_underrun.c    | 20 ++++++++++++++++
>  .../drm/i915/display/intel_fifo_underrun.h    |  3 +++
>  .../drm/i915/display/intel_modeset_setup.c    | 24 +++++--------------
>  4 files changed, 32 insertions(+), 18 deletions(-)

> 
> diff --git a/drivers/gpu/drm/i915/display/intel_crtc.c b/drivers/gpu/drm/i915/display/intel_crtc.c
> index 82be0fbe9934..b79a8834559f 100644
> --- a/drivers/gpu/drm/i915/display/intel_crtc.c
> +++ b/drivers/gpu/drm/i915/display/intel_crtc.c
> @@ -25,6 +25,7 @@
>  #include "intel_display_types.h"
>  #include "intel_drrs.h"
>  #include "intel_dsi.h"
> +#include "intel_fifo_underrun.h"
>  #include "intel_pipe_crc.h"
>  #include "intel_psr.h"
>  #include "intel_sprite.h"
> @@ -314,6 +315,8 @@ int intel_crtc_init(struct drm_i915_private *dev_priv, enum pipe pipe)
>         }
>         crtc->plane_ids_mask |= BIT(primary->id);
>  
> +       intel_init_fifo_underrun_reporting(dev_priv, crtc, false);
> +
>         for_each_sprite(dev_priv, pipe, sprite) {
>                 struct intel_plane *plane;
>  
> diff --git a/drivers/gpu/drm/i915/display/intel_fifo_underrun.c
> b/drivers/gpu/drm/i915/display/intel_fifo_underrun.c
> index d636d21fa9ce..b708a62e509a 100644
> --- a/drivers/gpu/drm/i915/display/intel_fifo_underrun.c
> +++ b/drivers/gpu/drm/i915/display/intel_fifo_underrun.c
> @@ -31,6 +31,7 @@
>  #include "intel_display_types.h"
>  #include "intel_fbc.h"
>  #include "intel_fifo_underrun.h"
> +#include "intel_pch_display.h"
>  
>  /**
>   * DOC: fifo underrun handling
> @@ -509,3 +510,22 @@ void intel_check_pch_fifo_underruns(struct drm_i915_private *dev_priv)
>  
>         spin_unlock_irq(&dev_priv->irq_lock);
>  }
> +
> +void intel_init_fifo_underrun_reporting(struct drm_i915_private *i915,
> +                                       struct intel_crtc *crtc,
> +                                       bool enable)
> +{
> +       crtc->cpu_fifo_underrun_disabled = !enable;
> +
> +       /*
> +        * We track the PCH trancoder underrun reporting state
> +        * within the crtc. With crtc for pipe A housing the underrun
> +        * reporting state for PCH transcoder A, crtc for pipe B housing
> +        * it for PCH transcoder B, etc. LPT-H has only PCH transcoder A,
> +        * and marking underrun reporting as disabled for the non-existing
> +        * PCH transcoders B and C would prevent enabling the south
> +        * error interrupt (see cpt_can_enable_serr_int()).
> +        */
> +       if (intel_has_pch_trancoder(i915, crtc->pipe))
> +               crtc->pch_fifo_underrun_disabled = !enable;
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_fifo_underrun.h
> b/drivers/gpu/drm/i915/display/intel_fifo_underrun.h
> index 2e47d7d3c101..b00d8abebcf9 100644
> --- a/drivers/gpu/drm/i915/display/intel_fifo_underrun.h
> +++ b/drivers/gpu/drm/i915/display/intel_fifo_underrun.h
> @@ -9,8 +9,11 @@
>  #include <linux/types.h>
>  
>  struct drm_i915_private;
> +struct intel_crtc;
>  enum pipe;
>  
> +void intel_init_fifo_underrun_reporting(struct drm_i915_private *i915,
> +                                       struct intel_crtc *crtc, bool enable);
>  bool intel_set_cpu_fifo_underrun_reporting(struct drm_i915_private *dev_priv,
>                                            enum pipe pipe, bool enable);
>  bool intel_set_pch_fifo_underrun_reporting(struct drm_i915_private *dev_priv,
> diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> b/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> index 52cdbd4fc2fa..be095327a9ba 100644
> --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> @@ -21,6 +21,7 @@
>  #include "intel_display.h"
>  #include "intel_display_power.h"
>  #include "intel_display_types.h"
> +#include "intel_fifo_underrun.h"
>  #include "intel_modeset_setup.h"
>  #include "intel_pch_display.h"
>  #include "intel_pm.h"
> @@ -234,12 +235,9 @@ static void intel_sanitize_fifo_underrun_reporting(const struct
> intel_crtc_state
>         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
>         struct drm_i915_private *i915 = to_i915(crtc->base.dev);
>  
> -       if (!crtc_state->hw.active && !HAS_GMCH(i915))
> -               return;
> -
>         /*
> -        * We start out with underrun reporting disabled to avoid races.
> -        * For correct bookkeeping mark this on active crtcs.
> +        * We start out with underrun reporting disabled on active
> +        * pipes to avoid races.
>          *
>          * Also on gmch platforms we dont have any hardware bits to
>          * disable the underrun reporting. Which means we need to start
> @@ -250,19 +248,9 @@ static void intel_sanitize_fifo_underrun_reporting(const struct
> intel_crtc_state
>          * No protection against concurrent access is required - at
>          * worst a fifo underrun happens which also sets this to false.
>          */
> -       crtc->cpu_fifo_underrun_disabled = true;
> -
> -       /*
> -        * We track the PCH trancoder underrun reporting state
> -        * within the crtc. With crtc for pipe A housing the underrun
> -        * reporting state for PCH transcoder A, crtc for pipe B housing
> -        * it for PCH transcoder B, etc. LPT-H has only PCH transcoder A,
> -        * and marking underrun reporting as disabled for the non-existing
> -        * PCH transcoders B and C would prevent enabling the south
> -        * error interrupt (see cpt_can_enable_serr_int()).
> -        */
> -       if (intel_has_pch_trancoder(i915, crtc->pipe))
> -               crtc->pch_fifo_underrun_disabled = true;
> +       intel_init_fifo_underrun_reporting(i915, crtc,
> +                                          !crtc_state->hw.active &&
> +                                          !HAS_GMCH(i915));
>  }
>  
>  static void intel_sanitize_crtc(struct intel_crtc *crtc,



More information about the Intel-gfx mailing list