drm/i915: Ignore LVDS EDID when it is unavailabe or invalid

This trys to shut up complains about invalid LVDS EDID during
mode probe, but uses fixed panel mode directly for panels with
broken EDID.

https://bugs.freedesktop.org/show_bug.cgi?id=23099
https://bugs.freedesktop.org/show_bug.cgi?id=26395

Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
Tested-by: Sitsofe Wheeler <sitsofe@yahoo.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Signed-off-by: Eric Anholt <eric@anholt.net>

authored by

Zhao Yakui and committed by
Eric Anholt
bfac4d67 9875557e

+11 -4
+2
drivers/gpu/drm/i915/i915_drv.h
··· 611 /* Reclocking support */ 612 bool render_reclock_avail; 613 bool lvds_downclock_avail; 614 /* indicates the reduced downclock for LVDS*/ 615 int lvds_downclock; 616 struct work_struct idle_work;
··· 611 /* Reclocking support */ 612 bool render_reclock_avail; 613 bool lvds_downclock_avail; 614 + /* indicate whether the LVDS EDID is OK */ 615 + bool lvds_edid_good; 616 /* indicates the reduced downclock for LVDS*/ 617 int lvds_downclock; 618 struct work_struct idle_work;
+9 -4
drivers/gpu/drm/i915/intel_lvds.c
··· 638 struct drm_i915_private *dev_priv = dev->dev_private; 639 int ret = 0; 640 641 - ret = intel_ddc_get_modes(intel_encoder); 642 643 - if (ret) 644 - return ret; 645 646 /* Didn't get an EDID, so 647 * Set wide sync ranges so we get all modes ··· 1064 * Attempt to get the fixed panel mode from DDC. Assume that the 1065 * preferred mode is the right one. 1066 */ 1067 - intel_ddc_get_modes(intel_encoder); 1068 1069 list_for_each_entry(scan, &connector->probed_modes, head) { 1070 mutex_lock(&dev->mode_config.mutex);
··· 638 struct drm_i915_private *dev_priv = dev->dev_private; 639 int ret = 0; 640 641 + if (dev_priv->lvds_edid_good) { 642 + ret = intel_ddc_get_modes(intel_encoder); 643 644 + if (ret) 645 + return ret; 646 + } 647 648 /* Didn't get an EDID, so 649 * Set wide sync ranges so we get all modes ··· 1062 * Attempt to get the fixed panel mode from DDC. Assume that the 1063 * preferred mode is the right one. 1064 */ 1065 + dev_priv->lvds_edid_good = true; 1066 + 1067 + if (!intel_ddc_get_modes(intel_encoder)) 1068 + dev_priv->lvds_edid_good = false; 1069 1070 list_for_each_entry(scan, &connector->probed_modes, head) { 1071 mutex_lock(&dev->mode_config.mutex);