dp/mst: add SDP stream support
Subsystems (3)
PATCH v3 1/2 dp/mst: add SDP stream support
From: Libin Yang <[email protected]>
This adds code to initialise the SDP streams for a sink in the simplest ordering.
I've no idea how you'd want to control the ordering at this level, so don't bother
until someone comes up with a use case.
--- drivers/gpu/drm/drm_dp_mst_topology.c | 38 ++++++++++++++++++++++++++++++++--- include/drm/drm_dp_mst_helper.h | 7 +++++-- 2 files changed, 40 insertions(+), 5 deletions(-)
drivers/gpu/drm/drm_dp_mst_topology.c +35 -3
@@ -666,7 +666,9 @@ static int build_enum_path_resources(struct drm_dp_sideband_msg_tx *msg, int por }static int build_allocate_payload (struct drm_dp_sideband_msg_tx *msg,int port_num, -u8 vcpi,uint16_t pbn) +u8 vcpi,uint16_t pbn, +u8 number_sdp_streams, +u8 *sdp_stream_sink) {struct drm_dp_sideband_msg_req_body req;memset (&req,0 ,sizeof (req));
@@ -674,6 +676,9 @@ static int build_allocate_payload(struct drm_dp_sideband_msg_tx *msg, int port_n req.u.allocate_payload.port_number = port_num; req.u.allocate_payload.vcpi = vcpi; req.u.allocate_payload.pbn = pbn; + req.u.allocate_payload.number_sdp_streams = number_sdp_streams; +memcpy (req.u.allocate_payload.sdp_stream_sink, sdp_stream_sink, + number_sdp_streams);drm_dp_encode_sideband_req (&req, msg); msg->path_msg = true;return 0 ;
@@ -1562,6 +1567,8 @@ static int drm_dp_payload_send_msg(struct drm_dp_mst_topology_mgr *mgr,struct drm_dp_sideband_msg_tx *txmsg;struct drm_dp_mst_branch *mstb;int len, ret; +u8 sinks[DRM_DP_MAX_SDP_STREAMS ]; +int i; mstb =drm_dp_get_validated_mstb_ref (mgr, port->parent);if (!mstb)
@@ -1573,10 +1580,13 @@ static int drm_dp_payload_send_msg(struct drm_dp_mst_topology_mgr *mgr, goto fail_put; } +for (i =0 ; i < port->num_sdp_streams; i++) + sinks[i] = i; + txmsg->dst = mstb; len =build_allocate_payload (txmsg, port->port_num, id, - pbn); + pbn, port->num_sdp_streams, sinks);drm_dp_queue_down_tx (mgr, txmsg);
@@ -2259,6 +2269,27 @@ out:EXPORT_SYMBOL (drm_dp_mst_detect_port);/** +* drm_dp_mst_port_has_audio() - Check whether port has audio capability or not +* @mgr: manager for this port +* @port: unverified pointer to a port. +* +* This returns whether the port supports audio or not. +*/ +bool drm_dp_mst_port_has_audio (struct drm_dp_mst_topology_mgr *mgr, +struct drm_dp_mst_port *port) +{ +bool ret = false; + + port =drm_dp_get_validated_port_ref (mgr, port); +if (!port) +return ret; + ret = port->has_audio; +drm_dp_put_port (port); +return ret; +} +EXPORT_SYMBOL (drm_dp_mst_port_has_audio); + +/** * drm_dp_mst_get_edid() - get EDID for an MST port * @connector: toplevel connector to get EDID for * @mgr: manager for this port
@@ -2283,6 +2314,7 @@ struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_ edid =drm_get_edid (connector, &port->aux.ddc);drm_mode_connector_set_tile_property (connector); } + port->has_audio =drm_detect_monitor_audio (edid);drm_dp_put_port (port);return edid; }
@@ -2566,7 +2598,7 @@ static void drm_dp_mst_dump_mstb(struct seq_file *m,seq_printf (m,"%smst: %p, %d\n" , prefix, mstb, mstb->num_ports);list_for_each_entry (port, &mstb->ports, next) { -seq_printf (m,"%sport: %d: ddps: %d ldps: %d, %p, conn: %p\n" , prefix, port->port_num, port->ddps, port->ldps, port, port->connector); +seq_printf (m,"%sport: %d: ddps: %d ldps: %d, sdp: %d/%d, %p, conn: %p\n" , prefix, port->port_num, port->ddps, port->ldps, port->num_sdp_streams, port->num_sdp_stream_sinks, port, port->connector);if (port->mstb)drm_dp_mst_dump_mstb (m, port->mstb); }
include/drm/drm_dp_mst_helper.h +5 -2
@@ -94,6 +94,7 @@ struct drm_dp_mst_port {struct drm_dp_mst_topology_mgr *mgr;struct edid *cached_edid;/* for DP logical ports - make tiling work */ +bool has_audio; };/**
@@ -215,13 +216,13 @@ struct drm_dp_sideband_msg_rx {struct drm_dp_sideband_msg_hdr initial_hdr; }; - +#define DRM_DP_MAX_SDP_STREAMS 16struct drm_dp_allocate_payload {u8 port_number;u8 number_sdp_streams;u8 vcpi;u16 pbn; -u8 sdp_stream_sink[8 ]; +u8 sdp_stream_sink[DRM_DP_MAX_SDP_STREAMS ]; };struct drm_dp_allocate_payload_ack_reply {
@@ -484,6 +485,8 @@ int drm_dp_mst_hpd_irq(struct drm_dp_mst_topology_mgr *mgr, u8 *esi, bool *handlenum drm_connector_status drm_dp_mst_detect_port (struct drm_connector *connector,struct drm_dp_mst_topology_mgr *mgr,struct drm_dp_mst_port *port); +bool drm_dp_mst_port_has_audio (struct drm_dp_mst_topology_mgr *mgr, +struct drm_dp_mst_port *port);struct edid *drm_dp_mst_get_edid (struct drm_connector *connector,struct drm_dp_mst_topology_mgr *mgr,struct drm_dp_mst_port *port);
Signature · 6 lines
1.9.1 _______________________________________________ Intel-gfx mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/intel-gfx
PATCH v3 2/2 drm/i915: start adding dp mst audio
From: Libin Yang <[email protected]>
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.
--- drivers/gpu/drm/i915/i915_debugfs.c | 16 ++++++++++++++++ drivers/gpu/drm/i915/intel_audio.c | 9 ++++++--- drivers/gpu/drm/i915/intel_ddi.c | 19 ++++++++++++++----- drivers/gpu/drm/i915/intel_dp_mst.c | 21 +++++++++++++++++++++ drivers/gpu/drm/i915/intel_drv.h | 3 +++ 5 files changed, 60 insertions(+), 8 deletions(-)
drivers/gpu/drm/i915/i915_debugfs.c +16 -0
@@ -2873,6 +2873,20 @@ static void intel_dp_info(struct seq_file *m,intel_panel_info (m, &intel_connector->panel); } +static void intel_dp_mst_info (struct seq_file *m, +struct intel_connector *intel_connector) +{ +struct intel_encoder *intel_encoder = intel_connector->encoder; +struct intel_dp_mst_encoder *intel_mst = +enc_to_mst (&intel_encoder->base); +struct intel_digital_port *intel_dig_port = intel_mst->primary; +struct intel_dp *intel_dp = &intel_dig_port->dp; +bool has_audio =drm_dp_mst_port_has_audio (&intel_dp->mst_mgr, + intel_connector->port); + +seq_printf (m,"\taudio support: %s\n" ,yesno (has_audio)); +} +static void intel_hdmi_info (struct seq_file *m,struct intel_connector *intel_connector) {
@@ -2916,6 +2930,8 @@ static void intel_connector_info(struct seq_file *m,intel_hdmi_info (m, intel_connector); else if (intel_encoder->type == INTEL_OUTPUT_LVDS) intel_lvds_info(m, intel_connector); + else if (intel_encoder->type == INTEL_OUTPUT_DP_MST) + intel_dp_mst_info(m, intel_connector); }seq_printf (m,"\tmodes:\n" );
drivers/gpu/drm/i915/intel_audio.c +6 -3
@@ -262,7 +262,8 @@ static void hsw_audio_codec_disable(struct intel_encoder *encoder) tmp |=AUD_CONFIG_N_PROG_ENABLE ; tmp &= ~AUD_CONFIG_UPPER_N_MASK ; tmp &= ~AUD_CONFIG_LOWER_N_MASK ; -if (intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DISPLAYPORT )) +if (intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DISPLAYPORT ) || +intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DP_MST )) tmp |=AUD_CONFIG_N_VALUE_INDEX ;I915_WRITE (HSW_AUD_CFG (pipe), tmp);
@@ -478,7 +479,8 @@ static void ilk_audio_codec_enable(struct drm_connector *connector, tmp &= ~AUD_CONFIG_N_VALUE_INDEX ; tmp &= ~AUD_CONFIG_N_PROG_ENABLE ; tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK ; -if (intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DISPLAYPORT )) +if (intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DISPLAYPORT ) || +intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DP_MST )) tmp |=AUD_CONFIG_N_VALUE_INDEX ;else tmp |=audio_config_hdmi_pixel_clock (adjusted_mode);
@@ -516,7 +518,8 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder)/* ELD Conn_Type */ connector->eld[5 ] &= ~(3 <<2 ); -if (intel_pipe_has_type (crtc,INTEL_OUTPUT_DISPLAYPORT )) +if (intel_pipe_has_type (crtc,INTEL_OUTPUT_DISPLAYPORT ) || +intel_pipe_has_type (crtc,INTEL_OUTPUT_DP_MST )) connector->eld[5 ] |= (1 <<2 ); connector->eld[6 ] =drm_av_sync_delay (connector, adjusted_mode) /2 ;
drivers/gpu/drm/i915/intel_ddi.c +14 -5
@@ -3043,6 +3043,19 @@ void intel_ddi_fdi_disable(struct drm_crtc *crtc)I915_WRITE (FDI_RX_CTL (PIPE_A ), val); } +void intel_set_pipe_has_audio (struct drm_i915_private *dev_priv, +struct intel_crtc *intel_crtc, +struct intel_crtc_state *pipe_config) +{ +u32 temp; + +if (intel_display_power_is_enabled (dev_priv,POWER_DOMAIN_AUDIO )) { + temp =I915_READ (HSW_AUD_PIN_ELD_CP_VLD ); +if (temp &AUDIO_OUTPUT_ENABLE (intel_crtc->pipe)) + pipe_config->has_audio = true; + } +} +void intel_ddi_get_config (struct intel_encoder *encoder,struct intel_crtc_state *pipe_config) {
@@ -3103,11 +3116,7 @@ void intel_ddi_get_config(struct intel_encoder *encoder,break ; } -if (intel_display_power_is_enabled (dev_priv,POWER_DOMAIN_AUDIO )) { - temp =I915_READ (HSW_AUD_PIN_ELD_CP_VLD ); -if (temp &AUDIO_OUTPUT_ENABLE (intel_crtc->pipe)) - pipe_config->has_audio = true; - } +intel_set_pipe_has_audio (dev_priv, intel_crtc, pipe_config);if (encoder->type ==INTEL_OUTPUT_EDP && dev_priv->vbt.edp_bpp && pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) {
drivers/gpu/drm/i915/intel_dp_mst.c +21 -0
@@ -78,6 +78,8 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,return false; } +if (drm_dp_mst_port_has_audio (&intel_dp->mst_mgr, found->port)) + pipe_config->has_audio = true; mst_pbn =drm_dp_calc_pbn_mode (adjusted_mode->crtc_clock, bpp); pipe_config->pbn = mst_pbn;
@@ -102,6 +104,11 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder)struct intel_dp_mst_encoder *intel_mst =enc_to_mst (&encoder->base);struct intel_digital_port *intel_dig_port = intel_mst->primary;struct intel_dp *intel_dp = &intel_dig_port->dp; +struct drm_device *dev = encoder->base.dev; +struct drm_i915_private *dev_priv = dev->dev_private; +struct drm_crtc *crtc = encoder->base.crtc; +struct intel_crtc *intel_crtc =to_intel_crtc (crtc); +int ret;DRM_DEBUG_KMS ("%d\n" , intel_dp->active_mst_links);
@@ -112,6 +119,10 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder)if (ret) {DRM_ERROR ("failed to update payload %d\n" , ret); } +if (intel_crtc->config->has_audio) { +intel_audio_codec_disable (encoder); +intel_display_power_put (dev_priv,POWER_DOMAIN_AUDIO ); + } }static void intel_mst_post_disable_dp (struct intel_encoder *encoder)
@@ -214,6 +225,7 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder)struct intel_dp *intel_dp = &intel_dig_port->dp;struct drm_device *dev = intel_dig_port->base.base.dev;struct drm_i915_private *dev_priv = dev->dev_private; +struct intel_crtc *crtc =to_intel_crtc (encoder->base.crtc);enum port port = intel_dig_port->port;int ret;
@@ -226,6 +238,13 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder) ret =drm_dp_check_act_status (&intel_dp->mst_mgr); ret =drm_dp_update_payload_part2 (&intel_dp->mst_mgr); + +if (crtc->config->has_audio) { +DRM_DEBUG_DRIVER ("Enabling DP audio on pipe %c\n" , +pipe_name (crtc->pipe)); +intel_display_power_get (dev_priv,POWER_DOMAIN_AUDIO ); +intel_audio_codec_enable (encoder); + } } static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder,
@@ -251,6 +270,8 @@ static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder, pipe_config->has_dp_encoder = true; +intel_set_pipe_has_audio (dev_priv, crtc, pipe_config); + temp =I915_READ (TRANS_DDI_FUNC_CTL (cpu_transcoder));if (temp &TRANS_DDI_PHSYNC ) flags |=DRM_MODE_FLAG_PHSYNC ;
drivers/gpu/drm/i915/intel_drv.h +3 -0
@@ -1013,6 +1013,9 @@ void intel_ddi_set_pipe_settings(struct drm_crtc *crtc);void intel_ddi_prepare_link_retrain (struct intel_dp *intel_dp);bool intel_ddi_connector_get_hw_state (struct intel_connector *intel_connector);void intel_ddi_fdi_disable (struct drm_crtc *crtc); +void intel_set_pipe_has_audio (struct drm_i915_private *dev_priv, +struct intel_crtc *intel_crtc, +struct intel_crtc_state *pipe_config);void intel_ddi_get_config (struct intel_encoder *encoder,struct intel_crtc_state *pipe_config); struct intel_encoder *
Signature · 6 lines
1.9.1 _______________________________________________ Intel-gfx mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Re: [PATCH V3 2/2] drm/i915: start adding dp mst audio
Quoted 3 lines · On Wed, 2015-11-25 at 13:19 +0800, [email protected] wrote:
From: Libin Yang <[email protected]>
This patch adds support for DP MST audio in i915.
The title says "start adding" so a note of what's still missing would be good here. I assume something is missing since I tested these two patches, and while I got a new sound device for my MST monitor, no audio came out of that.
With this and the change I asked below, this is
Quoted 92 lines
Enable audio codec when DP MST is enabled if
has_audioflag is set. Disable audio codec when DP MST is disabled ifhas_audioflag is set.Signed-off-by Libin Yang <[email protected]>Signed-off-by Dave Airlie <[email protected]>--- drivers/gpu/drm/i915/i915_debugfs.c | 16 ++++++++++++++++ drivers/gpu/drm/i915/intel_audio.c | 9 ++++++--- drivers/gpu/drm/i915/intel_ddi.c | 19 ++++++++++++++----- drivers/gpu/drm/i915/intel_dp_mst.c | 21 +++++++++++++++++++++ drivers/gpu/drm/i915/intel_drv.h | 3 +++ 5 files changed, 60 insertions(+), 8 deletions(-)drivers/gpu/drm/i915/i915_debugfs.c +16
-0@@ -2873,6 +2873,20 @@ static void intel_dp_info(struct seq_file *m,intel_panel_info (m, &intel_connector->panel); } +static void intel_dp_mst_info (struct seq_file *m, +struct intel_connector *intel_connector) +{ +struct intel_encoder *intel_encoder = intel_connector->encoder; +struct intel_dp_mst_encoder *intel_mst = +enc_to_mst (&intel_encoder->base); +struct intel_digital_port *intel_dig_port = intel_mst->primary; +struct intel_dp *intel_dp = &intel_dig_port->dp; +bool has_audio =drm_dp_mst_port_has_audio (&intel_dp->mst_mgr, + intel_connector->port); + +seq_printf (m,"\taudio support: %s\n" ,yesno (has_audio)); +} +static void intel_hdmi_info (struct seq_file *m,struct intel_connector *intel_connector) {@@ -2916,6 +2930,8 @@ static void intel_connector_info(struct seq_file *m,intel_hdmi_info (m, intel_connector); else if (intel_encoder->type == INTEL_OUTPUT_LVDS) intel_lvds_info(m, intel_connector); + else if (intel_encoder->type == INTEL_OUTPUT_DP_MST) + intel_dp_mst_info(m, intel_connector); }seq_printf (m,"\tmodes:\n" );drivers/gpu/drm/i915/intel_audio.c +4
-2@@ -262,7 +262,8 @@ static void hsw_audio_codec_disable(struct intel_encoder *encoder) tmp |=AUD_CONFIG_N_PROG_ENABLE ; tmp &= ~AUD_CONFIG_UPPER_N_MASK ; tmp &= ~AUD_CONFIG_LOWER_N_MASK ; -if (intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DISPLAYPORT )) +if (intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DISPLAYPORT ) || +intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DP_MST )) tmp |=AUD_CONFIG_N_VALUE_INDEX ;I915_WRITE (HSW_AUD_CFG (pipe), tmp);@@ -478,7 +479,8 @@ static void ilk_audio_codec_enable(struct drm_connector *connector, tmp &= ~AUD_CONFIG_N_VALUE_INDEX ; tmp &= ~AUD_CONFIG_N_PROG_ENABLE ; tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK ; -if (intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DISPLAYPORT )) +if (intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DISPLAYPORT ) || +intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DP_MST )) tmp |=AUD_CONFIG_N_VALUE_INDEX ;else drivers/gpu/drm/i915/intel_audio.c +2
-1tmp |=audio_config_hdmi_pixel_clock (adjusted_mode);@@ -516,7 +518,8 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder)/* ELD Conn_Type */ connector->eld[5 ] &= ~(3 <<2 ); -if (intel_pipe_has_type (crtc,INTEL_OUTPUT_DISPLAYPORT )) +if (intel_pipe_has_type (crtc,INTEL_OUTPUT_DISPLAYPORT ) || +intel_pipe_has_type (crtc,INTEL_OUTPUT_DP_MST )) connector->eld[5 ] |= (1 <<2 );drivers/gpu/drm/i915/intel_audio.c +0
-0connector->eld[6 ] =drm_av_sync_delay (connector, adjusted_mode) /2 ;drivers/gpu/drm/i915/intel_ddi.c +0
-0
drivers/gpu/drm/i915/intel_ddi.c void intel_ddi_fdi_disable(struct drm_crtc *crtc) · line 3046
Quoted 4 lines
drivers/gpu/drm/i915/intel_ddi.c +1
-0@@ -3043,6 +3043,19 @@ void intel_ddi_fdi_disable(struct drm_crtc *crtc)I915_WRITE (FDI_RX_CTL (PIPE_A ), val); } +void intel_set_pipe_has_audio(struct drm_i915_private *dev_priv,
This is a DDI-specific function, so it should have an intel_ddi_ prefix. I think it would also be good to make it return bool so it could have one less parameter. The field in pipe_config can be set in the caller. I.e.
pipe_config->has_audio = intel_ddi_is_audio_enabled(crtc);
If you take dev_priv from the crtc it could have just one parameter.
Quoted 118 lines
drivers/gpu/drm/i915/intel_ddi.c +13
-5+struct intel_crtc *intel_crtc, + struct intel_crtc_state *pipe_config) +{ + u32 temp; + +if (intel_display_power_is_enabled (dev_priv,POWER_DOMAIN_AUDIO )) { + temp =I915_READ (HSW_AUD_PIN_ELD_CP_VLD ); +if (temp &AUDIO_OUTPUT_ENABLE (intel_crtc->pipe)) + pipe_config->has_audio = true; + } +} +void intel_ddi_get_config (struct intel_encoder *encoder,struct intel_crtc_state *pipe_config) {@@ -3103,11 +3116,7 @@ void intel_ddi_get_config(struct intel_encoder *encoder, break; } -if (intel_display_power_is_enabled (dev_priv,POWER_DOMAIN_AUDIO )) { - temp =I915_READ (HSW_AUD_PIN_ELD_CP_VLD ); -if (temp &AUDIO_OUTPUT_ENABLE (intel_crtc->pipe)) - pipe_config->has_audio = true; - } +intel_set_pipe_has_audio (dev_priv, intel_crtc, pipe_config); if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp_bpp &&drivers/gpu/drm/i915/intel_ddi.c +0
-0pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) {drivers/gpu/drm/i915/intel_dp_mst.c +2
-0@@ -78,6 +78,8 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, return false; } +if (drm_dp_mst_port_has_audio (&intel_dp->mst_mgr, found->port)) + pipe_config->has_audio = true; mst_pbn =drm_dp_calc_pbn_mode (adjusted_mode->crtc_clock, bpp);drivers/gpu/drm/i915/intel_dp_mst.c +5
-0pipe_config->pbn = mst_pbn;@@ -102,6 +104,11 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder)struct intel_dp_mst_encoder *intel_mst =enc_to_mst (&encoder->base);struct intel_digital_port *intel_dig_port = intel_mst->primary;struct intel_dp *intel_dp = &intel_dig_port->dp; +struct drm_device *dev = encoder->base.dev; +struct drm_i915_private *dev_priv = dev->dev_private; +struct drm_crtc *crtc = encoder->base.crtc; +struct intel_crtc *intel_crtc =to_intel_crtc (crtc); +int ret;drivers/gpu/drm/i915/intel_dp_mst.c +4
-0DRM_DEBUG_KMS ("%d\n" , intel_dp->active_mst_links);@@ -112,6 +119,10 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder)if (ret) {DRM_ERROR ("failed to update payload %d\n" , ret); } +if (intel_crtc->config->has_audio) { +intel_audio_codec_disable (encoder); +intel_display_power_put (dev_priv,POWER_DOMAIN_AUDIO ); + } }static void
intel_mst_post_disable_dp(struct intel_encoder *encoder)drivers/gpu/drm/i915/intel_dp_mst.c +8
-0@@ -214,6 +225,7 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder)struct intel_dp *intel_dp = &intel_dig_port->dp;struct drm_device *dev = intel_dig_port->base.base.dev;struct drm_i915_private *dev_priv = dev->dev_private; +struct intel_crtc *crtc =to_intel_crtc (encoder->base.crtc);enum port port = intel_dig_port->port;int ret;@@ -226,6 +238,13 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder) ret =drm_dp_check_act_status (&intel_dp->mst_mgr); ret =drm_dp_update_payload_part2 (&intel_dp->mst_mgr); + +if (crtc->config->has_audio) { +DRM_DEBUG_DRIVER ("Enabling DP audio on pipe %c\n" , +pipe_name (crtc->pipe)); +intel_display_power_get (dev_priv,POWER_DOMAIN_AUDIO ); +intel_audio_codec_enable (encoder); + } }static bool intel_dp_mst_enc_get_hw_state(struct
intel_encoder*encoder,drivers/gpu/drm/i915/intel_dp_mst.c +2
-0@@ -251,6 +270,8 @@ static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder, pipe_config->has_dp_encoder = true; +intel_set_pipe_has_audio (dev_priv, crtc, pipe_config); + temp =I915_READ (TRANS_DDI_FUNC_CTL (cpu_transcoder));if (temp &TRANS_DDI_PHSYNC )drivers/gpu/drm/i915/intel_dp_mst.c +0
-0flags |=DRM_MODE_FLAG_PHSYNC ;drivers/gpu/drm/i915/intel_drv.h +3
-0@@ -1013,6 +1013,9 @@ void intel_ddi_set_pipe_settings(struct drm_crtc *crtc);void intel_ddi_prepare_link_retrain (struct intel_dp *intel_dp);bool intel_ddi_connector_get_hw_state (struct intel_connector *intel_connector);void intel_ddi_fdi_disable (struct drm_crtc *crtc); +void intel_set_pipe_has_audio (struct drm_i915_private *dev_priv, +struct intel_crtc *intel_crtc, +struct intel_crtc_state *pipe_config);void intel_ddi_get_config (struct intel_encoder *encoder,struct intel_crtc_state *pipe_config);
Quoted 1 line
struct
intel_encoder*
_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Re: [PATCH V3 2/2] drm/i915: start adding dp mst audio
Quoted 108 lines · Ander Conselvan De Oliveira
Quoted 3 lines · On Wed, 2015-11-25 at 13:19 +0800, [email protected] wrote:
From: Libin Yang <[email protected]>
This patch adds support for DP MST audio in i915.
The title says "start adding" so a note of what's still missing would be good here. I assume something is missing since I tested these two patches, and while I got a new sound device for my MST monitor, no audio came out of that.
With this and the change I asked below, this is
Reviewed-by Ander Conselvan de Oliveira <[email protected]>Quoted 95 lines
Enable audio codec when DP MST is enabled if
has_audioflag is set. Disable audio codec when DP MST is disabled ifhas_audioflag is set.Signed-off-by Libin Yang <[email protected]>Signed-off-by Dave Airlie <[email protected]>--- drivers/gpu/drm/i915/i915_debugfs.c | 16 ++++++++++++++++ drivers/gpu/drm/i915/intel_audio.c | 9 ++++++--- drivers/gpu/drm/i915/intel_ddi.c | 19 ++++++++++++++----- drivers/gpu/drm/i915/intel_dp_mst.c | 21 +++++++++++++++++++++ drivers/gpu/drm/i915/intel_drv.h | 3 +++ 5 files changed, 60 insertions(+), 8 deletions(-)drivers/gpu/drm/i915/i915_debugfs.c +16
-0@@ -2873,6 +2873,20 @@ static void intel_dp_info(struct seq_file *m,intel_panel_info (m, &intel_connector->panel); } +static void intel_dp_mst_info (struct seq_file *m, +struct intel_connector *intel_connector) +{ +struct intel_encoder *intel_encoder = intel_connector->encoder; +struct intel_dp_mst_encoder *intel_mst = +enc_to_mst (&intel_encoder->base); +struct intel_digital_port *intel_dig_port = intel_mst->primary; +struct intel_dp *intel_dp = &intel_dig_port->dp; +bool has_audio =drm_dp_mst_port_has_audio (&intel_dp->mst_mgr, + intel_connector->port); + +seq_printf (m,"\taudio support: %s\n" ,yesno (has_audio)); +} +static void intel_hdmi_info (struct seq_file *m,struct intel_connector *intel_connector) {@@ -2916,6 +2930,8 @@ static void intel_connector_info(struct seq_file *m,intel_hdmi_info (m, intel_connector); else if (intel_encoder->type == INTEL_OUTPUT_LVDS) intel_lvds_info(m, intel_connector); + else if (intel_encoder->type == INTEL_OUTPUT_DP_MST) + intel_dp_mst_info(m, intel_connector); }seq_printf (m,"\tmodes:\n" );drivers/gpu/drm/i915/intel_audio.c +4
-2@@ -262,7 +262,8 @@ static void hsw_audio_codec_disable(struct intel_encoder *encoder) tmp |=AUD_CONFIG_N_PROG_ENABLE ; tmp &= ~AUD_CONFIG_UPPER_N_MASK ; tmp &= ~AUD_CONFIG_LOWER_N_MASK ; -if (intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DISPLAYPORT )) +if (intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DISPLAYPORT ) || +intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DP_MST )) tmp |=AUD_CONFIG_N_VALUE_INDEX ;I915_WRITE (HSW_AUD_CFG (pipe), tmp);@@ -478,7 +479,8 @@ static void ilk_audio_codec_enable(struct drm_connector *connector, tmp &= ~AUD_CONFIG_N_VALUE_INDEX ; tmp &= ~AUD_CONFIG_N_PROG_ENABLE ; tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK ; -if (intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DISPLAYPORT )) +if (intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DISPLAYPORT ) || +intel_pipe_has_type (intel_crtc,INTEL_OUTPUT_DP_MST )) tmp |=AUD_CONFIG_N_VALUE_INDEX ;else tmp |= audio_config_hdmi_pixel_clock(adjusted_mode);drivers/gpu/drm/i915/intel_audio.c +2
-1@@ -516,7 +518,8 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder)/* ELD Conn_Type */ connector->eld[5 ] &= ~(3 <<2 ); -if (intel_pipe_has_type (crtc,INTEL_OUTPUT_DISPLAYPORT )) +if (intel_pipe_has_type (crtc,INTEL_OUTPUT_DISPLAYPORT ) || +intel_pipe_has_type (crtc,INTEL_OUTPUT_DP_MST )) connector->eld[5 ] |= (1 <<2 );connector->eld[6] = drm_av_sync_delay(connector, adjusted_mode) / 2;drivers/gpu/drm/i915/intel_ddi.c +0
-0@@ -3043,6 +3043,19 @@ void intel_ddi_fdi_disable(struct drm_crtc *crtc)I915_WRITE (FDI_RX_CTL (PIPE_A ), val); }
Quoted 7 lines
drivers/gpu/drm/i915/intel_ddi.c void intel_ddi_fdi_disable(struct drm_crtc *crtc) · line 3046
Quoted 1 line
drivers/gpu/drm/i915/intel_ddi.c +1
-0+void intel_set_pipe_has_audio(struct drm_i915_private *dev_priv,This is a DDI-specific function, so it should have an
intel_ddi_prefix. I think it would also be good to make it return bool so it could have one less parameter. The field inpipe_configcan be set in the caller. I.e.
pipe_config->has_audio=intel_ddi_is_audio_enabled(crtc);
OK.
Quoted 2 lines
If you take
dev_privfrom the crtc it could have just one parameter.
Thanks for review. I have sent the new patches based on your suggestion. And I still use the dev_priv as parameter, hoping this may be a little efficient without getting the dev_priv again in the new function.
Best Regards,
Libin
Quoted 114 lines
Quoted 114 lines
drivers/gpu/drm/i915/intel_ddi.c +13
-5+struct intel_crtc *intel_crtc, + struct intel_crtc_state *pipe_config) +{ + u32 temp; + +if (intel_display_power_is_enabled (dev_priv,POWER_DOMAIN_AUDIO )) { + temp =I915_READ (HSW_AUD_PIN_ELD_CP_VLD ); +if (temp &AUDIO_OUTPUT_ENABLE (intel_crtc->pipe)) + pipe_config->has_audio = true; + } +} +void intel_ddi_get_config (struct intel_encoder *encoder,struct intel_crtc_state *pipe_config) {@@ -3103,11 +3116,7 @@ void intel_ddi_get_config(struct intel_encoder *encoder, break; } -if (intel_display_power_is_enabled (dev_priv,POWER_DOMAIN_AUDIO )) { - temp =I915_READ (HSW_AUD_PIN_ELD_CP_VLD ); -if (temp &AUDIO_OUTPUT_ENABLE (intel_crtc->pipe)) - pipe_config->has_audio = true; - } +intel_set_pipe_has_audio (dev_priv, intel_crtc, pipe_config); if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp_bpp &&pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) {drivers/gpu/drm/i915/intel_dp_mst.c +2
-0@@ -78,6 +78,8 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, return false; } +if (drm_dp_mst_port_has_audio (&intel_dp->mst_mgr, found->port)) + pipe_config->has_audio = true; mst_pbn =drm_dp_calc_pbn_mode (adjusted_mode->crtc_clock, bpp);pipe_config->pbn = mst_pbn;drivers/gpu/drm/i915/intel_dp_mst.c +5
-0@@ -102,6 +104,11 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder)struct intel_dp_mst_encoder *intel_mst =enc_to_mst (&encoder->base);struct intel_digital_port *intel_dig_port = intel_mst->primary;struct intel_dp *intel_dp = &intel_dig_port->dp; +struct drm_device *dev = encoder->base.dev; +struct drm_i915_private *dev_priv = dev->dev_private; +struct drm_crtc *crtc = encoder->base.crtc; +struct intel_crtc *intel_crtc =to_intel_crtc (crtc); +int ret;DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);drivers/gpu/drm/i915/intel_dp_mst.c +4
-0@@ -112,6 +119,10 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder)if (ret) {DRM_ERROR ("failed to update payload %d\n" , ret); } +if (intel_crtc->config->has_audio) { +intel_audio_codec_disable (encoder); +intel_display_power_put (dev_priv,POWER_DOMAIN_AUDIO ); + } }static void
intel_mst_post_disable_dp(struct intel_encoder *encoder)drivers/gpu/drm/i915/intel_dp_mst.c +8
-0@@ -214,6 +225,7 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder)struct intel_dp *intel_dp = &intel_dig_port->dp;struct drm_device *dev = intel_dig_port->base.base.dev;struct drm_i915_private *dev_priv = dev->dev_private; +struct intel_crtc *crtc =to_intel_crtc (encoder->base.crtc);enum port port = intel_dig_port->port;int ret;@@ -226,6 +238,13 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder) ret =drm_dp_check_act_status (&intel_dp->mst_mgr); ret =drm_dp_update_payload_part2 (&intel_dp->mst_mgr); + +if (crtc->config->has_audio) { +DRM_DEBUG_DRIVER ("Enabling DP audio on pipe %c\n" , +pipe_name (crtc->pipe)); +intel_display_power_get (dev_priv,POWER_DOMAIN_AUDIO ); +intel_audio_codec_enable (encoder); + } }static bool intel_dp_mst_enc_get_hw_state(struct
intel_encoder*encoder,drivers/gpu/drm/i915/intel_dp_mst.c +2
-0@@ -251,6 +270,8 @@ static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder, pipe_config->has_dp_encoder = true; +intel_set_pipe_has_audio (dev_priv, crtc, pipe_config); + temp =I915_READ (TRANS_DDI_FUNC_CTL (cpu_transcoder));if (temp &TRANS_DDI_PHSYNC )flags |= DRM_MODE_FLAG_PHSYNC;drivers/gpu/drm/i915/intel_drv.h +0
-0@@ -1013,6 +1013,9 @@ void intel_ddi_set_pipe_settings(struct drm_crtc *crtc);void intel_ddi_prepare_link_retrain (struct intel_dp *intel_dp); bool intel_ddi_connector_get_hw_state(struct intel_connector
Quoted 8 lines
Quoted 8 lines
drivers/gpu/drm/i915/intel_drv.h +3
-0*intel_connector);void intel_ddi_fdi_disable (struct drm_crtc *crtc); +void intel_set_pipe_has_audio (struct drm_i915_private *dev_priv, +struct intel_crtc *intel_crtc, +struct intel_crtc_state *pipe_config);void intel_ddi_get_config (struct intel_encoder *encoder,struct intel_crtc_state *pipe_config);struct
intel_encoder*
_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx