All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jani Nikula <jani.nikula@linux.intel.com>
To: "Louis Chauvet" <louis.chauvet@bootlin.com>,
	"Maíra Canal" <mairacanal@riseup.net>,
	"Haneen Mohammed" <hamohammed.sa@gmail.com>,
	"Simona Vetter" <simona@ffwll.ch>,
	"Melissa Wen" <melissa.srw@gmail.com>,
	"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Thomas Zimmermann" <tzimmermann@suse.de>,
	"David Airlie" <airlied@gmail.com>
Cc: arthurgrillo@riseup.net, jeremie.dautheribes@bootlin.com,
	miquel.raynal@bootlin.com, thomas.petazzoni@bootlin.com,
	seanpaul@google.com, nicolejadeyee@google.com,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	Louis Chauvet <louis.chauvet@bootlin.com>
Subject: Re: [PATCH RFC v2 17/18] drm/vkms: Introduce config for connector EDID
Date: Mon, 25 Nov 2024 11:45:04 +0200	[thread overview]
Message-ID: <87o723y7dr.fsf@intel.com> (raw)
In-Reply-To: <20241122-google-remove-crtc-index-from-parameter-v2-17-81540742535a@bootlin.com>

On Fri, 22 Nov 2024, Louis Chauvet <louis.chauvet@bootlin.com> wrote:
> To properly test the EDID reading without using the DRM override, add an
> option to configure the EDID for a connector.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
>  drivers/gpu/drm/vkms/vkms_config.c |  1 +
>  drivers/gpu/drm/vkms/vkms_config.h |  2 ++
>  drivers/gpu/drm/vkms/vkms_output.c | 37 ++++++++++++++++++++++++++++++++++---
>  3 files changed, 37 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms_config.c
> index ac1a9658c5075c118d59da965ca3392355ccb2b2..1a1234d4f10fa8e5ea6bd649139ecc10c991f875 100644
> --- a/drivers/gpu/drm/vkms/vkms_config.c
> +++ b/drivers/gpu/drm/vkms/vkms_config.c
> @@ -199,6 +199,7 @@ struct vkms_config_connector *vkms_config_create_connector(struct vkms_config *v
>  	xa_init_flags(&vkms_config_connector->possible_encoders, XA_FLAGS_ALLOC);
>  	vkms_config_connector->type = DRM_MODE_CONNECTOR_VIRTUAL;
>  	vkms_config_connector->status = connector_status_unknown;
> +	vkms_config_connector->edid_blob_len = 0;
>  
>  	return vkms_config_connector;
>  }
> diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms_config.h
> index bba56c9d8aeceac97a4339ef42ab663c5dc54e65..1220b16f6c98d1ebb0ae55d662a84fe25e1a6a02 100644
> --- a/drivers/gpu/drm/vkms/vkms_config.h
> +++ b/drivers/gpu/drm/vkms/vkms_config.h
> @@ -112,6 +112,8 @@ struct vkms_config_connector {
>  	struct xarray possible_encoders;
>  	int type;
>  	enum drm_connector_status status;
> +	char edid_blob[PAGE_SIZE];
> +	int edid_blob_len;
>  
>  	/* Internal usage */
>  	struct drm_connector *connector;
> diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms_output.c
> index fc6a0cdade0739b94820ed4e0924cf355137fe79..56590afb33d75465971d10a282040690840cdbee 100644
> --- a/drivers/gpu/drm/vkms/vkms_output.c
> +++ b/drivers/gpu/drm/vkms/vkms_output.c
> @@ -31,13 +31,44 @@ static const struct drm_connector_funcs vkms_connector_funcs = {
>  	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
>  };
>  
> +static int vkms_connector_read_block(void *context, u8 *buf, unsigned int block, size_t len)
> +{
> +	struct vkms_config_connector *config = context;
> +
> +	if (block * len + len > config->edid_blob_len)

The parameters to the read block function are a bit weird for historical
reasons. The start offset is indicated by block number, length by
len. The start byte offset is thus block * EDID_LENGTH! There's no
smaller granularity for start offset. However len can be < EDID_LENGTH!

So the above should be (block * EDID_LENGTH + len > edid_blob_len)

> +		return 1;
> +	memcpy(buf, &config->edid_blob[block * len], len);

And this should be &config->edid_blob[block * EDID_LENGTH].

(Your patch would work, but just by coincidence due to the way the read
block function is currently called.)

> +	return 0;
> +}
> +
>  static int vkms_conn_get_modes(struct drm_connector *connector)
>  {
> +	const struct drm_edid *drm_edid = NULL;
>  	int count;
> +	struct vkms_config_connector *connector_cfg;
> +	struct vkms_device *vkmsdev = drm_device_to_vkms_device(connector->dev);
> +	struct vkms_config_connector *context = NULL;
> +
> +	list_for_each_entry(connector_cfg, &vkmsdev->config->connectors, link) {
> +		if (connector_cfg->connector == connector) {
> +			context = connector_cfg;
> +			break;
> +		}
> +	}
> +	if (context)
> +		drm_edid = drm_edid_read_custom(connector, vkms_connector_read_block, context);

Thanks for using drm_edid_read_custom() for this btw!

> +
> +	/*
> +	 * Unconditionally update the connector. If the EDID was read
> +	 * successfully, fill in the connector information derived from the
> +	 * EDID. Otherwise, if the EDID is NULL, clear the connector
> +	 * information.
> +	 */
> +	drm_edid_connector_update(connector, drm_edid);
> +
> +	count = drm_edid_connector_add_modes(connector);
>  
> -	/* Use the default modes list from DRM */
> -	count = drm_add_modes_noedid(connector, XRES_MAX, YRES_MAX);
> -	drm_set_preferred_mode(connector, XRES_DEF, YRES_DEF);

I don't really know anything about your use case, but don't you want to
fall back to the above for drm_edid == NULL? *shrug*

BR,
Jani.

> +	drm_edid_free(drm_edid);
>  
>  	return count;
>  }

-- 
Jani Nikula, Intel

  parent reply	other threads:[~2024-11-25  9:45 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-22 17:20 [PATCH RFC v2 00/18] drm/vkms: Introduce detailed configuration Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 01/18] drm/vkms: Extract vkms_config header Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 02/18] drm/vkms: Add a validation function for vkms configuration Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 03/18] drm/vkms: Move default_config creation to its own function Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 04/18] drm/vkms: Introduce config for plane Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 05/18] drm/vkms: Introduce config for plane name Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 06/18] drm/vkms: Introduce config for plane rotation Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 07/18] drm/vkms: Introduce config for plane color encoding Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 08/18] drm/vkms: Introduce config for plane color range Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 09/18] drm/vkms: Introduce config for CRTCs and encoders Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 10/18] drm/vkms: Introduce config for encoder name Louis Chauvet
