All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Lisovskiy, Stanislav" <stanislav.lisovskiy@intel.com>
To: "Mun, Gwan-gyeong" <gwan-gyeong.mun@intel.com>,
	"jani.nikula@linux.intel.com" <jani.nikula@linux.intel.com>
Cc: "dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>,
	"intel-gfx@lists.freedesktop.org"
	<intel-gfx@lists.freedesktop.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"Vivi, Rodrigo" <rodrigo.vivi@intel.com>,
	"airlied@linux.ie" <airlied@linux.ie>
Subject: Re: [Intel-gfx] [v3] drm/i915: Add detection of changing of edid on between suspend and resume
Date: Fri, 10 Aug 2018 13:02:15 +0000	[thread overview]
Message-ID: <919efd746382923946f9f443909cec65590ffc37.camel@intel.com> (raw)
In-Reply-To: <20180809111330.5113-1-gwan-gyeong.mun@intel.com>

On Thu, 2018-08-09 at 14:13 +0300, Gwan-gyeong Mun wrote:
> The hotplug detection routine of i915 uses
> drm_helper_hpd_irq_event(). This
> helper can detect changing of status of connector, but it can not
> detect
> changing of edid.
> 
> Following scenario requires detection of changing of edid.
> 
>  1) plug display device to a connector
>  2) system suspend
>  3) unplug 1)'s display device and plug the other display device to a
> connector
>  4) system resume
> 
> It adds edid check routine when a connector status still remains as
> "connector_status_connected".
> 
> v2: Add NULL check before comparing of EDIDs.
> 
> Testcase: igt/kms_chamelium/hdmi-edid-change-during-hibernate
> Testcase: igt/kms_chamelium/hdmi-edid-change-during-suspend
> Testcase: igt/kms_chamelium/dp-edid-change-during-hibernate
> Testcase: igt/kms_chamelium/dp-edid-change-during-suspend
> 
> Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
> ---
>  drivers/gpu/drm/i915/intel_hotplug.c | 84
> +++++++++++++++++++++++++++-
>  1 file changed, 83 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_hotplug.c
> b/drivers/gpu/drm/i915/intel_hotplug.c
> index 648a13c6043c..965f2d771fc0 100644
> --- a/drivers/gpu/drm/i915/intel_hotplug.c
> +++ b/drivers/gpu/drm/i915/intel_hotplug.c
> @@ -507,6 +507,88 @@ void intel_hpd_init(struct drm_i915_private
> *dev_priv)
>  	}
>  }
>  
> +/**
> + * intel_hpd_irq_event - hotplug processing
> + * @dev: drm_device
> + *
> + * Drivers can use this function to run a detect cycle on all
> connectors which
> + * have the DRM_CONNECTOR_POLL_HPD flag set in their &polled member.
> All other
> + * connectors are ignored, which is useful to avoid reprobing fixed
> panels.
> + *
> + * This function is useful for drivers which can't or don't track
> hotplug interrupts
> + * for each connector. This function is based on
> drm_helper_hpd_irq_event() helper
> + * function and besides it adds edid check routine when a connector
> status still
> + * remains as "connector_status_connected".
> + *
> + * Following scenario requires detection of changing of edid.
> + *  1) plug display device to a connector
> + *  2) system suspend
> + *  3) unplug 1)'s display device and plug the other display device
> to a connector
> + *  4) system resume
> +
> + * This function must be called from process context with no mode
> + * setting locks held.
> + *
> + * Note that a connector can be both polled and probed from the
> hotplug handler,
> + * in case the hotplug interrupt is known to be unreliable.
> + */
> +static bool intel_hpd_irq_event(struct drm_device *dev)
> +{
> +	struct drm_connector *connector;
> +	struct drm_connector_list_iter conn_iter;
> +	enum drm_connector_status old_status, cur_status;
> +	struct edid *old_edid;
> +	bool changed = false;
> +
> +	if (!dev->mode_config.poll_enabled)
> +		return false;
> +
> +	mutex_lock(&dev->mode_config.mutex);
> +	drm_connector_list_iter_begin(dev, &conn_iter);
> +	drm_for_each_connector_iter(connector, &conn_iter) {
> +		/* Only handle HPD capable connectors. */
> +		if (!(connector->polled & DRM_CONNECTOR_POLL_HPD))
> +			continue;
> +
> +		old_status = connector->status;
> +		old_edid = to_intel_connector(connector)-
> >detect_edid;
> +
> +		cur_status = drm_helper_probe_detect(connector,
> NULL, false);
> +		DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from
> %s to %s\n",
> +			      connector->base.id, connector->name,
> +			      drm_get_connector_status_name(old_stat
> us),
> +			      drm_get_connector_status_name(cur_stat
> us));
> +
> +		if (old_status != cur_status)
> +			changed = true;
> +
> +		/* Check changing of edid when a connector status
> still remains
> +		 * as "connector_status_connected".
> +		 */
> +		if (old_status == cur_status &&
> +		    cur_status == connector_status_connected) {
> +			struct edid *cur_edid =
> to_intel_connector(connector)->detect_edid;
> +
> +			if (!old_edid || !cur_edid)
> +				continue;
> +
> +			if (memcmp(old_edid, cur_edid,
> sizeof(*cur_edid))) {
> +				changed = true;
> +				DRM_DEBUG_KMS("[CONNECTOR:%d:%s]
> edid updated\n",
> +					      connector->base.id,
> +					      connector->name);
> +			}
> +		}
> +	}
> +	drm_connector_list_iter_end(&conn_iter);
> +	mutex_unlock(&dev->mode_config.mutex);
> +
> +	if (changed)
> +		drm_kms_helper_hotplug_event(dev);
> +
> +	return changed;
> +}
> +
>  static void i915_hpd_poll_init_work(struct work_struct *work)
>  {
>  	struct drm_i915_private *dev_priv =
> @@ -552,7 +634,7 @@ static void i915_hpd_poll_init_work(struct
> work_struct *work)
>  	 * in the middle of disabling polling
>  	 */
>  	if (!enabled)
> -		drm_helper_hpd_irq_event(dev);
> +		intel_hpd_irq_event(dev);
>  }

