Browse Source

drm/i915: handle bogus VBT panel timing

We've seen cases in the wild where the VBT sync data is wrong, so add
some code to fix it up in that case, taking care to make sure that the
total is greater than the sync end.

Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Dave Airlie <airlied@linux.ie>
Jesse Barnes 16 years ago
parent
commit
37df96736b
1 changed files with 6 additions and 0 deletions
  1. 6 0
      drivers/gpu/drm/i915/intel_bios.c

+ 6 - 0
drivers/gpu/drm/i915/intel_bios.c

@@ -111,6 +111,12 @@ parse_panel_data(struct drm_i915_private *dev_priv, struct bdb_header *bdb)
 	panel_fixed_mode->clock = dvo_timing->clock * 10;
 	panel_fixed_mode->clock = dvo_timing->clock * 10;
 	panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED;
 	panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED;
 
 
+	/* Some VBTs have bogus h/vtotal values */
+	if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal)
+		panel_fixed_mode->htotal = panel_fixed_mode->hsync_end + 1;
+	if (panel_fixed_mode->vsync_end > panel_fixed_mode->vtotal)
+		panel_fixed_mode->vtotal = panel_fixed_mode->vsync_end + 1;
+
 	drm_mode_set_name(panel_fixed_mode);
 	drm_mode_set_name(panel_fixed_mode);
 
 
 	dev_priv->vbt_mode = panel_fixed_mode;
 	dev_priv->vbt_mode = panel_fixed_mode;