[PATCH 1/6] drm/edid: split out drm_eld.h from drm_edid.h

Golani, Mitulkumar Ajitkumar mitulkumar.ajitkumar.golani at intel.com
Mon Sep 25 15:52:49 UTC 2023


> -----Original Message-----
> From: Nikula, Jani <jani.nikula at intel.com>
> Sent: Thursday, September 7, 2023 2:58 PM
> To: dri-devel at lists.freedesktop.org
> Cc: intel-gfx at lists.freedesktop.org; Nikula, Jani <jani.nikula at intel.com>;
> Golani, Mitulkumar Ajitkumar <mitulkumar.ajitkumar.golani at intel.com>
> Subject: [PATCH 1/6] drm/edid: split out drm_eld.h from drm_edid.h
> 
> The drm_edid.[ch] files are starting to be a bit crowded, and with plans to
> add more ELD related functionality, it's perhaps cleanest to split the ELD code
> out to a header of its own.
> 
> Include drm_eld.h from drm_edid.h for starters, and leave it to follow-up
> work to only include drm_eld.h where needed.
> 
> Cc: Mitul Golani <mitulkumar.ajitkumar.golani at intel.com>
> Signed-off-by: Jani Nikula <jani.nikula at intel.com>
> ---
>  Documentation/gpu/drm-kms-helpers.rst |   3 +
>  include/drm/drm_edid.h                | 149 +-----------------------
>  include/drm/drm_eld.h                 | 159 ++++++++++++++++++++++++++
>  3 files changed, 163 insertions(+), 148 deletions(-)  create mode 100644
> include/drm/drm_eld.h
> 
> diff --git a/Documentation/gpu/drm-kms-helpers.rst
> b/Documentation/gpu/drm-kms-helpers.rst
> index b8ab05e42dbb..f0f93aa62545 100644
> --- a/Documentation/gpu/drm-kms-helpers.rst
> +++ b/Documentation/gpu/drm-kms-helpers.rst
> @@ -363,6 +363,9 @@ EDID Helper Functions Reference  .. kernel-doc::
> drivers/gpu/drm/drm_edid.c
>     :export:
> 
> +.. kernel-doc:: include/drm/drm_eld.h
> +   :internal:
> +
>  SCDC Helper Functions Reference
>  ===============================
> 
> diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h index
> 882d2638708e..1ff52f57ab9c 100644
> --- a/include/drm/drm_edid.h
> +++ b/include/drm/drm_edid.h
> @@ -25,6 +25,7 @@
> 
>  #include <linux/types.h>
>  #include <linux/hdmi.h>
> +#include <drm/drm_eld.h> /* FIXME: remove this, include directly where
> +needed */
>  #include <drm/drm_mode.h>
> 
>  struct drm_device;
> @@ -269,64 +270,6 @@ struct detailed_timing {
>  #define DRM_EDID_DSC_MAX_SLICES			0xf
>  #define DRM_EDID_DSC_TOTAL_CHUNK_KBYTES		0x3f
> 
> -/* ELD Header Block */
> -#define DRM_ELD_HEADER_BLOCK_SIZE	4
> -
> -#define DRM_ELD_VER			0
> -# define DRM_ELD_VER_SHIFT		3
> -# define DRM_ELD_VER_MASK		(0x1f << 3)
> -# define DRM_ELD_VER_CEA861D		(2 << 3) /* supports 861D or
> below */
> -# define DRM_ELD_VER_CANNED		(0x1f << 3)
> -
> -#define DRM_ELD_BASELINE_ELD_LEN	2	/* in dwords! */
> -
> -/* ELD Baseline Block for ELD_Ver == 2 */
> -#define DRM_ELD_CEA_EDID_VER_MNL	4
> -# define DRM_ELD_CEA_EDID_VER_SHIFT	5
> -# define DRM_ELD_CEA_EDID_VER_MASK	(7 << 5)
> -# define DRM_ELD_CEA_EDID_VER_NONE	(0 << 5)
> -# define DRM_ELD_CEA_EDID_VER_CEA861	(1 << 5)
> -# define DRM_ELD_CEA_EDID_VER_CEA861A	(2 << 5)
> -# define DRM_ELD_CEA_EDID_VER_CEA861BCD	(3 << 5)
> -# define DRM_ELD_MNL_SHIFT		0
> -# define DRM_ELD_MNL_MASK		(0x1f << 0)
> -
> -#define DRM_ELD_SAD_COUNT_CONN_TYPE	5
> -# define DRM_ELD_SAD_COUNT_SHIFT	4
> -# define DRM_ELD_SAD_COUNT_MASK		(0xf << 4)
> -# define DRM_ELD_CONN_TYPE_SHIFT	2
> -# define DRM_ELD_CONN_TYPE_MASK		(3 << 2)
> -# define DRM_ELD_CONN_TYPE_HDMI		(0 << 2)
> -# define DRM_ELD_CONN_TYPE_DP		(1 << 2)
> -# define DRM_ELD_SUPPORTS_AI		(1 << 1)
> -# define DRM_ELD_SUPPORTS_HDCP		(1 << 0)
> -
> -#define DRM_ELD_AUD_SYNCH_DELAY		6	/* in units of
> 2 ms */
> -# define DRM_ELD_AUD_SYNCH_DELAY_MAX	0xfa	/* 500 ms */
> -
> -#define DRM_ELD_SPEAKER			7
> -# define DRM_ELD_SPEAKER_MASK		0x7f
> -# define DRM_ELD_SPEAKER_RLRC		(1 << 6)
> -# define DRM_ELD_SPEAKER_FLRC		(1 << 5)
> -# define DRM_ELD_SPEAKER_RC		(1 << 4)
> -# define DRM_ELD_SPEAKER_RLR		(1 << 3)
> -# define DRM_ELD_SPEAKER_FC		(1 << 2)
> -# define DRM_ELD_SPEAKER_LFE		(1 << 1)
> -# define DRM_ELD_SPEAKER_FLR		(1 << 0)
> -
> -#define DRM_ELD_PORT_ID			8	/* offsets 8..15
> inclusive */
> -# define DRM_ELD_PORT_ID_LEN		8
> -
> -#define DRM_ELD_MANUFACTURER_NAME0	16
> -#define DRM_ELD_MANUFACTURER_NAME1	17
> -
> -#define DRM_ELD_PRODUCT_CODE0		18
> -#define DRM_ELD_PRODUCT_CODE1		19
> -
> -#define DRM_ELD_MONITOR_NAME_STRING	20	/* offsets
> 20..(20+mnl-1) inclusive */
> -
> -#define DRM_ELD_CEA_SAD(mnl, sad)	(20 + (mnl) + 3 * (sad))
> -
>  struct edid {
>  	u8 header[8];
>  	/* Vendor & product info */
> @@ -409,96 +352,6 @@ drm_hdmi_avi_infoframe_quant_range(struct
> hdmi_avi_infoframe *frame,
>  				   const struct drm_display_mode *mode,
>  				   enum hdmi_quantization_range
> rgb_quant_range);
> 
> -/**
> - * drm_eld_mnl - Get ELD monitor name length in bytes.
> - * @eld: pointer to an eld memory structure with mnl set
> - */
> -static inline int drm_eld_mnl(const uint8_t *eld) -{
> -	return (eld[DRM_ELD_CEA_EDID_VER_MNL] &
> DRM_ELD_MNL_MASK) >> DRM_ELD_MNL_SHIFT;
> -}
> -
> -/**
> - * drm_eld_sad - Get ELD SAD structures.
> - * @eld: pointer to an eld memory structure with sad_count set
> - */
> -static inline const uint8_t *drm_eld_sad(const uint8_t *eld) -{
> -	unsigned int ver, mnl;
> -
> -	ver = (eld[DRM_ELD_VER] & DRM_ELD_VER_MASK) >>
> DRM_ELD_VER_SHIFT;
> -	if (ver != 2 && ver != 31)
> -		return NULL;
> -
> -	mnl = drm_eld_mnl(eld);
> -	if (mnl > 16)
> -		return NULL;
> -
> -	return eld + DRM_ELD_CEA_SAD(mnl, 0);
> -}
> -
> -/**
> - * drm_eld_sad_count - Get ELD SAD count.
> - * @eld: pointer to an eld memory structure with sad_count set
> - */
> -static inline int drm_eld_sad_count(const uint8_t *eld) -{
> -	return (eld[DRM_ELD_SAD_COUNT_CONN_TYPE] &
> DRM_ELD_SAD_COUNT_MASK) >>
> -		DRM_ELD_SAD_COUNT_SHIFT;
> -}
> -
> -/**
> - * drm_eld_calc_baseline_block_size - Calculate baseline block size in bytes
> - * @eld: pointer to an eld memory structure with mnl and sad_count set
> - *
> - * This is a helper for determining the payload size of the baseline block, in
> - * bytes, for e.g. setting the Baseline_ELD_Len field in the ELD header block.
> - */
> -static inline int drm_eld_calc_baseline_block_size(const uint8_t *eld) -{
> -	return DRM_ELD_MONITOR_NAME_STRING -
> DRM_ELD_HEADER_BLOCK_SIZE +
> -		drm_eld_mnl(eld) + drm_eld_sad_count(eld) * 3;
> -}
> -
> -/**
> - * drm_eld_size - Get ELD size in bytes
> - * @eld: pointer to a complete eld memory structure
> - *
> - * The returned value does not include the vendor block. It's vendor specific,
> - * and comprises of the remaining bytes in the ELD memory buffer after
> - * drm_eld_size() bytes of header and baseline block.
> - *
> - * The returned value is guaranteed to be a multiple of 4.
> - */
> -static inline int drm_eld_size(const uint8_t *eld) -{
> -	return DRM_ELD_HEADER_BLOCK_SIZE +
> eld[DRM_ELD_BASELINE_ELD_LEN] * 4;
> -}
> -
> -/**
> - * drm_eld_get_spk_alloc - Get speaker allocation
> - * @eld: pointer to an ELD memory structure
> - *
> - * The returned value is the speakers mask. User has to use
> %DRM_ELD_SPEAKER
> - * field definitions to identify speakers.
> - */
> -static inline u8 drm_eld_get_spk_alloc(const uint8_t *eld) -{
> -	return eld[DRM_ELD_SPEAKER] & DRM_ELD_SPEAKER_MASK;
> -}
> -
> -/**
> - * drm_eld_get_conn_type - Get device type hdmi/dp connected
> - * @eld: pointer to an ELD memory structure
> - *
> - * The caller need to use %DRM_ELD_CONN_TYPE_HDMI or
> %DRM_ELD_CONN_TYPE_DP to
> - * identify the display type connected.
> - */
> -static inline u8 drm_eld_get_conn_type(const uint8_t *eld) -{
> -	return eld[DRM_ELD_SAD_COUNT_CONN_TYPE] &
> DRM_ELD_CONN_TYPE_MASK;
> -}
> -
>  /**
>   * drm_edid_decode_mfg_id - Decode the manufacturer ID
>   * @mfg_id: The manufacturer ID
> diff --git a/include/drm/drm_eld.h b/include/drm/drm_eld.h new file mode
> 100644 index 000000000000..9bde89bd96ea
> --- /dev/null
> +++ b/include/drm/drm_eld.h
> @@ -0,0 +1,159 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2023 Intel Corporation
> + */
> +
> +#ifndef __DRM_ELD_H__
> +#define __DRM_ELD_H__
> +
> +#include <linux/types.h>
> +
> +/* ELD Header Block */
> +#define DRM_ELD_HEADER_BLOCK_SIZE	4
> +
> +#define DRM_ELD_VER			0
> +# define DRM_ELD_VER_SHIFT		3
> +# define DRM_ELD_VER_MASK		(0x1f << 3)
> +# define DRM_ELD_VER_CEA861D		(2 << 3) /* supports 861D or
> below */
> +# define DRM_ELD_VER_CANNED		(0x1f << 3)
> +
> +#define DRM_ELD_BASELINE_ELD_LEN	2	/* in dwords! */
> +
> +/* ELD Baseline Block for ELD_Ver == 2 */
> +#define DRM_ELD_CEA_EDID_VER_MNL	4
> +# define DRM_ELD_CEA_EDID_VER_SHIFT	5
> +# define DRM_ELD_CEA_EDID_VER_MASK	(7 << 5)
> +# define DRM_ELD_CEA_EDID_VER_NONE	(0 << 5)
> +# define DRM_ELD_CEA_EDID_VER_CEA861	(1 << 5)
> +# define DRM_ELD_CEA_EDID_VER_CEA861A	(2 << 5)
> +# define DRM_ELD_CEA_EDID_VER_CEA861BCD	(3 << 5)
> +# define DRM_ELD_MNL_SHIFT		0
> +# define DRM_ELD_MNL_MASK		(0x1f << 0)
> +
> +#define DRM_ELD_SAD_COUNT_CONN_TYPE	5
> +# define DRM_ELD_SAD_COUNT_SHIFT	4
> +# define DRM_ELD_SAD_COUNT_MASK		(0xf << 4)
> +# define DRM_ELD_CONN_TYPE_SHIFT	2
> +# define DRM_ELD_CONN_TYPE_MASK		(3 << 2)
> +# define DRM_ELD_CONN_TYPE_HDMI		(0 << 2)
> +# define DRM_ELD_CONN_TYPE_DP		(1 << 2)
> +# define DRM_ELD_SUPPORTS_AI		(1 << 1)
> +# define DRM_ELD_SUPPORTS_HDCP		(1 << 0)
> +
> +#define DRM_ELD_AUD_SYNCH_DELAY		6	/* in units of
> 2 ms */
> +# define DRM_ELD_AUD_SYNCH_DELAY_MAX	0xfa	/* 500 ms */
> +
> +#define DRM_ELD_SPEAKER			7
> +# define DRM_ELD_SPEAKER_MASK		0x7f
> +# define DRM_ELD_SPEAKER_RLRC		(1 << 6)
> +# define DRM_ELD_SPEAKER_FLRC		(1 << 5)
> +# define DRM_ELD_SPEAKER_RC		(1 << 4)
> +# define DRM_ELD_SPEAKER_RLR		(1 << 3)
> +# define DRM_ELD_SPEAKER_FC		(1 << 2)
> +# define DRM_ELD_SPEAKER_LFE		(1 << 1)
> +# define DRM_ELD_SPEAKER_FLR		(1 << 0)
> +
> +#define DRM_ELD_PORT_ID			8	/* offsets 8..15
> inclusive */
> +# define DRM_ELD_PORT_ID_LEN		8
> +
> +#define DRM_ELD_MANUFACTURER_NAME0	16
> +#define DRM_ELD_MANUFACTURER_NAME1	17
> +
> +#define DRM_ELD_PRODUCT_CODE0		18
> +#define DRM_ELD_PRODUCT_CODE1		19
> +
> +#define DRM_ELD_MONITOR_NAME_STRING	20	/* offsets
> 20..(20+mnl-1) inclusive */
> +
> +#define DRM_ELD_CEA_SAD(mnl, sad)	(20 + (mnl) + 3 * (sad))
> +
> +/**
> + * drm_eld_mnl - Get ELD monitor name length in bytes.
> + * @eld: pointer to an eld memory structure with mnl set  */ static
> +inline int drm_eld_mnl(const uint8_t *eld) {
> +	return (eld[DRM_ELD_CEA_EDID_VER_MNL] &
> DRM_ELD_MNL_MASK) >>
> +DRM_ELD_MNL_SHIFT; }
> +
> +/**
> + * drm_eld_sad - Get ELD SAD structures.
> + * @eld: pointer to an eld memory structure with sad_count set  */
> +static inline const uint8_t *drm_eld_sad(const uint8_t *eld) {
> +	unsigned int ver, mnl;
> +
> +	ver = (eld[DRM_ELD_VER] & DRM_ELD_VER_MASK) >>
> DRM_ELD_VER_SHIFT;
> +	if (ver != 2 && ver != 31)
> +		return NULL;
> +
> +	mnl = drm_eld_mnl(eld);
> +	if (mnl > 16)
> +		return NULL;
> +
> +	return eld + DRM_ELD_CEA_SAD(mnl, 0);
> +}
> +
> +/**
> + * drm_eld_sad_count - Get ELD SAD count.
> + * @eld: pointer to an eld memory structure with sad_count set  */
> +static inline int drm_eld_sad_count(const uint8_t *eld) {
> +	return (eld[DRM_ELD_SAD_COUNT_CONN_TYPE] &
> DRM_ELD_SAD_COUNT_MASK) >>
> +		DRM_ELD_SAD_COUNT_SHIFT;
> +}
> +
> +/**
> + * drm_eld_calc_baseline_block_size - Calculate baseline block size in
> +bytes
> + * @eld: pointer to an eld memory structure with mnl and sad_count set
> + *
> + * This is a helper for determining the payload size of the baseline
> +block, in
> + * bytes, for e.g. setting the Baseline_ELD_Len field in the ELD header block.
> + */
> +static inline int drm_eld_calc_baseline_block_size(const uint8_t *eld)
> +{
> +	return DRM_ELD_MONITOR_NAME_STRING -
> DRM_ELD_HEADER_BLOCK_SIZE +
> +		drm_eld_mnl(eld) + drm_eld_sad_count(eld) * 3; }
> +
> +/**
> + * drm_eld_size - Get ELD size in bytes
> + * @eld: pointer to a complete eld memory structure
> + *
> + * The returned value does not include the vendor block. It's vendor
> +specific,
> + * and comprises of the remaining bytes in the ELD memory buffer after
> + * drm_eld_size() bytes of header and baseline block.
> + *
> + * The returned value is guaranteed to be a multiple of 4.
> + */
> +static inline int drm_eld_size(const uint8_t *eld) {
> +	return DRM_ELD_HEADER_BLOCK_SIZE +
> eld[DRM_ELD_BASELINE_ELD_LEN] * 4;
> +}
> +
> +/**
> + * drm_eld_get_spk_alloc - Get speaker allocation
> + * @eld: pointer to an ELD memory structure
> + *
> + * The returned value is the speakers mask. User has to use
> +%DRM_ELD_SPEAKER
> + * field definitions to identify speakers.
> + */
> +static inline u8 drm_eld_get_spk_alloc(const uint8_t *eld) {
> +	return eld[DRM_ELD_SPEAKER] & DRM_ELD_SPEAKER_MASK; }
> +
> +/**
> + * drm_eld_get_conn_type - Get device type hdmi/dp connected
> + * @eld: pointer to an ELD memory structure
> + *
> + * The caller need to use %DRM_ELD_CONN_TYPE_HDMI or
> +%DRM_ELD_CONN_TYPE_DP to
> + * identify the display type connected.
> + */
> +static inline u8 drm_eld_get_conn_type(const uint8_t *eld) {
> +	return eld[DRM_ELD_SAD_COUNT_CONN_TYPE] &
> DRM_ELD_CONN_TYPE_MASK; }
> +
> +#endif /* __DRM_ELD_H__ */


The commit splits drm_eld.h from drm_edid.h and commit message is also aligned to that.

Changes LGTM.
Reviewed-by: Mitul Golani <mitulkumar.ajitkumar.golani at intel.com>
> --
> 2.39.2



More information about the dri-devel mailing list