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 = \