[Intel-gfx] [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 Intel-gfx
mailing list