From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Jani Nikula <jani.nikula@intel.com>
Cc: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Subject: Re: [Intel-gfx] [PATCH 09/15] drm/edid: detach debugfs EDID override from EDID property update
Date: Wed, 19 Oct 2022 23:07:36 +0300 [thread overview]
Message-ID: <Y1BZCPI8Fz353Aw9@intel.com> (raw)
In-Reply-To: <b68842462d58ca3c550049a95687f0ead81d615c.1665496046.git.jani.nikula@intel.com>
On Tue, Oct 11, 2022 at 04:49:43PM +0300, Jani Nikula wrote:
> Having the EDID override debugfs directly update the EDID property is
> problematic. The update is partial only. The driver has no way of
> knowing it's been updated. Mode list is not updated. It's an
> inconsistent state.
>
> Detach debugfs EDID override from the property update completely. Only
> set and reset a separate override EDID copy from debugfs, and have it
> take effect only at detect (via EDID read). The copy is at
> connector->edid_override.
>
> This also brings override EDID closer to firmware EDID in behaviour.
>
> Add validation of the override EDID which we completely lacked.
>
> Note that IGT already forces a detect whenever tests update the override
> EDID.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
> drivers/gpu/drm/drm_edid.c | 56 ++++++++++++-------------------------
> include/drm/drm_connector.h | 11 +++++---
> 2 files changed, 25 insertions(+), 42 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index c3cf942186b7..0f2898badd51 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -2207,8 +2207,8 @@ static struct edid *drm_get_override_edid(struct drm_connector *connector,
> {
> struct edid *override = NULL;
>
> - if (connector->override_edid)
> - override = drm_edid_duplicate(connector->edid_blob_ptr->data);
> + if (connector->edid_override)
> + override = drm_edid_duplicate(connector->edid_override->edid);
>
> if (!override)
> override = drm_load_edid_firmware(connector);
> @@ -2223,10 +2223,10 @@ static struct edid *drm_get_override_edid(struct drm_connector *connector,
> /* For debugfs edid_override implementation */
> int drm_edid_override_show(struct drm_connector *connector, struct seq_file *m)
> {
> - struct drm_property_blob *edid = connector->edid_blob_ptr;
> + const struct drm_edid *drm_edid = connector->edid_override;
>
> - if (connector->override_edid && edid)
> - seq_write(m, edid->data, edid->length);
> + if (drm_edid)
> + seq_write(m, drm_edid->edid, drm_edid->size);
>
> return 0;
> }
> @@ -2235,32 +2235,33 @@ int drm_edid_override_show(struct drm_connector *connector, struct seq_file *m)
> int drm_edid_override_set(struct drm_connector *connector, const void *edid,
> size_t size)
> {
> - int ret;
> + drm_edid_free(connector->edid_override);
>
> - if (size < EDID_LENGTH || edid_size(edid) > size)
> + connector->edid_override = drm_edid_alloc(edid, size);
> + if (!drm_edid_valid(connector->edid_override)) {
> + drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID override invalid\n",
> + connector->base.id, connector->name);
> + drm_edid_free(connector->edid_override);
> + connector->edid_override = NULL;
> return -EINVAL;
Hmm. Should we perhaps invest in some locking around these parts?
> -
> - connector->override_edid = false;
> + }
>
> drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID override set\n",
> connector->base.id, connector->name);
>
> - ret = drm_connector_update_edid_property(connector, edid);
> - if (!ret)
> - connector->override_edid = true;
> -
> - return ret;
> + return 0;
> }
>
> /* For debugfs edid_override implementation */
> int drm_edid_override_reset(struct drm_connector *connector)
> {
> - connector->override_edid = false;
> -
> drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID override reset\n",
> connector->base.id, connector->name);
>
> - return drm_connector_update_edid_property(connector, NULL);
> + drm_edid_free(connector->edid_override);
> + connector->edid_override = NULL;
> +
> + return 0;
> }
>
> /**
> @@ -6634,23 +6635,6 @@ int drm_edid_connector_update(struct drm_connector *connector,
> {
> int count;
>
> - /*
> - * FIXME: Reconcile the differences in override_edid handling between
> - * this and drm_connector_update_edid_property().
> - *
> - * If override_edid is set, and the EDID passed in here originates from
> - * drm_edid_read() and friends, it will be the override EDID, and there
> - * are no issues. drm_connector_update_edid_property() ignoring requests
> - * to set the EDID dates back to a time when override EDID was not
> - * handled at the low level EDID read.
> - *
> - * The only way the EDID passed in here can be different from the
> - * override EDID is when a driver passes in an EDID that does *not*
> - * originate from drm_edid_read() and friends, or passes in a stale
> - * cached version. This, in turn, is a question of when an override EDID
> - * set via debugfs should take effect.
> - */
> -
> count = _drm_edid_connector_update(connector, drm_edid);
>
> _drm_update_tile_info(connector, drm_edid);
> @@ -6665,10 +6649,6 @@ EXPORT_SYMBOL(drm_edid_connector_update);
> static int _drm_connector_update_edid_property(struct drm_connector *connector,
> const struct drm_edid *drm_edid)
> {
> - /* ignore requests to set edid when overridden */
> - if (connector->override_edid)
> - return 0;
> -
> /*
> * Set the display info, using edid if available, otherwise resetting
> * the values to defaults. This duplicates the work done in
> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> index b1b2df48d42c..09a7d7f23e4a 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -1550,12 +1550,15 @@ struct drm_connector {
> struct drm_cmdline_mode cmdline_mode;
> /** @force: a DRM_FORCE_<foo> state for forced mode sets */
> enum drm_connector_force force;
> +
> /**
> - * @override_edid: has the EDID been overwritten through debugfs for
> - * testing? Do not modify outside of drm_edid_override_set() and
> - * drm_edid_override_reset().
> + * @edid_override: Override EDID set via debugfs.
> + *
> + * Do not modify or access outside of the drm_edid_override_* family of
> + * functions.
> */
> - bool override_edid;
> + const struct drm_edid *edid_override;
> +
> /** @epoch_counter: used to detect any other changes in connector, besides status */
> u64 epoch_counter;
>
> --
> 2.34.1
--
Ville Syrjälä
Intel
WARNING: multiple messages have this Message-ID (diff)
From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Jani Nikula <jani.nikula@intel.com>
Cc: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 09/15] drm/edid: detach debugfs EDID override from EDID property update
Date: Wed, 19 Oct 2022 23:07:36 +0300 [thread overview]
Message-ID: <Y1BZCPI8Fz353Aw9@intel.com> (raw)
In-Reply-To: <b68842462d58ca3c550049a95687f0ead81d615c.1665496046.git.jani.nikula@intel.com>
On Tue, Oct 11, 2022 at 04:49:43PM +0300, Jani Nikula wrote:
> Having the EDID override debugfs directly update the EDID property is
> problematic. The update is partial only. The driver has no way of
> knowing it's been updated. Mode list is not updated. It's an
> inconsistent state.
>
> Detach debugfs EDID override from the property update completely. Only
> set and reset a separate override EDID copy from debugfs, and have it
> take effect only at detect (via EDID read). The copy is at
> connector->edid_override.
>
> This also brings override EDID closer to firmware EDID in behaviour.
>
> Add validation of the override EDID which we completely lacked.
>
> Note that IGT already forces a detect whenever tests update the override
> EDID.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
> drivers/gpu/drm/drm_edid.c | 56 ++++++++++++-------------------------
> include/drm/drm_connector.h | 11 +++++---
> 2 files changed, 25 insertions(+), 42 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index c3cf942186b7..0f2898badd51 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -2207,8 +2207,8 @@ static struct edid *drm_get_override_edid(struct drm_connector *connector,
> {
> struct edid *override = NULL;
>
> - if (connector->override_edid)
> - override = drm_edid_duplicate(connector->edid_blob_ptr->data);
> + if (connector->edid_override)
> + override = drm_edid_duplicate(connector->edid_override->edid);
>
> if (!override)
> override = drm_load_edid_firmware(connector);
> @@ -2223,10 +2223,10 @@ static struct edid *drm_get_override_edid(struct drm_connector *connector,
> /* For debugfs edid_override implementation */
> int drm_edid_override_show(struct drm_connector *connector, struct seq_file *m)
> {
> - struct drm_property_blob *edid = connector->edid_blob_ptr;
> + const struct drm_edid *drm_edid = connector->edid_override;
>
> - if (connector->override_edid && edid)
> - seq_write(m, edid->data, edid->length);
> + if (drm_edid)
> + seq_write(m, drm_edid->edid, drm_edid->size);
>
> return 0;
> }
> @@ -2235,32 +2235,33 @@ int drm_edid_override_show(struct drm_connector *connector, struct seq_file *m)
> int drm_edid_override_set(struct drm_connector *connector, const void *edid,
> size_t size)
> {
> - int ret;
> + drm_edid_free(connector->edid_override);
>
> - if (size < EDID_LENGTH || edid_size(edid) > size)
> + connector->edid_override = drm_edid_alloc(edid, size);
> + if (!drm_edid_valid(connector->edid_override)) {
> + drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID override invalid\n",
> + connector->base.id, connector->name);
> + drm_edid_free(connector->edid_override);
> + connector->edid_override = NULL;
> return -EINVAL;
Hmm. Should we perhaps invest in some locking around these parts?
> -
> - connector->override_edid = false;
> + }
>
> drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID override set\n",
> connector->base.id, connector->name);
>
> - ret = drm_connector_update_edid_property(connector, edid);
> - if (!ret)
> - connector->override_edid = true;
> -
> - return ret;
> + return 0;
> }
>
> /* For debugfs edid_override implementation */
> int drm_edid_override_reset(struct drm_connector *connector)
> {
> - connector->override_edid = false;
> -
> drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID override reset\n",
> connector->base.id, connector->name);
>
> - return drm_connector_update_edid_property(connector, NULL);
> + drm_edid_free(connector->edid_override);
> + connector->edid_override = NULL;
> +
> + return 0;
> }
>
> /**
> @@ -6634,23 +6635,6 @@ int drm_edid_connector_update(struct drm_connector *connector,
> {
> int count;
>
> - /*
> - * FIXME: Reconcile the differences in override_edid handling between
> - * this and drm_connector_update_edid_property().
> - *
> - * If override_edid is set, and the EDID passed in here originates from
> - * drm_edid_read() and friends, it will be the override EDID, and there
> - * are no issues. drm_connector_update_edid_property() ignoring requests
> - * to set the EDID dates back to a time when override EDID was not
> - * handled at the low level EDID read.
> - *
> - * The only way the EDID passed in here can be different from the
> - * override EDID is when a driver passes in an EDID that does *not*
> - * originate from drm_edid_read() and friends, or passes in a stale
> - * cached version. This, in turn, is a question of when an override EDID
> - * set via debugfs should take effect.
> - */
> -
> count = _drm_edid_connector_update(connector, drm_edid);
>
> _drm_update_tile_info(connector, drm_edid);
> @@ -6665,10 +6649,6 @@ EXPORT_SYMBOL(drm_edid_connector_update);
> static int _drm_connector_update_edid_property(struct drm_connector *connector,
> const struct drm_edid *drm_edid)
> {
> - /* ignore requests to set edid when overridden */
> - if (connector->override_edid)
> - return 0;
> -
> /*
> * Set the display info, using edid if available, otherwise resetting
> * the values to defaults. This duplicates the work done in
> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> index b1b2df48d42c..09a7d7f23e4a 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -1550,12 +1550,15 @@ struct drm_connector {
> struct drm_cmdline_mode cmdline_mode;
> /** @force: a DRM_FORCE_<foo> state for forced mode sets */
> enum drm_connector_force force;
> +
> /**
> - * @override_edid: has the EDID been overwritten through debugfs for
> - * testing? Do not modify outside of drm_edid_override_set() and
> - * drm_edid_override_reset().
> + * @edid_override: Override EDID set via debugfs.
> + *
> + * Do not modify or access outside of the drm_edid_override_* family of
> + * functions.
> */
> - bool override_edid;
> + const struct drm_edid *edid_override;
> +
> /** @epoch_counter: used to detect any other changes in connector, besides status */
> u64 epoch_counter;
>
> --
> 2.34.1
--
Ville Syrjälä
Intel
next prev parent reply other threads:[~2022-10-19 20:07 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-11 13:49 [Intel-gfx] [PATCH 00/15] drm/edid: EDID override refactoring and fixes Jani Nikula
2022-10-11 13:49 ` Jani Nikula
2022-10-11 13:49 ` [Intel-gfx] [PATCH 01/15] drm/i915/hdmi: do dual mode detect only if connected Jani Nikula
2022-10-11 13:49 ` Jani Nikula
2022-10-13 18:41 ` [Intel-gfx] " Ville Syrjälä
2022-10-13 18:41 ` Ville Syrjälä
2022-10-13 19:24 ` [Intel-gfx] " Ville Syrjälä
2022-10-13 19:24 ` Ville Syrjälä
2022-10-14 8:14 ` [Intel-gfx] " Jani Nikula
2022-10-14 8:14 ` Jani Nikula
2022-10-19 18:56 ` [Intel-gfx] " Ville Syrjälä
2022-10-19 18:56 ` Ville Syrjälä
2022-10-19 19:23 ` [Intel-gfx] " Ville Syrjälä
2022-10-20 8:57 ` Jani Nikula
2022-10-20 9:25 ` Ville Syrjälä
2022-10-11 13:49 ` [Intel-gfx] [PATCH 02/15] drm/i915/hdmi: stop using connector->override_edid Jani Nikula
2022-10-11 13:49 ` Jani Nikula
2022-10-19 19:36 ` [Intel-gfx] " Ville Syrjälä
2022-10-19 19:36 ` Ville Syrjälä
2022-10-11 13:49 ` [PATCH 03/15] drm/amd/display: " Jani Nikula
2022-10-11 13:49 ` Jani Nikula
2022-10-11 13:49 ` [Intel-gfx] " Jani Nikula
2022-10-11 14:07 ` Harry Wentland
2022-10-11 14:07 ` [Intel-gfx] " Harry Wentland
2022-10-11 14:11 ` Jani Nikula
2022-10-11 14:11 ` [Intel-gfx] " Jani Nikula
2022-10-11 14:19 ` Alex Deucher
2022-10-11 14:19 ` Alex Deucher
2022-10-11 14:19 ` [Intel-gfx] " Alex Deucher
2022-10-11 13:49 ` [Intel-gfx] [PATCH 04/15] drm/edid: debug log EDID override set/reset Jani Nikula
2022-10-11 13:49 ` Jani Nikula
2022-10-19 19:36 ` [Intel-gfx] " Ville Syrjälä
2022-10-19 19:36 ` Ville Syrjälä
2022-10-11 13:49 ` [Intel-gfx] [PATCH 05/15] drm/edid: abstract debugfs override EDID show better Jani Nikula
2022-10-11 13:49 ` Jani Nikula
2022-10-19 19:37 ` [Intel-gfx] " Ville Syrjälä
2022-10-19 19:37 ` Ville Syrjälä
2022-10-11 13:49 ` [Intel-gfx] [PATCH 06/15] drm/edid: rename drm_add_override_edid_modes() to drm_edid_override_connector_update() Jani Nikula
2022-10-11 13:49 ` Jani Nikula
2022-10-19 20:04 ` [Intel-gfx] " Ville Syrjälä
2022-10-19 20:04 ` Ville Syrjälä
2022-10-11 13:49 ` [Intel-gfx] [PATCH 07/15] drm/edid: split drm_edid block count helper Jani Nikula
2022-10-11 13:49 ` Jani Nikula
2022-10-19 19:44 ` [Intel-gfx] " Ville Syrjälä
2022-10-19 19:44 ` Ville Syrjälä
2022-10-11 13:49 ` [Intel-gfx] [PATCH 08/15] drm/edid: add function for checking drm_edid validity Jani Nikula
2022-10-11 13:49 ` Jani Nikula
2022-10-19 19:46 ` [Intel-gfx] " Ville Syrjälä
2022-10-19 19:46 ` Ville Syrjälä
2022-10-11 13:49 ` [Intel-gfx] [PATCH 09/15] drm/edid: detach debugfs EDID override from EDID property update Jani Nikula
2022-10-11 13:49 ` Jani Nikula
2022-10-19 20:07 ` Ville Syrjälä [this message]
2022-10-19 20:07 ` Ville Syrjälä
2022-10-11 13:49 ` [Intel-gfx] [PATCH 10/15] drm/edid/firmware: drop redundant connector_name variable/parameter Jani Nikula
2022-10-11 13:49 ` Jani Nikula
2022-10-19 19:52 ` [Intel-gfx] " Ville Syrjälä
2022-10-19 19:52 ` Ville Syrjälä
2022-10-11 13:49 ` [Intel-gfx] [PATCH 11/15] drm/edid/firmware: rename drm_load_edid_firmware() to drm_edid_load_firmware() Jani Nikula
2022-10-11 13:49 ` Jani Nikula
2022-10-19 20:07 ` [Intel-gfx] " Ville Syrjälä
2022-10-19 20:07 ` Ville Syrjälä
2022-10-11 13:49 ` [Intel-gfx] [PATCH 12/15] drm/edid: use struct drm_edid for override/firmware EDID Jani Nikula
2022-10-11 13:49 ` Jani Nikula
2022-10-19 20:01 ` [Intel-gfx] " Ville Syrjälä
2022-10-19 20:01 ` Ville Syrjälä
2022-10-11 13:49 ` [Intel-gfx] [PATCH 13/15] drm/edid: move edid load declarations to internal header Jani Nikula
2022-10-11 13:49 ` Jani Nikula
2022-10-19 20:08 ` [Intel-gfx] " Ville Syrjälä
2022-10-19 20:08 ` Ville Syrjälä
2022-10-11 13:49 ` [Intel-gfx] [PATCH 14/15] drm/edid/firmware: convert to drm device specific logging Jani Nikula
2022-10-11 13:49 ` Jani Nikula
2022-10-19 20:10 ` [Intel-gfx] " Ville Syrjälä
2022-10-19 20:10 ` Ville Syrjälä
2022-10-11 13:49 ` [Intel-gfx] [PATCH 15/15] drm/edid: convert to " Jani Nikula
2022-10-11 13:49 ` Jani Nikula
2022-10-19 20:12 ` [Intel-gfx] " Ville Syrjälä
2022-10-19 20:12 ` Ville Syrjälä
2022-10-11 15:30 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/edid: EDID override refactoring and fixes Patchwork
2022-10-11 15:30 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2022-10-11 15:52 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2022-10-11 18:49 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " 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=Y1BZCPI8Fz353Aw9@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=jani.nikula@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.