Just wondering, as I saw previously drm_helper_hpd_irq_event function
was used, which basically does the same thing, except doing memcmp
for detecting the edid change. Is it only Intel specific change? As we
could just add this modification to existing helper function or add
another helper function to the drm (drm_probe_helper.c), so that it is
also usable elsewhere..

>  
>  /**
-- 
Best Regards,

Lisovskiy Stanislav

WARNING: multiple messages have this Message-ID (diff)
From: "Lisovskiy, Stanislav" <stanislav.lisovskiy@intel.com>
To: "Mun, Gwan-gyeong" <gwan-gyeong.mun@intel.com>,
	"jani.nikula@linux.intel.com" <jani.nikula@linux.intel.com>
Cc: "airlied@linux.ie" <airlied@linux.ie>,
	"intel-gfx@lists.freedesktop.org"
	<intel-gfx@lists.freedesktop.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>,
	"Vivi, Rodrigo" <rodrigo.vivi@intel.com>
Subject: Re: [v3] drm/i915: Add detection of changing of edid on between suspend and resume
Date: Fri, 10 Aug 2018 13:02:15 +0000	[thread overview]
Message-ID: <919efd746382923946f9f443909cec65590ffc37.camel@intel.com> (raw)
In-Reply-To: <20180809111330.5113-1-gwan-gyeong.mun@intel.com>

On Thu, 2018-08-09 at 14:13 +0300, Gwan-gyeong Mun wrote:
> The hotplug detection routine of i915 uses
> drm_helper_hpd_irq_event(). This
> helper can detect changing of status of connector, but it can not
> detect
> changing of edid.
> 
> Following scenario requires detection of changing of edid.
> 
>  1) plug display device to a connector
>  2) system suspend
>  3) unplug 1)'s display device and plug the other display device to a
> connector
>  4) system resume
> 
> It adds edid check routine when a connector status still remains as
> "connector_status_connected".
> 
> v2: Add NULL check before comparing of EDIDs.
> 
> Testcase: igt/kms_chamelium/hdmi-edid-change-during-hibernate
> Testcase: igt/kms_chamelium/hdmi-edid-change-during-suspend
> Testcase: igt/kms_chamelium/dp-edid-change-during-hibernate
> Testcase: igt/kms_chamelium/dp-edid-change-during-suspend
> 
> Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
> ---
>  drivers/gpu/drm/i915/intel_hotplug.c | 84
> +++++++++++++++++++++++++++-
>  1 file changed, 83 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_hotplug.c
> b/drivers/gpu/drm/i915/intel_hotplug.c
> index 648a13c6043c..965f2d771fc0 100644
> --- a/drivers/gpu/drm/i915/intel_hotplug.c
> +++ b/drivers/gpu/drm/i915/intel_hotplug.c
> @@ -507,6 +507,88 @@ void intel_hpd_init(struct drm_i915_private
> *dev_priv)
>  	}
>  }
>  
> +/**
> + * intel_hpd_irq_event - hotplug processing
> + * @dev: drm_device
> + *
> + * Drivers can use this function to run a detect cycle on all
> connectors which
> + * have the DRM_CONNECTOR_POLL_HPD flag set in their &polled member.
> All other
> + * connectors are ignored, which is useful to avoid reprobing fixed
> panels.
> + *
> + * This function is useful for drivers which can't or don't track
> hotplug interrupts
> + * for each connector. This function is based on
> drm_helper_hpd_irq_event() helper
> + * function and besides it adds edid check routine when a connector
> status still
> + * remains as "connector_status_connected".
> + *
> + * Following scenario requires detection of changing of edid.
> + *  1) plug display device to a connector
> + *  2) system suspend
> + *  3) unplug 1)'s display device and plug the other display device
> to a connector
> + *  4) system resume
> +
> + * This function must be called from process context with no mode
> + * setting locks held.
> + *
> + * Note that a connector can be both polled and probed from the
> hotplug handler,
> + * in case the hotplug interrupt is known to be unreliable.
> + */
> +static bool intel_hpd_irq_event(struct drm_device *dev)
> +{
> +	struct drm_connector *connector;
> +	struct drm_connector_list_iter conn_iter;
> +	enum drm_connector_status old_status, cur_status;
> +	struct edid *old_edid;
> +	bool changed = false;
> +
> +	if (!dev->mode_config.poll_enabled)
> +		return false;
> +
> +	mutex_lock(&dev->mode_config.mutex);
> +	drm_connector_list_iter_begin(dev, &conn_iter);
> +	drm_for_each_connector_iter(connector, &conn_iter) {
> +		/* Only handle HPD capable connectors. */
> +		if (!(connector->polled & DRM_CONNECTOR_POLL_HPD))
> +			continue;
> +
> +		old_status = connector->status;
> +		old_edid = to_intel_connector(connector)-
> >detect_edid;
> +
> +		cur_status = drm_helper_probe_detect(connector,
> NULL, false);
> +		DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from
> %s to %s\n",
> +			      connector->base.id, connector->name,
> +			      drm_get_connector_status_name(old_stat
> us),
> +			      drm_get_connector_status_name(cur_stat
> us));
> +
> +		if (old_status != cur_status)
> +			changed = true;
> +
> +		/* Check changing of edid when a connector status
> still remains
> +		 * as "connector_status_connected".
> +		 */
> +		if (old_status == cur_status &&
> +		    cur_status == connector_status_connected) {
> +			struct edid *cur_edid =
> to_intel_connector(connector)->detect_edid;
> +
> +			if (!old_edid || !cur_edid)
> +				continue;
> +
> +			if (memcmp(old_edid, cur_edid,
> sizeof(*cur_edid))) {
> +				changed = true;
> +				DRM_DEBUG_KMS("[CONNECTOR:%d:%s]
> edid updated\n",
> +					      connector->base.id,
> +					      connector->name);
> +			}
> +		}
> +	}
> +	drm_connector_list_iter_end(&conn_iter);
> +	mutex_unlock(&dev->mode_config.mutex);
> +
> +	if (changed)
> +		drm_kms_helper_hotplug_event(dev);
> +
> +	return changed;
> +}
> +
>  static void i915_hpd_poll_init_work(struct work_struct *work)
>  {
>  	struct drm_i915_private *dev_priv =
> @@ -552,7 +634,7 @@ static void i915_hpd_poll_init_work(struct
> work_struct *work)
>  	 * in the middle of disabling polling
>  	 */
>  	if (!enabled)
> -		drm_helper_hpd_irq_event(dev);
> +		intel_hpd_irq_event(dev);
>  }

