aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorLibin Yang <libin.yang@linux.intel.com>2016-09-19 21:24:41 -0400
committerRodrigo Vivi <rodrigo.vivi@intel.com>2016-09-21 12:32:25 -0400
commit3708d5e082c39913b26bd06845ffe80a0b689e2a (patch)
treeb93a6b530af47b0fdb5abb9ec0b1c326dafba8fd /drivers/gpu
parentf1a3acea26f89de17399726e1451fc7bb5376573 (diff)
drm/i915: start adding dp mst audio
(This patch is developed by Dave Airlie <airlied@redhat.com> originally) 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. v2: Rebased. Signed-off-by: Libin Yang <libin.yang@linux.intel.com> Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com> Reviewed-by: Lyude <cpaul@redhat.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1474334681-22690-6-git-send-email-dhinakaran.pandiyan@intel.com
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c19
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c20
-rw-r--r--drivers/gpu/drm/i915/intel_dp_mst.c18
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
4 files changed, 53 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index d3f83c5ab70b..3c6a06df3dc9 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -2888,6 +2888,20 @@ static void intel_dp_info(struct seq_file *m,
2888 &intel_dp->aux); 2888 &intel_dp->aux);
2889} 2889}
2890 2890
2891static void intel_dp_mst_info(struct seq_file *m,
2892 struct intel_connector *intel_connector)
2893{
2894 struct intel_encoder *intel_encoder = intel_connector->encoder;
2895 struct intel_dp_mst_encoder *intel_mst =
2896 enc_to_mst(&intel_encoder->base);
2897 struct intel_digital_port *intel_dig_port = intel_mst->primary;
2898 struct intel_dp *intel_dp = &intel_dig_port->dp;
2899 bool has_audio = drm_dp_mst_port_has_audio(&intel_dp->mst_mgr,
2900 intel_connector->port);
2901
2902 seq_printf(m, "\taudio support: %s\n", yesno(has_audio));
2903}
2904
2891static void intel_hdmi_info(struct seq_file *m, 2905static void intel_hdmi_info(struct seq_file *m,
2892 struct intel_connector *intel_connector) 2906 struct intel_connector *intel_connector)
2893{ 2907{
@@ -2930,7 +2944,10 @@ static void intel_connector_info(struct seq_file *m,
2930 switch (connector->connector_type) { 2944 switch (connector->connector_type) {
2931 case DRM_MODE_CONNECTOR_DisplayPort: 2945 case DRM_MODE_CONNECTOR_DisplayPort:
2932 case DRM_MODE_CONNECTOR_eDP: 2946 case DRM_MODE_CONNECTOR_eDP:
2933 intel_dp_info(m, intel_connector); 2947 if (intel_encoder->type == INTEL_OUTPUT_DP_MST)
2948 intel_dp_mst_info(m, intel_connector);
2949 else
2950 intel_dp_info(m, intel_connector);
2934 break; 2951 break;
2935 case DRM_MODE_CONNECTOR_LVDS: 2952 case DRM_MODE_CONNECTOR_LVDS:
2936 if (intel_encoder->type == INTEL_OUTPUT_LVDS) 2953 if (intel_encoder->type == INTEL_OUTPUT_LVDS)
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 35f0b7c9d0a6..07cba6c0b1b5 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -2227,6 +2227,19 @@ void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp)
2227 udelay(600); 2227 udelay(600);
2228} 2228}
2229 2229
2230bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv,
2231 struct intel_crtc *intel_crtc)
2232{
2233 u32 temp;
2234
2235 if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) {
2236 temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
2237 if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe))
2238 return true;
2239 }
2240 return false;
2241}
2242
2230void intel_ddi_get_config(struct intel_encoder *encoder, 2243void intel_ddi_get_config(struct intel_encoder *encoder,
2231 struct intel_crtc_state *pipe_config) 2244 struct intel_crtc_state *pipe_config)
2232{ 2245{
@@ -2292,11 +2305,8 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
2292 break; 2305 break;
2293 } 2306 }
2294 2307
2295 if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) { 2308 pipe_config->has_audio =
2296 temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD); 2309 intel_ddi_is_audio_enabled(dev_priv, intel_crtc);
2297 if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe))
2298 pipe_config->has_audio = true;
2299 }
2300 2310
2301 if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp.bpp && 2311 if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp.bpp &&
2302 pipe_config->pipe_bpp > dev_priv->vbt.edp.bpp) { 2312 pipe_config->pipe_bpp > dev_priv->vbt.edp.bpp) {
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c
index 3ffbd69e4551..2fc9f81fdd41 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;
@@ -59,6 +61,8 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,
59 61
60 state = pipe_config->base.state; 62 state = pipe_config->base.state;
61 63
64 if (drm_dp_mst_port_has_audio(&intel_dp->mst_mgr, connector->port))
65 pipe_config->has_audio = true;
62 mst_pbn = drm_dp_calc_pbn_mode(adjusted_mode->crtc_clock, bpp); 66 mst_pbn = drm_dp_calc_pbn_mode(adjusted_mode->crtc_clock, bpp);
63 67
64 pipe_config->pbn = mst_pbn; 68 pipe_config->pbn = mst_pbn;
@@ -84,6 +88,7 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder,
84 struct intel_dp *intel_dp = &intel_dig_port->dp; 88 struct intel_dp *intel_dp = &intel_dig_port->dp;
85 struct intel_connector *connector = 89 struct intel_connector *connector =
86 to_intel_connector(old_conn_state->connector); 90 to_intel_connector(old_conn_state->connector);
91 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
87 int ret; 92 int ret;
88 93
89 DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); 94 DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
@@ -94,6 +99,10 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder,
94 if (ret) { 99 if (ret) {
95 DRM_ERROR("failed to update payload %d\n", ret); 100 DRM_ERROR("failed to update payload %d\n", ret);
96 } 101 }
102 if (old_crtc_state->has_audio) {
103 intel_audio_codec_disable(encoder);
104 intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
105 }
97} 106}
98 107
99static void intel_mst_post_disable_dp(struct intel_encoder *encoder, 108static void intel_mst_post_disable_dp(struct intel_encoder *encoder,
@@ -206,6 +215,12 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder,
206 ret = drm_dp_check_act_status(&intel_dp->mst_mgr); 215 ret = drm_dp_check_act_status(&intel_dp->mst_mgr);
207 216
208 ret = drm_dp_update_payload_part2(&intel_dp->mst_mgr); 217 ret = drm_dp_update_payload_part2(&intel_dp->mst_mgr);
218 if (pipe_config->has_audio) {
219 DRM_DEBUG_DRIVER("Enabling DP audio on pipe %c\n",
220 pipe_name(intel_mst->pipe));
221 intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
222 intel_audio_codec_enable(encoder);
223 }
209} 224}
210 225
211static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder, 226static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder,
@@ -228,6 +243,9 @@ static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder,
228 enum transcoder cpu_transcoder = pipe_config->cpu_transcoder; 243 enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
229 u32 temp, flags = 0; 244 u32 temp, flags = 0;
230 245
246 pipe_config->has_audio =
247 intel_ddi_is_audio_enabled(dev_priv, crtc);
248
231 temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder)); 249 temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
232 if (temp & TRANS_DDI_PHSYNC) 250 if (temp & TRANS_DDI_PHSYNC)
233 flags |= DRM_MODE_FLAG_PHSYNC; 251 flags |= DRM_MODE_FLAG_PHSYNC;
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index f56dad8f222e..5e9c15e5e58d 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1156,6 +1156,8 @@ bool intel_ddi_pll_select(struct intel_crtc *crtc,
1156void intel_ddi_set_pipe_settings(struct drm_crtc *crtc); 1156void intel_ddi_set_pipe_settings(struct drm_crtc *crtc);
1157void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp); 1157void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp);
1158bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector); 1158bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector);
1159bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv,
1160 struct intel_crtc *intel_crtc);
1159void intel_ddi_get_config(struct intel_encoder *encoder, 1161void intel_ddi_get_config(struct intel_encoder *encoder,
1160 struct intel_crtc_state *pipe_config); 1162 struct intel_crtc_state *pipe_config);
1161struct intel_encoder * 1163struct intel_encoder *