[Intel-gfx] [PATCH] drm/i915: Ignore LVDS presence in VBT flag if the LVDS is enabled by BIOS

Damien Lespiau damien.lespiau at intel.com
Mon Jun 22 06:17:16 PDT 2015


On Fri, Jun 19, 2015 at 01:57:43PM +0100, Chris Wilson wrote:
> On older gen, pre-Ironlake, parts there is no hardwired pin to report
> the presence of an LVDS panel. Instead, we have to rely on the VBT to
> declare whether the machine has a panel or not. Though notoriously
> unreliable, so far we have erred on the side of false-positives and have
> required a list of machines which end up falsely reporting a panel as
> present. However, we now have reports of false-negatives, machines with
> an LVDS that are being ignored due to the VBT not declaring the panel.
> This patch ignores the VBT setting if the BIOS has already enabled the
> LVDS panel (and on Ironlake+ we also have the hardware presence pin).
> 
> It fixes the Samsung NP680Z5E-X01FR in the bug report, but is likely to
> result in more false-positives, and since we rely on the BIOS to enable
> the panel, there are likely different circumstances where the BIOS will
> not enable that panel (and so we may see the same machine with and
> without a panel all on the whim of the BIOS).
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90979
> Reported-and-tested-by: lysxia at gmail.com
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>


Reviewed-by: Damien Lespiau <damien.lespiau at intel.com>

> ---
>  drivers/gpu/drm/i915/intel_lvds.c | 16 ++++++++++------
>  1 file changed, 10 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
> index 161ab26f81fb..bf1702a6e33d 100644
> --- a/drivers/gpu/drm/i915/intel_lvds.c
> +++ b/drivers/gpu/drm/i915/intel_lvds.c
> @@ -942,12 +942,6 @@ void intel_lvds_init(struct drm_device *dev)
>  	if (dmi_check_system(intel_no_lvds))
>  		return;
>  
> -	pin = GMBUS_PIN_PANEL;
> -	if (!lvds_is_present_in_vbt(dev, &pin)) {
> -		DRM_DEBUG_KMS("LVDS is not present in VBT\n");
> -		return;
> -	}
> -
>  	if (HAS_PCH_SPLIT(dev)) {
>  		if ((I915_READ(PCH_LVDS) & LVDS_DETECTED) == 0)
>  			return;
> @@ -957,6 +951,16 @@ void intel_lvds_init(struct drm_device *dev)
>  		}
>  	}
>  
> +	pin = GMBUS_PIN_PANEL;
> +	if (!lvds_is_present_in_vbt(dev, &pin)) {
> +		u32 reg = HAS_PCH_SPLIT(dev) ? PCH_LVDS : LVDS;
> +		if ((I915_READ(reg) & LVDS_PORT_EN) == 0) {
> +			DRM_DEBUG_KMS("LVDS is not present in VBT\n");
> +			return;
> +		}
> +		DRM_DEBUG_KMS("LVDS is not present in VBT, but enabled anyway\n");
> +	}
> +
>  	lvds_encoder = kzalloc(sizeof(*lvds_encoder), GFP_KERNEL);
>  	if (!lvds_encoder)
>  		return;
> -- 
> 2.1.4
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx


More information about the Intel-gfx mailing list