All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jani Nikula <jani.nikula@linux.intel.com>
To: Imre Deak <imre.deak@intel.com>,
	intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org
Cc: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
Subject: Re: [PATCH v5 6/6] drm/i915/crt: Use intel_hpd_block/unblock() instead of intel_hpd_disable/enable()
Date: Fri, 07 Mar 2025 14:34:28 +0200	[thread overview]
Message-ID: <871pv9hve3.fsf@intel.com> (raw)
In-Reply-To: <20250304152917.3407080-7-imre.deak@intel.com>

On Tue, 04 Mar 2025, Imre Deak <imre.deak@intel.com> wrote:
> intel_hpd_disable/enable() have the same purpose as
> intel_hpd_block/unblock(), except that disable/enable will drop any HPD
> IRQs which were triggered while the HPD was disabled, while
> block/unblock will handle such IRQs after the IRQ handling is unblocked.
> Use intel_hpd_block/unblock() for crt as well, by adding a helper to
> explicitly clear any pending IRQs before unblocking.
>
> v2:
> - Handle encoders without a port assigned to them.
> - Rebase on change in intel_hpd_suspend() documentation.
> v3:
> - Rebase on the suspend/resume -> block/unblock rename change.
> - Clear the pending events only after all encoders have unblocked the
>   HPD handling.
> - Clear the short/long port events for all encoders using the given HPD
>   pin.
> v4:
> - Rebase on port->hpd_pin tracking. (Ville)
>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Imre Deak <imre.deak@intel.com>

Reviewed-by: Jani Nikula <jani.nikula@intel.com>

