diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_audio.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ddi.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 22 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 2 |
5 files changed, 61 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index a8721fccd8a0..8698bd5de2c3 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -2850,6 +2850,20 @@ static void intel_dp_info(struct seq_file *m, | |||
2850 | intel_panel_info(m, &intel_connector->panel); | 2850 | intel_panel_info(m, &intel_connector->panel); |
2851 | } | 2851 | } |
2852 | 2852 | ||
2853 | static void intel_dp_mst_info(struct seq_file *m, | ||
2854 | struct intel_connector *intel_connector) | ||
2855 | { | ||
2856 | struct intel_encoder *intel_encoder = intel_connector->encoder; | ||
2857 | struct intel_dp_mst_encoder *intel_mst = | ||
2858 | enc_to_mst(&intel_encoder->base); | ||
2859 | struct intel_digital_port *intel_dig_port = intel_mst->primary; | ||
2860 | struct intel_dp *intel_dp = &intel_dig_port->dp; | ||
2861 | bool has_audio = drm_dp_mst_port_has_audio(&intel_dp->mst_mgr, | ||
2862 | intel_connector->port); | ||
2863 | |||
2864 | seq_printf(m, "\taudio support: %s\n", yesno(has_audio)); | ||
2865 | } | ||
2866 | |||
2853 | static void intel_hdmi_info(struct seq_file *m, | 2867 | static void intel_hdmi_info(struct seq_file *m, |
2854 | struct intel_connector *intel_connector) | 2868 | struct intel_connector *intel_connector) |
2855 | { | 2869 | { |
@@ -2893,6 +2907,8 @@ static void intel_connector_info(struct seq_file *m, | |||
2893 | intel_hdmi_info(m, intel_connector); | 2907 | intel_hdmi_info(m, intel_connector); |
2894 | else if (intel_encoder->type == INTEL_OUTPUT_LVDS) | 2908 | else if (intel_encoder->type == INTEL_OUTPUT_LVDS) |
2895 | intel_lvds_info(m, intel_connector); | 2909 | intel_lvds_info(m, intel_connector); |
2910 | else if (intel_encoder->type == INTEL_OUTPUT_DP_MST) | ||
2911 | intel_dp_mst_info(m, intel_connector); | ||
2896 | } | 2912 | } |
2897 | 2913 | ||
2898 | seq_printf(m, "\tmodes:\n"); | 2914 | seq_printf(m, "\tmodes:\n"); |
diff --git a/drivers/gpu/drm/i915/intel_audio.c b/drivers/gpu/drm/i915/intel_audio.c index 9aa83e71b792..5ad2e6624940 100644 --- a/drivers/gpu/drm/i915/intel_audio.c +++ b/drivers/gpu/drm/i915/intel_audio.c | |||
@@ -262,7 +262,8 @@ static void hsw_audio_codec_disable(struct intel_encoder *encoder) | |||
262 | tmp |= AUD_CONFIG_N_PROG_ENABLE; | 262 | tmp |= AUD_CONFIG_N_PROG_ENABLE; |
263 | tmp &= ~AUD_CONFIG_UPPER_N_MASK; | 263 | tmp &= ~AUD_CONFIG_UPPER_N_MASK; |
264 | tmp &= ~AUD_CONFIG_LOWER_N_MASK; | 264 | tmp &= ~AUD_CONFIG_LOWER_N_MASK; |
265 | if (intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DISPLAYPORT)) | 265 | if (intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DISPLAYPORT) || |
266 | intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DP_MST)) | ||
266 | tmp |= AUD_CONFIG_N_VALUE_INDEX; | 267 | tmp |= AUD_CONFIG_N_VALUE_INDEX; |
267 | I915_WRITE(HSW_AUD_CFG(pipe), tmp); | 268 | I915_WRITE(HSW_AUD_CFG(pipe), tmp); |
268 | 269 | ||
@@ -474,7 +475,8 @@ static void ilk_audio_codec_enable(struct drm_connector *connector, | |||
474 | tmp &= ~AUD_CONFIG_N_VALUE_INDEX; | 475 | tmp &= ~AUD_CONFIG_N_VALUE_INDEX; |
475 | tmp &= ~AUD_CONFIG_N_PROG_ENABLE; | 476 | tmp &= ~AUD_CONFIG_N_PROG_ENABLE; |
476 | tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK; | 477 | tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK; |
477 | if (intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DISPLAYPORT)) | 478 | if (intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DISPLAYPORT) || |
479 | intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DP_MST)) | ||
478 | tmp |= AUD_CONFIG_N_VALUE_INDEX; | 480 | tmp |= AUD_CONFIG_N_VALUE_INDEX; |
479 | else | 481 | else |
480 | tmp |= audio_config_hdmi_pixel_clock(adjusted_mode); | 482 | tmp |= audio_config_hdmi_pixel_clock(adjusted_mode); |
@@ -512,7 +514,8 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder) | |||
512 | 514 | ||
513 | /* ELD Conn_Type */ | 515 | /* ELD Conn_Type */ |
514 | connector->eld[5] &= ~(3 << 2); | 516 | connector->eld[5] &= ~(3 << 2); |
515 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) | 517 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT) || |
518 | intel_pipe_has_type(crtc, INTEL_OUTPUT_DP_MST)) | ||
516 | connector->eld[5] |= (1 << 2); | 519 | connector->eld[5] |= (1 << 2); |
517 | 520 | ||
518 | connector->eld[6] = drm_av_sync_delay(connector, adjusted_mode) / 2; | 521 | connector->eld[6] = drm_av_sync_delay(connector, adjusted_mode) / 2; |
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c index 1fad19eb5533..f00a3c952629 100644 --- a/drivers/gpu/drm/i915/intel_ddi.c +++ b/drivers/gpu/drm/i915/intel_ddi.c | |||
@@ -3114,6 +3114,19 @@ void intel_ddi_fdi_disable(struct drm_crtc *crtc) | |||
3114 | I915_WRITE(FDI_RX_CTL(PIPE_A), val); | 3114 | I915_WRITE(FDI_RX_CTL(PIPE_A), val); |
3115 | } | 3115 | } |
3116 | 3116 | ||
3117 | bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv, | ||
3118 | struct intel_crtc *intel_crtc) | ||
3119 | { | ||
3120 | u32 temp; | ||
3121 | |||
3122 | if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) { | ||
3123 | temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD); | ||
3124 | if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe)) | ||
3125 | return true; | ||
3126 | } | ||
3127 | return false; | ||
3128 | } | ||
3129 | |||
3117 | void intel_ddi_get_config(struct intel_encoder *encoder, | 3130 | void intel_ddi_get_config(struct intel_encoder *encoder, |
3118 | struct intel_crtc_state *pipe_config) | 3131 | struct intel_crtc_state *pipe_config) |
3119 | { | 3132 | { |
@@ -3174,11 +3187,8 @@ void intel_ddi_get_config(struct intel_encoder *encoder, | |||
3174 | break; | 3187 | break; |
3175 | } | 3188 | } |
3176 | 3189 | ||
3177 | if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) { | 3190 | pipe_config->has_audio = |
3178 | temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD); | 3191 | intel_ddi_is_audio_enabled(dev_priv, intel_crtc); |
3179 | if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe)) | ||
3180 | pipe_config->has_audio = true; | ||
3181 | } | ||
3182 | 3192 | ||
3183 | if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp_bpp && | 3193 | if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp_bpp && |
3184 | pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) { | 3194 | 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 8c4e7dfe304c..8b608c2cd070 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c | |||
@@ -78,6 +78,8 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, | |||
78 | return false; | 78 | return false; |
79 | } | 79 | } |
80 | 80 | ||
81 | if (drm_dp_mst_port_has_audio(&intel_dp->mst_mgr, found->port)) | ||
82 | pipe_config->has_audio = true; | ||
81 | mst_pbn = drm_dp_calc_pbn_mode(adjusted_mode->crtc_clock, bpp); | 83 | mst_pbn = drm_dp_calc_pbn_mode(adjusted_mode->crtc_clock, bpp); |
82 | 84 | ||
83 | pipe_config->pbn = mst_pbn; | 85 | pipe_config->pbn = mst_pbn; |
@@ -102,6 +104,11 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder) | |||
102 | struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base); | 104 | struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base); |
103 | struct intel_digital_port *intel_dig_port = intel_mst->primary; | 105 | struct intel_digital_port *intel_dig_port = intel_mst->primary; |
104 | struct intel_dp *intel_dp = &intel_dig_port->dp; | 106 | struct intel_dp *intel_dp = &intel_dig_port->dp; |
107 | struct drm_device *dev = encoder->base.dev; | ||
108 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
109 | struct drm_crtc *crtc = encoder->base.crtc; | ||
110 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||
111 | |||
105 | int ret; | 112 | int ret; |
106 | 113 | ||
107 | DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); | 114 | DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); |
@@ -112,6 +119,10 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder) | |||
112 | if (ret) { | 119 | if (ret) { |
113 | DRM_ERROR("failed to update payload %d\n", ret); | 120 | DRM_ERROR("failed to update payload %d\n", ret); |
114 | } | 121 | } |
122 | if (intel_crtc->config->has_audio) { | ||
123 | intel_audio_codec_disable(encoder); | ||
124 | intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO); | ||
125 | } | ||
115 | } | 126 | } |
116 | 127 | ||
117 | static void intel_mst_post_disable_dp(struct intel_encoder *encoder) | 128 | static void intel_mst_post_disable_dp(struct intel_encoder *encoder) |
@@ -208,6 +219,7 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder) | |||
208 | struct intel_dp *intel_dp = &intel_dig_port->dp; | 219 | struct intel_dp *intel_dp = &intel_dig_port->dp; |
209 | struct drm_device *dev = intel_dig_port->base.base.dev; | 220 | struct drm_device *dev = intel_dig_port->base.base.dev; |
210 | struct drm_i915_private *dev_priv = dev->dev_private; | 221 | struct drm_i915_private *dev_priv = dev->dev_private; |
222 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); | ||
211 | enum port port = intel_dig_port->port; | 223 | enum port port = intel_dig_port->port; |
212 | int ret; | 224 | int ret; |
213 | 225 | ||
@@ -220,6 +232,13 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder) | |||
220 | ret = drm_dp_check_act_status(&intel_dp->mst_mgr); | 232 | ret = drm_dp_check_act_status(&intel_dp->mst_mgr); |
221 | 233 | ||
222 | ret = drm_dp_update_payload_part2(&intel_dp->mst_mgr); | 234 | ret = drm_dp_update_payload_part2(&intel_dp->mst_mgr); |
235 | |||
236 | if (crtc->config->has_audio) { | ||
237 | DRM_DEBUG_DRIVER("Enabling DP audio on pipe %c\n", | ||
238 | pipe_name(crtc->pipe)); | ||
239 | intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO); | ||
240 | intel_audio_codec_enable(encoder); | ||
241 | } | ||
223 | } | 242 | } |
224 | 243 | ||
225 | static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder, | 244 | static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder, |
@@ -245,6 +264,9 @@ static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder, | |||
245 | 264 | ||
246 | pipe_config->has_dp_encoder = true; | 265 | pipe_config->has_dp_encoder = true; |
247 | 266 | ||
267 | pipe_config->has_audio = | ||
268 | intel_ddi_is_audio_enabled(dev_priv, crtc); | ||
269 | |||
248 | temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder)); | 270 | temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder)); |
249 | if (temp & TRANS_DDI_PHSYNC) | 271 | if (temp & TRANS_DDI_PHSYNC) |
250 | flags |= DRM_MODE_FLAG_PHSYNC; | 272 | flags |= DRM_MODE_FLAG_PHSYNC; |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 974ab041d60c..f97b21d3ca6e 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -1014,6 +1014,8 @@ void intel_ddi_set_pipe_settings(struct drm_crtc *crtc); | |||
1014 | void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp); | 1014 | void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp); |
1015 | bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector); | 1015 | bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector); |
1016 | void intel_ddi_fdi_disable(struct drm_crtc *crtc); | 1016 | void intel_ddi_fdi_disable(struct drm_crtc *crtc); |
1017 | bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv, | ||
1018 | struct intel_crtc *intel_crtc); | ||
1017 | void intel_ddi_get_config(struct intel_encoder *encoder, | 1019 | void intel_ddi_get_config(struct intel_encoder *encoder, |
1018 | struct intel_crtc_state *pipe_config); | 1020 | struct intel_crtc_state *pipe_config); |
1019 | struct intel_encoder * | 1021 | struct intel_encoder * |