diff mbox series

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

Message ID f681c6c25b258cddc28c51fe582201802e4aada1.1694078430.git.jani.nikula@intel.com (mailing list archive)
State New, archived
Headers show
Series drm/edid: split out drm_eld.[ch], add some SAD helpers | expand

Commit Message

Jani Nikula Sept. 7, 2023, 9:28 a.m. UTC
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@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@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

Comments

Golani, Mitulkumar Ajitkumar Sept. 25, 2023, 3:52 p.m. UTC | #1
> -----Original Message-----
> From: Nikula, Jani <jani.nikula@intel.com>
> Sent: Thursday, September 7, 2023 2:58 PM
> To: dri-devel@lists.freedesktop.org
> Cc: intel-gfx@lists.freedesktop.org; Nikula, Jani <jani.nikula@intel.com>;
> Golani, Mitulkumar Ajitkumar <mitulkumar.ajitkumar.golani@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@intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@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@intel.com>
> --
> 2.39.2
diff mbox series

Patch

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__ */