diff options
author | Libin Yang <libin.yang@linux.intel.com> | 2016-09-19 21:24:41 -0400 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2016-09-21 12:32:25 -0400 |
commit | 3708d5e082c39913b26bd06845ffe80a0b689e2a (patch) | |
tree | b93a6b530af47b0fdb5abb9ec0b1c326dafba8fd /drivers/gpu | |
parent | f1a3acea26f89de17399726e1451fc7bb5376573 (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.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ddi.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 2 |
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 | ||
2891 | static 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 | |||
2891 | static void intel_hdmi_info(struct seq_file *m, | 2905 | static 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 | ||
2230 | bool 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 | |||
2230 | void intel_ddi_get_config(struct intel_encoder *encoder, | 2243 | void 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 | ||
99 | static void intel_mst_post_disable_dp(struct intel_encoder *encoder, | 108 | static 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 | ||
211 | static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder, | 226 | static 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, | |||
1156 | void intel_ddi_set_pipe_settings(struct drm_crtc *crtc); | 1156 | void intel_ddi_set_pipe_settings(struct drm_crtc *crtc); |
1157 | void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp); | 1157 | void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp); |
1158 | bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector); | 1158 | bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector); |
1159 | bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv, | ||
1160 | struct intel_crtc *intel_crtc); | ||
1159 | void intel_ddi_get_config(struct intel_encoder *encoder, | 1161 | void intel_ddi_get_config(struct intel_encoder *encoder, |
1160 | struct intel_crtc_state *pipe_config); | 1162 | struct intel_crtc_state *pipe_config); |
1161 | struct intel_encoder * | 1163 | struct intel_encoder * |