Re: nvidia fb flicker

Linus Torvalds
2005-11-28T23:01:40Z

On Tue, 29 Nov 2005, Antonino A. Daplas wrote:
>
> Nov 28 14:02:32 stiffy kernel: Extrapolated
> Nov 28 14:02:32 stiffy kernel: H: 75-75KHz V: 60-60Hz DCLK: 162MHz
>
> Since the min and max value of the sync timings are equal, nvidiafb has
> no room left to verify the timings, and will _always_ reject any timings even
> if they are valid.
>
> So, try this patch, we make nvidiafb less restrictive by ignoring the
> hsync and vsync ranges if the min and max values are equal. This should
> make your hardware display properly even if CONFIG_FB_NVIDIA_I2c = y.

Tony,

may I suggestinstead making the verifier allow a small error?

I don't find it at all unlikely that some EDID blocks might say that only
a 60Hz refresh rate is allowed. A lot of LCD's are literally specced for
that (just read their manuals), even though they often in practice allow
other frequencies (often _wildly_ different - most modern LCD's are
perfectly happy to sync up with almost anything).

And if a monitor says that it wants a vertical frequency of 60Hz, a mode
that has a frequency of 59 should certainly be accepted.

So it sounds like something has marked a perfectly valid mode as invalid,
just because it's not _exactly_ at the frequency.

So how about allowing a small error in the frequencies in
fb_validate_mode()? And make sure to try to round the divisions to
nearest, not down. Something like the appended (totally untested)..

Linus

----
diff --git a/drivers/video/fbmon.c b/drivers/video/fbmon.c
index fc7965b..15b0e7e 100644
--- a/drivers/video/fbmon.c
+++ b/drivers/video/fbmon.c
@@ -1261,10 +1261,15 @@ int fb_validate_mode(const struct fb_var
if (var->vmode & FB_VMODE_DOUBLE)
vtotal *= 2;

- hfreq = pixclock/htotal;
+ hfreq = (pixclock + htotal/2) / htotal;
hfreq = (hfreq + 500) / 1000 * 1000;

- vfreq = hfreq/vtotal;
+ vfreq = (hfreq + vtotal/2) / vtotal;
+
+ /* Allow a 3% error */
+ vfmin -= vfmin >> 5; vfmax += vfmax >> 5;
+ hfmin -= hfmin >> 5; hfmax += hfmax >> 5;
+

return (vfreq < vfmin || vfreq > vfmax ||
hfreq < hfmin || hfreq > hfmax ||