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 |
> -----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 --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 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