A couple of Xnvidia patches

Scott Zuk <szuk-sK6dKysfGH7D0D/[email protected]>
Newsgroups gmane.comp.freedesktop.xserver
Message-ID <[email protected]>
Hi,

I'm pretty new to this whole xserver thing but I've been playing around with 
the source to get a bit of an idea of how things work.  Anyway, here's two 
patches for the Xnvidia driver that are hopefully useful.  I've only tested 
them with my GeForce2 MX though but things seem okay.

The first patch adds device id detection and the second adds framebuffer 
support instead of just vesa.  Most of the code was taken from the current 
Xati driver and the device id list came from the fdo cvs xfree86 nv driver.  
Not sure if that needs to be added to the copyright headers though...  
Comments?

~Scott
patch1-nvidia-deviddetect.diff (text/x-diff, 7.2 KB)
--- xserver/hw/kdrive/nvidia/nvidia.c	2003-11-02 12:56:10.000000000 -0700
+++ xserver/hw/kdrive/nvidia/nvidia.c	2004-03-03 16:03:39.000000000 -0700
@@ -28,25 +28,176 @@
 #include "nvidia.h"
 #include <sys/io.h>
 
+struct pci_id_entry nvidia_pci_ids[] = {
+    {0x12D2, 0x0018, "RIVA 128"},
+    {0x10DE, 0x0020, "RIVA TNT"},
+    {0x10DE, 0x0028, "RIVA TNT2"},
+    {0x10DE, 0x002A, "Unknown TNT2"},
+    {0x10DE, 0x002C, "Vanta"},
+    {0x10DE, 0x0029, "RIVA TNT2 Ultra"},
+    {0x10DE, 0x002D, "RIVA TNT2 Model 64"},
+    {0x10DE, 0x00A0, "Aladdin TNT2"},
+    {0x10DE, 0x0100, "GeForce 256"},
+    {0x10DE, 0x0101, "GeForce DDR"},
+    {0x10DE, 0x0103, "Quadro"},
+    {0x10DE, 0x0110, "GeForce2 MX/MX 400"},
+    {0x10DE, 0x0111, "GeForce2 MX 100/200"},
+    {0x10DE, 0x0112, "GeForce2 Go"},
+    {0x10DE, 0x0113, "Quadro2 MXR/EX/Go"},
+    {0x10DE, 0x01A0, "GeForce2 Integrated GPU"},
+    {0x10DE, 0x0150, "GeForce2 GTS"},
+    {0x10DE, 0x0151, "GeForce2 Ti"},
+    {0x10DE, 0x0152, "GeForce2 Ultra"},
+    {0x10DE, 0x0153, "Quadro2 Pro"},
+    {0x10DE, 0x0170, "GeForce4 MX 460"},
+    {0x10DE, 0x0171, "GeForce4 MX 440"},
+    {0x10DE, 0x0172, "GeForce4 MX 420"},
+    {0x10DE, 0x0173, "GeForce4 MX 440-SE"},
+    {0x10DE, 0x0174, "GeForce4 440 Go"},
+    {0x10DE, 0x0175, "GeForce4 420 Go"},
+    {0x10DE, 0x0176, "GeForce4 420 Go 32M"},
+    {0x10DE, 0x0177, "GeForce4 460 Go"},
+#if defined(__powerpc__)
+    {0x10DE, 0x0179, "GeForce4 MX (Mac)"},
+#else
+    {0x10DE, 0x0179, "GeForce4 440 Go 64M"},
+#endif
+    {0x10DE, 0x017D, "GeForce4 410 Go 16M"},
+    {0x10DE, 0x017C, "Quadro4 500 GoGL"},
+    {0x10DE, 0x0178, "Quadro4 550 XGL"},
+    {0x10DE, 0x017A, "Quadro4 NVS"},
+    {0x10DE, 0x0181, "GeForce4 MX 440 with AGP8X"},
+    {0x10DE, 0x0182, "GeForce4 MX 440SE with AGP8X"},
+    {0x10DE, 0x0183, "GeForce4 MX 420 with AGP8X"},
+    {0x10DE, 0x0186, "GeForce4 448 Go"},
+    {0x10DE, 0x0187, "GeForce4 488 Go"},
+    {0x10DE, 0x0188, "Quadro4 580 XGL"},
+#if defined(__powerpc__)
+    {0x10DE, 0x0189, "Geforce4 MX with AGP8x (Mac)"},
+#endif
+    {0x10DE, 0x018A, "Quadro4 280 NVS"},
+    {0x10DE, 0x018B, "Quadro4 380 XGL"},
+    {0x10DE, 0x01F0, "GeForce4 MX Integrated GPU"},
+    {0x10DE, 0x0200, "GeForce3"},
+    {0x10DE, 0x0201, "GeForce3 Ti 200"},
+    {0x10DE, 0x0202, "GeForce3 Ti 500"},
+    {0x10DE, 0x0203, "Quadro DCC"},
+    {0x10DE, 0x0250, "GeForce4 Ti 4600"},
+    {0x10DE, 0x0251, "GeForce4 Ti 4400"},
+    {0x10DE, 0x0252, "0x0252"},
+    {0x10DE, 0x0253, "GeForce4 Ti 4200"},
+    {0x10DE, 0x0258, "Quadro4 900 XGL"},
+    {0x10DE, 0x0259, "Quadro4 750 XGL"},
+    {0x10DE, 0x025B, "Quadro4 700 XGL"},
+    {0x10DE, 0x0280, "GeForce4 Ti 4800"},
+    {0x10DE, 0x0281, "GeForce4 Ti 4200 with AGP8X"},
+    {0x10DE, 0x0282, "GeForce4 Ti 4800 SE"},
+    {0x10DE, 0x0286, "GeForce4 4200 Go"},
+    {0x10DE, 0x028C, "Quadro4 700 GoGL"},
+    {0x10DE, 0x0288, "Quadro4 980 XGL"},
+    {0x10DE, 0x0289, "Quadro4 780 XGL"},
+    {0x10DE, 0x0301, "GeForce FX 5800 Ultra"},
+    {0x10DE, 0x0302, "GeForce FX 5800"},
+    {0x10DE, 0x0308, "Quadro FX 2000"},
+    {0x10DE, 0x0309, "Quadro FX 1000"},
+    {0x10DE, 0x0311, "GeForce FX 5600 Ultra"},
+    {0x10DE, 0x0312, "GeForce FX 5600"},
+    {0x10DE, 0x0313, "0x0313"},
+    {0x10DE, 0x0314, "GeForce FX 5600SE"},
+    {0x10DE, 0x0316, "0x0316"},
+    {0x10DE, 0x0317, "0x0317"},
+    {0x10DE, 0x031A, "GeForce FX Go5600"},
+    {0x10DE, 0x031B, "GeForce FX Go5650"},
+    {0x10DE, 0x031C, "Quadro FX Go700"},
+    {0x10DE, 0x031D, "0x031D"},
+    {0x10DE, 0x031E, "0x031E"},
+    {0x10DE, 0x031F, "0x031F"},
+    {0x10DE, 0x0320, "GeForce FX 5200"},
+    {0x10DE, 0x0321, "GeForce FX 5200 Ultra"},
+    {0x10DE, 0x0322, "GeForce FX 5200"},
+    {0x10DE, 0x0323, "GeForce FX 5200SE"},
+    {0x10DE, 0x0324, "GeForce FX Go5200"},
+    {0x10DE, 0x0325, "GeForce FX Go5250"},
+    {0x10DE, 0x0328, "GeForce FX Go5200 32M/64M"},
+#if defined(__powerpc__)
+    {0x10DE, 0x0329, "GeForce FX 5200 (Mac)"},
+#else
+    {0x10DE, 0x0329, "0x0329" },
+#endif
+    {0x10DE, 0x032A, "Quadro NVS 280 PCI"},
+    {0x10DE, 0x032B, "Quadro FX 500"},
+    {0x10DE, 0x032C, "GeForce FX Go5300"},
+    {0x10DE, 0x032D, "GeForce FX Go5100"},
+    {0x10DE, 0x032F, "0x032F"},
+    {0x10DE, 0x0330, "GeForce FX 5900 Ultra"},
+    {0x10DE, 0x0331, "GeForce FX 5900"},
+    {0x10DE, 0x0332, "GeForce FX 5900XT"},
+    {0x10DE, 0x0333, "GeForce FX 5950 Ultra"},
+    {0x10DE, 0x0334, "0x0334"},
+    {0x10DE, 0x0338, "Quadro FX 3000"},
+    {0x10DE, 0x0341, "GeForce FX 5700 Ultra"},
+    {0x10DE, 0x0342, "GeForce FX 5700"},
+    {0x10DE, 0x0343, "GeForce FX 5700LE"},
+    {0x10DE, 0x0344, "GeForce FX 5700VE"},
+    {0x10DE, 0x0345, "0x0345"},
+    {0x10DE, 0x0347, "GeForce FX Go5700"},
+    {0x10DE, 0x0348, "GeForce FX Go5700"},
+    {0x10DE, 0x0349, "0x0349"},
+    {0x10DE, 0x034B, "0x034B"},
+    {0x10DE, 0x034C, "Quadro FX Go1000"},
+    {0x10DE, 0x034E, "Quadro FX 1100"},
+    {0x10DE, 0x034F, "0x034F"},
+    {0, 0, NULL}
+};
+
+static char *
+make_busid(KdCardAttr *attr)
+{
+    char *busid;
+
+    busid = xalloc(20);
+    if (busid == NULL)
+	return NULL;
+    snprintf(busid, 20, "pci:%04x:%02x:%02x.%d", attr->domain, attr->bus,
+	attr->slot, attr->func);
+    return busid;
+}
+
 static Bool
 nvidiaCardInit (KdCardInfo *card)
 {
     NvidiaCardInfo	*nvidiac;
+    int i;
 
     nvidiac = (NvidiaCardInfo *) xalloc (sizeof (NvidiaCardInfo));
     if (!nvidiac)
 	return FALSE;
-    
+
     (void) nvidiaMapReg (card, nvidiac);
-    
+
     if (!vesaInitialize (card, &nvidiac->vesa))
     {
 	xfree (nvidiac);
 	return FALSE;
     }
 
+    nvidiac->busid = make_busid(&card->attr);
+    if (nvidiac->busid == NULL) {
+	xfree(nvidiac);
+	return FALSE;
+    }
+
     card->driver = nvidiac;
-    
+
+    for (i = 0; nvidia_pci_ids[i].name != NULL; i++) {
+	if (nvidia_pci_ids[i].device == card->attr.deviceID) {
+		nvidiac->pci_id = &nvidia_pci_ids[i];
+		break;
+	}
+    }
+
+    ErrorF("Using Nvidia card: %s at %s\n", nvidiac->pci_id->name, nvidiac->busid);
+
     return TRUE;
 }
 
