Lines Matching +full:scaled +full:- +full:sync

2  * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
41 * "as-is" without express or implied warranty.
84 #include <xorg-config.h>
102 if (p->type & M_T_BUILTIN) in printModeRejectMessage()
103 type = "built-in "; in printModeRejectMessage()
104 else if (p->type & M_T_DEFAULT) in printModeRejectMessage()
106 else if (p->type & M_T_DRIVER) in printModeRejectMessage()
111 xf86DrvMsg(index, X_INFO, "Not using %smode \"%s\" (%s)\n", type, p->name, in printModeRejectMessage()
124 int minimumGap = abs(freq - scrp->clock[0]); in xf86GetNearestClock()
132 /* Must set this here in case the best match is scrp->clock[0] */ in xf86GetNearestClock()
136 for (i = 0; i < scrp->numClocks; i++) { in xf86GetNearestClock()
138 gap = abs((freq * j) - ((scrp->clock[i] * DivFactor) / MulFactor)); in xf86GetNearestClock()
144 *divider = (j - 1) * V_CLKDIV2; in xf86GetNearestClock()
204 return "horizontal sync too narrow"; in xf86ModeStatusToString()
206 return "horizontal sync too wide"; in xf86ModeStatusToString()
212 return "vertical sync too narrow"; in xf86ModeStatusToString()
214 return "vertical sync too wide"; in xf86ModeStatusToString()
243 * xf86ShowClockRanges() -- Print the clock ranges allowed
244 * and the clock values scaled by ClockMulFactor and ClockDivFactor
255 for (cp = clockRanges; cp != NULL; cp = cp->next) { in xf86ShowClockRanges()
256 DivFactor = max(1, cp->ClockDivFactor); in xf86ShowClockRanges()
257 MulFactor = max(1, cp->ClockMulFactor); in xf86ShowClockRanges()
258 if (scrp->progClock) { in xf86ShowClockRanges()
259 if (cp->minClock) { in xf86ShowClockRanges()
260 if (cp->maxClock) { in xf86ShowClockRanges()
261 xf86DrvMsg(scrp->scrnIndex, X_INFO, in xf86ShowClockRanges()
263 (double) cp->minClock / 1000.0, in xf86ShowClockRanges()
264 (double) cp->maxClock / 1000.0); in xf86ShowClockRanges()
267 xf86DrvMsg(scrp->scrnIndex, X_INFO, in xf86ShowClockRanges()
269 (double) cp->minClock / 1000.0); in xf86ShowClockRanges()
273 if (cp->maxClock) { in xf86ShowClockRanges()
274 xf86DrvMsg(scrp->scrnIndex, X_INFO, in xf86ShowClockRanges()
276 (double) cp->maxClock / 1000.0); in xf86ShowClockRanges()
282 for (i = 0; i < scrp->numClocks; i++) { in xf86ShowClockRanges()
283 scaledClock = (scrp->clock[i] * DivFactor) / MulFactor; in xf86ShowClockRanges()
284 if (scaledClock >= cp->minClock && scaledClock <= cp->maxClock) { in xf86ShowClockRanges()
288 xf86DrvMsg(scrp->scrnIndex, X_INFO, "scaled clocks:"); in xf86ShowClockRanges()
302 return ((p->Clock >= cp->minClock) && in modeInClockRange()
303 (p->Clock <= cp->maxClock) && in modeInClockRange()
304 (cp->interlaceAllowed || !(p->Flags & V_INTERLACE)) && in modeInClockRange()
305 (cp->doubleScanAllowed || in modeInClockRange()
306 ((p->VScan <= 1) && !(p->Flags & V_DBLSCAN)))); in modeInClockRange()
317 for (cp = clockRanges;; cp = cp->next) in xf86FindClockRangeForMode()
323 * xf86HandleBuiltinMode() - handles built-in modes
338 if (p->status != MODE_OK) in xf86HandleBuiltinMode()
339 return p->status; in xf86HandleBuiltinMode()
342 if (p->prev) in xf86HandleBuiltinMode()
345 if ((p->type & M_T_CLOCK_C) == M_T_CLOCK_C) { in xf86HandleBuiltinMode()
349 modep->type = p->type; in xf86HandleBuiltinMode()
350 p->status = MODE_CLOCK_RANGE; in xf86HandleBuiltinMode()
353 DivFactor = cp->ClockDivFactor; in xf86HandleBuiltinMode()
354 MulFactor = cp->ClockMulFactor; in xf86HandleBuiltinMode()
355 if (!scrp->progClock) { in xf86HandleBuiltinMode()
356 clockIndex = xf86GetNearestClock(scrp, p->Clock, allowDiv2, in xf86HandleBuiltinMode()
357 cp->ClockDivFactor, in xf86HandleBuiltinMode()
358 cp->ClockMulFactor, &extraFlags); in xf86HandleBuiltinMode()
359 modep->Clock = (scrp->clock[clockIndex] * DivFactor) in xf86HandleBuiltinMode()
361 modep->ClockIndex = clockIndex; in xf86HandleBuiltinMode()
362 modep->SynthClock = scrp->clock[clockIndex]; in xf86HandleBuiltinMode()
364 modep->Clock /= 2; in xf86HandleBuiltinMode()
365 modep->SynthClock /= 2; in xf86HandleBuiltinMode()
369 modep->Clock = p->Clock; in xf86HandleBuiltinMode()
370 modep->ClockIndex = -1; in xf86HandleBuiltinMode()
371 modep->SynthClock = (modep->Clock * MulFactor) in xf86HandleBuiltinMode()
374 modep->PrivFlags = cp->PrivFlags; in xf86HandleBuiltinMode()
377 if (!scrp->progClock) { in xf86HandleBuiltinMode()
378 modep->Clock = p->Clock; in xf86HandleBuiltinMode()
379 modep->ClockIndex = p->ClockIndex; in xf86HandleBuiltinMode()
380 modep->SynthClock = p->SynthClock; in xf86HandleBuiltinMode()
383 modep->Clock = p->Clock; in xf86HandleBuiltinMode()
384 modep->ClockIndex = -1; in xf86HandleBuiltinMode()
385 modep->SynthClock = p->SynthClock; in xf86HandleBuiltinMode()
387 modep->PrivFlags = p->PrivFlags; in xf86HandleBuiltinMode()
389 modep->type = p->type; in xf86HandleBuiltinMode()
390 modep->HDisplay = p->HDisplay; in xf86HandleBuiltinMode()
391 modep->HSyncStart = p->HSyncStart; in xf86HandleBuiltinMode()
392 modep->HSyncEnd = p->HSyncEnd; in xf86HandleBuiltinMode()
393 modep->HTotal = p->HTotal; in xf86HandleBuiltinMode()
394 modep->HSkew = p->HSkew; in xf86HandleBuiltinMode()
395 modep->VDisplay = p->VDisplay; in xf86HandleBuiltinMode()
396 modep->VSyncStart = p->VSyncStart; in xf86HandleBuiltinMode()
397 modep->VSyncEnd = p->VSyncEnd; in xf86HandleBuiltinMode()
398 modep->VTotal = p->VTotal; in xf86HandleBuiltinMode()
399 modep->VScan = p->VScan; in xf86HandleBuiltinMode()
400 modep->Flags = p->Flags | extraFlags; in xf86HandleBuiltinMode()
401 modep->CrtcHDisplay = p->CrtcHDisplay; in xf86HandleBuiltinMode()
402 modep->CrtcHBlankStart = p->CrtcHBlankStart; in xf86HandleBuiltinMode()
403 modep->CrtcHSyncStart = p->CrtcHSyncStart; in xf86HandleBuiltinMode()
404 modep->CrtcHSyncEnd = p->CrtcHSyncEnd; in xf86HandleBuiltinMode()
405 modep->CrtcHBlankEnd = p->CrtcHBlankEnd; in xf86HandleBuiltinMode()
406 modep->CrtcHTotal = p->CrtcHTotal; in xf86HandleBuiltinMode()
407 modep->CrtcHSkew = p->CrtcHSkew; in xf86HandleBuiltinMode()
408 modep->CrtcVDisplay = p->CrtcVDisplay; in xf86HandleBuiltinMode()
409 modep->CrtcVBlankStart = p->CrtcVBlankStart; in xf86HandleBuiltinMode()
410 modep->CrtcVSyncStart = p->CrtcVSyncStart; in xf86HandleBuiltinMode()
411 modep->CrtcVSyncEnd = p->CrtcVSyncEnd; in xf86HandleBuiltinMode()
412 modep->CrtcVBlankEnd = p->CrtcVBlankEnd; in xf86HandleBuiltinMode()
413 modep->CrtcVTotal = p->CrtcVTotal; in xf86HandleBuiltinMode()
414 modep->CrtcHAdjusted = p->CrtcHAdjusted; in xf86HandleBuiltinMode()
415 modep->CrtcVAdjusted = p->CrtcVAdjusted; in xf86HandleBuiltinMode()
416 modep->HSync = p->HSync; in xf86HandleBuiltinMode()
417 modep->VRefresh = p->VRefresh; in xf86HandleBuiltinMode()
418 modep->Private = p->Private; in xf86HandleBuiltinMode()
419 modep->PrivSize = p->PrivSize; in xf86HandleBuiltinMode()
421 p->prev = modep; in xf86HandleBuiltinMode()
439 * modes are built-in modes.
464 int clockIndex = -1; in xf86LookupMode()
486 if (scrp == NULL || scrp->modePool == NULL || in xf86LookupMode()
487 (!scrp->progClock && scrp->numClocks == 0)) { in xf86LookupMode()
491 if (modep == NULL || modep->name == NULL) { in xf86LookupMode()
495 for (cp = clockRanges; cp != NULL; cp = cp->next) { in xf86LookupMode()
497 cp->ClockDivFactor = max(1, cp->ClockDivFactor); in xf86LookupMode()
498 cp->ClockMulFactor = max(1, cp->ClockMulFactor); in xf86LookupMode()
505 for (p = scrp->modePool; p != NULL; p = p->next) { in xf86LookupMode()
508 if ((p->type & type) != type) in xf86LookupMode()
511 if (strcmp(p->name, modep->name) == 0) { in xf86LookupMode()
514 if (p->status != MODE_OK) { in xf86LookupMode()
516 status = p->status; in xf86LookupMode()
521 if (p->prev) in xf86LookupMode()
524 if (p->type & M_T_BUILTIN) { in xf86LookupMode()
536 p->status = MODE_CLOCK_RANGE; in xf86LookupMode()
547 if (scrp->progClock) { in xf86LookupMode()
551 DivFactor = cp->ClockDivFactor; in xf86LookupMode()
552 MulFactor = cp->ClockMulFactor; in xf86LookupMode()
553 ModePrivFlags = cp->PrivFlags; in xf86LookupMode()
557 if (p->Flags & V_INTERLACE) in xf86LookupMode()
561 DivFactor = cp->ClockDivFactor; in xf86LookupMode()
562 MulFactor = cp->ClockMulFactor; in xf86LookupMode()
563 ModePrivFlags = cp->PrivFlags; in xf86LookupMode()
574 i = xf86GetNearestClock(scrp, p->Clock, allowDiv2, in xf86LookupMode()
575 cp->ClockDivFactor, cp->ClockMulFactor, in xf86LookupMode()
582 gap = abs((p->Clock * 2) - in xf86LookupMode()
583 ((scrp->clock[i] * cp->ClockDivFactor) / in xf86LookupMode()
584 cp->ClockMulFactor)); in xf86LookupMode()
586 gap = abs(p->Clock - in xf86LookupMode()
587 ((scrp->clock[i] * cp->ClockDivFactor) / in xf86LookupMode()
588 cp->ClockMulFactor)); in xf86LookupMode()
590 p->status = MODE_NOCLOCK; in xf86LookupMode()
599 if (p->Flags & V_INTERLACE) in xf86LookupMode()
603 DivFactor = cp->ClockDivFactor; in xf86LookupMode()
604 MulFactor = cp->ClockMulFactor; in xf86LookupMode()
605 ModePrivFlags = cp->PrivFlags; in xf86LookupMode()
615 DivFactor = cp->ClockDivFactor; in xf86LookupMode()
616 MulFactor = cp->ClockMulFactor; in xf86LookupMode()
617 ModePrivFlags = cp->PrivFlags; in xf86LookupMode()
629 DivFactor = cp->ClockDivFactor; in xf86LookupMode()
630 MulFactor = cp->ClockMulFactor; in xf86LookupMode()
631 ModePrivFlags = cp->PrivFlags; in xf86LookupMode()
644 if (scrp->progClock) { in xf86LookupMode()
645 modep->Clock = bestMode->Clock; in xf86LookupMode()
646 modep->ClockIndex = -1; in xf86LookupMode()
647 modep->SynthClock = (modep->Clock * MulFactor) / DivFactor; in xf86LookupMode()
650 modep->Clock = (scrp->clock[clockIndex] * DivFactor) / MulFactor; in xf86LookupMode()
651 modep->ClockIndex = clockIndex; in xf86LookupMode()
652 modep->SynthClock = scrp->clock[clockIndex]; in xf86LookupMode()
654 modep->Clock /= 2; in xf86LookupMode()
655 modep->SynthClock /= 2; in xf86LookupMode()
658 modep->type = bestMode->type; in xf86LookupMode()
659 modep->PrivFlags = ModePrivFlags; in xf86LookupMode()
660 modep->HDisplay = bestMode->HDisplay; in xf86LookupMode()
661 modep->HSyncStart = bestMode->HSyncStart; in xf86LookupMode()
662 modep->HSyncEnd = bestMode->HSyncEnd; in xf86LookupMode()
663 modep->HTotal = bestMode->HTotal; in xf86LookupMode()
664 modep->HSkew = bestMode->HSkew; in xf86LookupMode()
665 modep->VDisplay = bestMode->VDisplay; in xf86LookupMode()
666 modep->VSyncStart = bestMode->VSyncStart; in xf86LookupMode()
667 modep->VSyncEnd = bestMode->VSyncEnd; in xf86LookupMode()
668 modep->VTotal = bestMode->VTotal; in xf86LookupMode()
669 modep->VScan = bestMode->VScan; in xf86LookupMode()
670 modep->Flags = bestMode->Flags | extraFlags; in xf86LookupMode()
671 modep->CrtcHDisplay = bestMode->CrtcHDisplay; in xf86LookupMode()
672 modep->CrtcHBlankStart = bestMode->CrtcHBlankStart; in xf86LookupMode()
673 modep->CrtcHSyncStart = bestMode->CrtcHSyncStart; in xf86LookupMode()
674 modep->CrtcHSyncEnd = bestMode->CrtcHSyncEnd; in xf86LookupMode()
675 modep->CrtcHBlankEnd = bestMode->CrtcHBlankEnd; in xf86LookupMode()
676 modep->CrtcHTotal = bestMode->CrtcHTotal; in xf86LookupMode()
677 modep->CrtcHSkew = bestMode->CrtcHSkew; in xf86LookupMode()
678 modep->CrtcVDisplay = bestMode->CrtcVDisplay; in xf86LookupMode()
679 modep->CrtcVBlankStart = bestMode->CrtcVBlankStart; in xf86LookupMode()
680 modep->CrtcVSyncStart = bestMode->CrtcVSyncStart; in xf86LookupMode()
681 modep->CrtcVSyncEnd = bestMode->CrtcVSyncEnd; in xf86LookupMode()
682 modep->CrtcVBlankEnd = bestMode->CrtcVBlankEnd; in xf86LookupMode()
683 modep->CrtcVTotal = bestMode->CrtcVTotal; in xf86LookupMode()
684 modep->CrtcHAdjusted = bestMode->CrtcHAdjusted; in xf86LookupMode()
685 modep->CrtcVAdjusted = bestMode->CrtcVAdjusted; in xf86LookupMode()
686 modep->HSync = bestMode->HSync; in xf86LookupMode()
687 modep->VRefresh = bestMode->VRefresh; in xf86LookupMode()
688 modep->Private = bestMode->Private; in xf86LookupMode()
689 modep->PrivSize = bestMode->PrivSize; in xf86LookupMode()
691 bestMode->prev = modep; in xf86LookupMode()
714 mode, mode->name, monitor, monitor->id); in xf86CheckModeForMonitor()
717 if (0 >= mode->HDisplay || mode->HDisplay > mode->HSyncStart || in xf86CheckModeForMonitor()
718 mode->HSyncStart >= mode->HSyncEnd || mode->HSyncEnd >= mode->HTotal) in xf86CheckModeForMonitor()
721 if (0 >= mode->VDisplay || mode->VDisplay > mode->VSyncStart || in xf86CheckModeForMonitor()
722 mode->VSyncStart >= mode->VSyncEnd || mode->VSyncEnd >= mode->VTotal) in xf86CheckModeForMonitor()
725 if (monitor->nHsync > 0) { in xf86CheckModeForMonitor()
729 for (i = 0; i < monitor->nHsync; i++) in xf86CheckModeForMonitor()
730 if ((hsync > monitor->hsync[i].lo * (1.0 - SYNC_TOLERANCE)) && in xf86CheckModeForMonitor()
731 (hsync < monitor->hsync[i].hi * (1.0 + SYNC_TOLERANCE))) in xf86CheckModeForMonitor()
734 /* Now see whether we ran out of sync ranges without finding a match */ in xf86CheckModeForMonitor()
735 if (i == monitor->nHsync) in xf86CheckModeForMonitor()
739 if (monitor->nVrefresh > 0) { in xf86CheckModeForMonitor()
743 for (i = 0; i < monitor->nVrefresh; i++) in xf86CheckModeForMonitor()
744 if ((vrefrsh > monitor->vrefresh[i].lo * (1.0 - SYNC_TOLERANCE)) && in xf86CheckModeForMonitor()
745 (vrefrsh < monitor->vrefresh[i].hi * (1.0 + SYNC_TOLERANCE))) in xf86CheckModeForMonitor()
749 if (i == monitor->nVrefresh) in xf86CheckModeForMonitor()
754 if (mode->Flags & V_INTERLACE) in xf86CheckModeForMonitor()
755 mode->CrtcVTotal = mode->VTotal |= 1; in xf86CheckModeForMonitor()
758 * This code stops cvt -r modes, and only cvt -r modes, from hitting 15y+ in xf86CheckModeForMonitor()
761 * sync to it. It's called "Protecting the user from doing anything stupid". in xf86CheckModeForMonitor()
762 * -- libv in xf86CheckModeForMonitor()
766 if (!monitor->reducedblanking && !(mode->type & M_T_DRIVER)) in xf86CheckModeForMonitor()
770 if ((monitor->maxPixClock) && (mode->Clock > monitor->maxPixClock)) in xf86CheckModeForMonitor()
786 int bpp = scrp->fbFormat.bitsPerPixel, pad = scrp->fbFormat.scanlinePad; in xf86CheckModeSize()
789 if (scrp->depth == 4) in xf86CheckModeSize()
796 lineWidth = (((w * bpp) + pad - 1) / pad) * pad; in xf86CheckModeSize()
802 * (lineWidth * (y - 1)) + lastWidth in xf86CheckModeSize()
806 * scrp->videoRam * (1024 * 8) in xf86CheckModeSize()
814 lineWidth = (lineWidth + (BITMAP_SCANLINE_PAD - 1)) / BITMAP_SCANLINE_PAD; in xf86CheckModeSize()
815 lastWidth = (lastWidth + (BITMAP_SCANLINE_PAD - 1)) / BITMAP_SCANLINE_PAD; in xf86CheckModeSize()
817 if ((lineWidth * (y - 1) + lastWidth) > in xf86CheckModeSize()
818 (scrp->videoRam * ((1024 * 8) / BITMAP_SCANLINE_PAD))) in xf86CheckModeSize()
828 * - mode size fits within the available pixel area (memory)
829 * - width lies within the range of supported line pitches
830 * - mode size fits within virtual size (if fixed)
831 * - horizontal timings are in range
865 scrp, mode, mode->name, clockRanges, strategy, maxPitch, virtualX, in xf86InitialCheckModeForDriver()
869 if (0 >= mode->HDisplay || mode->HDisplay > mode->HSyncStart || in xf86InitialCheckModeForDriver()
870 mode->HSyncStart >= mode->HSyncEnd || mode->HSyncEnd >= mode->HTotal) in xf86InitialCheckModeForDriver()
873 if (0 >= mode->VDisplay || mode->VDisplay > mode->VSyncStart || in xf86InitialCheckModeForDriver()
874 mode->VSyncStart >= mode->VSyncEnd || mode->VSyncEnd >= mode->VTotal) in xf86InitialCheckModeForDriver()
877 if (!xf86CheckModeSize(scrp, mode->HDisplay, mode->HDisplay, in xf86InitialCheckModeForDriver()
878 mode->VDisplay)) in xf86InitialCheckModeForDriver()
881 if (maxPitch > 0 && mode->HDisplay > maxPitch) in xf86InitialCheckModeForDriver()
884 if (virtualX > 0 && mode->HDisplay > virtualX) in xf86InitialCheckModeForDriver()
887 if (virtualY > 0 && mode->VDisplay > virtualY) in xf86InitialCheckModeForDriver()
892 * provisional, in that they are later reused by the driver at mode-set in xf86InitialCheckModeForDriver()
897 * user-supplied values as these are reported back when mode validation is in xf86InitialCheckModeForDriver()
901 * NOTE: We (ab)use the mode->Crtc* values here to store timing in xf86InitialCheckModeForDriver()
910 * This dual use of the mode->Crtc* values will certainly create in xf86InitialCheckModeForDriver()
915 if (scrp->ValidMode) { in xf86InitialCheckModeForDriver()
923 if (cp->ClockMulFactor < 1) in xf86InitialCheckModeForDriver()
924 cp->ClockMulFactor = 1; in xf86InitialCheckModeForDriver()
925 if (cp->ClockDivFactor < 1) in xf86InitialCheckModeForDriver()
926 cp->ClockDivFactor = 1; in xf86InitialCheckModeForDriver()
932 if (scrp->progClock) { in xf86InitialCheckModeForDriver()
933 mode->SynthClock = mode->Clock; in xf86InitialCheckModeForDriver()
936 i = xf86GetNearestClock(scrp, mode->Clock, allowDiv2, in xf86InitialCheckModeForDriver()
937 cp->ClockDivFactor, cp->ClockMulFactor, in xf86InitialCheckModeForDriver()
939 mode->SynthClock = (scrp->clock[i] * cp->ClockDivFactor) / in xf86InitialCheckModeForDriver()
940 cp->ClockMulFactor; in xf86InitialCheckModeForDriver()
942 mode->SynthClock /= 2; in xf86InitialCheckModeForDriver()
945 status = (*scrp->ValidMode) (scrp, mode, FALSE, in xf86InitialCheckModeForDriver()
950 if (mode->HSync <= 0.0) in xf86InitialCheckModeForDriver()
951 mode->HSync = (float) mode->SynthClock / (float) mode->CrtcHTotal; in xf86InitialCheckModeForDriver()
952 if (mode->VRefresh <= 0.0) in xf86InitialCheckModeForDriver()
953 mode->VRefresh = (mode->SynthClock * 1000.0) in xf86InitialCheckModeForDriver()
954 / (mode->CrtcHTotal * mode->CrtcVTotal); in xf86InitialCheckModeForDriver()
957 mode->HSync = xf86ModeHSync(mode); in xf86InitialCheckModeForDriver()
958 mode->VRefresh = xf86ModeVRefresh(mode); in xf86InitialCheckModeForDriver()
971 * - width lies within the line pitch
972 * - mode size fits within virtual size
973 * - horizontal/vertical timings are in range
992 int clockIndex = -1; in xf86CheckModeForDriver()
999 if (scrp == NULL || (!scrp->progClock && scrp->numClocks == 0)) { in xf86CheckModeForDriver()
1009 if (mode->HDisplay > scrp->virtualX) in xf86CheckModeForDriver()
1012 if (mode->VDisplay > scrp->virtualY) in xf86CheckModeForDriver()
1015 for (cp = scrp->clockRanges; cp != NULL; cp = cp->next) { in xf86CheckModeForDriver()
1017 cp->ClockDivFactor = max(1, cp->ClockDivFactor); in xf86CheckModeForDriver()
1018 cp->ClockMulFactor = max(1, cp->ClockMulFactor); in xf86CheckModeForDriver()
1021 if (scrp->progClock) { in xf86CheckModeForDriver()
1023 for (cp = scrp->clockRanges; cp != NULL; cp = cp->next) { in xf86CheckModeForDriver()
1033 DivFactor = cp->ClockDivFactor; in xf86CheckModeForDriver()
1034 MulFactor = cp->ClockMulFactor; in xf86CheckModeForDriver()
1035 ModePrivFlags = cp->PrivFlags; in xf86CheckModeForDriver()
1040 for (cp = scrp->clockRanges; cp != NULL; cp = cp->next) { in xf86CheckModeForDriver()
1047 i = xf86GetNearestClock(scrp, mode->Clock, 0, in xf86CheckModeForDriver()
1048 cp->ClockDivFactor, cp->ClockMulFactor, in xf86CheckModeForDriver()
1055 gap = abs((mode->Clock * 2) - in xf86CheckModeForDriver()
1056 ((scrp->clock[i] * cp->ClockDivFactor) / in xf86CheckModeForDriver()
1057 cp->ClockMulFactor)); in xf86CheckModeForDriver()
1059 gap = abs(mode->Clock - in xf86CheckModeForDriver()
1060 ((scrp->clock[i] * cp->ClockDivFactor) / in xf86CheckModeForDriver()
1061 cp->ClockMulFactor)); in xf86CheckModeForDriver()
1067 DivFactor = cp->ClockDivFactor; in xf86CheckModeForDriver()
1068 MulFactor = cp->ClockMulFactor; in xf86CheckModeForDriver()
1069 ModePrivFlags = cp->PrivFlags; in xf86CheckModeForDriver()
1080 if (scrp->progClock) { in xf86CheckModeForDriver()
1081 mode->ClockIndex = -1; in xf86CheckModeForDriver()
1082 mode->SynthClock = (mode->Clock * MulFactor) / DivFactor; in xf86CheckModeForDriver()
1085 mode->Clock = (scrp->clock[clockIndex] * DivFactor) / MulFactor; in xf86CheckModeForDriver()
1086 mode->ClockIndex = clockIndex; in xf86CheckModeForDriver()
1087 mode->SynthClock = scrp->clock[clockIndex]; in xf86CheckModeForDriver()
1089 mode->Clock /= 2; in xf86CheckModeForDriver()
1090 mode->SynthClock /= 2; in xf86CheckModeForDriver()
1093 mode->PrivFlags = ModePrivFlags; in xf86CheckModeForDriver()
1102 MonPtr mon = scrp->monitor; in inferVirtualSize()
1109 DDC = mon->DDC; in inferVirtualSize()
1111 if (DDC && DDC->ver.revision >= 4) { in inferVirtualSize()
1113 if (PREFERRED_TIMING_MODE(DDC->features.msc)) { in inferVirtualSize()
1114 for (mode = modes; mode; mode = mode->next) { in inferVirtualSize()
1115 if (mode->type & (M_T_DRIVER | M_T_PREFERRED)) { in inferVirtualSize()
1116 x = mode->HDisplay; in inferVirtualSize()
1117 y = mode->VDisplay; in inferVirtualSize()
1133 if (!mon->widthmm || !mon->heightmm) in inferVirtualSize()
1136 aspect = (float) mon->widthmm / (float) mon->heightmm; in inferVirtualSize()
1140 for (mode = modes; mode; mode = mode->next) { in inferVirtualSize()
1143 if (!(mode->type & (M_T_DRIVER | M_T_USERDEF))) in inferVirtualSize()
1145 mode_aspect = (float) mode->HDisplay / (float) mode->VDisplay; in inferVirtualSize()
1148 if (fabs(1.0 - metaspect) < 0.05) { in inferVirtualSize()
1149 if ((mode->HDisplay > x) && (mode->VDisplay > y)) { in inferVirtualSize()
1150 x = mode->HDisplay; in inferVirtualSize()
1151 y = mode->VDisplay; in inferVirtualSize()
1157 xf86DrvMsg(scrp->scrnIndex, X_WARNING, in inferVirtualSize()
1166 xf86DrvMsg(scrp->scrnIndex, X_INFO, in inferVirtualSize()
1190 * bank boundaries are off-screen. This function returns -1 if such a width
1207 return -1; in scanLineWidth()
1210 if (nBitsPerBank % pBankFormat->scanlinePad) in scanLineWidth()
1211 return -1; in scanLineWidth()
1215 nBitsPerScanlinePadUnit = LCM(pBankFormat->scanlinePad, nWidthUnit); in scanLineWidth()
1217 (((width * pBankFormat->bitsPerPixel) + nBitsPerScanlinePadUnit - 1) / in scanLineWidth()
1219 width = nBitsPerScanline / pBankFormat->bitsPerPixel; in scanLineWidth()
1221 if (!xsize || !(nBitsPerBank % pBankFormat->bitsPerPixel)) in scanLineWidth()
1225 * Scanlines will be server-pad aligned at this point. They will also be in scanLineWidth()
1227 * bank boundaries are off-screen. in scanLineWidth()
1230 * theoretical maximum address space size. On a machine with 32-bit in scanLineWidth()
1231 * addresses (to 8-bit quantities) this turns out to be 256MB. Not only in scanLineWidth()
1236 return -1; in scanLineWidth()
1238 minBitsPerScanline = xsize * pBankFormat->bitsPerPixel; in scanLineWidth()
1240 return -1; in scanLineWidth()
1246 (((unsigned long) (-1) >> 1) - minBitsPerScanline) / (ysize - 1); in scanLineWidth()
1250 BankUnit = ((nBitsPerBank + nBitsPerScanline - 1) / nBitsPerBank) * in scanLineWidth()
1263 if (!(x % pBankFormat->bitsPerPixel)) in scanLineWidth()
1272 nBitsPerScanline += ((x + y - 1) / y) * nBitsPerScanlinePadUnit; in scanLineWidth()
1273 width = nBitsPerScanline / pBankFormat->bitsPerPixel; in scanLineWidth()
1283 BankBase = ((nBitsPerScanline - minBitsPerScanline) / in scanLineWidth()
1284 (nBitsPerScanline - x)) * BankUnit; in scanLineWidth()
1288 return -1; in scanLineWidth()
1333 * The function's return value is the number of matching modes found, or -1
1347 int linePitch = -1, virtX = 0, virtY = 0; in xf86ValidateModes()
1367 if (scrp == NULL || scrp->name == NULL || !scrp->monitor || in xf86ValidateModes()
1368 (!scrp->progClock && scrp->numClocks == 0)) { in xf86ValidateModes()
1370 return -1; in xf86ValidateModes()
1374 return -1; in xf86ValidateModes()
1378 return -1; in xf86ValidateModes()
1382 return -1; in xf86ValidateModes()
1396 if (scrp->monitor->nHsync <= 0) { in xf86ValidateModes()
1398 scrp->monitor->nHsync = numTimings; in xf86ValidateModes()
1400 scrp->monitor->hsync[i].lo = hsync[i].lo; in xf86ValidateModes()
1401 scrp->monitor->hsync[i].hi = hsync[i].hi; in xf86ValidateModes()
1405 scrp->monitor->hsync[0].lo = 31.5; in xf86ValidateModes()
1406 scrp->monitor->hsync[0].hi = 48.0; in xf86ValidateModes()
1407 scrp->monitor->nHsync = 1; in xf86ValidateModes()
1414 for (i = 0; i < scrp->monitor->nHsync; i++) { in xf86ValidateModes()
1415 if (scrp->monitor->hsync[i].lo == scrp->monitor->hsync[i].hi) in xf86ValidateModes()
1416 xf86DrvMsg(scrp->scrnIndex, X_INFO, in xf86ValidateModes()
1418 scrp->monitor->id, type, scrp->monitor->hsync[i].lo); in xf86ValidateModes()
1420 xf86DrvMsg(scrp->scrnIndex, X_INFO, in xf86ValidateModes()
1421 "%s: Using %shsync range of %.2f-%.2f kHz\n", in xf86ValidateModes()
1422 scrp->monitor->id, type, in xf86ValidateModes()
1423 scrp->monitor->hsync[i].lo, in xf86ValidateModes()
1424 scrp->monitor->hsync[i].hi); in xf86ValidateModes()
1428 if (scrp->monitor->nVrefresh <= 0) { in xf86ValidateModes()
1430 scrp->monitor->nVrefresh = numTimings; in xf86ValidateModes()
1432 scrp->monitor->vrefresh[i].lo = vrefresh[i].lo; in xf86ValidateModes()
1433 scrp->monitor->vrefresh[i].hi = vrefresh[i].hi; in xf86ValidateModes()
1437 scrp->monitor->vrefresh[0].lo = 50; in xf86ValidateModes()
1438 scrp->monitor->vrefresh[0].hi = 70; in xf86ValidateModes()
1439 scrp->monitor->nVrefresh = 1; in xf86ValidateModes()
1446 for (i = 0; i < scrp->monitor->nVrefresh; i++) { in xf86ValidateModes()
1447 if (scrp->monitor->vrefresh[i].lo == scrp->monitor->vrefresh[i].hi) in xf86ValidateModes()
1448 xf86DrvMsg(scrp->scrnIndex, X_INFO, in xf86ValidateModes()
1450 scrp->monitor->id, type, in xf86ValidateModes()
1451 scrp->monitor->vrefresh[i].lo); in xf86ValidateModes()
1453 xf86DrvMsg(scrp->scrnIndex, X_INFO, in xf86ValidateModes()
1454 "%s: Using %svrefresh range of %.2f-%.2f Hz\n", in xf86ValidateModes()
1455 scrp->monitor->id, type, in xf86ValidateModes()
1456 scrp->monitor->vrefresh[i].lo, in xf86ValidateModes()
1457 scrp->monitor->vrefresh[i].hi); in xf86ValidateModes()
1461 if (!scrp->monitor->maxPixClock && !specified) { in xf86ValidateModes()
1463 scrp->monitor->maxPixClock = 65000.0; in xf86ValidateModes()
1465 if (scrp->monitor->maxPixClock) { in xf86ValidateModes()
1466 xf86DrvMsg(scrp->scrnIndex, X_INFO, in xf86ValidateModes()
1468 scrp->monitor->id, type, in xf86ValidateModes()
1469 (float) scrp->monitor->maxPixClock / 1000.0); in xf86ValidateModes()
1479 newCR->next = NULL; in xf86ValidateModes()
1480 if (scrp->clockRanges == NULL) in xf86ValidateModes()
1481 scrp->clockRanges = newCR; in xf86ValidateModes()
1483 nt_list_append(newCR, scrp->clockRanges, ClockRange, next); in xf86ValidateModes()
1487 if (scrp->depth > 4) in xf86ValidateModes()
1488 BankFormat = &scrp->fbFormat; in xf86ValidateModes()
1490 BankFormat = xf86GetPixFormat(scrp, 1); /* >not< scrp->depth! */ in xf86ValidateModes()
1492 if (scrp->xInc <= 0) in xf86ValidateModes()
1493 scrp->xInc = 8; /* Suitable for VGA and others */ in xf86ValidateModes()
1495 #define _VIRTUALX(x) ((((x) + scrp->xInc - 1) / scrp->xInc) * scrp->xInc) in xf86ValidateModes()
1499 * always takes precedence if is non-NULL. In that case the minPitch and in xf86ValidateModes()
1517 xf86DrvMsg(scrp->scrnIndex, X_ERROR, in xf86ValidateModes()
1520 return -1; in xf86ValidateModes()
1524 xf86DrvMsg(scrp->scrnIndex, X_ERROR, in xf86ValidateModes()
1527 return -1; in xf86ValidateModes()
1548 xf86DrvMsg(scrp->scrnIndex, X_ERROR, in xf86ValidateModes()
1551 return -1; in xf86ValidateModes()
1555 xf86DrvMsg(scrp->scrnIndex, X_ERROR, in xf86ValidateModes()
1558 return -1; in xf86ValidateModes()
1573 /* Print clock ranges and scaled clocks */ in xf86ValidateModes()
1577 * If scrp->modePool hasn't been setup yet, set it up now. This allows the in xf86ValidateModes()
1580 * member of the scrp->modes list for which a match was considered. in xf86ValidateModes()
1582 if (scrp->modePool == NULL) { in xf86ValidateModes()
1584 for (p = availModes; p != NULL; p = p->next) { in xf86ValidateModes()
1590 status = xf86CheckModeForMonitor(p, scrp->monitor); in xf86ValidateModes()
1596 new->next = NULL; in xf86ValidateModes()
1598 scrp->modePool = new; in xf86ValidateModes()
1601 q->next = new; in xf86ValidateModes()
1603 new->prev = NULL; in xf86ValidateModes()
1605 q->name = xnfstrdup(p->name); in xf86ValidateModes()
1606 q->status = MODE_OK; in xf86ValidateModes()
1609 printModeRejectMessage(scrp->scrnIndex, p, status); in xf86ValidateModes()
1613 if (scrp->modePool == NULL) { in xf86ValidateModes()
1614 xf86DrvMsg(scrp->scrnIndex, X_WARNING, "Mode pool is empty\n"); in xf86ValidateModes()
1619 for (p = scrp->modePool; p != NULL; p = p->next) { in xf86ValidateModes()
1620 p->prev = NULL; in xf86ValidateModes()
1621 p->status = MODE_OK; in xf86ValidateModes()
1626 * Allocate one entry in scrp->modes for each named mode. in xf86ValidateModes()
1628 while (scrp->modes) in xf86ValidateModes()
1629 xf86DeleteMode(&scrp->modes, scrp->modes); in xf86ValidateModes()
1630 endp = &scrp->modes; in xf86ValidateModes()
1636 new->prev = last; in xf86ValidateModes()
1637 new->type = M_T_USERDEF; in xf86ValidateModes()
1638 new->name = xnfstrdup(modeNames[i]); in xf86ValidateModes()
1639 if (new->prev) in xf86ValidateModes()
1640 new->prev->next = new; in xf86ValidateModes()
1642 endp = &new->next; in xf86ValidateModes()
1652 for (p = scrp->modes;; p = p->next) { in xf86ValidateModes()
1668 for (q = scrp->modePool; q != NULL; q = q->next) { in xf86ValidateModes()
1669 if ((q->prev == NULL) && (q->status == MODE_OK)) { in xf86ValidateModes()
1674 for (p = scrp->modes; p != NULL; p = p->next) { in xf86ValidateModes()
1675 if ((p->status != MODE_OK) && !strcmp(p->name, q->name)) in xf86ValidateModes()
1680 q->prev = p; in xf86ValidateModes()
1687 if (!scrp->monitor->reducedblanking && in xf86ValidateModes()
1688 (q->type & M_T_DEFAULT) && in xf86ValidateModes()
1689 ((double) q->HTotal / (double) q->HDisplay) < 1.15) in xf86ValidateModes()
1692 if (modeSize < (q->HDisplay * q->VDisplay)) { in xf86ValidateModes()
1694 modeSize = q->HDisplay * q->VDisplay; in xf86ValidateModes()
1704 p->prev = last; in xf86ValidateModes()
1705 p->name = xnfstrdup(r->name); in xf86ValidateModes()
1707 p->type = M_T_USERDEF; in xf86ValidateModes()
1708 if (p->prev) in xf86ValidateModes()
1709 p->prev->next = p; in xf86ValidateModes()
1711 endp = &p->next; in xf86ValidateModes()
1716 if (repeat && ((status = p->status) != MODE_OK)) in xf86ValidateModes()
1717 printModeRejectMessage(scrp->scrnIndex, p, status); in xf86ValidateModes()
1718 saveType = p->type; in xf86ValidateModes()
1723 printModeRejectMessage(scrp->scrnIndex, p, status); in xf86ValidateModes()
1727 return -1; in xf86ValidateModes()
1730 if (p->status == MODE_OK) in xf86ValidateModes()
1731 p->status = status; in xf86ValidateModes()
1734 p->type |= saveType; in xf86ValidateModes()
1742 * Don't let non-user defined modes increase the virtual size in xf86ValidateModes()
1744 if (!(p->type & M_T_USERDEF) && (numModes > 0)) { in xf86ValidateModes()
1745 if (p->HDisplay > virtX) { in xf86ValidateModes()
1746 p->status = MODE_VIRTUAL_X; in xf86ValidateModes()
1749 if (p->VDisplay > virtY) { in xf86ValidateModes()
1750 p->status = MODE_VIRTUAL_Y; in xf86ValidateModes()
1758 if (virtualX <= 0 && p->HDisplay > newVirtX) in xf86ValidateModes()
1759 newVirtX = _VIRTUALX(p->HDisplay); in xf86ValidateModes()
1760 if (virtualY <= 0 && p->VDisplay > newVirtY) { in xf86ValidateModes()
1761 if (maxHeight > 0 && p->VDisplay > maxHeight) { in xf86ValidateModes()
1762 p->status = MODE_VIRTUAL_Y; /* ? */ in xf86ValidateModes()
1765 newVirtY = p->VDisplay; in xf86ValidateModes()
1773 newLinePitch = -1; in xf86ValidateModes()
1793 p->status = MODE_BAD_WIDTH; in xf86ValidateModes()
1802 p->status = MODE_MEM_VIRT; in xf86ValidateModes()
1807 if (scrp->ValidMode) { in xf86ValidateModes()
1812 scrp->virtualX = newVirtX; in xf86ValidateModes()
1813 scrp->virtualY = newVirtY; in xf86ValidateModes()
1814 scrp->displayWidth = newLinePitch; in xf86ValidateModes()
1815 p->status = (scrp->ValidMode) (scrp, p, FALSE, in xf86ValidateModes()
1818 if (p->status != MODE_OK) { in xf86ValidateModes()
1827 p->status = MODE_OK; in xf86ValidateModes()
1839 for (p = scrp->modes; p; p = p->next) { in xf86ValidateModes()
1840 if (p->HDisplay > vx && p->VDisplay > vy) { in xf86ValidateModes()
1841 vx = p->HDisplay; in xf86ValidateModes()
1842 vy = p->VDisplay; in xf86ValidateModes()
1866 for (p = scrp->modes; p; p = p->next) { in xf86ValidateModes()
1868 if ((p->type & type) != type) in xf86ValidateModes()
1870 if (p->HDisplay > vx && p->VDisplay > vy) { in xf86ValidateModes()
1871 vx = p->HDisplay; in xf86ValidateModes()
1872 vy = p->VDisplay; in xf86ValidateModes()
1879 xf86DrvMsg(scrp->scrnIndex, X_WARNING, in xf86ValidateModes()
1884 for (p = scrp->modes; p; p = p->next) { in xf86ValidateModes()
1886 if (p->HDisplay > virtX) in xf86ValidateModes()
1887 p->status = MODE_VIRTUAL_X; in xf86ValidateModes()
1888 if (p->VDisplay > virtY) in xf86ValidateModes()
1889 p->status = MODE_VIRTUAL_Y; in xf86ValidateModes()
1890 if (p->status != MODE_OK) { in xf86ValidateModes()
1891 numModes--; in xf86ValidateModes()
1892 printModeRejectMessage(scrp->scrnIndex, p, p->status); in xf86ValidateModes()
1916 scrp->virtualX = virtX; in xf86ValidateModes()
1917 scrp->virtualY = virtY; in xf86ValidateModes()
1918 scrp->displayWidth = linePitch; in xf86ValidateModes()
1924 p = scrp->modes; in xf86ValidateModes()
1925 while (p->next != NULL) in xf86ValidateModes()
1926 p = p->next; in xf86ValidateModes()
1928 p->next = scrp->modes; in xf86ValidateModes()
1929 scrp->modes->prev = p; in xf86ValidateModes()
1932 xf86DrvMsg(scrp->scrnIndex, X_ERROR, in xf86ValidateModes()
1935 return -1; in xf86ValidateModes()
1948 * - singly linked linear lists, ending in NULL
1949 * - doubly linked linear lists, starting and ending in NULL
1950 * - doubly linked circular lists
1963 *modeList = mode->next; in xf86DeleteMode()
1966 if ((mode == mode->prev) && (mode == mode->next)) { in xf86DeleteMode()
1970 if ((mode->prev != NULL) && (mode->prev->next == mode)) in xf86DeleteMode()
1971 mode->prev->next = mode->next; in xf86DeleteMode()
1972 if ((mode->next != NULL) && (mode->next->prev == mode)) in xf86DeleteMode()
1973 mode->next->prev = mode->prev; in xf86DeleteMode()
1976 free((void *) mode->name); in xf86DeleteMode()
1992 p = scrp->modes; in xf86PruneDriverModes()
1997 if (!(first = scrp->modes)) in xf86PruneDriverModes()
1999 n = p->next; in xf86PruneDriverModes()
2000 if (p->status != MODE_OK) { in xf86PruneDriverModes()
2001 xf86DeleteMode(&(scrp->modes), p); in xf86PruneDriverModes()
2007 while (scrp->modePool) { in xf86PruneDriverModes()
2010 * member of the scrp->modes list for which a match was considered. in xf86PruneDriverModes()
2014 scrp->modePool->prev = NULL; in xf86PruneDriverModes()
2015 xf86DeleteMode(&scrp->modePool, scrp->modePool); in xf86PruneDriverModes()
2035 scrp->adjustFlags = adjustFlags; in xf86SetCrtcForModes()
2037 p = scrp->modes; in xf86SetCrtcForModes()
2044 (p->type & M_T_DEFAULT) ? "Default " : "", in xf86SetCrtcForModes()
2045 p->name, p->CrtcHDisplay, p->CrtcHBlankStart, in xf86SetCrtcForModes()
2046 p->CrtcHSyncStart, p->CrtcHSyncEnd, p->CrtcHBlankEnd, in xf86SetCrtcForModes()
2047 p->CrtcHTotal, p->CrtcVDisplay, p->CrtcVBlankStart, in xf86SetCrtcForModes()
2048 p->CrtcVSyncStart, p->CrtcVSyncEnd, p->CrtcVBlankEnd, in xf86SetCrtcForModes()
2049 p->CrtcVTotal); in xf86SetCrtcForModes()
2050 p = p->next; in xf86SetCrtcForModes()
2051 } while (p != NULL && p != scrp->modes); in xf86SetCrtcForModes()
2064 xf86DrvMsg(scrp->scrnIndex, X_INFO, "Virtual size is %dx%d (pitch %d)\n", in xf86PrintModes()
2065 scrp->virtualX, scrp->virtualY, scrp->displayWidth); in xf86PrintModes()
2067 p = scrp->modes; in xf86PrintModes()
2075 if (p->Flags & V_INTERLACE) { in xf86PrintModes()
2078 if (p->Flags & V_DBLSCAN) { in xf86PrintModes()
2081 if (p->VScan > 1) { in xf86PrintModes()
2084 if (p->type & M_T_BUILTIN) in xf86PrintModes()
2085 prefix = "Built-in mode"; in xf86PrintModes()
2086 else if (p->type & M_T_DEFAULT) in xf86PrintModes()
2088 else if (p->type & M_T_DRIVER) in xf86PrintModes()
2092 if (p->type & M_T_USERDEF) in xf86PrintModes()
2097 if (p->name) in xf86PrintModes()
2098 xf86DrvMsg(scrp->scrnIndex, X_CONFIG, in xf86PrintModes()
2099 "%s%s \"%s\"\n", uprefix, prefix, p->name); in xf86PrintModes()
2101 xf86DrvMsg(scrp->scrnIndex, X_PROBED, in xf86PrintModes()
2103 uprefix, prefix, p->HDisplay, p->VDisplay); in xf86PrintModes()
2105 else if (p->Clock == p->SynthClock) { in xf86PrintModes()
2106 xf86DrvMsg(scrp->scrnIndex, X_CONFIG, in xf86PrintModes()
2108 uprefix, prefix, p->name, p->Clock / 1000.0, in xf86PrintModes()
2112 xf86DrvMsg(scrp->scrnIndex, X_CONFIG, in xf86PrintModes()
2113 "%s%s \"%s\": %.1f MHz (scaled from %.1f MHz), " in xf86PrintModes()
2115 uprefix, prefix, p->name, p->Clock / 1000.0, in xf86PrintModes()
2116 p->SynthClock / 1000.0, hsync, refresh, desc, desc2); in xf86PrintModes()
2119 xf86PrintModeline(scrp->scrnIndex, p); in xf86PrintModes()
2120 p = p->next; in xf86PrintModes()
2121 } while (p != NULL && p != scrp->modes); in xf86PrintModes()