Skip to content

Commit 2f79190

Browse files
tiwaijnikula
authored andcommitted
drm/i915: Fix bogus dig_port_map[] assignment for pre-HSW
The recent commit [0bdf5a0: drm/i915: Add reverse mapping between port and intel_encoder] introduced a reverse mapping to retrieve intel_dig_port object from the port number. The code assumed that the port vs intel_dig_port are 1:1 mapping. But in reality, this was a too naive assumption. As Martin reported about the missing HDMI audio on his SNB machine, pre-HSW chips may have multiple intel_dig_port objects corresponding to the same port. Since we assign the mapping statically at the init time and the multiple objects override the map, it may not match with the actually enabled output. This patch tries to address the regression above. The reverse mapping is provided basically only for the audio callbacks, so now we set / clear the mapping dynamically at enabling and disabling HDMI/DP audio, so that we can always track the latest and correct object corresponding to the given port. Fixes: 0bdf5a0 ('drm/i915: Add reverse mapping between port and intel_encoder') Reported-and-tested-by: Martin Kepplinger <martink@posteo.de> Cc: drm-intel-fixes@lists.freedesktop.org Signed-off-by: Takashi Iwai <tiwai@suse.de> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Tested-by: Martin Kepplinger <martink@posteo.de> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1456324522-21591-1-git-send-email-tiwai@suse.de (cherry picked from commit 9dfbffc) Signed-off-by: Jani Nikula <jani.nikula@intel.com>
1 parent f6cede5 commit 2f79190

File tree

4 files changed

+3
-4
lines changed

4 files changed

+3
-4
lines changed

drivers/gpu/drm/i915/intel_audio.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,8 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder)
527527

528528
mutex_lock(&dev_priv->av_mutex);
529529
intel_dig_port->audio_connector = connector;
530+
/* referred in audio callbacks */
531+
dev_priv->dig_port_map[port] = intel_encoder;
530532
mutex_unlock(&dev_priv->av_mutex);
531533

532534
if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
@@ -554,6 +556,7 @@ void intel_audio_codec_disable(struct intel_encoder *intel_encoder)
554556

555557
mutex_lock(&dev_priv->av_mutex);
556558
intel_dig_port->audio_connector = NULL;
559+
dev_priv->dig_port_map[port] = NULL;
557560
mutex_unlock(&dev_priv->av_mutex);
558561

559562
if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)

drivers/gpu/drm/i915/intel_ddi.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3358,7 +3358,6 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
33583358
intel_encoder->get_config = intel_ddi_get_config;
33593359

33603360
intel_dig_port->port = port;
3361-
dev_priv->dig_port_map[port] = intel_encoder;
33623361
intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
33633362
(DDI_BUF_PORT_REVERSAL |
33643363
DDI_A_4_LANES);

drivers/gpu/drm/i915/intel_dp.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6045,7 +6045,6 @@ intel_dp_init(struct drm_device *dev,
60456045
}
60466046

60476047
intel_dig_port->port = port;
6048-
dev_priv->dig_port_map[port] = intel_encoder;
60496048
intel_dig_port->dp.output_reg = output_reg;
60506049

60516050
intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;

drivers/gpu/drm/i915/intel_hdmi.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2154,7 +2154,6 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
21542154
void intel_hdmi_init(struct drm_device *dev,
21552155
i915_reg_t hdmi_reg, enum port port)
21562156
{
2157-
struct drm_i915_private *dev_priv = dev->dev_private;
21582157
struct intel_digital_port *intel_dig_port;
21592158
struct intel_encoder *intel_encoder;
21602159
struct intel_connector *intel_connector;
@@ -2223,7 +2222,6 @@ void intel_hdmi_init(struct drm_device *dev,
22232222
intel_encoder->cloneable |= 1 << INTEL_OUTPUT_HDMI;
22242223

22252224
intel_dig_port->port = port;
2226-
dev_priv->dig_port_map[port] = intel_encoder;
22272225
intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
22282226
intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
22292227

0 commit comments

Comments
 (0)