diff options
author | Jesse Barnes <jbarnes@virtuousgeek.org> | 2014-11-05 17:26:08 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-11-14 04:29:22 -0500 |
commit | e43823ecc24488c464587f7daf462548f2396e4f (patch) | |
tree | 4a5cdd880c14546cecaac51bdfc40a475d25dd03 /drivers | |
parent | 50f5275698df4490046cc5b4ed2018abb642a803 (diff) |
drm/i915/hdmi: fetch infoframe status in get_config v2
This is useful for checking things later.
v2:
- fix hsw infoframe enabled check (Ander)
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
[danvet: Add the missing PIPE_CONF_CHECK_I(has_infoframe); line to the
hw state cross-checker.]
[danet: Squash in fixup from Jesse to correctly compute has_infoframe
in the hdmi compute_config function.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 65 |
3 files changed, 70 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 22ad01c38eef..8b5efe6f3ee6 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -10362,6 +10362,7 @@ intel_pipe_config_compare(struct drm_device *dev, | |||
10362 | if ((INTEL_INFO(dev)->gen < 8 && !IS_HASWELL(dev)) || | 10362 | if ((INTEL_INFO(dev)->gen < 8 && !IS_HASWELL(dev)) || |
10363 | IS_VALLEYVIEW(dev)) | 10363 | IS_VALLEYVIEW(dev)) |
10364 | PIPE_CONF_CHECK_I(limited_color_range); | 10364 | PIPE_CONF_CHECK_I(limited_color_range); |
10365 | PIPE_CONF_CHECK_I(has_infoframe); | ||
10365 | 10366 | ||
10366 | PIPE_CONF_CHECK_I(has_audio); | 10367 | PIPE_CONF_CHECK_I(has_audio); |
10367 | 10368 | ||
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 3c324a806646..8432ae2d41f0 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -292,6 +292,9 @@ struct intel_crtc_config { | |||
292 | * between pch encoders and cpu encoders. */ | 292 | * between pch encoders and cpu encoders. */ |
293 | bool has_pch_encoder; | 293 | bool has_pch_encoder; |
294 | 294 | ||
295 | /* Are we sending infoframes on the attached port */ | ||
296 | bool has_infoframe; | ||
297 | |||
295 | /* CPU Transcoder for the pipe. Currently this can only differ from the | 298 | /* CPU Transcoder for the pipe. Currently this can only differ from the |
296 | * pipe on Haswell (where we have a special eDP transcoder). */ | 299 | * pipe on Haswell (where we have a special eDP transcoder). */ |
297 | enum transcoder cpu_transcoder; | 300 | enum transcoder cpu_transcoder; |
@@ -552,6 +555,7 @@ struct intel_hdmi { | |||
552 | void (*set_infoframes)(struct drm_encoder *encoder, | 555 | void (*set_infoframes)(struct drm_encoder *encoder, |
553 | bool enable, | 556 | bool enable, |
554 | struct drm_display_mode *adjusted_mode); | 557 | struct drm_display_mode *adjusted_mode); |
558 | bool (*infoframe_enabled)(struct drm_encoder *encoder); | ||
555 | }; | 559 | }; |
556 | 560 | ||
557 | struct intel_dp_mst_encoder; | 561 | struct intel_dp_mst_encoder; |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 29baa53aef90..f58e8834ebfb 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
@@ -166,6 +166,15 @@ static void g4x_write_infoframe(struct drm_encoder *encoder, | |||
166 | POSTING_READ(VIDEO_DIP_CTL); | 166 | POSTING_READ(VIDEO_DIP_CTL); |
167 | } | 167 | } |
168 | 168 | ||
169 | static bool g4x_infoframe_enabled(struct drm_encoder *encoder) | ||
170 | { | ||
171 | struct drm_device *dev = encoder->dev; | ||
172 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
173 | u32 val = I915_READ(VIDEO_DIP_CTL); | ||
174 | |||
175 | return val & VIDEO_DIP_ENABLE; | ||
176 | } | ||
177 | |||
169 | static void ibx_write_infoframe(struct drm_encoder *encoder, | 178 | static void ibx_write_infoframe(struct drm_encoder *encoder, |
170 | enum hdmi_infoframe_type type, | 179 | enum hdmi_infoframe_type type, |
171 | const void *frame, ssize_t len) | 180 | const void *frame, ssize_t len) |
@@ -204,6 +213,17 @@ static void ibx_write_infoframe(struct drm_encoder *encoder, | |||
204 | POSTING_READ(reg); | 213 | POSTING_READ(reg); |
205 | } | 214 | } |
206 | 215 | ||
216 | static bool ibx_infoframe_enabled(struct drm_encoder *encoder) | ||
217 | { | ||
218 | struct drm_device *dev = encoder->dev; | ||
219 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
220 | struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); | ||
221 | int reg = TVIDEO_DIP_CTL(intel_crtc->pipe); | ||
222 | u32 val = I915_READ(reg); | ||
223 | |||
224 | return val & VIDEO_DIP_ENABLE; | ||
225 | } | ||
226 | |||
207 | static void cpt_write_infoframe(struct drm_encoder *encoder, | 227 | static void cpt_write_infoframe(struct drm_encoder *encoder, |
208 | enum hdmi_infoframe_type type, | 228 | enum hdmi_infoframe_type type, |
209 | const void *frame, ssize_t len) | 229 | const void *frame, ssize_t len) |
@@ -245,6 +265,17 @@ static void cpt_write_infoframe(struct drm_encoder *encoder, | |||
245 | POSTING_READ(reg); | 265 | POSTING_READ(reg); |
246 | } | 266 | } |
247 | 267 | ||
268 | static bool cpt_infoframe_enabled(struct drm_encoder *encoder) | ||
269 | { | ||
270 | struct drm_device *dev = encoder->dev; | ||
271 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
272 | struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); | ||
273 | int reg = TVIDEO_DIP_CTL(intel_crtc->pipe); | ||
274 | u32 val = I915_READ(reg); | ||
275 | |||
276 | return val & VIDEO_DIP_ENABLE; | ||
277 | } | ||
278 | |||
248 | static void vlv_write_infoframe(struct drm_encoder *encoder, | 279 | static void vlv_write_infoframe(struct drm_encoder *encoder, |
249 | enum hdmi_infoframe_type type, | 280 | enum hdmi_infoframe_type type, |
250 | const void *frame, ssize_t len) | 281 | const void *frame, ssize_t len) |
@@ -283,6 +314,17 @@ static void vlv_write_infoframe(struct drm_encoder *encoder, | |||
283 | POSTING_READ(reg); | 314 | POSTING_READ(reg); |
284 | } | 315 | } |
285 | 316 | ||
317 | static bool vlv_infoframe_enabled(struct drm_encoder *encoder) | ||
318 | { | ||
319 | struct drm_device *dev = encoder->dev; | ||
320 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
321 | struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); | ||
322 | int reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe); | ||
323 | u32 val = I915_READ(reg); | ||
324 | |||
325 | return val & VIDEO_DIP_ENABLE; | ||
326 | } | ||
327 | |||
286 | static void hsw_write_infoframe(struct drm_encoder *encoder, | 328 | static void hsw_write_infoframe(struct drm_encoder *encoder, |
287 | enum hdmi_infoframe_type type, | 329 | enum hdmi_infoframe_type type, |
288 | const void *frame, ssize_t len) | 330 | const void *frame, ssize_t len) |
@@ -320,6 +362,18 @@ static void hsw_write_infoframe(struct drm_encoder *encoder, | |||
320 | POSTING_READ(ctl_reg); | 362 | POSTING_READ(ctl_reg); |
321 | } | 363 | } |
322 | 364 | ||
365 | static bool hsw_infoframe_enabled(struct drm_encoder *encoder) | ||
366 | { | ||
367 | struct drm_device *dev = encoder->dev; | ||
368 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
369 | struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); | ||
370 | u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config.cpu_transcoder); | ||
371 | u32 val = I915_READ(ctl_reg); | ||
372 | |||
373 | return val & (VIDEO_DIP_ENABLE_AVI_HSW | VIDEO_DIP_ENABLE_SPD_HSW | | ||
374 | VIDEO_DIP_ENABLE_VS_HSW); | ||
375 | } | ||
376 | |||
323 | /* | 377 | /* |
324 | * The data we write to the DIP data buffer registers is 1 byte bigger than the | 378 | * The data we write to the DIP data buffer registers is 1 byte bigger than the |
325 | * HDMI infoframe size because of an ECC/reserved byte at position 3 (starting | 379 | * HDMI infoframe size because of an ECC/reserved byte at position 3 (starting |
@@ -724,6 +778,9 @@ static void intel_hdmi_get_config(struct intel_encoder *encoder, | |||
724 | if (tmp & HDMI_MODE_SELECT_HDMI) | 778 | if (tmp & HDMI_MODE_SELECT_HDMI) |
725 | pipe_config->has_hdmi_sink = true; | 779 | pipe_config->has_hdmi_sink = true; |
726 | 780 | ||
781 | if (intel_hdmi->infoframe_enabled(&encoder->base)) | ||
782 | pipe_config->has_infoframe = true; | ||
783 | |||
727 | if (tmp & SDVO_AUDIO_ENABLE) | 784 | if (tmp & SDVO_AUDIO_ENABLE) |
728 | pipe_config->has_audio = true; | 785 | pipe_config->has_audio = true; |
729 | 786 | ||
@@ -925,6 +982,9 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder, | |||
925 | 982 | ||
926 | pipe_config->has_hdmi_sink = intel_hdmi->has_hdmi_sink; | 983 | pipe_config->has_hdmi_sink = intel_hdmi->has_hdmi_sink; |
927 | 984 | ||
985 | if (pipe_config->has_hdmi_sink) | ||
986 | pipe_config->has_infoframe = true; | ||
987 | |||
928 | if (intel_hdmi->color_range_auto) { | 988 | if (intel_hdmi->color_range_auto) { |
929 | /* See CEA-861-E - 5.1 Default Encoding Parameters */ | 989 | /* See CEA-861-E - 5.1 Default Encoding Parameters */ |
930 | if (pipe_config->has_hdmi_sink && | 990 | if (pipe_config->has_hdmi_sink && |
@@ -1619,18 +1679,23 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port, | |||
1619 | if (IS_VALLEYVIEW(dev)) { | 1679 | if (IS_VALLEYVIEW(dev)) { |
1620 | intel_hdmi->write_infoframe = vlv_write_infoframe; | 1680 | intel_hdmi->write_infoframe = vlv_write_infoframe; |
1621 | intel_hdmi->set_infoframes = vlv_set_infoframes; | 1681 | intel_hdmi->set_infoframes = vlv_set_infoframes; |
1682 | intel_hdmi->infoframe_enabled = vlv_infoframe_enabled; | ||
1622 | } else if (IS_G4X(dev)) { | 1683 | } else if (IS_G4X(dev)) { |
1623 | intel_hdmi->write_infoframe = g4x_write_infoframe; | 1684 | intel_hdmi->write_infoframe = g4x_write_infoframe; |
1624 | intel_hdmi->set_infoframes = g4x_set_infoframes; | 1685 | intel_hdmi->set_infoframes = g4x_set_infoframes; |
1686 | intel_hdmi->infoframe_enabled = g4x_infoframe_enabled; | ||
1625 | } else if (HAS_DDI(dev)) { | 1687 | } else if (HAS_DDI(dev)) { |
1626 | intel_hdmi->write_infoframe = hsw_write_infoframe; | 1688 | intel_hdmi->write_infoframe = hsw_write_infoframe; |
1627 | intel_hdmi->set_infoframes = hsw_set_infoframes; | 1689 | intel_hdmi->set_infoframes = hsw_set_infoframes; |
1690 | intel_hdmi->infoframe_enabled = hsw_infoframe_enabled; | ||
1628 | } else if (HAS_PCH_IBX(dev)) { | 1691 | } else if (HAS_PCH_IBX(dev)) { |
1629 | intel_hdmi->write_infoframe = ibx_write_infoframe; | 1692 | intel_hdmi->write_infoframe = ibx_write_infoframe; |
1630 | intel_hdmi->set_infoframes = ibx_set_infoframes; | 1693 | intel_hdmi->set_infoframes = ibx_set_infoframes; |
1694 | intel_hdmi->infoframe_enabled = ibx_infoframe_enabled; | ||
1631 | } else { | 1695 | } else { |
1632 | intel_hdmi->write_infoframe = cpt_write_infoframe; | 1696 | intel_hdmi->write_infoframe = cpt_write_infoframe; |
1633 | intel_hdmi->set_infoframes = cpt_set_infoframes; | 1697 | intel_hdmi->set_infoframes = cpt_set_infoframes; |
1698 | intel_hdmi->infoframe_enabled = cpt_infoframe_enabled; | ||
1634 | } | 1699 | } |
1635 | 1700 | ||
1636 | if (HAS_DDI(dev)) | 1701 | if (HAS_DDI(dev)) |