diff -up xf86-video-nv-2.1.6/src/nv_driver.c.jx xf86-video-nv-2.1.6/src/nv_driver.c --- xf86-video-nv-2.1.6/src/nv_driver.c.jx 2007-09-26 20:59:50.000000000 -0400 +++ xf86-video-nv-2.1.6/src/nv_driver.c 2008-01-22 16:11:24.000000000 -0500 @@ -1148,12 +1148,19 @@ NVFreeScreen(int scrnIndex, int flags) static ModeStatus NVValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags) { - NVPtr pNv = NVPTR(xf86Screens[scrnIndex]); + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + NVPtr pNv = NVPTR(pScrn); if(pNv->fpWidth && pNv->fpHeight) if((pNv->fpWidth < mode->HDisplay) || (pNv->fpHeight < mode->VDisplay)) return (MODE_PANEL); + /* avoid starving the chip on scanout */ + if (pNv->Architecture == NV_ARCH_04 && + (mode->HDisplay * mode->VDisplay * (pScrn->bitsPerPixel / 8) > + pScrn->videoRam * 952)) /* 1024 * 0.93, yay magic numbers */ + return MODE_BANDWIDTH; + return (MODE_OK); }