9495e5b
diff -up xf86-video-ati-6.12.2/src/drmmode_display.c.lvds xf86-video-ati-6.12.2/src/drmmode_display.c
9495e5b
--- xf86-video-ati-6.12.2/src/drmmode_display.c.lvds	2009-05-07 13:13:43.000000000 -0400
9495e5b
+++ xf86-video-ati-6.12.2/src/drmmode_display.c	2009-05-07 13:39:10.000000000 -0400
9495e5b
@@ -568,6 +568,49 @@ drmmode_output_get_modes(xf86OutputPtr o
9495e5b
 		Modes = xf86ModesAdd(Modes, Mode);
9495e5b
 
9495e5b
 	}
9495e5b
+
9495e5b
+        /*
9495e5b
+         * LVDS can scale.  If there's no EDID, or if it claims not to be
9495e5b
+         * continuous-freq, then add the default modes so we get 800x600
9495e5b
+         * and friends.
9495e5b
+         */
9495e5b
+	if (strstr(output->name, "LVDS")) {
9495e5b
+                xf86MonPtr mon = output->MonInfo;
9495e5b
+                if (!mon || !GTF_SUPPORTED(mon->features.msc)) {
9495e5b
+                        DisplayModePtr m, i, p = NULL;
9495e5b
+                        int max_x = 0, max_y = 0;
9495e5b
+                        float max_vrefresh = 0.0;
9495e5b
+ 
9495e5b
+                        for (m = Modes; m; m = m->next) {
9495e5b
+				if (m->type & M_T_PREFERRED)
9495e5b
+				    p = m;
9495e5b
+                                max_x = max(max_x, m->HDisplay);
9495e5b
+                                max_y = max(max_y, m->VDisplay);
9495e5b
+                                max_vrefresh = max(max_vrefresh,
9495e5b
+                                                   xf86ModeVRefresh(m));
9495e5b
+                        }
9495e5b
+
9495e5b
+			max_vrefresh = max(max_vrefresh, 60.0);
9495e5b
+                        max_vrefresh *= (1 + SYNC_TOLERANCE);
9495e5b
+ 
9495e5b
+                        m = xf86GetDefaultModes(FALSE, FALSE);
9495e5b
+ 
9495e5b
+                        xf86ValidateModesSize(output->scrn, m, max_x, max_y, 0);
9495e5b
+                        for (i = m; i; i = i->next) {
9495e5b
+                                if (xf86ModeVRefresh(i) > max_vrefresh)
9495e5b
+                                        i->status = MODE_VSYNC;
9495e5b
+				if (p && i->HDisplay >= p->HDisplay &&
9495e5b
+				    i->VDisplay >= p->VDisplay &&
9495e5b
+				    xf86ModeVRefresh(i) >= xf86ModeVRefresh(p))
9495e5b
+					i->status = MODE_VSYNC;
9495e5b
+			}
9495e5b
+ 
9495e5b
+                        xf86PruneInvalidModes(output->scrn, &m, FALSE);
9495e5b
+ 
9495e5b
+                        Modes = xf86ModesAdd(Modes, m);
9495e5b
+                }
9495e5b
+        }
9495e5b
+
9495e5b
 	return Modes;
9495e5b
 }
9495e5b