--- xserver/hw/kdrive/nvidia/nvidia.h	2003-11-02 12:56:10.000000000 -0700
+++ xserver/hw/kdrive/nvidia/nvidia.h	2004-03-03 15:54:53.000000000 -0700
@@ -63,6 +63,12 @@ typedef volatile CARD8	VOL8;
 typedef volatile CARD16	VOL16;
 typedef volatile CARD32	VOL32;
 
+struct pci_id_entry {
+    CARD16 vendor;
+    CARD16 device;
+    char *name;
+};
+
 #define NVIDIA_XY(x,y)	    ((x) | ((y) << 16))
 
 typedef struct {
@@ -115,7 +121,9 @@ typedef struct {
 
 typedef struct _nvidiaCardInfo {
     VesaCardPrivRec	vesa;
+    struct pci_id_entry	*pci_id;
     CARD8		*reg_base;
+    char		*busid;
     int			fifo_free;
     int			fifo_size;
     CARD8		*mmio;
--- xserver/hw/kdrive/nvidia/nvidiastub.c	2003-11-17 21:53:16.000000000 -0700
+++ xserver/hw/kdrive/nvidia/nvidiastub.c	2004-03-03 15:58:36.000000000 -0700
@@ -26,14 +26,21 @@
 #include <config.h>
 #endif
 #include "nvidia.h"
+#include "klinux.h"
+
+extern struct pci_id_entry nvidia_pci_ids[];
 
 void
 InitCard (char *name)
 {
+    struct pci_id_entry *id;
     KdCardAttr	attr;
 
-    if (LinuxFindPci (0x10de, 0x0112, 0, &attr))
-	KdCardInfoAdd (&nvidiaFuncs, &attr, 0);
+    for (id = nvidia_pci_ids; id->name != NULL; id++) {
+	int j = 0;
+	while (LinuxFindPci(id->vendor, id->device, j++, &attr))
+		KdCardInfoAdd(&nvidiaFuncs, &attr, 0);
+    }
 }
 
 void
patch2-nvidia-fbsupport.diff (text/x-diff, 14.1 KB)
--- xserver/hw/kdrive/nvidia/nvidiastub.c	2004-03-03 16:32:32.000000000 -0700
+++ xserver/hw/kdrive/nvidia/nvidiastub.c	2004-03-03 17:28:49.000000000 -0700
@@ -59,15 +59,19 @@ void
 ddxUseMsg (void)
 {
     KdUseMsg();
+#ifdef KDRIVEVESA
     vesaUseMsg();
+#endif
 }
 
 int
 ddxProcessArgument (int argc, char **argv, int i)
 {
     int	ret;
-    
+
+#ifdef KDRIVEVESA
     if (!(ret = vesaProcessArgument (argc, argv, i)))
+#endif
 	ret = KdProcessArgument(argc, argv, i);
     return ret;
 }
--- xserver/hw/kdrive/nvidia/nvidia.h	2004-03-03 16:32:32.000000000 -0700
+++ xserver/hw/kdrive/nvidia/nvidia.h	2004-03-03 17:40:25.000000000 -0700
@@ -24,7 +24,16 @@
 
 #ifndef _NVIDIA_H_
 #define _NVIDIA_H_
+
+#include "config.h"
+
+#ifdef KDRIVEFBDEV
+#include <fbdev.h>
+#endif
+#ifdef KDRIVEVESA
 #include <vesa.h>
+#endif
+
 #include "kxv.h"
 #include "klinux.h"
 
@@ -69,6 +78,21 @@ struct pci_id_entry {
     char *name;
 };
 
+struct backend_funcs {
+    void    (*cardfini)(KdCardInfo *);
+    void    (*scrfini)(KdScreenInfo *);
+    Bool    (*initScreen)(ScreenPtr);
+    Bool    (*finishInitScreen)(ScreenPtr pScreen);
+    Bool    (*createRes)(ScreenPtr);
+    void    (*preserve)(KdCardInfo *);
+    void    (*restore)(KdCardInfo *);
+    Bool    (*dpms)(ScreenPtr, int);
+    Bool    (*enable)(ScreenPtr);
+    void    (*disable)(ScreenPtr);
+    void    (*getColors)(ScreenPtr, int, int, xColorItem *);
+    void    (*putColors)(ScreenPtr, int, int, xColorItem *);
+};
+
 #define NVIDIA_XY(x,y)	    ((x) | ((y) << 16))
 
 typedef struct {
@@ -120,7 +144,16 @@ typedef struct {
 } NvidiaBusy;
 
 typedef struct _nvidiaCardInfo {
-    VesaCardPrivRec	vesa;
+    union {
+#ifdef KDRIVEFBDEV
+	FbdevPriv fbdev;
+#endif
+#ifdef KDRIVEVESA
+	VesaCardPrivRec vesa;
+#endif
+    } backend_priv;
+    struct backend_funcs backend_funcs;
+
     struct pci_id_entry	*pci_id;
     CARD8		*reg_base;
     char		*busid;
@@ -131,6 +164,7 @@ typedef struct _nvidiaCardInfo {
     NvidiaRectangle    	*rect;
     NvidiaScreenBlt	*blt;
     NvidiaBusy		*busy;
+    Bool use_fbdev, use_vesa;
 } NvidiaCardInfo;
     
 #define getNvidiaCardInfo(kd)	((NvidiaCardInfo *) ((kd)->card->driver))
@@ -162,7 +196,16 @@ typedef struct _nvidiaPortPriv {
 Bool nvidiaInitVideo(ScreenPtr pScreen);
 
 typedef struct _nvidiaScreenInfo {
-    VesaScreenPrivRec		vesa;
+    union {
+#ifdef KDRIVEFBDEV
+	FbdevScrPriv fbdev;
+#endif
+#ifdef KDRIVEVESA
+	VesaScreenPrivRec vesa;
+#endif
+    } backend_priv;
+    NvidiaCardInfo *nvidiac;
+
     CARD8			*cursor_base;
     CARD8			*screen;
     CARD8			*off_screen;
--- xserver/hw/kdrive/nvidia/nvidia.c	2004-03-03 16:32:32.000000000 -0700
+++ xserver/hw/kdrive/nvidia/nvidia.c	2004-03-04 02:17:22.000000000 -0700
@@ -168,15 +168,50 @@ nvidiaCardInit (KdCardInfo *card)
 {
     NvidiaCardInfo	*nvidiac;
     int i;
+    Bool initialized = FALSE;
 
     nvidiac = (NvidiaCardInfo *) xalloc (sizeof (NvidiaCardInfo));
     if (!nvidiac)
 	return FALSE;
 
-    (void) nvidiaMapReg (card, nvidiac);
+#ifdef KDRIVEFBDEV
+    if (!initialized && fbdevInitialize(card, &nvidiac->backend_priv.fbdev)) {
+	nvidiac->use_fbdev = TRUE;
+	initialized = TRUE;
+	nvidiac->backend_funcs.cardfini = fbdevCardFini;
+	nvidiac->backend_funcs.scrfini = fbdevScreenFini;
+	nvidiac->backend_funcs.initScreen = fbdevInitScreen;
+	nvidiac->backend_funcs.finishInitScreen = fbdevFinishInitScreen;
+	nvidiac->backend_funcs.createRes = fbdevCreateResources;
+	nvidiac->backend_funcs.preserve = fbdevPreserve;
+	nvidiac->backend_funcs.restore = fbdevRestore;
+	nvidiac->backend_funcs.dpms = fbdevDPMS;
+	nvidiac->backend_funcs.enable = fbdevEnable;
+	nvidiac->backend_funcs.disable = fbdevDisable;
+	nvidiac->backend_funcs.getColors = fbdevGetColors;
+	nvidiac->backend_funcs.putColors = fbdevPutColors;
+    }
+#endif
+#ifdef KDRIVEVESA
+    if (!initialized && vesaInitialize(card, &nvidiac->backend_priv.vesa)) {
+	nvidiac->use_vesa = TRUE;
+	initialized = TRUE;
+	nvidiac->backend_funcs.cardfini = vesaCardFini;
+	nvidiac->backend_funcs.scrfini = vesaScreenFini;
+	nvidiac->backend_funcs.initScreen = vesaInitScreen;
+	nvidiac->backend_funcs.finishInitScreen = vesaFinishInitScreen;
+	nvidiac->backend_funcs.createRes = vesaCreateResources;
+	nvidiac->backend_funcs.preserve = vesaPreserve;
+	nvidiac->backend_funcs.restore = vesaRestore;
+	nvidiac->backend_funcs.dpms = vesaDPMS;
+	nvidiac->backend_funcs.enable = vesaEnable;
+	nvidiac->backend_funcs.disable = vesaDisable;
+	nvidiac->backend_funcs.getColors = vesaGetColors;
+	nvidiac->backend_funcs.putColors = vesaPutColors;
+    }
+#endif
 
-    if (!vesaInitialize (card, &nvidiac->vesa))
-    {
+    if (!initialized || !nvidiaMapReg(card, nvidiac)) {
 	xfree (nvidiac);
 	return FALSE;
     }
@@ -204,52 +239,79 @@ nvidiaCardInit (KdCardInfo *card)
 static Bool
 nvidiaScreenInit (KdScreenInfo *screen)
 {
-    NvidiaCardInfo	*nvidiac = screen->card->driver;
+    nvidiaCardInfo(screen);
     NvidiaScreenInfo	*nvidias;
-    int			screen_size, memory;
+    int screen_size = 0, memory = 0;
+    Bool success = FALSE;
 
     nvidias = (NvidiaScreenInfo *) xalloc (sizeof (NvidiaScreenInfo));
     if (!nvidias)
 	return FALSE;
     memset (nvidias, '\0', sizeof (NvidiaScreenInfo));
-    if (!vesaScreenInitialize (screen, &nvidias->vesa))
-    {
-	xfree (nvidias);
-	return FALSE;
-    }
+
+    nvidias->nvidiac = nvidiac;
+
+    screen->driver = nvidias;
+
     if (!nvidiac->reg_base)
 	screen->dumb = TRUE;
-    if (nvidias->vesa.mapping != VESA_LINEAR)
-	screen->dumb = TRUE;
-    nvidias->screen = nvidias->vesa.fb;
-    memory = nvidias->vesa.fb_size;
-    screen_size = screen->fb[0].byteStride * screen->height;
-    if (nvidias->screen && memory >= screen_size + 2048)
-    {
-	memory -= 2048;
-	nvidias->cursor_base = nvidias->screen + memory - 2048;
-    }
-    else
-	nvidias->cursor_base = 0;
-    screen->softCursor = TRUE;	/* XXX for now */
-    memory -= screen_size;
-    if (memory > screen->fb[0].byteStride)
-    {
-	nvidias->off_screen = nvidias->screen + screen_size;
-	nvidias->off_screen_size = memory;
+#ifdef KDRIVEFBDEV
+    if (nvidiac->use_fbdev) {
+	success = fbdevScreenInitialize(screen,
+			&nvidias->backend_priv.fbdev);
+	screen->memory_size = nvidiac->backend_priv.fbdev.fix.smem_len;
+	memory = screen->memory_size;
+	screen_size = nvidiac->backend_priv.fbdev.var.yres_virtual *
+	    screen->fb[0].byteStride;
     }
-    else
-    {
-	nvidias->off_screen = 0;
-	nvidias->off_screen_size = 0;
+#endif
+#ifdef KDRIVEVESA
+    if (nvidiac->use_vesa) {
+	if (screen->fb[0].depth == 0)
+		screen->fb[0].depth = 16;
+	success = vesaScreenInitialize(screen, &nvidias->backend_priv.vesa);
+	if (nvidias->backend_priv.vesa.mapping != VESA_LINEAR)
+		screen->dumb = TRUE;
+	nvidias->screen = nvidias->backend_priv.vesa.fb;
+	memory = nvidias->backend_priv.vesa.fb_size;
+	screen_size = screen->fb[0].byteStride * screen->height;
     }
-    screen->driver = nvidias;
-    return TRUE;
+#endif
+	if (!success)
+	{
+		screen->driver = NULL;
+		xfree (nvidias);
+		return FALSE;
+	}
+
+	if (nvidias->screen && memory >= screen_size + 2048)
+	{
+		memory -= 2048;
+		nvidias->cursor_base = nvidias->screen + memory - 2048;
+	}
+	else
+		nvidias->cursor_base = 0;
+	screen->softCursor = TRUE;	/* XXX for now */
+	memory -= screen_size;
+	if (memory > screen->fb[0].byteStride)
+	{
+		nvidias->off_screen = nvidias->screen + screen_size;
+		nvidias->off_screen_size = memory;
+	}
+	else
+	{
+		nvidias->off_screen = 0;
+		nvidias->off_screen_size = 0;
+	}
+
+	return TRUE;
 }
 
 static Bool
 nvidiaInitScreen (ScreenPtr pScreen)
 {
+    KdScreenPriv(pScreen);
+    nvidiaCardInfo(pScreenPriv);
 #if 0
 #ifdef XV
     KdScreenPriv(pScreen);
@@ -258,7 +320,7 @@ nvidiaInitScreen (ScreenPtr pScreen)
 	nvidiaInitVideo(pScreen);
 #endif
 #endif
-    return vesaInitScreen (pScreen);
+    return nvidiac->backend_funcs.initScreen(pScreen);
 }
 
 #ifdef RANDR
@@ -270,9 +332,17 @@ nvidiaRandRSetConfig (ScreenPtr		pScreen
 {
     KdCheckSync (pScreen);
 
-    if (!vesaRandRSetConfig (pScreen, rotation, rate, pSize))
+    KdScreenPriv(pScreen);
+    nvidiaCardInfo(pScreenPriv);
+
+#ifdef KDRIVEFBDEV
+    if (nvidiac->use_fbdev && !fbdevRandRSetConfig(pScreen, rotation, rate, pSize))
 	return FALSE;
-    
+#endif
+#ifdef KDRIVEVESA
+    if (nvidiac->use_vesa && !vesaRandRSetConfig(pScreen, rotation, rate, pSize))
+	return FALSE;
+#endif
     return TRUE;
 }
 
@@ -289,17 +359,31 @@ static Bool
 nvidiaFinishInitScreen (ScreenPtr pScreen)
 {
     Bool    ret;
-    ret = vesaFinishInitScreen (pScreen);
+
+    KdScreenPriv(pScreen);
+    nvidiaCardInfo(pScreenPriv);
+
+    ret = nvidiac->backend_funcs.finishInitScreen(pScreen);
 #ifdef RANDR
     nvidiaRandRInit (pScreen);
 #endif
     return ret;
 }
 
+static Bool
+nvidiaCreateResources(ScreenPtr pScreen)
+{
+	KdScreenPriv(pScreen);
+	nvidiaCardInfo(pScreenPriv);
+
+	return nvidiac->backend_funcs.createRes(pScreen);
+}
+
 void
 nvidiaPreserve (KdCardInfo *card)
 {
-    vesaPreserve(card);
+    NvidiaCardInfo *nvidiac = card->driver;
+    nvidiac->backend_funcs.preserve(card);
 }
 
 void
@@ -335,7 +419,8 @@ nvidiaSetIndex (NvidiaCardInfo *nvidiac,
     nvidiaOutb (nvidiac, data, val);
 }
 
-static void vgaLockUnlock (NvidiaCardInfo *nvidiac, Bool lock)
+static void
+vgaLockUnlock (NvidiaCardInfo *nvidiac, Bool lock)
 {
     CARD8 cr11;
     ENTER ();
@@ -346,7 +431,8 @@ static void vgaLockUnlock (NvidiaCardInf
     LEAVE ();
 }
 
-static void nvidiaLockUnlock (NvidiaCardInfo *nvidiac, Bool lock)
+static void
+nvidiaLockUnlock (NvidiaCardInfo *nvidiac, Bool lock)
 {
     if (NVIDIA_IS_3(nvidiac))
 	nvidiaSetIndex (nvidiac, 0x3c4, 0x3c5, 0x06, lock ? 0x99 : 0x57);
@@ -402,7 +488,10 @@ nvidiaSetMMIO (KdCardInfo *card, NvidiaC
 {
     if (!nvidiac->reg_base)
 	nvidiaMapReg (card, nvidiac);
-    nvidiaLockUnlock (nvidiac, FALSE);
+#ifdef KDRIVEVESA
+    if (nvidiac->use_vesa)
+    	nvidiaLockUnlock (nvidiac, FALSE);
+#endif
     nvidiac->fifo_free = 0;
     nvidiac->fifo_size = nvidiac->rop->FifoFree.FifoFree;
 }
@@ -411,18 +500,21 @@ void
 nvidiaResetMMIO (KdCardInfo *card, NvidiaCardInfo *nvidiac)
 {
     nvidiaUnmapReg (card, nvidiac);
-    nvidiaLockUnlock (nvidiac, TRUE);
+#ifdef KDRIVEVESA
+    if (nvidiac->use_vesa)
+	nvidiaLockUnlock (nvidiac, TRUE);
+#endif
 }
 
 Bool
 nvidiaEnable (ScreenPtr pScreen)
 {
     KdScreenPriv(pScreen);
-    NvidiaCardInfo	*nvidiac = pScreenPriv->card->driver;
+    nvidiaCardInfo(pScreenPriv);
 
-    if (!vesaEnable (pScreen))
+    if (!nvidiac->backend_funcs.enable(pScreen))
 	return FALSE;
-    
+
     nvidiaSetMMIO (pScreenPriv->card, nvidiac);
 #ifdef XV
     KdXVEnable (pScreen);
@@ -434,36 +526,40 @@ void
 nvidiaDisable (ScreenPtr pScreen)
 {
     KdScreenPriv(pScreen);
-    NvidiaCardInfo	*nvidiac = pScreenPriv->card->driver;
+    nvidiaCardInfo(pScreenPriv);
 
 #ifdef XV
     KdXVDisable (pScreen);
 #endif
     nvidiaResetMMIO (pScreenPriv->card, nvidiac);
-    vesaDisable (pScreen);
+    nvidiac->backend_funcs.disable(pScreen);
 }
 
 static Bool
 nvidiaDPMS (ScreenPtr pScreen, int mode)
 {
-    return vesaDPMS (pScreen, mode);
+    KdScreenPriv(pScreen);
+    nvidiaCardInfo(pScreenPriv);
+
+    return nvidiac->backend_funcs.dpms(pScreen, mode);
 }
 
 static void
 nvidiaRestore (KdCardInfo *card)
 {
-    NvidiaCardInfo	*nvidiac = card->driver;
+    NvidiaCardInfo *nvidiac = card->driver;
 
     nvidiaResetMMIO (card, nvidiac);
-    vesaRestore (card);
+    nvidiac->backend_funcs.restore(card);
 }
 
 static void
 nvidiaScreenFini (KdScreenInfo *screen)
 {
-    NvidiaScreenInfo	*nvidias = (NvidiaScreenInfo *) screen->driver;
+    NvidiaScreenInfo *nvidias = (NvidiaScreenInfo *) screen->driver;
+    NvidiaCardInfo *nvidiac = screen->card->driver;
 
-    vesaScreenFini (screen);
+    nvidiac->backend_funcs.scrfini(screen);
     xfree (nvidias);
     screen->driver = 0;
 }
@@ -471,10 +567,28 @@ nvidiaScreenFini (KdScreenInfo *screen)
 static void
 nvidiaCardFini (KdCardInfo *card)
 {
-    NvidiaCardInfo	*nvidiac = card->driver;
+    NvidiaCardInfo *nvidiac = (NvidiaCardInfo *) card->driver;
 
     nvidiaUnmapReg (card, nvidiac);
-    vesaCardFini (card);
+    nvidiac->backend_funcs.cardfini(card);
+}
+
+static void
+nvidiaGetColors(ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
+{
+    KdScreenPriv(pScreen);
+    nvidiaCardInfo(pScreenPriv);
+
+    nvidiac->backend_funcs.getColors(pScreen, fb, n, pdefs);
+}
+
+static void
+nvidiaPutColors(ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
+{
+    KdScreenPriv(pScreen);
+    nvidiaCardInfo(pScreenPriv);
+
+    nvidiac->backend_funcs.putColors(pScreen, fb, n, pdefs);
 }
 
 #define nvidiaCursorInit 0       /* initCursor */
@@ -488,7 +602,7 @@ KdCardFuncs	nvidiaFuncs = {
     nvidiaScreenInit,	    /* scrinit */
     nvidiaInitScreen,	    /* initScreen */
     nvidiaFinishInitScreen, /* finishInitScreen */
-    vesaCreateResources,    /* createRes */
+    nvidiaCreateResources,  /* createRes */
     nvidiaPreserve,	    /* preserve */
     nvidiaEnable,	    /* enable */
     nvidiaDPMS,		    /* dpms */
@@ -508,7 +622,7 @@ KdCardFuncs	nvidiaFuncs = {
     nvidiaDrawSync,	    /* syncAccel */
     nvidiaDrawDisable,	    /* disableAccel */
     nvidiaDrawFini,	    /* finiAccel */
-    
-    vesaGetColors,    	    /* getColors */
-    vesaPutColors,	    /* putColors */
+
+    nvidiaGetColors,	    /* getColors */
+    nvidiaPutColors,	    /* putColors */
 };
--- xserver/hw/kdrive/nvidia/Makefile.am	2003-12-29 02:04:20.000000000 -0700
+++ xserver/hw/kdrive/nvidia/Makefile.am	2004-02-29 23:01:48.000000000 -0700
@@ -3,12 +3,28 @@ INCLUDES = 					\
 	-I$(top_srcdir)/hw/kdrive/vesa		\
 	@XSERVER_CFLAGS@
 
+if KDRIVEFBDEV
+FBDEV_INCLUDES =-I$(top_srcdir)/hw/kdrive/fbdev
+FBDEV_LIBS = $(top_builddir)/hw/kdrive/fbdev/libfbdev.a
+endif
+
+if KDRIVEVESA
+VESA_INCLUDES = -I$(top_srcdir)/hw/kdrive/vesa
+VESA_LIBS = $(top_builddir)/hw/kdrive/vesa/libvesa.a
+endif
+
+INCLUDES = 					\
+	@KDRIVE_INCS@				\
+	$(FBDEV_INCLUDES)			\
+	$(VESA_INCLUDES)			\
+	@XSERVER_CFLAGS@
+
 bin_PROGRAMS = Xnvidia
 
 noinst_LIBRARIES = libnvidia.a
 
 #	nvidiavideo.c
-	
+
 libnvidia_a_SOURCES = 	\
 	nvidia.c	\
 	nvidiadraw.c	\
@@ -21,7 +37,8 @@ Xnvidia_SOURCES = \
 
 NVIDIA_LIBS =					\
 	libnvidia.a 				\
-	$(top_builddir)/hw/kdrive/vesa/libvesa.a \
+	$(FBDEV_LIBS)				\
+	$(VESA_LIBS)				\
 	@KDRIVE_LIBS@
 
 Xnvidia_LDADD = \
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.