[Nouveau] Blank screen at startup (conflict with VESA VGA)
Aaron Plattner
aplattner at nvidia.com
Thu Apr 15 13:19:41 PDT 2010
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 <marcin.slusarz at gmail.com> 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.
> ---
> From 112a8c9aa9de6ea30b4c3c98e5d7cbce312aaaf8 Mon Sep 17 00:00:00 2001
> From: Marcin Slusarz <marcin.slusarz at gmail.com>
> 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 <christopher.halse.rogers at canonical.com>
>
> Signed-off-by: Marcin Slusarz <marcin.slusarz at gmail.com>
> ---
> 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/
> + 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.
> +
> + busIdString = DRICreatePCIBusID(device);
Eww. Why doesn't drmCheckModesettingSupported take a pci_device*? Oh
well, whatever.
> + 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?
> + 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");
Please use NV_NAME instead of hard-coding the "NV:" prefix.
> + return FALSE;
> + }
> +
> if(NVIsG80(id))
> return G80GetScrnInfoRec(NULL, entity);
> else if(dev->vendor_id == PCI_VENDOR_NVIDIA_SGS)
> --
> 1.7.0.4
More information about the Nouveau
mailing list