diff options
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r-- | drivers/gpu/drm/drm_edid.c | 64 |
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 | ||
3255 | static void | 3255 | static void |
3256 | parse_hdmi_vsdb(struct drm_connector *connector, const u8 *db) | 3256 | drm_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 | ||
3295 | static void | 3286 | static void |
@@ -3350,7 +3341,6 @@ EXPORT_SYMBOL(drm_edid_get_monitor_name); | |||
3350 | */ | 3341 | */ |
3351 | void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid) | 3342 | void 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 | ||
3790 | static void | ||
3791 | drm_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 | |||
3803 | static void drm_parse_cea_ext(struct drm_connector *connector, | 3809 | static 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; |