[PATCH 3/4] drm/displayid: provide access to DisplayID version and primary use case

Dmitry Osipenko dmitry.osipenko at collabora.com
Tue Feb 21 16:27:37 UTC 2023


On 2/16/23 23:45, Jani Nikula wrote:
> The DisplayID structure version and primary use case are stored in the
> DisplayID Base Section. We should be checking them in a number of places
> when parsing the DisplayID blocks. Currently, we completely ignore the
> primary use case, and just look at the block tags without cross-checking
> against structure version.
> 
> Store the version and primary use case in the DisplayID iterator, and
> provide accessors to them. In general, the information is needed when
> iterating the blocks, and this is a convenient place to both store and
> retrieve the information during parsing.
> 
> Promote using accessors rather than users poking at the iterator
> directly.
> 
> Cc: Iaroslav Boliukin <iam at lach.pw>
> Cc: Dmitry Osipenko <dmitry.osipenko at collabora.com>
> Signed-off-by: Jani Nikula <jani.nikula at intel.com>
> ---
>  drivers/gpu/drm/drm_displayid.c | 30 ++++++++++++++++++++++++++++++
>  include/drm/drm_displayid.h     | 12 +++++++++++-
>  2 files changed, 41 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/drm_displayid.c b/drivers/gpu/drm/drm_displayid.c
> index 0de9b5530393..9edc111be7ee 100644
> --- a/drivers/gpu/drm/drm_displayid.c
> +++ b/drivers/gpu/drm/drm_displayid.c
> @@ -123,6 +123,9 @@ __displayid_iter_next(struct displayid_iter *iter)
>  	}
>  
>  	for (;;) {
> +		/* The first section we encounter is the base section */
> +		bool base_section = !iter->section;
> +
>  		iter->section = drm_find_displayid_extension(iter->drm_edid,
>  							     &iter->length,
>  							     &iter->idx,
> @@ -132,6 +135,18 @@ __displayid_iter_next(struct displayid_iter *iter)
>  			return NULL;
>  		}
>  
> +		/* Save the structure version and primary use case. */
> +		if (base_section) {
> +			const struct displayid_header *base;
> +
> +			base = displayid_get_header(iter->section, iter->length,
> +						    iter->idx);
> +			if (!IS_ERR(base)) {
> +				iter->version = base->rev;
> +				iter->primary_use = base->prod_id;
> +			}
> +		}
> +
>  		iter->idx += sizeof(struct displayid_header);
>  
>  		block = displayid_iter_block(iter);
> @@ -144,3 +159,18 @@ void displayid_iter_end(struct displayid_iter *iter)
>  {
>  	memset(iter, 0, sizeof(*iter));
>  }
> +
> +/* DisplayID Structure Version/Revision from the Base Section. */
> +u8 displayid_version(const struct displayid_iter *iter)
> +{
> +	return iter->version;
> +}
> +
> +/*
> + * DisplayID Primary Use Case (2.0+) or Product Type Identifier (1.0-1.3) from
> + * the Base Section.
> + */
> +u8 displayid_primary_use(const struct displayid_iter *iter)
> +{
> +	return iter->primary_use;
> +}
> diff --git a/include/drm/drm_displayid.h b/include/drm/drm_displayid.h
> index 49649eb8447e..566497eeb3b8 100644
> --- a/include/drm/drm_displayid.h
> +++ b/include/drm/drm_displayid.h
> @@ -139,7 +139,11 @@ struct displayid_vesa_vendor_specific_block {
>  	u8 mso;
>  } __packed;
>  
> -/* DisplayID iteration */
> +/*
> + * DisplayID iteration.
> + *
> + * Do not access directly, this is private.
> + */
>  struct displayid_iter {
>  	const struct drm_edid *drm_edid;
>  
> @@ -147,6 +151,9 @@ struct displayid_iter {
>  	int length;
>  	int idx;
>  	int ext_index;
> +
> +	u8 version;
> +	u8 primary_use;
>  };
>  
>  void displayid_iter_edid_begin(const struct drm_edid *drm_edid,
> @@ -157,4 +164,7 @@ __displayid_iter_next(struct displayid_iter *iter);
>  	while (((__block) = __displayid_iter_next(__iter)))
>  void displayid_iter_end(struct displayid_iter *iter);
>  
> +u8 displayid_version(const struct displayid_iter *iter);
> +u8 displayid_primary_use(const struct displayid_iter *iter);
> +
>  #endif

Tested-by: Dmitry Osipenko <dmitry.osipenko at collabora.com>
Reviewed-by: Dmitry Osipenko <dmitry.osipenko at collabora.com>

-- 
Best regards,
Dmitry



More information about the dri-devel mailing list