> ---
>  drivers/gpu/drm/i915/display/intel_crt.c     |  7 +--
>  drivers/gpu/drm/i915/display/intel_hotplug.c | 60 +++++++++++---------
>  drivers/gpu/drm/i915/display/intel_hotplug.h |  3 +-
>  3 files changed, 35 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_crt.c b/drivers/gpu/drm/i915/display/intel_crt.c
> index 76ffb3f8467c8..bca91d49cb960 100644
> --- a/drivers/gpu/drm/i915/display/intel_crt.c
> +++ b/drivers/gpu/drm/i915/display/intel_crt.c
> @@ -532,8 +532,6 @@ static bool valleyview_crt_detect_hotplug(struct drm_connector *connector)
>  {
>  	struct intel_display *display = to_intel_display(connector->dev);
>  	struct intel_crt *crt = intel_attached_crt(to_intel_connector(connector));
> -	struct drm_i915_private *dev_priv = to_i915(connector->dev);
> -	bool reenable_hpd;
>  	u32 adpa;
>  	bool ret;
>  	u32 save_adpa;
> @@ -550,7 +548,7 @@ static bool valleyview_crt_detect_hotplug(struct drm_connector *connector)
>  	 *
>  	 * Just disable HPD interrupts here to prevent this
>  	 */
> -	reenable_hpd = intel_hpd_disable(dev_priv, crt->base.hpd_pin);
> +	intel_hpd_block(&crt->base);
>  
>  	save_adpa = adpa = intel_de_read(display, crt->adpa_reg);
>  	drm_dbg_kms(display->drm,
> @@ -577,8 +575,7 @@ static bool valleyview_crt_detect_hotplug(struct drm_connector *connector)
>  	drm_dbg_kms(display->drm,
>  		    "valleyview hotplug adpa=0x%x, result %d\n", adpa, ret);
>  
> -	if (reenable_hpd)
> -		intel_hpd_enable(dev_priv, crt->base.hpd_pin);
> +	intel_hpd_clear_and_unblock(&crt->base);
>  
>  	return ret;
>  }
> diff --git a/drivers/gpu/drm/i915/display/intel_hotplug.c b/drivers/gpu/drm/i915/display/intel_hotplug.c
> index cb4e320a1023d..423925fec73dc 100644
> --- a/drivers/gpu/drm/i915/display/intel_hotplug.c
> +++ b/drivers/gpu/drm/i915/display/intel_hotplug.c
> @@ -993,33 +993,6 @@ void intel_hpd_cancel_work(struct drm_i915_private *dev_priv)
>  		drm_dbg_kms(&dev_priv->drm, "Hotplug detection work still active\n");
>  }
>  
> -bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin)
> -{
> -	bool ret = false;
> -
> -	if (pin == HPD_NONE)
> -		return false;
> -
> -	spin_lock_irq(&dev_priv->irq_lock);
> -	if (dev_priv->display.hotplug.stats[pin].state == HPD_ENABLED) {
> -		dev_priv->display.hotplug.stats[pin].state = HPD_DISABLED;
> -		ret = true;
> -	}
> -	spin_unlock_irq(&dev_priv->irq_lock);
> -
> -	return ret;
> -}
> -
> -void intel_hpd_enable(struct drm_i915_private *dev_priv, enum hpd_pin pin)
> -{
> -	if (pin == HPD_NONE)
> -		return;
> -
> -	spin_lock_irq(&dev_priv->irq_lock);
> -	dev_priv->display.hotplug.stats[pin].state = HPD_ENABLED;
> -	spin_unlock_irq(&dev_priv->irq_lock);
> -}
> -
>  static void queue_work_for_missed_irqs(struct drm_i915_private *i915)
>  {
>  	struct intel_display *display = to_intel_display(&i915->drm);
> @@ -1096,7 +1069,8 @@ static bool unblock_hpd_pin(struct intel_display *display, enum hpd_pin pin)
>   *   drm_connector_funcs::detect()) remains allowed, for instance as part of
>   *   userspace connector probing, or DRM core's connector polling.
>   *
> - * The call must be followed by calling intel_hpd_unblock().
> + * The call must be followed by calling intel_hpd_unblock(), or
> + * intel_hpd_clear_and_unblock().
>   *
>   * Note that the handling of HPD IRQs for another encoder using the same HPD
>   * pin as that of @encoder will be also blocked.
> @@ -1147,6 +1121,36 @@ void intel_hpd_unblock(struct intel_encoder *encoder)
>  	spin_unlock_irq(&i915->irq_lock);
>  }
>  
> +/**
> + * intel_hpd_clear_and_unblock - Unblock handling of new HPD IRQs on an HPD pin
> + * @encoder: Encoder to unblock the HPD handling for
> + *
> + * Unblock the handling of HPD IRQs on the HPD pin of @encoder, which was
> + * previously blocked by intel_hpd_block(). Any HPD IRQ raised on the
> + * HPD pin while it was blocked will be cleared, handling only new IRQs.
> + */
> +void intel_hpd_clear_and_unblock(struct intel_encoder *encoder)
> +{
> +	struct intel_display *display = to_intel_display(encoder);
> +	struct drm_i915_private *i915 = to_i915(display->drm);
> +	struct intel_hotplug *hotplug = &display->hotplug;
> +	enum hpd_pin pin = encoder->hpd_pin;
> +
> +	if (pin == HPD_NONE)
> +		return;
> +
> +	spin_lock_irq(&i915->irq_lock);
> +
> +	if (unblock_hpd_pin(display, pin)) {
> +		hotplug->event_bits &= ~BIT(pin);
> +		hotplug->retry_bits &= ~BIT(pin);
> +		hotplug->short_hpd_pin_mask &= ~BIT(pin);
> +		hotplug->long_hpd_pin_mask &= ~BIT(pin);
> +	}
> +
> +	spin_unlock_irq(&i915->irq_lock);
> +}
> +
>  void intel_hpd_enable_detection_work(struct drm_i915_private *i915)
>  {
>  	spin_lock_irq(&i915->irq_lock);
> diff --git a/drivers/gpu/drm/i915/display/intel_hotplug.h b/drivers/gpu/drm/i915/display/intel_hotplug.h
> index 5f9857136f5e3..f189b871904ed 100644
> --- a/drivers/gpu/drm/i915/display/intel_hotplug.h
> +++ b/drivers/gpu/drm/i915/display/intel_hotplug.h
> @@ -26,10 +26,9 @@ void intel_hpd_init(struct drm_i915_private *dev_priv);
>  void intel_hpd_init_early(struct drm_i915_private *i915);
>  void intel_hpd_cancel_work(struct drm_i915_private *dev_priv);
>  enum hpd_pin intel_hpd_pin_default(enum port port);
> -bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin);
> -void intel_hpd_enable(struct drm_i915_private *dev_priv, enum hpd_pin pin);
>  void intel_hpd_block(struct intel_encoder *encoder);
>  void intel_hpd_unblock(struct intel_encoder *encoder);
> +void intel_hpd_clear_and_unblock(struct intel_encoder *encoder);
>  void intel_hpd_debugfs_register(struct drm_i915_private *i915);
>  
>  void intel_hpd_enable_detection_work(struct drm_i915_private *i915);

