aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h2
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c28
2 files changed, 30 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index fab94be89dfa..88a2c0792f26 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -4151,6 +4151,8 @@
4151 _TRANSCODER(trans, HSW_VIDEO_DIP_CTL_A, HSW_VIDEO_DIP_CTL_B) 4151 _TRANSCODER(trans, HSW_VIDEO_DIP_CTL_A, HSW_VIDEO_DIP_CTL_B)
4152#define HSW_TVIDEO_DIP_AVI_DATA(trans) \ 4152#define HSW_TVIDEO_DIP_AVI_DATA(trans) \
4153 _TRANSCODER(trans, HSW_VIDEO_DIP_AVI_DATA_A, HSW_VIDEO_DIP_AVI_DATA_B) 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#define HSW_TVIDEO_DIP_SPD_DATA(trans) \ 4156#define HSW_TVIDEO_DIP_SPD_DATA(trans) \
4155 _TRANSCODER(trans, HSW_VIDEO_DIP_SPD_DATA_A, HSW_VIDEO_DIP_SPD_DATA_B) 4157 _TRANSCODER(trans, HSW_VIDEO_DIP_SPD_DATA_A, HSW_VIDEO_DIP_SPD_DATA_B)
4156#define HSW_TVIDEO_DIP_GCP(trans) \ 4158#define HSW_TVIDEO_DIP_GCP(trans) \
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index dd4fa35e0a85..f27b91eeeb64 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -74,6 +74,8 @@ static u32 g4x_infoframe_index(enum hdmi_infoframe_type type)
74 return VIDEO_DIP_SELECT_AVI; 74 return VIDEO_DIP_SELECT_AVI;
75 case HDMI_INFOFRAME_TYPE_SPD: 75 case HDMI_INFOFRAME_TYPE_SPD:
76 return VIDEO_DIP_SELECT_SPD; 76 return VIDEO_DIP_SELECT_SPD;
77 case HDMI_INFOFRAME_TYPE_VENDOR:
78 return VIDEO_DIP_SELECT_VENDOR;
77 default: 79 default:
78 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type); 80 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
79 return 0; 81 return 0;
@@ -87,6 +89,8 @@ static u32 g4x_infoframe_enable(enum hdmi_infoframe_type type)
87 return VIDEO_DIP_ENABLE_AVI; 89 return VIDEO_DIP_ENABLE_AVI;
88 case HDMI_INFOFRAME_TYPE_SPD: 90 case HDMI_INFOFRAME_TYPE_SPD:
89 return VIDEO_DIP_ENABLE_SPD; 91 return VIDEO_DIP_ENABLE_SPD;
92 case HDMI_INFOFRAME_TYPE_VENDOR:
93 return VIDEO_DIP_ENABLE_VENDOR;
90 default: 94 default:
91 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type); 95 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
92 return 0; 96 return 0;
@@ -100,6 +104,8 @@ static u32 hsw_infoframe_enable(enum hdmi_infoframe_type type)
100 return VIDEO_DIP_ENABLE_AVI_HSW; 104 return VIDEO_DIP_ENABLE_AVI_HSW;
101 case HDMI_INFOFRAME_TYPE_SPD: 105 case HDMI_INFOFRAME_TYPE_SPD:
102 return VIDEO_DIP_ENABLE_SPD_HSW; 106 return VIDEO_DIP_ENABLE_SPD_HSW;
107 case HDMI_INFOFRAME_TYPE_VENDOR:
108 return VIDEO_DIP_ENABLE_VS_HSW;
103 default: 109 default:
104 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type); 110 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
105 return 0; 111 return 0;
@@ -114,6 +120,8 @@ static u32 hsw_infoframe_data_reg(enum hdmi_infoframe_type type,
114 return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder); 120 return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder);
115 case HDMI_INFOFRAME_TYPE_SPD: 121 case HDMI_INFOFRAME_TYPE_SPD:
116 return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder); 122 return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder);
123 case HDMI_INFOFRAME_TYPE_VENDOR:
124 return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder);
117 default: 125 default:
118 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type); 126 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
119 return 0; 127 return 0;
@@ -392,6 +400,21 @@ static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
392 intel_write_infoframe(encoder, &frame); 400 intel_write_infoframe(encoder, &frame);
393} 401}
394 402
403static void
404intel_hdmi_set_hdmi_infoframe(struct drm_encoder *encoder,
405 struct drm_display_mode *adjusted_mode)
406{
407 union hdmi_infoframe frame;
408 int ret;
409
410 ret = drm_hdmi_vendor_infoframe_from_display_mode(&frame.vendor.hdmi,
411 adjusted_mode);
412 if (ret < 0)
413 return;
414
415 intel_write_infoframe(encoder, &frame);
416}
417
395static void g4x_set_infoframes(struct drm_encoder *encoder, 418static void g4x_set_infoframes(struct drm_encoder *encoder,
396 struct drm_display_mode *adjusted_mode) 419 struct drm_display_mode *adjusted_mode)
397{ 420{
@@ -454,6 +477,7 @@ static void g4x_set_infoframes(struct drm_encoder *encoder,
454 477
455 intel_hdmi_set_avi_infoframe(encoder, adjusted_mode); 478 intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
456 intel_hdmi_set_spd_infoframe(encoder); 479 intel_hdmi_set_spd_infoframe(encoder);
480 intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
457} 481}
458 482
459static void ibx_set_infoframes(struct drm_encoder *encoder, 483static void ibx_set_infoframes(struct drm_encoder *encoder,
@@ -515,6 +539,7 @@ static void ibx_set_infoframes(struct drm_encoder *encoder,
515 539
516 intel_hdmi_set_avi_infoframe(encoder, adjusted_mode); 540 intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
517 intel_hdmi_set_spd_infoframe(encoder); 541 intel_hdmi_set_spd_infoframe(encoder);
542 intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
518} 543}
519 544
520static void cpt_set_infoframes(struct drm_encoder *encoder, 545static void cpt_set_infoframes(struct drm_encoder *encoder,
@@ -550,6 +575,7 @@ static void cpt_set_infoframes(struct drm_encoder *encoder,
550 575
551 intel_hdmi_set_avi_infoframe(encoder, adjusted_mode); 576 intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
552 intel_hdmi_set_spd_infoframe(encoder); 577 intel_hdmi_set_spd_infoframe(encoder);
578 intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
553} 579}
554 580
555static void vlv_set_infoframes(struct drm_encoder *encoder, 581static void vlv_set_infoframes(struct drm_encoder *encoder,
@@ -584,6 +610,7 @@ static void vlv_set_infoframes(struct drm_encoder *encoder,
584 610
585 intel_hdmi_set_avi_infoframe(encoder, adjusted_mode); 611 intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
586 intel_hdmi_set_spd_infoframe(encoder); 612 intel_hdmi_set_spd_infoframe(encoder);
613 intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
587} 614}
588 615
589static void hsw_set_infoframes(struct drm_encoder *encoder, 616static void hsw_set_infoframes(struct drm_encoder *encoder,
@@ -611,6 +638,7 @@ static void hsw_set_infoframes(struct drm_encoder *encoder,
611 638
612 intel_hdmi_set_avi_infoframe(encoder, adjusted_mode); 639 intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
613 intel_hdmi_set_spd_infoframe(encoder); 640 intel_hdmi_set_spd_infoframe(encoder);
641 intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
614} 642}
615 643
616static void intel_hdmi_mode_set(struct intel_encoder *encoder) 644static void intel_hdmi_mode_set(struct intel_encoder *encoder)