aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2016-09-28 09:51:41 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2016-10-04 02:23:12 -0400
commit23ebf8b9eab9151c3cccca8dbf44a8d47357158d (patch)
tree51068df99c7abb20bfe17ea2099fd0d6bb6938c1
parent011acce2859ad50b7a923cad4a726220b5f24455 (diff)
drm/edid: Move dvi_dual/max_tmds_clock parsing out from drm_edid_to_eld()
drm_edid_to_eld() is just mean to cook up the ELD for the audio driver, so having it parse non-audio related stuff seems just wrong, and potentially could lead to that information not being even filled out if the function doesn't even get called. Let's move that stuff to the place where we parse the color formats and whatnot from the CEA ext block. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Acked-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: http://patchwork.freedesktop.org/patch/msgid/1475070703-6435-9-git-send-email-ville.syrjala@linux.intel.com
-rw-r--r--drivers/gpu/drm/drm_edid.c64
1 files changed, 35 insertions, 29 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 48e529df344e..ec77bd3e1f08 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3253,17 +3253,12 @@ static void fixup_detailed_cea_mode_clock(struct drm_display_mode *mode)
3253} 3253}
3254 3254
3255static void 3255static void
3256parse_hdmi_vsdb(struct drm_connector *connector, const u8 *db) 3256drm_parse_hdmi_vsdb_audio(struct drm_connector *connector, const u8 *db)
3257{ 3257{
3258 struct drm_display_info *info = &connector->display_info;
3259 u8 len = cea_db_payload_len(db); 3258 u8 len = cea_db_payload_len(db);
3260 3259
3261 if (len >= 6) { 3260 if (len >= 6)
3262 connector->eld[5] |= (db[6] >> 7) << 1; /* Supports_AI */ 3261 connector->eld[5] |= (db[6] >> 7) << 1; /* Supports_AI */
3263 info->dvi_dual = db[6] & 1;
3264 }
3265 if (len >= 7)
3266 info->max_tmds_clock = db[7] * 5000;
3267 if (len >= 8) { 3262 if (len >= 8) {
3268 connector->latency_present[0] = db[8] >> 7; 3263 connector->latency_present[0] = db[8] >> 7;
3269 connector->latency_present[1] = (db[8] >> 6) & 1; 3264 connector->latency_present[1] = (db[8] >> 6) & 1;
@@ -3277,19 +3272,15 @@ parse_hdmi_vsdb(struct drm_connector *connector, const u8 *db)
3277 if (len >= 12) 3272 if (len >= 12)
3278 connector->audio_latency[1] = db[12]; 3273 connector->audio_latency[1] = db[12];
3279 3274
3280 DRM_DEBUG_KMS("HDMI: DVI dual %d, " 3275 DRM_DEBUG_KMS("HDMI: latency present %d %d, "
3281 "max TMDS clock %d, " 3276 "video latency %d %d, "
3282 "latency present %d %d, " 3277 "audio latency %d %d\n",
3283 "video latency %d %d, " 3278 connector->latency_present[0],
3284 "audio latency %d %d\n", 3279 connector->latency_present[1],
3285 info->dvi_dual, 3280 connector->video_latency[0],
3286 info->max_tmds_clock, 3281 connector->video_latency[1],
3287 (int) connector->latency_present[0], 3282 connector->audio_latency[0],
3288 (int) connector->latency_present[1], 3283 connector->audio_latency[1]);
3289 connector->video_latency[0],
3290 connector->video_latency[1],
3291 connector->audio_latency[0],
3292 connector->audio_latency[1]);
3293} 3284}
3294 3285
3295static void 3286static void
@@ -3350,7 +3341,6 @@ EXPORT_SYMBOL(drm_edid_get_monitor_name);
3350 */ 3341 */
3351void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid) 3342void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
3352{ 3343{
3353 struct drm_display_info *info = &connector->display_info;
3354 uint8_t *eld = connector->eld; 3344 uint8_t *eld = connector->eld;
3355 u8 *cea; 3345 u8 *cea;
3356 u8 *db; 3346 u8 *db;
@@ -3367,9 +3357,6 @@ void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
3367 connector->video_latency[1] = 0; 3357 connector->video_latency[1] = 0;
3368 connector->audio_latency[1] = 0; 3358 connector->audio_latency[1] = 0;
3369 3359
3370 info->max_tmds_clock = 0;
3371 info->dvi_dual = false;
3372
3373 cea = drm_find_cea_extension(edid); 3360 cea = drm_find_cea_extension(edid);
3374 if (!cea) { 3361 if (!cea) {
3375 DRM_DEBUG_KMS("ELD: no CEA Extension found\n"); 3362 DRM_DEBUG_KMS("ELD: no CEA Extension found\n");
@@ -3419,7 +3406,7 @@ void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
3419 case VENDOR_BLOCK: 3406 case VENDOR_BLOCK:
3420 /* HDMI Vendor-Specific Data Block */ 3407 /* HDMI Vendor-Specific Data Block */
3421 if (cea_db_is_hdmi_vsdb(db)) 3408 if (cea_db_is_hdmi_vsdb(db))
3422 parse_hdmi_vsdb(connector, db); 3409 drm_parse_hdmi_vsdb_audio(connector, db);
3423 break; 3410 break;
3424 default: 3411 default:
3425 break; 3412 break;
@@ -3800,6 +3787,25 @@ static void drm_parse_hdmi_deep_color_info(struct drm_connector *connector,
3800 } 3787 }
3801} 3788}
3802 3789
3790static void
3791drm_parse_hdmi_vsdb_video(struct drm_connector *connector, const u8 *db)
3792{
3793 struct drm_display_info *info = &connector->display_info;
3794 u8 len = cea_db_payload_len(db);
3795
3796 if (len >= 6)
3797 info->dvi_dual = db[6] & 1;
3798 if (len >= 7)
3799 info->max_tmds_clock = db[7] * 5000;
3800
3801 DRM_DEBUG_KMS("HDMI: DVI dual %d, "
3802 "max TMDS clock %d kHz\n",
3803 info->dvi_dual,
3804 info->max_tmds_clock);
3805
3806 drm_parse_hdmi_deep_color_info(connector, db);
3807}
3808
3803static void drm_parse_cea_ext(struct drm_connector *connector, 3809static void drm_parse_cea_ext(struct drm_connector *connector,
3804 struct edid *edid) 3810 struct edid *edid)
3805{ 3811{
@@ -3826,10 +3832,8 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
3826 for_each_cea_db(edid_ext, i, start, end) { 3832 for_each_cea_db(edid_ext, i, start, end) {
3827 const u8 *db = &edid_ext[i]; 3833 const u8 *db = &edid_ext[i];
3828 3834
3829 if (!cea_db_is_hdmi_vsdb(db)) 3835 if (cea_db_is_hdmi_vsdb(db))
3830 continue; 3836 drm_parse_hdmi_vsdb_video(connector, db);
3831
3832 drm_parse_hdmi_deep_color_info(connector, db);
3833 } 3837 }
3834} 3838}
3835 3839
@@ -3845,6 +3849,8 @@ static void drm_add_display_info(struct drm_connector *connector,
3845 info->bpc = 0; 3849 info->bpc = 0;
3846 info->color_formats = 0; 3850 info->color_formats = 0;
3847 info->cea_rev = 0; 3851 info->cea_rev = 0;
3852 info->max_tmds_clock = 0;
3853 info->dvi_dual = false;
3848 3854
3849 if (edid->revision < 3) 3855 if (edid->revision < 3)
3850 return; 3856 return;