2024-11-25  9:28   ` Jani Nikula
2024-11-25  9:50     ` Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 11/18] drm/vkms: Introduce config for CRTC name Louis Chauvet
2024-11-25  9:29   ` Jani Nikula
2024-11-22 17:20 ` [PATCH RFC v2 12/18] drm/vkms: Add test for config structure Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 13/18] drm/vkms: Introduce config for connector Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 14/18] drm/vkms: Introduce config for connector type Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 15/18] drm/vkms: Introduce config for plane format Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 16/18] drm/vkms: Introduce config for connector status Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 17/18] drm/vkms: Introduce config for connector EDID Louis Chauvet
2024-11-22 21:28   ` Ian Forbes
2024-11-23 10:45     ` Louis Chauvet
2024-11-25  9:45   ` Jani Nikula [this message]
2024-11-25 10:19     ` Louis Chauvet
2024-11-22 17:20 ` [PATCH RFC v2 18/18] drm/vkms: Introduce config for encoder type Louis Chauvet

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=87o723y7dr.fsf@intel.com \
    --to=jani.nikula@linux.intel.com \
    --cc=airlied@gmail.com \
    --cc=arthurgrillo@riseup.net \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hamohammed.sa@gmail.com \
    --cc=jeremie.dautheribes@bootlin.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=louis.chauvet@bootlin.com \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mairacanal@riseup.net \
    --cc=melissa.srw@gmail.com \
    --cc=miquel.raynal@bootlin.com \
    --cc=mripard@kernel.org \
    --cc=nicolejadeyee@google.com \
    --cc=seanpaul@google.com \
    --cc=simona@ffwll.ch \
    --cc=thomas.petazzoni@bootlin.com \
    --cc=tzimmermann@suse.de \
    /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.