Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915/hdmi: Write HDMI vendor specific infoframes

With all the common infoframe bits now in place, we can finally write
the vendor specific infoframes in our driver.

Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Dave Airlie <airlied@gmail.com>

authored by

Lespiau, Damien and committed by
Dave Airlie
c8bb75af 83dd0008

+30
+2
drivers/gpu/drm/i915/i915_reg.h
··· 4151 4151 _TRANSCODER(trans, HSW_VIDEO_DIP_CTL_A, HSW_VIDEO_DIP_CTL_B) 4152 4152 #define HSW_TVIDEO_DIP_AVI_DATA(trans) \ 4153 4153 _TRANSCODER(trans, HSW_VIDEO_DIP_AVI_DATA_A, HSW_VIDEO_DIP_AVI_DATA_B) 4154 + #define HSW_TVIDEO_DIP_VS_DATA(trans) \ 4155 + _TRANSCODER(trans, HSW_VIDEO_DIP_VS_DATA_A, HSW_VIDEO_DIP_VS_DATA_B) 4154 4156 #define HSW_TVIDEO_DIP_SPD_DATA(trans) \ 4155 4157 _TRANSCODER(trans, HSW_VIDEO_DIP_SPD_DATA_A, HSW_VIDEO_DIP_SPD_DATA_B) 4156 4158 #define HSW_TVIDEO_DIP_GCP(trans) \
+28
drivers/gpu/drm/i915/intel_hdmi.c
··· 74 74 return VIDEO_DIP_SELECT_AVI; 75 75 case HDMI_INFOFRAME_TYPE_SPD: 76 76 return VIDEO_DIP_SELECT_SPD; 77 + case HDMI_INFOFRAME_TYPE_VENDOR: 78 + return VIDEO_DIP_SELECT_VENDOR; 77 79 default: 78 80 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type); 79 81 return 0; ··· 89 87 return VIDEO_DIP_ENABLE_AVI; 90 88 case HDMI_INFOFRAME_TYPE_SPD: 91 89 return VIDEO_DIP_ENABLE_SPD; 90 + case HDMI_INFOFRAME_TYPE_VENDOR: 91 + return VIDEO_DIP_ENABLE_VENDOR; 92 92 default: 93 93 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type); 94 94 return 0; ··· 104 100 return VIDEO_DIP_ENABLE_AVI_HSW; 105 101 case HDMI_INFOFRAME_TYPE_SPD: 106 102 return VIDEO_DIP_ENABLE_SPD_HSW; 103 + case HDMI_INFOFRAME_TYPE_VENDOR: 104 + return VIDEO_DIP_ENABLE_VS_HSW; 107 105 default: 108 106 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type); 109 107 return 0; ··· 120 114 return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder); 121 115 case HDMI_INFOFRAME_TYPE_SPD: 122 116 return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder); 117 + case HDMI_INFOFRAME_TYPE_VENDOR: 118 + return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder); 123 119 default: 124 120 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type); 125 121 return 0; ··· 400 392 intel_write_infoframe(encoder, &frame); 401 393 } 402 394 395 + static void 396 + intel_hdmi_set_hdmi_infoframe(struct drm_encoder *encoder, 397 + struct drm_display_mode *adjusted_mode) 398 + { 399 + union hdmi_infoframe frame; 400 + int ret; 401 + 402 + ret = drm_hdmi_vendor_infoframe_from_display_mode(&frame.vendor.hdmi, 403 + adjusted_mode); 404 + if (ret < 0) 405 + return; 406 + 407 + intel_write_infoframe(encoder, &frame); 408 + } 409 + 403 410 static void g4x_set_infoframes(struct drm_encoder *encoder, 404 411 struct drm_display_mode *adjusted_mode) 405 412 { ··· 477 454 478 455 intel_hdmi_set_avi_infoframe(encoder, adjusted_mode); 479 456 intel_hdmi_set_spd_infoframe(encoder); 457 + intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode); 480 458 } 481 459 482 460 static void ibx_set_infoframes(struct drm_encoder *encoder, ··· 539 515 540 516 intel_hdmi_set_avi_infoframe(encoder, adjusted_mode); 541 517 intel_hdmi_set_spd_infoframe(encoder); 518 + intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode); 542 519 } 543 520 544 521 static void cpt_set_infoframes(struct drm_encoder *encoder, ··· 575 550 576 551 intel_hdmi_set_avi_infoframe(encoder, adjusted_mode); 577 552 intel_hdmi_set_spd_infoframe(encoder); 553 + intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode); 578 554 } 579 555 580 556 static void vlv_set_infoframes(struct drm_encoder *encoder, ··· 610 584 611 585 intel_hdmi_set_avi_infoframe(encoder, adjusted_mode); 612 586 intel_hdmi_set_spd_infoframe(encoder); 587 + intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode); 613 588 } 614 589 615 590 static void hsw_set_infoframes(struct drm_encoder *encoder, ··· 638 611 639 612 intel_hdmi_set_avi_infoframe(encoder, adjusted_mode); 640 613 intel_hdmi_set_spd_infoframe(encoder); 614 + intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode); 641 615 } 642 616 643 617 static void intel_hdmi_mode_set(struct intel_encoder *encoder)