summaryrefslogtreecommitdiff
path: root/xc/programs/Xserver/hw/xfree86/drivers/nv/nv_driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'xc/programs/Xserver/hw/xfree86/drivers/nv/nv_driver.c')
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/nv/nv_driver.c211
1 files changed, 117 insertions, 94 deletions
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/nv/nv_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/nv/nv_driver.c
index 844dcb1fe..19b4a8126 100644
--- a/xc/programs/Xserver/hw/xfree86/drivers/nv/nv_driver.c
+++ b/xc/programs/Xserver/hw/xfree86/drivers/nv/nv_driver.c
@@ -24,7 +24,7 @@
/* Hacked together from mga driver and 3.3.4 NVIDIA driver by Jarno Paananen
<jpaana@s2.org> */
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/nv_driver.c,v 1.49 2000/11/03 18:46:12 eich Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/nv_driver.c,v 1.50 2000/11/16 19:44:59 eich Exp $ */
#include "nv_include.h"
@@ -668,6 +668,81 @@ NVValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
return (MODE_OK);
}
+static xf86MonPtr
+nvDoDDC2(ScrnInfoPtr pScrn)
+{
+ NVPtr pNv = NVPTR(pScrn);
+ xf86MonPtr MonInfo = NULL;
+
+ if (!pNv->i2cInit) return NULL;
+
+ /* - DDC can use I2C bus */
+ /* Load I2C if we have the code to use it */
+ if ( xf86LoadSubModule(pScrn, "i2c") ) {
+ xf86LoaderReqSymLists(i2cSymbols,NULL);
+ if (pNv->i2cInit(pScrn)) {
+ DEBUG(ErrorF("I2C initialized on %p\n",pNv->I2C));
+ if ((MonInfo = xf86DoEDID_DDC2(pScrn->scrnIndex,pNv->I2C))) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DDC Monitor info: %p\n",
+ MonInfo);
+ xf86PrintEDID( MonInfo );
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "end of DDC Monitor "
+ "info\n\n");
+ xf86SetDDCproperties(pScrn,MonInfo);
+ }
+ }
+ }
+ return MonInfo;
+}
+
+static xf86MonPtr
+nvDoDDC1(ScrnInfoPtr pScrn)
+{
+ NVPtr pNv = NVPTR(pScrn);
+ xf86MonPtr MonInfo = NULL;
+
+ if (!pNv->ddc1Read || !pNv->DDC1SetSpeed) return NULL;
+ if (!pNv->Primary
+ && (pNv->DDC1SetSpeed == vgaHWddc1SetSpeed)) return NULL;
+
+ if ((MonInfo = xf86DoEDID_DDC1(pScrn->scrnIndex, pNv->DDC1SetSpeed,
+ pNv->ddc1Read ))) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DDC Monitor info: %p\n",
+ MonInfo);
+ xf86PrintEDID( MonInfo );
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "end of DDC Monitor info\n\n");
+ xf86SetDDCproperties(pScrn,MonInfo);
+ }
+ return MonInfo;
+}
+
+static xf86MonPtr
+nvDoDDCVBE(ScrnInfoPtr pScrn)
+{
+ NVPtr pNv = NVPTR(pScrn);
+ xf86MonPtr MonInfo = NULL;
+ vbeInfoPtr pVbe;
+
+ if (xf86LoadSubModule(pScrn, "vbe")) {
+ xf86LoaderReqSymLists(vbeSymbols,NULL);
+ pVbe = VBEInit(pNv->pInt,pNv->pEnt->index);
+ if (pVbe) {
+ if ((MonInfo = vbeDoEDID(pVbe,NULL))) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DDC Monitor info: %p\n",
+ MonInfo);
+ xf86PrintEDID( MonInfo );
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "end of DDC Monitor info\n\n");
+ xf86SetDDCproperties(pScrn,MonInfo);
+ }
+ vbeFree(pVbe);
+ } else
+ xf86FreeInt10(pNv->pInt);
+ pNv->pInt = NULL;
+ }
+ return MonInfo;
+}
+
+
/* Internally used */
static xf86MonPtr
NVdoDDC(ScrnInfoPtr pScrn)
@@ -676,51 +751,18 @@ NVdoDDC(ScrnInfoPtr pScrn)
NVPtr pNv;
NVRamdacPtr NVdac;
xf86MonPtr MonInfo = NULL;
-#if 0
- vbeInfoPtr pVbe;
-#endif
+
hwp = VGAHWPTR(pScrn);
pNv = NVPTR(pScrn);
NVdac = &pNv->Dac;
/* Load DDC if we have the code to use it */
- /* This gives us DDC1 */
- if (xf86LoadSubModule(pScrn, "ddc")) {
- xf86LoaderReqSymLists(ddcSymbols, NULL);
- } else {
- /* ddc module not found, we can do without it */
- pNv->ddc1Read = NULL;
-
- /* Without DDC, we have no use for the I2C bus */
- pNv->i2cInit = NULL;
- return NULL;
- }
-#if 0 /* for some reason vbe messes up modes */
- if (xf86LoadSubModule(pScrn, "vbe")) {
- xf86LoaderReqSymLists(vbeSymbols,NULL);
- pVbe = VBEInit(pNv->pInt,pNv->pEnt->index);
- if (pVbe) {
- MonInfo = xf86PrintEDID(vbeDoEDID(pVbe,NULL));
- vbeFree(pVbe);
- if (MonInfo) {
- xf86SetDDCproperties(pScrn,MonInfo);
- return MonInfo;
- }
- }
- }
-#endif
- if (pNv->pInt)
- xf86FreeInt10(pNv->pInt);
- pNv->pInt = NULL;
- if (!pNv->Primary) {
- /* XXX Need to write an NV mode ddc1SetSpeed */
- if (pNv->DDC1SetSpeed == vgaHWddc1SetSpeed) {
- pNv->DDC1SetSpeed = NULL;
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 2,
- "DDC1 disabled - chip not in VGA mode\n");
- }
- }
+ if (!xf86LoadSubModule(pScrn, "ddc")) return NULL;
+
+ xf86LoaderReqSymLists(ddcSymbols, NULL);
+
+ /* if ((MonInfo = nvDoDDCVBE(pScrn))) return MonInfo; */
/* Save the current state */
NVSave(pScrn);
@@ -729,48 +771,10 @@ NVdoDDC(ScrnInfoPtr pScrn)
vgaHWUnlock(hwp);
pNv->riva.LockUnlock(&pNv->riva, 0);
- /* It is now safe to talk to the card */
-#if NVuseI2C
- /* - DDC can use I2C bus */
- /* Load I2C if we have the code to use it */
- if (pNv->i2cInit) {
- if ( xf86LoadSubModule(pScrn, "i2c") ) {
- xf86LoaderReqSymLists(i2cSymbols,NULL);
- } else {
- /* i2c module not found, we can do without it */
- pNv->i2cInit = NULL;
- pNv->I2C = NULL;
- }
- }
-
- /* Initialize I2C bus - used by DDC if available */
- if (pNv->i2cInit) {
- pNv->i2cInit(pScrn);
-#if 0
- ErrorF("I2C initialized on %p\n",pNv->I2C);
-#endif
- }
- /* Read and output monitor info using DDC2 over I2C bus */
- if (pNv->I2C) {
- MonInfo = xf86DoEDID_DDC2(pScrn->scrnIndex,pNv->I2C);
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "I2C Monitor info: %p\n", MonInfo);
-
- xf86PrintEDID(MonInfo);
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "end of I2C Monitor info\n\n");
- }
- if (!MonInfo)
-#endif /* NVuseI2C */
- /* Read and output monitor info using DDC1 */
- if (pNv->ddc1Read && pNv->DDC1SetSpeed) {
-#if 0
- MonInfo = xf86DoEDID_DDC1(pScrn->scrnIndex, pNv->DDC1SetSpeed,
- pNv->ddc1Read );
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DDC Monitor info: %p\n",
- MonInfo);
- xf86PrintEDID( MonInfo );
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "end of DDC Monitor info\n\n");
+ if ((MonInfo = nvDoDDC2(pScrn))) return MonInfo;
+#if 0 /* disable for now - causes problems on AXP */
+ if ((MonInfo = nvDoDDC1(pScrn))) return MonInfo;
#endif
- }
/* Restore previous state */
NVRestore(pScrn);
@@ -779,6 +783,17 @@ NVdoDDC(ScrnInfoPtr pScrn)
return MonInfo;
}
+static void
+nvProbeDDC(ScrnInfoPtr pScrn, int index)
+{
+ vbeInfoPtr pVbe;
+
+ if (xf86LoadSubModule(pScrn, "vbe")) {
+ pVbe = VBEInit(NULL,index);
+ ConfiguredMonitor = vbeDoEDID(pVbe, NULL);
+ }
+}
+
/* Mandatory */
Bool
NVPreInit(ScrnInfoPtr pScrn, int flags)
@@ -792,7 +807,11 @@ NVPreInit(ScrnInfoPtr pScrn, int flags)
const char *reqSym = NULL;
const char *s;
- if (flags & PROBE_DETECT) return FALSE;
+ if (flags & PROBE_DETECT) {
+ nvProbeDDC( pScrn, xf86GetEntityInfo(pScrn->entityList[0])->index );
+ return TRUE;
+ }
+
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NVPreInit\n"));
/*
@@ -1611,18 +1630,22 @@ NVScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
/* Setup the visuals we support. */
- if (pScrn->bitsPerPixel > 8) {
- if (!miSetVisualTypes(pScrn->depth, TrueColorMask, pScrn->rgbBits,
- pScrn->defaultVisual))
- return FALSE;
- } else {
- if (!miSetVisualTypes(pScrn->depth,
- miGetDefaultVisualMask(pScrn->depth),
- pScrn->rgbBits, pScrn->defaultVisual))
- return FALSE;
- if (!miSetPixmapDepths ())
- return FALSE;
- }
+#ifndef NV_USE_FB
+ if (pScrn->bitsPerPixel > 8) {
+ if (!miSetVisualTypes(pScrn->depth, TrueColorMask, pScrn->rgbBits,
+ pScrn->defaultVisual))
+ return FALSE;
+ } else
+#endif
+ {
+ if (!miSetVisualTypes(pScrn->depth,
+ miGetDefaultVisualMask(pScrn->depth),
+ pScrn->rgbBits, pScrn->defaultVisual))
+ return FALSE;
+ }
+#ifdef NV_USE_FB
+ if (!miSetPixmapDepths ()) return FALSE;
+#endif
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Visuals set up\n"));