Lines Matching +full:e +full:- +full:ddc

18  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
26 * @file This file covers code to convert a xf86MonPtr containing EDID-probed
27 * information into a list of modes, including applying monitor-specific
31 #include <xorg-config.h>
47 if (det_mon->type == DS_RANGES) in handle_detailed_rblank()
48 if (det_mon->section.ranges.supported_blanking & CVT_REDUCED) in handle_detailed_rblank()
53 xf86MonitorSupportsReducedBlanking(xf86MonPtr DDC) in xf86MonitorSupportsReducedBlanking() argument
56 if (DDC->ver.revision >= 4) { in xf86MonitorSupportsReducedBlanking()
59 xf86ForEachDetailedBlock(DDC, handle_detailed_rblank, &ret); in xf86MonitorSupportsReducedBlanking()
64 if (DDC->features.input_type) in xf86MonitorSupportsReducedBlanking()
71 quirk_prefer_large_60(int scrnIndex, xf86MonPtr DDC) in quirk_prefer_large_60() argument
74 if (memcmp(DDC->vendor.name, "MAX", 4) == 0 && in quirk_prefer_large_60()
75 ((DDC->vendor.prod_id == 1516) || (DDC->vendor.prod_id == 0x77e))) in quirk_prefer_large_60()
79 if (memcmp(DDC->vendor.name, "ACR", 4) == 0 && DDC->vendor.prod_id == 44358) in quirk_prefer_large_60()
83 if (memcmp(DDC->vendor.name, "SAM", 4) == 0 && DDC->vendor.prod_id == 596) in quirk_prefer_large_60()
87 if (memcmp(DDC->vendor.name, "SAM", 4) == 0 && DDC->vendor.prod_id == 638) in quirk_prefer_large_60()
91 if (memcmp(DDC->vendor.name, "API", 4) == 0 && in quirk_prefer_large_60()
92 DDC->vendor.prod_id == 0x7602) in quirk_prefer_large_60()
99 quirk_prefer_large_75(int scrnIndex, xf86MonPtr DDC) in quirk_prefer_large_75() argument
102 if (memcmp(DDC->vendor.name, "FCM", 4) == 0 && DDC->vendor.prod_id == 13600) in quirk_prefer_large_75()
109 quirk_detailed_h_in_cm(int scrnIndex, xf86MonPtr DDC) in quirk_detailed_h_in_cm() argument
112 if (memcmp(DDC->vendor.name, "FCM", 4) == 0 && DDC->vendor.prod_id == 13600) in quirk_detailed_h_in_cm()
119 quirk_detailed_v_in_cm(int scrnIndex, xf86MonPtr DDC) in quirk_detailed_v_in_cm() argument
122 if (memcmp(DDC->vendor.name, "FCM", 4) == 0 && DDC->vendor.prod_id == 13600) in quirk_detailed_v_in_cm()
125 /* Bug #21000: LGPhilipsLCD LP154W01-TLAJ */ in quirk_detailed_v_in_cm()
126 if (memcmp(DDC->vendor.name, "LPL", 4) == 0 && DDC->vendor.prod_id == 47360) in quirk_detailed_v_in_cm()
129 /* Bug #10304: LGPhilipsLCD LP154W01-A5 */ in quirk_detailed_v_in_cm()
130 if (memcmp(DDC->vendor.name, "LPL", 4) == 0 && DDC->vendor.prod_id == 0) in quirk_detailed_v_in_cm()
133 /* Bug #24482: LGPhilipsLCD LP154W01-TLA1 */ in quirk_detailed_v_in_cm()
134 if (memcmp(DDC->vendor.name, "LPL", 4) == 0 && in quirk_detailed_v_in_cm()
135 DDC->vendor.prod_id == 0x2a00) in quirk_detailed_v_in_cm()
138 /* Bug #28414: HP Compaq NC8430 LP154W01-TLA8 */ in quirk_detailed_v_in_cm()
139 if (memcmp(DDC->vendor.name, "LPL", 4) == 0 && DDC->vendor.prod_id == 5750) in quirk_detailed_v_in_cm()
143 if (memcmp(DDC->vendor.name, "SAM", 4) == 0 && DDC->vendor.prod_id == 1157) in quirk_detailed_v_in_cm()
150 quirk_detailed_use_maximum_size(int scrnIndex, xf86MonPtr DDC) in quirk_detailed_use_maximum_size() argument
153 if (memcmp(DDC->vendor.name, "ADA", 4) == 0 && in quirk_detailed_use_maximum_size()
154 DDC->vendor.prod_id == 4) in quirk_detailed_use_maximum_size()
158 if (memcmp(DDC->vendor.name, "IVM", 4) == 0 && DDC->vendor.prod_id == 6400) in quirk_detailed_use_maximum_size()
162 if (memcmp(DDC->vendor.name, "LGD", 4) == 0 && in quirk_detailed_use_maximum_size()
163 DDC->vendor.prod_id == 0x7f01) in quirk_detailed_use_maximum_size()
167 if (memcmp(DDC->vendor.name, "MEI", 4) == 0 && in quirk_detailed_use_maximum_size()
168 DDC->vendor.prod_id == 0x96a2) in quirk_detailed_use_maximum_size()
175 quirk_135_clock_too_high(int scrnIndex, xf86MonPtr DDC) in quirk_135_clock_too_high() argument
177 /* Envision Peripherals, Inc. EN-7100e. See bug #9550. */ in quirk_135_clock_too_high()
178 if (memcmp(DDC->vendor.name, "EPI", 4) == 0 && DDC->vendor.prod_id == 59264) in quirk_135_clock_too_high()
185 quirk_first_detailed_preferred(int scrnIndex, xf86MonPtr DDC) in quirk_first_detailed_preferred() argument
188 if (memcmp(DDC->vendor.name, "PHL", 4) == 0 && DDC->vendor.prod_id == 57364) in quirk_first_detailed_preferred()
192 if (memcmp(DDC->vendor.name, "PTS", 4) == 0 && DDC->vendor.prod_id == 765) in quirk_first_detailed_preferred()
196 if (memcmp(DDC->vendor.name, "ACR", 4) == 0 && DDC->vendor.prod_id == 2423) in quirk_first_detailed_preferred()
200 if (memcmp(DDC->vendor.name, "PEA", 4) == 0 && DDC->vendor.prod_id == 9003) in quirk_first_detailed_preferred()
207 quirk_detailed_sync_pp(int scrnIndex, xf86MonPtr DDC) in quirk_detailed_sync_pp() argument
210 if (memcmp(DDC->vendor.name, "SAM", 4) == 0 && DDC->vendor.prod_id == 541) in quirk_detailed_sync_pp()
217 quirk_dvi_single_link(int scrnIndex, xf86MonPtr DDC) in quirk_dvi_single_link() argument
220 if (memcmp(DDC->vendor.name, "APL", 4) == 0 && in quirk_dvi_single_link()
221 DDC->vendor.prod_id == 0x921c) in quirk_dvi_single_link()
227 Bool (*detect) (int scrnIndex, xf86MonPtr DDC);
268 * modes are old-school Mac modes. The EDID spec says the 1152x864@75 mode
272 * The DMT modes have been fact-checked; the rest are mild guesses.
302 CARD32 bits = (timing->t1) | (timing->t2 << 8) | in DDCModesFromEstablished()
303 ((timing->t_manu & 0x80) << 9); in DDCModesFromEstablished()
405 MonitorStandardTimingLevel(xf86MonPtr DDC) in MonitorStandardTimingLevel() argument
407 if (DDC->ver.revision >= 2) { in MonitorStandardTimingLevel()
408 if (DDC->ver.revision >= 4 && CVT_SUPPORTED(DDC->features.msc)) { in MonitorStandardTimingLevel()
423 * If rb is not set, then we'll not consider reduced-blanking modes as
439 if (ret->HDisplay == hsize && in FindDMTMode()
440 ret->VDisplay == vsize && refresh == ModeRefresh(ret)) in FindDMTMode()
459 * as CVT-compliant (unless specified in an extension block I suppose).
487 for (p = pool; p; p = p->next) { in DDCModesFromStandardTiming()
488 if (p->HDisplay == hsize && p->VDisplay == vsize && in DDCModesFromStandardTiming()
498 Mode->HDisplay = 1366; in DDCModesFromStandardTiming()
499 Mode->HSyncStart--; in DDCModesFromStandardTiming()
500 Mode->HSyncEnd--; in DDCModesFromStandardTiming()
516 Mode->type = M_T_DRIVER; in DDCModesFromStandardTiming()
550 if ((mode->HDisplay == cea_interlaced[i].w) && in DDCModeDoInterlaceQuirks()
551 (mode->VDisplay == cea_interlaced[i].h / 2)) { in DDCModeDoInterlaceQuirks()
552 mode->VDisplay *= 2; in DDCModeDoInterlaceQuirks()
553 mode->VSyncStart *= 2; in DDCModeDoInterlaceQuirks()
554 mode->VSyncEnd *= 2; in DDCModeDoInterlaceQuirks()
555 mode->VTotal *= 2; in DDCModeDoInterlaceQuirks()
556 mode->VTotal |= 1; in DDCModeDoInterlaceQuirks()
560 mode->Flags |= V_INTERLACE; in DDCModeDoInterlaceQuirks()
578 if (timing->h_active < 64 || timing->v_active < 64) { in DDCModeFromDetailedTiming()
581 timing->h_active, timing->v_active); in DDCModeFromDetailedTiming()
586 if (timing->stereo) { in DDCModeFromDetailedTiming()
593 if (timing->sync != 0x03) { in DDCModeFromDetailedTiming()
596 " sync.\n", __func__, timing->h_active, timing->v_active); in DDCModeFromDetailedTiming()
601 Mode->type = M_T_DRIVER; in DDCModeFromDetailedTiming()
603 Mode->type |= M_T_PREFERRED; in DDCModeFromDetailedTiming()
605 if ((quirks & DDC_QUIRK_135_CLOCK_TOO_HIGH) && timing->clock == 135000000) in DDCModeFromDetailedTiming()
606 Mode->Clock = 108880; in DDCModeFromDetailedTiming()
608 Mode->Clock = timing->clock / 1000.0; in DDCModeFromDetailedTiming()
610 Mode->HDisplay = timing->h_active; in DDCModeFromDetailedTiming()
611 Mode->HSyncStart = timing->h_active + timing->h_sync_off; in DDCModeFromDetailedTiming()
612 Mode->HSyncEnd = Mode->HSyncStart + timing->h_sync_width; in DDCModeFromDetailedTiming()
613 Mode->HTotal = timing->h_active + timing->h_blanking; in DDCModeFromDetailedTiming()
615 Mode->VDisplay = timing->v_active; in DDCModeFromDetailedTiming()
616 Mode->VSyncStart = timing->v_active + timing->v_sync_off; in DDCModeFromDetailedTiming()
617 Mode->VSyncEnd = Mode->VSyncStart + timing->v_sync_width; in DDCModeFromDetailedTiming()
618 Mode->VTotal = timing->v_active + timing->v_blanking; in DDCModeFromDetailedTiming()
621 if (Mode->HSyncEnd > Mode->HTotal || Mode->VSyncEnd > Mode->VTotal) { in DDCModeFromDetailedTiming()
628 if (timing->interlaced) in DDCModeFromDetailedTiming()
632 Mode->Flags |= V_PVSYNC | V_PHSYNC; in DDCModeFromDetailedTiming()
634 if (timing->misc & 0x02) in DDCModeFromDetailedTiming()
635 Mode->Flags |= V_PVSYNC; in DDCModeFromDetailedTiming()
637 Mode->Flags |= V_NVSYNC; in DDCModeFromDetailedTiming()
639 if (timing->misc & 0x01) in DDCModeFromDetailedTiming()
640 Mode->Flags |= V_PHSYNC; in DDCModeFromDetailedTiming()
642 Mode->Flags |= V_NHSYNC; in DDCModeFromDetailedTiming()
756 for (j = 7; j >= 0; j--) { in DDCModesFromEstIII()
758 m = (i * 8) + (7 - j); in DDCModesFromEstIII()
773 * This is only valid when the sink claims to be continuous-frequency
776 * this; the non-RANDR code even punts the decision of optional sync
788 Monitor->nHsync = 1; in DDCGuessRangesFromModes()
789 Monitor->hsync[0].lo = 1024.0; in DDCGuessRangesFromModes()
790 Monitor->hsync[0].hi = 0.0; in DDCGuessRangesFromModes()
792 Monitor->nVrefresh = 1; in DDCGuessRangesFromModes()
793 Monitor->vrefresh[0].lo = 1024.0; in DDCGuessRangesFromModes()
794 Monitor->vrefresh[0].hi = 0.0; in DDCGuessRangesFromModes()
797 if (!Mode->HSync) in DDCGuessRangesFromModes()
798 Mode->HSync = ((float) Mode->Clock) / ((float) Mode->HTotal); in DDCGuessRangesFromModes()
800 if (!Mode->VRefresh) in DDCGuessRangesFromModes()
801 Mode->VRefresh = (1000.0 * ((float) Mode->Clock)) / in DDCGuessRangesFromModes()
802 ((float) (Mode->HTotal * Mode->VTotal)); in DDCGuessRangesFromModes()
804 if (Mode->HSync < Monitor->hsync[0].lo) in DDCGuessRangesFromModes()
805 Monitor->hsync[0].lo = Mode->HSync; in DDCGuessRangesFromModes()
807 if (Mode->HSync > Monitor->hsync[0].hi) in DDCGuessRangesFromModes()
808 Monitor->hsync[0].hi = Mode->HSync; in DDCGuessRangesFromModes()
810 if (Mode->VRefresh < Monitor->vrefresh[0].lo) in DDCGuessRangesFromModes()
811 Monitor->vrefresh[0].lo = Mode->VRefresh; in DDCGuessRangesFromModes()
813 if (Mode->VRefresh > Monitor->vrefresh[0].hi) in DDCGuessRangesFromModes()
814 Monitor->vrefresh[0].hi = Mode->VRefresh; in DDCGuessRangesFromModes()
816 Mode = Mode->next; in DDCGuessRangesFromModes()
821 xf86DDCDetectQuirks(int scrnIndex, xf86MonPtr DDC, Bool verbose) in xf86DDCDetectQuirks() argument
828 if (ddc_quirks[i].detect(scrnIndex, DDC)) { in xf86DDCDetectQuirks()
844 if (det_mon->type != DT) in xf86DetTimingApplyQuirks()
848 det_mon->section.d_timings.h_size *= 10; in xf86DetTimingApplyQuirks()
851 det_mon->section.d_timings.v_size *= 10; in xf86DetTimingApplyQuirks()
854 det_mon->section.d_timings.h_size = 10 * hsize; in xf86DetTimingApplyQuirks()
855 det_mon->section.d_timings.v_size = 10 * vsize; in xf86DetTimingApplyQuirks()
860 * Applies monitor-specific quirks to the decoded EDID information.
866 xf86DDCApplyQuirks(int scrnIndex, xf86MonPtr DDC) in xf86DDCApplyQuirks() argument
868 ddc_quirk_t quirks = xf86DDCDetectQuirks(scrnIndex, DDC, FALSE); in xf86DDCApplyQuirks()
872 xf86DetTimingApplyQuirks(DDC->det_mon + i, quirks, in xf86DDCApplyQuirks()
873 DDC->features.hsize, DDC->features.vsize); in xf86DDCApplyQuirks()
887 for (mode = modes; mode; mode = mode->next) { in xf86DDCSetPreferredRefresh()
888 mode->type &= ~M_T_PREFERRED; in xf86DDCSetPreferredRefresh()
893 if (mode->HDisplay * mode->VDisplay > best->HDisplay * best->VDisplay) { in xf86DDCSetPreferredRefresh()
897 if (mode->HDisplay * mode->VDisplay == best->HDisplay * best->VDisplay) { in xf86DDCSetPreferredRefresh()
900 double mode_dist = fabs(mode_refresh - target_refresh); in xf86DDCSetPreferredRefresh()
901 double best_dist = fabs(best_refresh - target_refresh); in xf86DDCSetPreferredRefresh()
910 best->type |= M_T_PREFERRED; in xf86DDCSetPreferredRefresh()
989 vid = video->video_code & 0x7f; in handle_cea_svd()
991 Mode = xf86DuplicateMode(CEAVideoModes + (vid - 1)); in handle_cea_svd()
1007 xf86MonPtr DDC; member
1021 xf86DetTimingApplyQuirks(det_mon, p->quirks, in handle_detailed_modes()
1022 p->DDC->features.hsize, p->DDC->features.vsize); in handle_detailed_modes()
1024 switch (det_mon->type) { in handle_detailed_modes()
1026 Mode = DDCModeFromDetailedTiming(p->DDC->scrnIndex, in handle_detailed_modes()
1027 &det_mon->section.d_timings, in handle_detailed_modes()
1028 p->preferred, p->quirks); in handle_detailed_modes()
1029 p->preferred = FALSE; in handle_detailed_modes()
1030 p->Modes = xf86ModesAdd(p->Modes, Mode); in handle_detailed_modes()
1033 Mode = DDCModesFromStandardTiming(p->Modes, in handle_detailed_modes()
1034 det_mon->section.std_t, in handle_detailed_modes()
1035 p->quirks, p->timing_level, p->rb); in handle_detailed_modes()
1036 p->Modes = xf86ModesAdd(p->Modes, Mode); in handle_detailed_modes()
1039 Mode = DDCModesFromCVT(p->DDC->scrnIndex, det_mon->section.cvt); in handle_detailed_modes()
1040 p->Modes = xf86ModesAdd(p->Modes, Mode); in handle_detailed_modes()
1043 Mode = DDCModesFromEstIII(det_mon->section.est_iii); in handle_detailed_modes()
1044 p->Modes = xf86ModesAdd(p->Modes, Mode); in handle_detailed_modes()
1052 xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC) in xf86DDCGetModes() argument
1061 DDC->vendor.name, DDC->vendor.prod_id); in xf86DDCGetModes()
1063 quirks = xf86DDCDetectQuirks(scrnIndex, DDC, TRUE); in xf86DDCGetModes()
1065 preferred = PREFERRED_TIMING_MODE(DDC->features.msc); in xf86DDCGetModes()
1066 if (DDC->ver.revision >= 4) in xf86DDCGetModes()
1073 rb = xf86MonitorSupportsReducedBlanking(DDC); in xf86DDCGetModes()
1075 timing_level = MonitorStandardTimingLevel(DDC); in xf86DDCGetModes()
1078 p.DDC = DDC; in xf86DDCGetModes()
1083 xf86ForEachDetailedBlock(DDC, handle_detailed_modes, &p); in xf86DDCGetModes()
1086 /* Add cea-extension mode timings */ in xf86DDCGetModes()
1087 Mode = DDCModesFromCEAExtension(scrnIndex, DDC); in xf86DDCGetModes()
1091 Mode = DDCModesFromEstablished(scrnIndex, &DDC->timings1, quirks); in xf86DDCGetModes()
1095 Mode = DDCModesFromStandardTiming(Modes, DDC->timings2, quirks, in xf86DDCGetModes()
1123 int scrnIndex = ((xf86MonPtr) (p->Monitor->DDC))->scrnIndex; in handle_detailed_monset()
1125 switch (det_mon->type) { in handle_detailed_monset()
1127 if (!p->have_hsync) { in handle_detailed_monset()
1128 if (!p->Monitor->nHsync) in handle_detailed_monset()
1131 p->Monitor->hsync[p->Monitor->nHsync].lo = in handle_detailed_monset()
1132 det_mon->section.ranges.min_h; in handle_detailed_monset()
1133 p->Monitor->hsync[p->Monitor->nHsync].hi = in handle_detailed_monset()
1134 det_mon->section.ranges.max_h; in handle_detailed_monset()
1135 p->Monitor->nHsync++; in handle_detailed_monset()
1142 if (!p->have_vrefresh) { in handle_detailed_monset()
1143 if (!p->Monitor->nVrefresh) in handle_detailed_monset()
1146 p->Monitor->vrefresh[p->Monitor->nVrefresh].lo = in handle_detailed_monset()
1147 det_mon->section.ranges.min_v; in handle_detailed_monset()
1148 p->Monitor->vrefresh[p->Monitor->nVrefresh].hi = in handle_detailed_monset()
1149 det_mon->section.ranges.max_v; in handle_detailed_monset()
1150 p->Monitor->nVrefresh++; in handle_detailed_monset()
1157 clock = det_mon->section.ranges.max_clock * 1000; in handle_detailed_monset()
1158 if (p->quirks & DDC_QUIRK_DVI_SINGLE_LINK) in handle_detailed_monset()
1160 if (!p->have_maxpixclock && clock > p->Monitor->maxPixClock) in handle_detailed_monset()
1161 p->Monitor->maxPixClock = clock; in handle_detailed_monset()
1173 xf86EdidMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC) in xf86EdidMonitorSet() argument
1178 if (!Monitor || !DDC) in xf86EdidMonitorSet()
1181 Monitor->DDC = DDC; in xf86EdidMonitorSet()
1183 if (Monitor->widthmm <= 0 || Monitor->heightmm <= 0) { in xf86EdidMonitorSet()
1184 Monitor->widthmm = 10 * DDC->features.hsize; in xf86EdidMonitorSet()
1185 Monitor->heightmm = 10 * DDC->features.vsize; in xf86EdidMonitorSet()
1188 Monitor->reducedblanking = xf86MonitorSupportsReducedBlanking(DDC); in xf86EdidMonitorSet()
1190 Modes = xf86DDCGetModes(scrnIndex, DDC); in xf86EdidMonitorSet()
1194 p.quirks = xf86DDCDetectQuirks(scrnIndex, Monitor->DDC, FALSE); in xf86EdidMonitorSet()
1195 p.have_hsync = (Monitor->nHsync != 0); in xf86EdidMonitorSet()
1196 p.have_vrefresh = (Monitor->nVrefresh != 0); in xf86EdidMonitorSet()
1197 p.have_maxpixclock = (Monitor->maxPixClock != 0); in xf86EdidMonitorSet()
1198 xf86ForEachDetailedBlock(DDC, handle_detailed_monset, &p); in xf86EdidMonitorSet()
1202 xf86DrvMsg(scrnIndex, X_INFO, "Printing DDC gathered Modelines:\n"); in xf86EdidMonitorSet()
1207 Mode = Mode->next; in xf86EdidMonitorSet()
1211 if (!Monitor->nHsync || !Monitor->nVrefresh) in xf86EdidMonitorSet()
1215 if (Monitor->Modes) { in xf86EdidMonitorSet()
1216 Monitor->Last->next = Modes; in xf86EdidMonitorSet()
1217 Modes->prev = Monitor->Last; in xf86EdidMonitorSet()
1220 Monitor->Modes = Modes; in xf86EdidMonitorSet()
1223 Monitor->Modes = xf86PruneDuplicateModes(Monitor->Modes); in xf86EdidMonitorSet()
1226 for (Mode = Monitor->Modes; Mode && Mode->next; Mode = Mode->next) {} in xf86EdidMonitorSet()
1227 Monitor->Last = Mode; in xf86EdidMonitorSet()