aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_dp_mst.c
diff options
context:
space:
mode:
authorLibin Yang <libin.yang@intel.com>2016-11-28 07:07:07 -0500
committerJani Nikula <jani.nikula@intel.com>2016-11-29 10:42:10 -0500
commit7f9e77545b92bcb894b8e2be5646535e8ba8da9e (patch)
tree75ce22a7c178e1e4ca9c8ed5ebaac8315fecfd8f /drivers/gpu/drm/i915/intel_dp_mst.c
parent9935f7fa2854355203e3976762eecfb218079aac (diff)
drm/i915: enable dp mst audio
This patch adds support for DP MST audio in i915. Enable audio codec when DP MST is enabled if has_audio flag is set. Disable audio codec when DP MST is disabled if has_audio flag is set. Another separated patches to support DP MST audio will be implemented in audio driver. This patch is ported from commit 3708d5e082c3 ("drm/i915: start adding dp mst audio") And because commit 3708d5e082c3 ("drm/i915: start adding dp mst audio") breaks MST multi-monitor setups on some platforms, the orignal patch is reverted by commit be754b101f70 ("Revert "drm/i915: start adding dp mst audio"") As the multi-monitor setups issue is fixed, let's port the patch and enable the dp mst audio. Signed-off-by: Libin Yang <libin.yang@intel.com> Cc: Lyude <cpaul@redhat.com> Cc: Jani Nikula <jani.nikula@intel.com> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Cc: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com> Reviewed-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1480334827-112273-3-git-send-email-libin.yang@intel.com
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
-rw-r--r--drivers/gpu/drm/i915/intel_dp_mst.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c
index b029d1026a28..1f98757f61e7 100644
--- a/drivers/gpu/drm/i915/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/intel_dp_mst.c
@@ -37,6 +37,8 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,
37 struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base); 37 struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
38 struct intel_digital_port *intel_dig_port = intel_mst->primary; 38 struct intel_digital_port *intel_dig_port = intel_mst->primary;
39 struct intel_dp *intel_dp = &intel_dig_port->dp; 39 struct intel_dp *intel_dp = &intel_dig_port->dp;
40 struct intel_connector *connector =
41 to_intel_connector(conn_state->connector);
40 struct drm_atomic_state *state; 42 struct drm_atomic_state *state;
41 int bpp; 43 int bpp;
42 int lane_count, slots; 44 int lane_count, slots;
@@ -58,6 +60,8 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,
58 60
59 state = pipe_config->base.state; 61 state = pipe_config->base.state;
60 62
63 if (drm_dp_mst_port_has_audio(&intel_dp->mst_mgr, connector->port))
64 pipe_config->has_audio = true;
61 mst_pbn = drm_dp_calc_pbn_mode(adjusted_mode->crtc_clock, bpp); 65 mst_pbn = drm_dp_calc_pbn_mode(adjusted_mode->crtc_clock, bpp);
62 66
63 pipe_config->pbn = mst_pbn; 67 pipe_config->pbn = mst_pbn;
@@ -83,6 +87,7 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder,
83 struct intel_dp *intel_dp = &intel_dig_port->dp; 87 struct intel_dp *intel_dp = &intel_dig_port->dp;
84 struct intel_connector *connector = 88 struct intel_connector *connector =
85 to_intel_connector(old_conn_state->connector); 89 to_intel_connector(old_conn_state->connector);
90 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
86 int ret; 91 int ret;
87 92
88 DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); 93 DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
@@ -93,6 +98,10 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder,
93 if (ret) { 98 if (ret) {
94 DRM_ERROR("failed to update payload %d\n", ret); 99 DRM_ERROR("failed to update payload %d\n", ret);
95 } 100 }
101 if (old_crtc_state->has_audio) {
102 intel_audio_codec_disable(encoder);
103 intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
104 }
96} 105}
97 106
98static void intel_mst_post_disable_dp(struct intel_encoder *encoder, 107static void intel_mst_post_disable_dp(struct intel_encoder *encoder,
@@ -205,6 +214,10 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder,
205 ret = drm_dp_check_act_status(&intel_dp->mst_mgr); 214 ret = drm_dp_check_act_status(&intel_dp->mst_mgr);
206 215
207 ret = drm_dp_update_payload_part2(&intel_dp->mst_mgr); 216 ret = drm_dp_update_payload_part2(&intel_dp->mst_mgr);
217 if (pipe_config->has_audio) {
218 intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
219 intel_audio_codec_enable(encoder, pipe_config, conn_state);
220 }
208} 221}
209 222
210static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder, 223static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder,
@@ -227,6 +240,9 @@ static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder,
227 enum transcoder cpu_transcoder = pipe_config->cpu_transcoder; 240 enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
228 u32 temp, flags = 0; 241 u32 temp, flags = 0;
229 242
243 pipe_config->has_audio =
244 intel_ddi_is_audio_enabled(dev_priv, crtc);
245
230 temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder)); 246 temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
231 if (temp & TRANS_DDI_PHSYNC) 247 if (temp & TRANS_DDI_PHSYNC)
232 flags |= DRM_MODE_FLAG_PHSYNC; 248 flags |= DRM_MODE_FLAG_PHSYNC;