Just wondering, as I saw previously drm_helper_hpd_irq_event function
was used, which basically does the same thing, except doing memcmp
for detecting the edid change. Is it only Intel specific change? As we
could just add this modification to existing helper function or add
another helper function to the drm (drm_probe_helper.c), so that it is
also usable elsewhere..

>  
>  /**
-- 
Best Regards,

Lisovskiy Stanislav
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2018-08-10 13:02 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-03 16:34 [PATCH] drm/i915: Add detection of changing of edid on between suspend and resume Gwan-gyeong Mun
2018-08-03 16:34 ` Gwan-gyeong Mun
2018-08-03 16:56 ` ✗ Fi.CI.CHECKPATCH: warning for " Patchwork
2018-08-03 17:11 ` ✗ Fi.CI.BAT: failure " Patchwork
2018-08-06 12:09 ` [v2] " Gwan-gyeong Mun
2018-08-06 12:09   ` Gwan-gyeong Mun
2018-08-06 13:09 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Add detection of changing of edid on between suspend and resume (rev2) Patchwork
2018-08-06 13:25 ` ✗ Fi.CI.BAT: failure " Patchwork
2018-08-09  8:20 ` Patchwork
2018-08-09  9:04 ` Patchwork
2018-08-09 11:13 ` [v3] drm/i915: Add detection of changing of edid on between suspend and resume Gwan-gyeong Mun
2018-08-09 11:13   ` Gwan-gyeong Mun
2018-08-10 13:02   ` Lisovskiy, Stanislav [this message]
2018-08-10 13:02     ` Lisovskiy, Stanislav
2018-08-13 10:55     ` [Intel-gfx] " Mika Kahola
2018-08-13 10:55       ` Mika Kahola
2018-08-09 11:35 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Add detection of changing of edid on between suspend and resume (rev3) Patchwork
2018-08-09 11:53 ` ✗ Fi.CI.BAT: failure " Patchwork
2018-08-09 13:33 ` Patchwork
2018-08-09 15:02 ` 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=919efd746382923946f9f443909cec65590ffc37.camel@intel.com \
    --to=stanislav.lisovskiy@intel.com \
    --cc=airlied@linux.ie \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=gwan-gyeong.mun@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=jani.nikula@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rodrigo.vivi@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.