]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/edid: detect color formats and CTA revision in all CTA extensions
authorJani Nikula <jani.nikula@intel.com>
Thu, 5 May 2022 10:52:42 +0000 (13:52 +0300)
committerJani Nikula <jani.nikula@intel.com>
Thu, 5 May 2022 17:28:42 +0000 (20:28 +0300)
Convert drm_find_cea_extension() to EDID block iterator in color format
and CTA revision detection. Detect them in all CTA extensions.

Also parse CTA Data Blocks in DisplayID even if there's no CTA EDID
extension.

v2:
- Don't assume DRM_COLOR_FORMAT_RGB444 support if there's only DisplayID
  CTA Data Blocks (Ville)

Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220505105242.1198521-1-jani.nikula@intel.com
drivers/gpu/drm/drm_edid.c

index 3b18a6e501df0791eb215f9c9dce5edb1b0212e1..8d737322145ca7a3d9cf9fb1269cd32aefcf638b 100644 (file)
@@ -5447,26 +5447,31 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
                              const struct edid *edid)
 {
        struct drm_display_info *info = &connector->display_info;
+       struct drm_edid_iter edid_iter;
        const struct cea_db *db;
        struct cea_db_iter iter;
        const u8 *edid_ext;
 
-       edid_ext = drm_find_cea_extension(edid);
-       if (!edid_ext)
-               return;
+       drm_edid_iter_begin(edid, &edid_iter);
+       drm_edid_iter_for_each(edid_ext, &edid_iter) {
+               if (edid_ext[0] != CEA_EXT)
+                       continue;
 
-       info->cea_rev = edid_ext[1];
+               if (!info->cea_rev)
+                       info->cea_rev = edid_ext[1];
 
-       /* The existence of a CEA block should imply RGB support */
-       info->color_formats = DRM_COLOR_FORMAT_RGB444;
+               if (info->cea_rev != edid_ext[1])
+                       DRM_DEBUG_KMS("CEA extension version mismatch %u != %u\n",
+                                     info->cea_rev, edid_ext[1]);
 
-       /* CTA DisplayID Data Block does not have byte #3 */
-       if (edid_ext[0] == CEA_EXT) {
+               /* The existence of a CTA extension should imply RGB support */
+               info->color_formats = DRM_COLOR_FORMAT_RGB444;
                if (edid_ext[3] & EDID_CEA_YCRCB444)
                        info->color_formats |= DRM_COLOR_FORMAT_YCBCR444;
                if (edid_ext[3] & EDID_CEA_YCRCB422)
                        info->color_formats |= DRM_COLOR_FORMAT_YCBCR422;
        }
+       drm_edid_iter_end(&edid_iter);
 
        cea_db_iter_edid_begin(edid, &iter);
        cea_db_iter_for_each(db, &iter) {