Message ID | 20230908052527.685-1-ville.syrjala@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] drm/i915: Only check eDP HPD when AUX CH is shared | expand |
On Fri, 2023-09-08 at 08:25 +0300, Ville Syrjala wrote: > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Apparently Acer Chromebook C740 (BDW-ULT) doesn't have the > eDP HPD line properly connected, and thus fails the new > HPD check during eDP probe. The result is that we lose the > eDP output. > > I suspect all such machines would all be Chromebooks or other Small duplication here "...all such machines would all...". > Linux exclusive systems as the Windows driver likely wouldn't > work either. I did check a few other BDW machines here and > those do have eDP HPD connected, one of them even is a > different Chromebook (Samus). > > To account for these funky machines let's skip the HPD check when > it looks like the eDP port is the only one using that specific AUX > channel. In case of multiple ports sharing the same AUX CH (eg. on > Asrock B250M-HDV) we still do the check and thus should correctly > ignore the eDP port in favor of the other DP port (usually a DP->VGA > converter). > > v2: Don't oops during list iteration > > Cc: stable@vger.kernel.org > Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/9264 > Fixes: cfe5bdfb27fa ("drm/i915: Check HPD live state during eDP probe") > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- Regardless of the small grammatical issue, LGTM: Reviewed-by: Luca Coelho <luciano.coelho@intel.com> -- Cheers, Luca.
On Mon, Sep 11, 2023 at 08:19:21AM +0000, Coelho, Luciano wrote: > On Fri, 2023-09-08 at 08:25 +0300, Ville Syrjala wrote: > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > > > Apparently Acer Chromebook C740 (BDW-ULT) doesn't have the > > eDP HPD line properly connected, and thus fails the new > > HPD check during eDP probe. The result is that we lose the > > eDP output. > > > > I suspect all such machines would all be Chromebooks or other > > Small duplication here "...all such machines would all...". Dropped one 'all'. Thanks for the review -> pushed. > > > > Linux exclusive systems as the Windows driver likely wouldn't > > work either. I did check a few other BDW machines here and > > those do have eDP HPD connected, one of them even is a > > different Chromebook (Samus). > > > > To account for these funky machines let's skip the HPD check when > > it looks like the eDP port is the only one using that specific AUX > > channel. In case of multiple ports sharing the same AUX CH (eg. on > > Asrock B250M-HDV) we still do the check and thus should correctly > > ignore the eDP port in favor of the other DP port (usually a DP->VGA > > converter). > > > > v2: Don't oops during list iteration > > > > Cc: stable@vger.kernel.org > > Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/9264 > > Fixes: cfe5bdfb27fa ("drm/i915: Check HPD live state during eDP probe") > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > > --- > > Regardless of the small grammatical issue, LGTM: > > Reviewed-by: Luca Coelho <luciano.coelho@intel.com> > > -- > Cheers, > Luca.
diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c index 858c959f7bab..f735b035436c 100644 --- a/drivers/gpu/drm/i915/display/intel_bios.c +++ b/drivers/gpu/drm/i915/display/intel_bios.c @@ -3540,6 +3540,27 @@ enum aux_ch intel_bios_dp_aux_ch(const struct intel_bios_encoder_data *devdata) return map_aux_ch(devdata->i915, devdata->child.aux_channel); } +bool intel_bios_dp_has_shared_aux_ch(const struct intel_bios_encoder_data *devdata) +{ + struct drm_i915_private *i915; + u8 aux_channel; + int count = 0; + + if (!devdata || !devdata->child.aux_channel) + return false; + + i915 = devdata->i915; + aux_channel = devdata->child.aux_channel; + + list_for_each_entry(devdata, &i915->display.vbt.display_devices, node) { + if (intel_bios_encoder_supports_dp(devdata) && + aux_channel == devdata->child.aux_channel) + count++; + } + + return count > 1; +} + int intel_bios_dp_boost_level(const struct intel_bios_encoder_data *devdata) { if (!devdata || devdata->i915->display.vbt.version < 196 || !devdata->child.iboost) diff --git a/drivers/gpu/drm/i915/display/intel_bios.h b/drivers/gpu/drm/i915/display/intel_bios.h index 9680e3e92bb5..49e24b7cf675 100644 --- a/drivers/gpu/drm/i915/display/intel_bios.h +++ b/drivers/gpu/drm/i915/display/intel_bios.h @@ -273,6 +273,7 @@ enum aux_ch intel_bios_dp_aux_ch(const struct intel_bios_encoder_data *devdata); int intel_bios_dp_boost_level(const struct intel_bios_encoder_data *devdata); int intel_bios_dp_max_lane_count(const struct intel_bios_encoder_data *devdata); int intel_bios_dp_max_link_rate(const struct intel_bios_encoder_data *devdata); +bool intel_bios_dp_has_shared_aux_ch(const struct intel_bios_encoder_data *devdata); int intel_bios_hdmi_boost_level(const struct intel_bios_encoder_data *devdata); int intel_bios_hdmi_ddc_pin(const struct intel_bios_encoder_data *devdata); int intel_bios_hdmi_level_shift(const struct intel_bios_encoder_data *devdata); diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 2206b45bc78c..aa5f602b56fb 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -5889,8 +5889,13 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, /* * VBT and straps are liars. Also check HPD as that seems * to be the most reliable piece of information available. + * + * ... expect on devices that forgot to hook HPD up for eDP + * (eg. Acer Chromebook C710), so we'll check it only if multiple + * ports are attempting to use the same AUX CH, according to VBT. */ - if (!intel_digital_port_connected(encoder)) { + if (intel_bios_dp_has_shared_aux_ch(encoder->devdata) && + !intel_digital_port_connected(encoder)) { /* * If this fails, presume the DPCD answer came * from some other port using the same AUX CH.