From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marcin Slusarz Subject: Re: Blank screen at startup (conflict with VESA VGA) Date: Tue, 13 Apr 2010 13:34:51 +0200 Message-ID: <20100413113451.GA10009@joi.lan> References: <20100411153919.GA12618@joi.lan> <4BC1FA45.1050808@epsm.fr> <20100411170535.GA4016@joi.lan> <4BC2231C.2060509@epsm.fr> <4BC2BA76.8040509@epsm.fr> <20100412101413.GA2733@joi.lan> <4BC2F69E.6000905@epsm.fr> <20100412105013.GA2789@joi.lan> <20100412200458.0380a4fe@daedalus.pq.iki.fi> <1271121328.3035.2.camel@Spike> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline In-Reply-To: <1271121328.3035.2.camel@Spike> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Errors-To: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org To: Christopher James Halse Rogers , Aaron Plattner Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org List-Id: nouveau.vger.kernel.org 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 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. :) --- >From 112a8c9aa9de6ea30b4c3c98e5d7cbce312aaaf8 Mon Sep 17 00:00:00 2001 From: Marcin Slusarz 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 Signed-off-by: Marcin Slusarz --- 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.) + 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 +#include +#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.2x@%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"); + return FALSE; + } + if(NVIsG80(id)) return G80GetScrnInfoRec(NULL, entity); else if(dev->vendor_id == PCI_VENDOR_NVIDIA_SGS) -- 1.7.0.4