-- 
Jani Nikula, Intel

  reply	other threads:[~2025-03-07 12:34 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-04 15:29 [PATCH v5 0/6] drm/i915/dp: Fix link training interrupted by HPD pulse Imre Deak
2025-03-04 15:29 ` [PATCH v5 1/6] drm/i915/hpd: Track HPD pins instead of ports for HPD pulse events Imre Deak
2025-03-04 16:08   ` Jani Nikula
2025-03-04 15:29 ` [PATCH v5 2/6] drm/i915/hpd: Let an HPD pin be in the disabled state when handling missed IRQs Imre Deak
2025-03-04 16:08   ` Jani Nikula
2025-03-04 15:29 ` [PATCH v5 3/6] drm/i915/hpd: Add support for blocking the IRQ handling on an HPD pin Imre Deak
2025-03-04 17:02   ` Jani Nikula
2025-03-04 19:50     ` Imre Deak
2025-03-05 11:48   ` [PATCH v6 " Imre Deak
2025-03-07 12:32     ` Jani Nikula
2025-03-04 15:29 ` [PATCH v5 4/6] drm/i915/dp: Fix link training interrupted by a short HPD pulse Imre Deak
2025-03-04 17:03   ` Jani Nikula
2025-03-04 15:29 ` [PATCH v5 5/6] drm/i915/dp: Queue a link check after link training is complete Imre Deak
2025-03-04 17:56   ` Jani Nikula
2025-03-04 19:59     ` Imre Deak
2025-03-05 11:48   ` [PATCH v6 " Imre Deak
2025-03-04 15:29 ` [PATCH v5 6/6] drm/i915/crt: Use intel_hpd_block/unblock() instead of intel_hpd_disable/enable() Imre Deak
2025-03-07 12:34   ` Jani Nikula [this message]
2025-03-04 16:22 ` ✓ CI.Patch_applied: success for drm/i915/dp: Fix link training interrupted by HPD pulse Patchwork
2025-03-04 16:23 ` ✓ CI.checkpatch: " Patchwork
2025-03-04 16:24 ` ✓ CI.KUnit: " Patchwork
2025-03-04 16:40 ` ✓ CI.Build: " Patchwork
2025-03-04 16:43 ` ✓ CI.Hooks: " Patchwork
2025-03-04 16:46 ` ✗ CI.checksparse: warning " Patchwork
2025-03-04 17:04 ` ✓ Xe.CI.BAT: success " Patchwork
2025-03-04 18:05 ` ✗ Xe.CI.Full: failure " Patchwork
2025-03-04 18:20 ` ✗ Fi.CI.SPARSE: warning " Patchwork
2025-03-04 18:42 ` ✗ i915.CI.BAT: failure " Patchwork
2025-03-05 18:13 ` ✗ Fi.CI.SPARSE: warning for drm/i915/dp: Fix link training interrupted by HPD pulse (rev3) Patchwork
2025-03-05 18:18 ` ✓ CI.Build: success " Patchwork
2025-03-05 18:20 ` ✓ CI.Hooks: " Patchwork
2025-03-05 18:22 ` ✗ CI.checksparse: warning " Patchwork
2025-03-05 18:40 ` ✓ i915.CI.BAT: success " Patchwork
2025-03-05 18:41 ` ✓ Xe.CI.BAT: " Patchwork
2025-03-05 19:59 ` ✗ Xe.CI.Full: failure for drm/i915/dp: Fix link training interrupted by HPD pulse (rev2) Patchwork
2025-03-05 21:11 ` ✗ i915.CI.Full: failure for drm/i915/dp: Fix link training interrupted by HPD pulse (rev3) Patchwork
2025-03-11 14:37   ` Imre Deak
2025-03-05 21:27 ` ✗ Xe.CI.Full: " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=871pv9hve3.fsf@intel.com \
    --to=jani.nikula@linux.intel.com \
    --cc=imre.deak@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=ville.syrjala@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.