Patch "drm/i915: Clean up DDI DDC/AUX CH sanitation" has been added to the 4.8-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
drm/i915: Clean up DDI DDC/AUX CH sanitation
to the 4.8-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-i915-clean-up-ddi-ddc-aux-ch-sanitation.patch
and it can be found in the queue-4.8 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
0ce140d45a8398b501934ac289aef0eb7f47c596Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <[email protected]>
Date: Tue, 11 Oct 2016 20:52:47 +0300
Subject: drm/i915: Clean up DDI DDC/AUX CH sanitation
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
From: Ville Syrjälä <[email protected]>
commit 0ce140d45a8398b501934ac289aef0eb7f47c596 upstream.
Now that we use the AUX and GMBUS assignment from VBT for all ports, let's clean up the sanitization of the port information a bit. Previosuly we only did this for port E, and only complained about a non-standard assignment for the other ports. But as we know that non-standard assignments are a fact of life, let's expand the sanitization to all the ports.
v2: Include a commit message, fix up the comments a bit
v3: Don't clobber other ports if the current port has no alternate aux ch/ddc pin
References: https://bugs.freedesktop.org/show_bug.cgi?id=97877
--- drivers/gpu/drm/i915/intel_bios.c | 122 +++++++++++++++++++++++--------------- 1 file changed, 77 insertions(+), 45 deletions(-)
drivers/gpu/drm/i915/intel_bios.c +77 -45
@@ -1031,6 +1031,77 @@ static u8 translate_iboost(u8 val)return mapping[val]; } +static void sanitize_ddc_pin (struct drm_i915_private *dev_priv, +enum port port) +{ +const struct ddi_vbt_port_info *info = + &dev_priv->vbt.ddi_port_info[port]; +enum port p; + +if (!info->alternate_ddc_pin) +return ; + +for_each_port_masked (p, (1 << port) -1 ) { +struct ddi_vbt_port_info *i = &dev_priv->vbt.ddi_port_info[p]; + +if (info->alternate_ddc_pin != i->alternate_ddc_pin) +continue ; + +DRM_DEBUG_KMS ("port %c trying to use the same DDC pin (0x%x) as port %c, " +"disabling port %c DVI/HDMI support\n" , +port_name (p), i->alternate_ddc_pin, +port_name (port),port_name (p)); + +/* +* If we have multiple ports supposedly sharing the +* pin, then dvi/hdmi couldn't exist on the shared +* port. Otherwise they share the same ddc bin and +* system couldn't communicate with them separately. +* +* Due to parsing the ports in alphabetical order, +* a higher port will always clobber a lower one. +*/ + i->supports_dvi = false; + i->supports_hdmi = false; + i->alternate_ddc_pin =0 ; + } +} + +static void sanitize_aux_ch (struct drm_i915_private *dev_priv, +enum port port) +{ +const struct ddi_vbt_port_info *info = + &dev_priv->vbt.ddi_port_info[port]; +enum port p; + +if (!info->alternate_aux_channel) +return ; + +for_each_port_masked (p, (1 << port) -1 ) { +struct ddi_vbt_port_info *i = &dev_priv->vbt.ddi_port_info[p]; + +if (info->alternate_aux_channel != i->alternate_aux_channel) +continue ; + +DRM_DEBUG_KMS ("port %c trying to use the same AUX CH (0x%x) as port %c, " +"disabling port %c DP support\n" , +port_name (p), i->alternate_aux_channel, +port_name (port),port_name (p)); + +/* +* If we have multiple ports supposedlt sharing the +* aux channel, then DP couldn't exist on the shared +* port. Otherwise they share the same aux channel +* and system couldn't communicate with them separately. +* +* Due to parsing the ports in alphabetical order, +* a higher port will always clobber a lower one. +*/ + i->supports_dp = false; + i->alternate_aux_channel =0 ; + } +} +static void parse_ddi_port (struct drm_i915_private *dev_priv,enum port port,const struct bdb_header *bdb) {
@@ -1105,54 +1176,15 @@ static void parse_ddi_port(struct drm_i9DRM_DEBUG_KMS ("Port %c is internal DP\n" ,port_name (port));if (is_dvi) { -if (port ==PORT_E ) { - info->alternate_ddc_pin = ddc_pin; -/* if DDIE share ddc pin with other port, then -* dvi/hdmi couldn't exist on the shared port. -* Otherwise they share the same ddc bin and system -* couldn't communicate with them seperately. */ -if (ddc_pin ==DDC_PIN_B ) { - dev_priv->vbt.ddi_port_info[PORT_B ].supports_dvi =0 ; - dev_priv->vbt.ddi_port_info[PORT_B ].supports_hdmi =0 ; - }else if (ddc_pin ==DDC_PIN_C ) { - dev_priv->vbt.ddi_port_info[PORT_C ].supports_dvi =0 ; - dev_priv->vbt.ddi_port_info[PORT_C ].supports_hdmi =0 ; - }else if (ddc_pin ==DDC_PIN_D ) { - dev_priv->vbt.ddi_port_info[PORT_D ].supports_dvi =0 ; - dev_priv->vbt.ddi_port_info[PORT_D ].supports_hdmi =0 ; - } - }else if (ddc_pin ==DDC_PIN_B && port !=PORT_B ) -DRM_DEBUG_KMS ("Unexpected DDC pin for port B\n" ); -else if (ddc_pin ==DDC_PIN_C && port !=PORT_C ) -DRM_DEBUG_KMS ("Unexpected DDC pin for port C\n" ); -else if (ddc_pin ==DDC_PIN_D && port !=PORT_D ) -DRM_DEBUG_KMS ("Unexpected DDC pin for port D\n" ); + info->alternate_ddc_pin = ddc_pin; + +sanitize_ddc_pin (dev_priv, port); }if (is_dp) { -if (port ==PORT_E ) { - info->alternate_aux_channel = aux_channel; -/* if DDIE share aux channel with other port, then -* DP couldn't exist on the shared port. Otherwise -* they share the same aux channel and system -* couldn't communicate with them seperately. */ -if (aux_channel ==DP_AUX_A ) - dev_priv->vbt.ddi_port_info[PORT_A ].supports_dp =0 ; -else if (aux_channel ==DP_AUX_B ) - dev_priv->vbt.ddi_port_info[PORT_B ].supports_dp =0 ; -else if (aux_channel ==DP_AUX_C ) - dev_priv->vbt.ddi_port_info[PORT_C ].supports_dp =0 ; -else if (aux_channel ==DP_AUX_D ) - dev_priv->vbt.ddi_port_info[PORT_D ].supports_dp =0 ; - } -else if (aux_channel ==DP_AUX_A && port !=PORT_A ) -DRM_DEBUG_KMS ("Unexpected AUX channel for port A\n" ); -else if (aux_channel ==DP_AUX_B && port !=PORT_B ) -DRM_DEBUG_KMS ("Unexpected AUX channel for port B\n" ); -else if (aux_channel ==DP_AUX_C && port !=PORT_C ) -DRM_DEBUG_KMS ("Unexpected AUX channel for port C\n" ); -else if (aux_channel ==DP_AUX_D && port !=PORT_D ) -DRM_DEBUG_KMS ("Unexpected AUX channel for port D\n" ); + info->alternate_aux_channel = aux_channel; + +sanitize_aux_ch (dev_priv, port); }if (bdb->version >=158 ) {
Patches currently in stable-queue which might be from [email protected] are
queue-4.8/drm-release-reference-from-blob-lookup-after-replacing-property.patch queue-4.8/x86-smpboot-init-apic-mapping-before-usage.patch queue-4.8/drm-fb-helper-don-t-call-dirty-callback-for-untouched-clips.patch queue-4.8/usb-gadget-function-u_ether-don-t-starve-tx-request-queue.patch queue-4.8/drm-i915-clean-up-ddi-ddc-aux-ch-sanitation.patch queue-4.8/drm-i915-respect-alternate_aux_channel-for-all-ddi-ports.patch queue-4.8/drm-dp-mst-check-peer-device-type-before-attempting-edid-read.patch queue-4.8/drm-fb-helper-keep-references-for-the-current-set-of-used-connectors.patch queue-4.8/drm-dp-mst-clear-port-pdt-when-tearing-down-the-i2c-adapter.patch queue-4.8/drm-fb-helper-fix-connector-ref-leak-on-error.patch queue-4.8/drm-i915-fbc-fix-cfb-size-calculation-for-gen8.patch