1 /***************************************************************************\
3 |* Copyright 2003 NVIDIA, Corporation. All rights reserved. *|
5 |* NOTICE TO USER: The source code is copyrighted under U.S. and *|
6 |* international laws. Users and possessors of this source code are *|
7 |* hereby granted a nonexclusive, royalty-free copyright license to *|
8 |* use this code in individual and commercial software. *|
10 |* Any use of this source code must include, in the user documenta- *|
11 |* tion and internal comments to the code, notices to the end user *|
14 |* Copyright 2003 NVIDIA, Corporation. All rights reserved. *|
16 |* NVIDIA, CORPORATION MAKES NO REPRESENTATION ABOUT THE SUITABILITY *|
17 |* OF THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" *|
18 |* WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. NVIDIA, CORPOR- *|
19 |* ATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOURCE CODE, *|
20 |* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGE- *|
21 |* MENT, AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL *|
22 |* NVIDIA, CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT, INCI- *|
23 |* DENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RE- *|
24 |* SULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION *|
25 |* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *|
26 |* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. *|
28 |* U.S. Government End Users. This source code is a "commercial *|
29 |* item," as that term is defined at 48 C.F.R. 2.101 (OCT 1995), *|
30 |* consisting of "commercial computer software" and "commercial *|
31 |* computer software documentation," as such terms are used in *|
32 |* 48 C.F.R. 12.212 (SEPT 1995) and is provided to the U.S. Govern- *|
33 |* ment only as a commercial end item. Consistent with 48 C.F.R. *|
34 |* 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (JUNE 1995), *|
35 |* all U.S. Government End Users acquire the source code with only *|
36 |* those rights set forth herein. *|
38 \***************************************************************************/
40 /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/nv_setup.c,v 1.48 2005/09/14 02:28:03 mvojkovi Exp $ */
42 #include "nv_include.h"
46 * Override VGA I/O routines.
48 static void NVWriteCrtc(vgaHWPtr pVga, CARD8 index, CARD8 value)
50 NVPtr pNv = (NVPtr)pVga->MMIOBase;
51 VGA_WR08(pNv->PCIO, pVga->IOBase + VGA_CRTC_INDEX_OFFSET, index);
52 VGA_WR08(pNv->PCIO, pVga->IOBase + VGA_CRTC_DATA_OFFSET, value);
54 static CARD8 NVReadCrtc(vgaHWPtr pVga, CARD8 index)
56 NVPtr pNv = (NVPtr)pVga->MMIOBase;
57 VGA_WR08(pNv->PCIO, pVga->IOBase + VGA_CRTC_INDEX_OFFSET, index);
58 return (VGA_RD08(pNv->PCIO, pVga->IOBase + VGA_CRTC_DATA_OFFSET));
60 static void NVWriteGr(vgaHWPtr pVga, CARD8 index, CARD8 value)
62 NVPtr pNv = (NVPtr)pVga->MMIOBase;
63 VGA_WR08(pNv->PVIO, VGA_GRAPH_INDEX, index);
64 VGA_WR08(pNv->PVIO, VGA_GRAPH_DATA, value);
66 static CARD8 NVReadGr(vgaHWPtr pVga, CARD8 index)
68 NVPtr pNv = (NVPtr)pVga->MMIOBase;
69 VGA_WR08(pNv->PVIO, VGA_GRAPH_INDEX, index);
70 return (VGA_RD08(pNv->PVIO, VGA_GRAPH_DATA));
72 static void NVWriteSeq(vgaHWPtr pVga, CARD8 index, CARD8 value)
74 NVPtr pNv = (NVPtr)pVga->MMIOBase;
75 VGA_WR08(pNv->PVIO, VGA_SEQ_INDEX, index);
76 VGA_WR08(pNv->PVIO, VGA_SEQ_DATA, value);
78 static CARD8 NVReadSeq(vgaHWPtr pVga, CARD8 index)
80 NVPtr pNv = (NVPtr)pVga->MMIOBase;
81 VGA_WR08(pNv->PVIO, VGA_SEQ_INDEX, index);
82 return (VGA_RD08(pNv->PVIO, VGA_SEQ_DATA));
84 static void NVWriteAttr(vgaHWPtr pVga, CARD8 index, CARD8 value)
86 NVPtr pNv = (NVPtr)pVga->MMIOBase;
89 tmp = VGA_RD08(pNv->PCIO, pVga->IOBase + VGA_IN_STAT_1_OFFSET);
90 if (pVga->paletteEnabled)
94 VGA_WR08(pNv->PCIO, VGA_ATTR_INDEX, index);
95 VGA_WR08(pNv->PCIO, VGA_ATTR_DATA_W, value);
97 static CARD8 NVReadAttr(vgaHWPtr pVga, CARD8 index)
99 NVPtr pNv = (NVPtr)pVga->MMIOBase;
102 tmp = VGA_RD08(pNv->PCIO, pVga->IOBase + VGA_IN_STAT_1_OFFSET);
103 if (pVga->paletteEnabled)
107 VGA_WR08(pNv->PCIO, VGA_ATTR_INDEX, index);
108 return (VGA_RD08(pNv->PCIO, VGA_ATTR_DATA_R));
110 static void NVWriteMiscOut(vgaHWPtr pVga, CARD8 value)
112 NVPtr pNv = (NVPtr)pVga->MMIOBase;
113 VGA_WR08(pNv->PVIO, VGA_MISC_OUT_W, value);
115 static CARD8 NVReadMiscOut(vgaHWPtr pVga)
117 NVPtr pNv = (NVPtr)pVga->MMIOBase;
118 return (VGA_RD08(pNv->PVIO, VGA_MISC_OUT_R));
120 static void NVEnablePalette(vgaHWPtr pVga)
122 NVPtr pNv = (NVPtr)pVga->MMIOBase;
125 tmp = VGA_RD08(pNv->PCIO, pVga->IOBase + VGA_IN_STAT_1_OFFSET);
126 VGA_WR08(pNv->PCIO, VGA_ATTR_INDEX, 0x00);
127 pVga->paletteEnabled = TRUE;
129 static void NVDisablePalette(vgaHWPtr pVga)
131 NVPtr pNv = (NVPtr)pVga->MMIOBase;
134 tmp = VGA_RD08(pNv->PCIO, pVga->IOBase + VGA_IN_STAT_1_OFFSET);
135 VGA_WR08(pNv->PCIO, VGA_ATTR_INDEX, 0x20);
136 pVga->paletteEnabled = FALSE;
138 static void NVWriteDacMask(vgaHWPtr pVga, CARD8 value)
140 NVPtr pNv = (NVPtr)pVga->MMIOBase;
141 VGA_WR08(pNv->PDIO, VGA_DAC_MASK, value);
143 static CARD8 NVReadDacMask(vgaHWPtr pVga)
145 NVPtr pNv = (NVPtr)pVga->MMIOBase;
146 return (VGA_RD08(pNv->PDIO, VGA_DAC_MASK));
148 static void NVWriteDacReadAddr(vgaHWPtr pVga, CARD8 value)
150 NVPtr pNv = (NVPtr)pVga->MMIOBase;
151 VGA_WR08(pNv->PDIO, VGA_DAC_READ_ADDR, value);
153 static void NVWriteDacWriteAddr(vgaHWPtr pVga, CARD8 value)
155 NVPtr pNv = (NVPtr)pVga->MMIOBase;
156 VGA_WR08(pNv->PDIO, VGA_DAC_WRITE_ADDR, value);
158 static void NVWriteDacData(vgaHWPtr pVga, CARD8 value)
160 NVPtr pNv = (NVPtr)pVga->MMIOBase;
161 VGA_WR08(pNv->PDIO, VGA_DAC_DATA, value);
163 static CARD8 NVReadDacData(vgaHWPtr pVga)
165 NVPtr pNv = (NVPtr)pVga->MMIOBase;
166 return (VGA_RD08(pNv->PDIO, VGA_DAC_DATA));
170 NVIsConnected (ScrnInfoPtr pScrn, int output)
172 NVPtr pNv = NVPTR(pScrn);
173 volatile U032 *PRAMDAC = pNv->PRAMDAC0;
174 CARD32 reg52C, reg608;
177 xf86DrvMsg(pScrn->scrnIndex, X_INFO,
178 "Probing for analog device on output %s...\n",
181 if(output) PRAMDAC += 0x800;
183 reg52C = PRAMDAC[0x052C/4];
184 reg608 = PRAMDAC[0x0608/4];
186 PRAMDAC[0x0608/4] = reg608 & ~0x00010000;
188 PRAMDAC[0x052C/4] = reg52C & 0x0000FEEE;
190 PRAMDAC[0x052C/4] |= 1;
192 pNv->PRAMDAC0[0x0610/4] = 0x94050140;
193 pNv->PRAMDAC0[0x0608/4] |= 0x00001000;
197 present = (PRAMDAC[0x0608/4] & (1 << 28)) ? TRUE : FALSE;
200 xf86DrvMsg(pScrn->scrnIndex, X_PROBED, " ...found one\n");
202 xf86DrvMsg(pScrn->scrnIndex, X_PROBED, " ...can't find one\n");
204 pNv->PRAMDAC0[0x0608/4] &= 0x0000EFFF;
206 PRAMDAC[0x052C/4] = reg52C;
207 PRAMDAC[0x0608/4] = reg608;
213 NVSelectHeadRegisters(ScrnInfoPtr pScrn, int head)
215 NVPtr pNv = NVPTR(pScrn);
218 pNv->PCIO = pNv->PCIO0 + 0x2000;
219 pNv->PCRTC = pNv->PCRTC0 + 0x800;
220 pNv->PRAMDAC = pNv->PRAMDAC0 + 0x800;
221 pNv->PDIO = pNv->PDIO0 + 0x2000;
223 pNv->PCIO = pNv->PCIO0;
224 pNv->PCRTC = pNv->PCRTC0;
225 pNv->PRAMDAC = pNv->PRAMDAC0;
226 pNv->PDIO = pNv->PDIO0;
231 NVProbeDDC (ScrnInfoPtr pScrn, int bus)
233 NVPtr pNv = NVPTR(pScrn);
234 xf86MonPtr MonInfo = NULL;
236 if(!pNv->I2C) return NULL;
238 pNv->DDCBase = bus ? 0x36 : 0x3e;
240 xf86DrvMsg(pScrn->scrnIndex, X_INFO,
241 "Probing for EDID on I2C bus %s...\n", bus ? "B" : "A");
243 if ((MonInfo = xf86DoEDID_DDC2(pScrn->scrnIndex, pNv->I2C))) {
244 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
245 "DDC detected a %s:\n", MonInfo->features.input_type ?
247 xf86PrintEDID( MonInfo );
249 xf86DrvMsg(pScrn->scrnIndex, X_INFO,
250 " ... none found\n");
256 static void nv4GetConfig (NVPtr pNv)
258 if (pNv->PFB[0x0000/4] & 0x00000100) {
259 pNv->RamAmountKBytes = ((pNv->PFB[0x0000/4] >> 12) & 0x0F) * 1024 * 2
262 switch (pNv->PFB[0x0000/4] & 0x00000003) {
264 pNv->RamAmountKBytes = 1024 * 32;
267 pNv->RamAmountKBytes = 1024 * 4;
270 pNv->RamAmountKBytes = 1024 * 8;
274 pNv->RamAmountKBytes = 1024 * 16;
278 pNv->CrystalFreqKHz = (pNv->PEXTDEV[0x0000/4] & 0x00000040) ? 14318 : 13500;
279 pNv->CURSOR = &(pNv->PRAMIN[0x1E00]);
280 pNv->MinVClockFreqKHz = 12000;
281 pNv->MaxVClockFreqKHz = 350000;
284 static void nv10GetConfig (NVPtr pNv)
286 CARD32 implementation = pNv->Chipset & 0x0ff0;
288 #if X_BYTE_ORDER == X_BIG_ENDIAN
289 /* turn on big endian register access */
290 if(!(pNv->PMC[0x0004/4] & 0x01000001)) {
291 pNv->PMC[0x0004/4] = 0x01000001;
296 if(implementation == CHIPSET_NFORCE) {
297 int amt = pciReadLong(pciTag(0, 0, 1), 0x7C);
298 pNv->RamAmountKBytes = (((amt >> 6) & 31) + 1) * 1024;
299 } else if(implementation == CHIPSET_NFORCE2) {
300 int amt = pciReadLong(pciTag(0, 0, 1), 0x84);
301 pNv->RamAmountKBytes = (((amt >> 4) & 127) + 1) * 1024;
303 pNv->RamAmountKBytes = (pNv->PFB[0x020C/4] & 0xFFF00000) >> 10;
306 if(pNv->RamAmountKBytes > 256*1024)
307 pNv->RamAmountKBytes = 256*1024;
309 pNv->CrystalFreqKHz = (pNv->PEXTDEV[0x0000/4] & (1 << 6)) ? 14318 : 13500;
311 if(pNv->twoHeads && (implementation != CHIPSET_NV11))
313 if(pNv->PEXTDEV[0x0000/4] & (1 << 22))
314 pNv->CrystalFreqKHz = 27000;
317 pNv->CURSOR = NULL; /* can't set this here */
318 pNv->MinVClockFreqKHz = 12000;
319 pNv->MaxVClockFreqKHz = pNv->twoStagePLL ? 400000 : 350000;
323 NVCommonSetup(ScrnInfoPtr pScrn)
325 NVPtr pNv = NVPTR(pScrn);
326 vgaHWPtr pVga = VGAHWPTR(pScrn);
327 CARD16 implementation = pNv->Chipset & 0x0ff0;
328 xf86MonPtr monitorA, monitorB;
332 int FlatPanel = -1; /* really means the CRTC is slaved */
333 Bool Television = FALSE;
336 * Override VGA I/O routines.
338 pVga->writeCrtc = NVWriteCrtc;
339 pVga->readCrtc = NVReadCrtc;
340 pVga->writeGr = NVWriteGr;
341 pVga->readGr = NVReadGr;
342 pVga->writeAttr = NVWriteAttr;
343 pVga->readAttr = NVReadAttr;
344 pVga->writeSeq = NVWriteSeq;
345 pVga->readSeq = NVReadSeq;
346 pVga->writeMiscOut = NVWriteMiscOut;
347 pVga->readMiscOut = NVReadMiscOut;
348 pVga->enablePalette = NVEnablePalette;
349 pVga->disablePalette = NVDisablePalette;
350 pVga->writeDacMask = NVWriteDacMask;
351 pVga->readDacMask = NVReadDacMask;
352 pVga->writeDacWriteAddr = NVWriteDacWriteAddr;
353 pVga->writeDacReadAddr = NVWriteDacReadAddr;
354 pVga->writeDacData = NVWriteDacData;
355 pVga->readDacData = NVReadDacData;
357 * Note: There are different pointers to the CRTC/AR and GR/SEQ registers.
358 * Bastardize the intended uses of these to make it work.
360 pVga->MMIOBase = (CARD8 *)pNv;
361 pVga->MMIOOffset = 0;
363 pNv->REGS = xf86MapPciMem(pScrn->scrnIndex,
364 VIDMEM_MMIO | VIDMEM_READSIDEEFFECT,
365 pNv->PciTag, pNv->IOAddress, 0x01000000);
367 pNv->PRAMIN = pNv->REGS + (NV_PRAMIN_OFFSET/4);
368 pNv->PCRTC0 = pNv->REGS + (NV_PCRTC0_OFFSET/4);
369 pNv->PRAMDAC0 = pNv->REGS + (NV_PRAMDAC0_OFFSET/4);
370 pNv->PFB = pNv->REGS + (NV_PFB_OFFSET/4);
371 pNv->PFIFO = pNv->REGS + (NV_PFIFO_OFFSET/4);
372 pNv->PGRAPH = pNv->REGS + (NV_PGRAPH_OFFSET/4);
373 pNv->PEXTDEV = pNv->REGS + (NV_PEXTDEV_OFFSET/4);
374 pNv->PTIMER = pNv->REGS + (NV_PTIMER_OFFSET/4);
375 pNv->PMC = pNv->REGS + (NV_PMC_OFFSET/4);
377 /* 8 bit registers */
378 pNv->PCIO0 = (U008*)pNv->REGS + NV_PCIO0_OFFSET;
379 pNv->PDIO0 = (U008*)pNv->REGS + NV_PDIO0_OFFSET;
380 pNv->PVIO = (U008*)pNv->REGS + NV_PVIO_OFFSET;
381 pNv->PROM = (U008*)pNv->REGS + NV_PROM_OFFSET;
383 pNv->twoHeads = (pNv->Architecture >= NV_ARCH_10) &&
384 (implementation != CHIPSET_NV10) &&
385 (implementation != CHIPSET_NV15) &&
386 (implementation != CHIPSET_NFORCE) &&
387 (implementation != CHIPSET_NV20);
389 pNv->fpScaler = (pNv->FpScale && pNv->twoHeads && (implementation!=CHIPSET_NV11));
391 pNv->twoStagePLL = (implementation == CHIPSET_NV31) ||
392 (implementation == CHIPSET_NV36) ||
393 (pNv->Architecture >= NV_ARCH_40);
395 pNv->WaitVSyncPossible = (pNv->Architecture >= NV_ARCH_10) &&
396 (implementation != CHIPSET_NV10);
398 pNv->BlendingPossible = ((pNv->Chipset & 0xffff) != CHIPSET_NV04);
400 /* look for known laptop chips */
401 /* FIXME we could add some ids here (0x0167) */
402 switch(pNv->Chipset & 0xffff) {
455 /* Parse the bios to initialize the card */
456 NVSelectHeadRegisters(pScrn, 0);
458 /* reset PFIFO and PGRAPH, then power up all the card units */
459 /* pNv->PMC[0x200]=0x17110013;
461 pNv->PMC[0x200]=0x17111113;
463 if(pNv->Architecture == NV_ARCH_04)
468 NVSelectHeadRegisters(pScrn, 0);
470 NVLockUnlock(pNv, 0);
474 pNv->Television = FALSE;
478 if((monitorA = NVProbeDDC(pScrn, 0))) {
479 FlatPanel = monitorA->features.input_type ? 1 : 0;
481 /* NV4 doesn't support FlatPanels */
482 if((pNv->Chipset & 0x0fff) <= CHIPSET_NV04)
485 VGA_WR08(pNv->PCIO, 0x03D4, 0x28);
486 if(VGA_RD08(pNv->PCIO, 0x03D5) & 0x80) {
487 VGA_WR08(pNv->PCIO, 0x03D4, 0x33);
488 if(!(VGA_RD08(pNv->PCIO, 0x03D5) & 0x01))
494 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
495 "HW is currently programmed for %s\n",
496 FlatPanel ? (Television ? "TV" : "DFP") : "CRT");
499 if(pNv->FlatPanel == -1) {
500 pNv->FlatPanel = FlatPanel;
501 pNv->Television = Television;
503 xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
504 "Forcing display type to %s as specified\n",
505 pNv->FlatPanel ? "DFP" : "CRT");
508 CARD8 outputAfromCRTC, outputBfromCRTC;
510 CARD8 slaved_on_A, slaved_on_B;
511 Bool analog_on_A, analog_on_B;
515 if(implementation != CHIPSET_NV11) {
516 if(pNv->PRAMDAC0[0x0000052C/4] & 0x100)
520 if(pNv->PRAMDAC0[0x0000252C/4] & 0x100)
524 analog_on_A = NVIsConnected(pScrn, 0);
525 analog_on_B = NVIsConnected(pScrn, 1);
533 VGA_WR08(pNv->PCIO, 0x03D4, 0x44);
534 cr44 = VGA_RD08(pNv->PCIO, 0x03D5);
537 VGA_WR08(pNv->PCIO, 0x03D5, 3);
538 NVSelectHeadRegisters(pScrn, 1);
539 NVLockUnlock(pNv, 0);
541 VGA_WR08(pNv->PCIO, 0x03D4, 0x28);
542 slaved_on_B = VGA_RD08(pNv->PCIO, 0x03D5) & 0x80;
544 VGA_WR08(pNv->PCIO, 0x03D4, 0x33);
545 tvB = !(VGA_RD08(pNv->PCIO, 0x03D5) & 0x01);
548 VGA_WR08(pNv->PCIO, 0x03D4, 0x44);
549 VGA_WR08(pNv->PCIO, 0x03D5, 0);
550 NVSelectHeadRegisters(pScrn, 0);
551 NVLockUnlock(pNv, 0);
553 VGA_WR08(pNv->PCIO, 0x03D4, 0x28);
554 slaved_on_A = VGA_RD08(pNv->PCIO, 0x03D5) & 0x80;
556 VGA_WR08(pNv->PCIO, 0x03D4, 0x33);
557 tvA = !(VGA_RD08(pNv->PCIO, 0x03D5) & 0x01);
560 oldhead = pNv->PCRTC0[0x00000860/4];
561 pNv->PCRTC0[0x00000860/4] = oldhead | 0x00000010;
563 monitorA = NVProbeDDC(pScrn, 0);
564 monitorB = NVProbeDDC(pScrn, 1);
566 if(slaved_on_A && !tvA) {
569 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
570 "CRTC 0 is currently programmed for DFP\n");
572 if(slaved_on_B && !tvB) {
575 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
576 "CRTC 1 is currently programmed for DFP\n");
579 CRTCnumber = outputAfromCRTC;
581 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
582 "CRTC %i appears to have a CRT attached\n", CRTCnumber);
585 CRTCnumber = outputBfromCRTC;
587 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
588 "CRTC %i appears to have a CRT attached\n", CRTCnumber);
594 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
595 "CRTC 0 is currently programmed for TV\n");
601 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
602 "CRTC 1 is currently programmed for TV\n");
605 FlatPanel = monitorA->features.input_type ? 1 : 0;
608 FlatPanel = monitorB->features.input_type ? 1 : 0;
611 if(pNv->FlatPanel == -1) {
612 if(FlatPanel != -1) {
613 pNv->FlatPanel = FlatPanel;
614 pNv->Television = Television;
616 xf86DrvMsg(pScrn->scrnIndex, X_INFO,
617 "Unable to detect display type...\n");
619 xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT,
620 "...On a laptop, assuming DFP\n");
623 xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT,
624 "...Using default of CRT\n");
629 xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
630 "Forcing display type to %s as specified\n",
631 pNv->FlatPanel ? "DFP" : "CRT");
634 if(pNv->CRTCnumber == -1) {
635 if(CRTCnumber != -1) pNv->CRTCnumber = CRTCnumber;
637 xf86DrvMsg(pScrn->scrnIndex, X_INFO,
638 "Unable to detect which CRTCNumber...\n");
639 if(pNv->FlatPanel) pNv->CRTCnumber = 1;
640 else pNv->CRTCnumber = 0;
641 xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT,
642 "...Defaulting to CRTCNumber %i\n", pNv->CRTCnumber);
645 xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
646 "Forcing CRTCNumber %i as specified\n", pNv->CRTCnumber);
650 if((monitorA->features.input_type && pNv->FlatPanel) ||
651 (!monitorA->features.input_type && !pNv->FlatPanel))
664 if((monitorB->features.input_type && !pNv->FlatPanel) ||
665 (!monitorB->features.input_type && pNv->FlatPanel))
674 if(implementation == CHIPSET_NV11)
675 cr44 = pNv->CRTCnumber * 0x3;
677 pNv->PCRTC0[0x00000860/4] = oldhead;
679 VGA_WR08(pNv->PCIO, 0x03D4, 0x44);
680 VGA_WR08(pNv->PCIO, 0x03D5, cr44);
681 NVSelectHeadRegisters(pScrn, pNv->CRTCnumber);
684 xf86DrvMsg(pScrn->scrnIndex, X_INFO,
685 "Using %s on CRTC %i\n",
686 pNv->FlatPanel ? (pNv->Television ? "TV" : "DFP") : "CRT",
689 if(pNv->FlatPanel && !pNv->Television) {
690 pNv->fpWidth = pNv->PRAMDAC[0x0820/4] + 1;
691 pNv->fpHeight = pNv->PRAMDAC[0x0800/4] + 1;
692 pNv->fpSyncs = pNv->PRAMDAC[0x0848/4] & 0x30000033;
693 xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Panel size is %i x %i\n",
694 pNv->fpWidth, pNv->fpHeight);
698 xf86SetDDCproperties(pScrn, monitorA);
700 if(!pNv->FlatPanel || (pScrn->depth != 24) || !pNv->twoHeads)
701 pNv->FPDither = FALSE;
704 if(pNv->FlatPanel && pNv->twoHeads) {
705 pNv->PRAMDAC0[0x08B0/4] = 0x00010004;
706 if(pNv->PRAMDAC0[0x08B4/4] & 1)
708 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel is %s\n",
709 pNv->LVDS ? "LVDS" : "TMDS");