aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm')
-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;