On Thu, Apr 15, 2010 at 01:19:41PM -0700, Aaron Plattner wrote: > On Tue, Apr 13, 2010 at 04:34:51AM -0700, Marcin Slusarz wrote: > > On Tue, Apr 13, 2010 at 11:15:28AM +1000, Christopher James Halse Rogers > > wrote: > > > On Mon, 2010-04-12 at 20:04 +0300, Pekka Paalanen wrote: > > > > On Mon, 12 Apr 2010 12:50:13 +0200 > > > > Marcin Slusarz <[email protected]> wrote: > > > > > > > > > I'm not aware of any trick to make both nv and nouveau working. > > > > > Maybe there should be a way to prevent nv (and vesa, but not > > > > > fbdev) from loading when KMS is in use? > > > > > > > > Yeah, there was a brief discussion about that recently: > > > > http://people.freedesktop.org/~cbrill/dri-log/index.php?date=2010-03-21&channel=nouveau&show_html=true&highlight_names=&update=Update&date=2010-03-21 > > > > > > > > I haven't heard anything about it since. > > > > > > > > > > I wrote a patch for vesa on bugzilla[1] to do exactly that; a similar > > > one for nv wouldn't be hard. > > > > > > [1] https://bugs.freedesktop.org/show_bug.cgi?id=26878 > > > > Yay, thanks. > > I adapted it to xf86-video-nv and it works! > > Now we need to trick Aaron to apply it. > > > > Aaron: please, please, please apply. > > :) > > Sorry for the slow reply. It sucks that this is necessary, but I guess it > makes sense. Comments below.
Thanks for a reply! > > --- > > From 112a8c9aa9de6ea30b4c3c98e5d7cbce312aaaf8 Mon Sep 17 00:00:00 2001 > > From: Marcin Slusarz <[email protected]> > > Date: Tue, 13 Apr 2010 13:17:56 +0200 > > Subject: [PATCH] Refuse to bind to a device which has kernel modesetting > > active. > > > > Touching directly the hardware while kernel modesetting is active > > breaks console output. > > > > Patch almost entrirely based on VESA patch by > > Christopher James Halse Rogers <[email protected]> > > > > Signed-off-by: Marcin Slusarz <[email protected]> > > --- > > configure.ac | 11 +++++++++++ > > src/Makefile.am | 2 +- > > src/nv_driver.c | 33 +++++++++++++++++++++++++++++++++ > > 3 files changed, 45 insertions(+), 1 deletions(-) > > > > diff --git a/configure.ac b/configure.ac > > index d717805..3028005 100644 > > --- a/configure.ac > > +++ b/configure.ac > > @@ -134,6 +134,17 @@ AC_SUBST([modes_dir]) > > AC_SUBST([XORG_CFLAGS]) > > AC_SUBST([moduledir]) > > > > +if test "x$XSERVER_LIBPCIACCESS" = xyes; then > > + PKG_CHECK_MODULES(LIBDRM, [libdrm > 2.4.3 xf86driproto], > > HAVE_KMS="yes", HAVE_KMS="no") > > + if test "x$HAVE_KMS" = xyes; then > > + AC_DEFINE(HAVE_KMS, 1, [Have kernel modesetting]) > > + else > > + AC_MSG_WARN(Support for detecting kernel modesetting drivers is > > not available.) > > + AC_MSG_WARN(This driver can cause display problems in the presence > > of kernel modesetting.) > > + AC_MSG_WARN(Please install libdrm > 2.4.3 and xf86driproto to > > enable kms detection.) > > s/kms/KMS/ done > > + fi > > +fi > > + > > DRIVER_NAME=nv > > AC_SUBST([DRIVER_NAME]) > > > > diff --git a/src/Makefile.am b/src/Makefile.am > > index 2677d9c..5d57010 100644 > > --- a/src/Makefile.am > > +++ b/src/Makefile.am > > @@ -23,7 +23,7 @@ > > # -avoid-version prevents gratuitous .0.0.0 version numbers on the end > > # _ladir passes a dummy rpath to libtool so the thing will actually link > > # TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, > > etc. > > -AM_CFLAGS = @XMODES_CFLAGS@ @XORG_CFLAGS@ > > +AM_CFLAGS = @XMODES_CFLAGS@ @XORG_CFLAGS@ $(LIBDRM_CFLAGS) > > nv_drv_la_LTLIBRARIES = nv_drv.la > > nv_drv_la_LDFLAGS = -module -avoid-version > > nv_drv_ladir = @moduledir@/drivers > > diff --git a/src/nv_driver.c b/src/nv_driver.c > > index 0d017f9..e117626 100644 > > --- a/src/nv_driver.c > > +++ b/src/nv_driver.c > > @@ -33,6 +33,11 @@ > > #include "xf86int10.h" > > #include "vbeModes.h" > > > > +#ifdef HAVE_KMS > > +#include <xf86drmMode.h> > > +#include <dri.h> > > +#endif > > + > > const OptionInfoRec * RivaAvailableOptions(int chipid, int busid); > > Bool RivaGetScrnInfoRec(PciChipsets *chips, int chip); > > Bool G80GetScrnInfoRec(PciChipsets *chips, int chip); > > @@ -830,6 +835,26 @@ NVIsSupported(CARD32 id) > > return FALSE; > > } > > > > +#ifdef HAVE_KMS > > +static Bool NVKernelModesettingEnabled (struct pci_device *device) > > +{ > > + char *busIdString; > > + int ret; > > + > > + if (!xf86LoaderCheckSymbol("DRICreatePCIBusID")) > > + return FALSE; > > I know the rest of the code uses tabs, but please use spaces for new code. ok > > + > > + busIdString = DRICreatePCIBusID(device); > > Eww. Why doesn't drmCheckModesettingSupported take a pci_device*? Oh > well, whatever. That's how it was done from the beginning - drmCheckModesettingSupported parses busIdString and reads some files in /sys based on this information... > > + ret = drmCheckModesettingSupported(busIdString); > > There's no chance of false positives here, right? E.g. if you set > nouveau.modeset=0 on the kernel command line, does that make this return > nonzero? With nouveau.modeset=0 it returns nonzero and nv works fine. > > + xfree(busIdString); > > + > > + return (ret == 0); > > +} > > +#else > > +static inline Bool NVKernelModesettingEnabled (struct pci_device *device) > > { return FALSE; } > > +#endif //HAVE_KMS > > + > > /* Mandatory */ > > #if XSERVER_LIBPCIACCESS > > static Bool > > @@ -864,6 +889,14 @@ NVPciProbe(DriverPtr drv, int entity, struct > > pci_device *dev, intptr_t data) > > NV_NAME ": Found NVIDIA %s at %2...@%2.2x:%2.2x:%1.1x\n", > > name, dev->bus, dev->domain, dev->dev, dev->func); > > > > + /* Trying to bring up a NV mode while kernel modesetting is enabled > > + results in badness */ > > + if (NVKernelModesettingEnabled (dev)) { > > + xf86Msg (X_ERROR, > > + "NV: Kernel modesetting driver in use, refusing to load\n"); > > Please use NV_NAME instead of hard-coding the "NV:" prefix. done > > + return FALSE; > > + } > > + > > if(NVIsG80(id)) > > return G80GetScrnInfoRec(NULL, entity); > > else if(dev->vendor_id == PCI_VENDOR_NVIDIA_SGS) > > -- > > 1.7.0.4 --- From: Marcin Slusarz <[email protected]> Subject: [PATCH] Refuse to bind to a device which has kernel modesetting active. Touching directly the hardware while kernel modesetting is active breaks console output. Patch almost entrirely based on VESA patch by Christopher James Halse Rogers <[email protected]> Signed-off-by: Marcin Slusarz <[email protected]> --- configure.ac | 11 +++++++++++ src/Makefile.am | 2 +- src/nv_driver.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletions(-) diff --git a/configure.ac b/configure.ac index d717805..c51ab4a 100644 --- a/configure.ac +++ b/configure.ac @@ -134,6 +134,17 @@ AC_SUBST([modes_dir]) AC_SUBST([XORG_CFLAGS]) AC_SUBST([moduledir]) +if test "x$XSERVER_LIBPCIACCESS" = xyes; then + PKG_CHECK_MODULES(LIBDRM, [libdrm > 2.4.3 xf86driproto], HAVE_KMS="yes", HAVE_KMS="no") + if test "x$HAVE_KMS" = xyes; then + AC_DEFINE(HAVE_KMS, 1, [Have kernel modesetting]) + else + AC_MSG_WARN(Support for detecting kernel modesetting drivers is not available.) + AC_MSG_WARN(This driver can cause display problems in the presence of kernel modesetting.) + AC_MSG_WARN(Please install libdrm > 2.4.3 and xf86driproto to enable KMS detection.) + fi +fi + DRIVER_NAME=nv AC_SUBST([DRIVER_NAME]) diff --git a/src/Makefile.am b/src/Makefile.am index 2677d9c..5d57010 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,7 +23,7 @@ # -avoid-version prevents gratuitous .0.0.0 version numbers on the end # _ladir passes a dummy rpath to libtool so the thing will actually link # TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc. -AM_CFLAGS = @XMODES_CFLAGS@ @XORG_CFLAGS@ +AM_CFLAGS = @XMODES_CFLAGS@ @XORG_CFLAGS@ $(LIBDRM_CFLAGS) nv_drv_la_LTLIBRARIES = nv_drv.la nv_drv_la_LDFLAGS = -module -avoid-version nv_drv_ladir = @moduledir@/drivers diff --git a/src/nv_driver.c b/src/nv_driver.c index 0d017f9..d7cc963 100644 --- a/src/nv_driver.c +++ b/src/nv_driver.c @@ -33,6 +33,11 @@ #include "xf86int10.h" #include "vbeModes.h" +#ifdef HAVE_KMS +#include <xf86drmMode.h> +#include <dri.h> +#endif + const OptionInfoRec * RivaAvailableOptions(int chipid, int busid); Bool RivaGetScrnInfoRec(PciChipsets *chips, int chip); Bool G80GetScrnInfoRec(PciChipsets *chips, int chip); @@ -830,6 +835,26 @@ NVIsSupported(CARD32 id) return FALSE; } +#ifdef HAVE_KMS +static Bool NVKernelModesettingEnabled(struct pci_device *device) +{ + char *busIdString; + int ret; + + if (!xf86LoaderCheckSymbol("DRICreatePCIBusID")) + return FALSE; + + busIdString = DRICreatePCIBusID(device); + + ret = drmCheckModesettingSupported(busIdString); + xfree(busIdString); + + return (ret == 0); +} +#else +static inline Bool NVKernelModesettingEnabled(struct pci_device *device) { return FALSE; } +#endif //HAVE_KMS + /* Mandatory */ #if XSERVER_LIBPCIACCESS static Bool @@ -864,6 +889,14 @@ NVPciProbe(DriverPtr drv, int entity, struct pci_device *dev, intptr_t data) NV_NAME ": Found NVIDIA %s at %2...@%2.2x:%2.2x:%1.1x\n", name, dev->bus, dev->domain, dev->dev, dev->func); + /* Trying to bring up a NV mode while kernel modesetting is enabled + results in badness */ + if (NVKernelModesettingEnabled(dev)) { + xf86Msg(X_ERROR, + NV_NAME ": Kernel modesetting driver in use, refusing to load\n"); + return FALSE; + } + if(NVIsG80(id)) return G80GetScrnInfoRec(NULL, entity); else if(dev->vendor_id == PCI_VENDOR_NVIDIA_SGS) -- 1.7.0.4 _______________________________________________ Nouveau mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/nouveau
