[Nouveau] [PATCH v3 2/2] xorg/nouveau: blacklist all pre NV30 cards
Marcin Slusarz
marcin.slusarz at gmail.com
Sun Jun 5 22:51:07 PDT 2011
On Sun, Jun 05, 2011 at 11:43:15PM +0200, Marcin Kościelnicki wrote:
> > ---
> > From: Marcin Slusarz <marcin.slusarz at gmail.com>
> > Subject: [PATCH] xorg/nouveau: blacklist all pre NV30 cards
> >
> > Bail out early in probe, so other driver (xf86-video-nouveau) can
> > take control
> > of the card. Doing it in screen_create would be too late.
> > ---
> > src/gallium/targets/xorg-nouveau/Makefile | 3 +
> > src/gallium/targets/xorg-nouveau/nouveau_xorg.c | 63
> > +++++++++++++++++++---
> > 2 files changed, 57 insertions(+), 9 deletions(-)
> >
> > diff --git a/src/gallium/targets/xorg-nouveau/Makefile
> > b/src/gallium/targets/xorg-nouveau/Makefile
> > index 16ac954..755969c 100644
> > --- a/src/gallium/targets/xorg-nouveau/Makefile
> > +++ b/src/gallium/targets/xorg-nouveau/Makefile
> > @@ -23,4 +23,7 @@ DRIVER_PIPES = \
> > DRIVER_LINKS = \
> > $(shell pkg-config --libs libdrm libdrm_nouveau)
> >
> > +DRIVER_INCLUDES = \
> > + $(shell pkg-config --cflags-only-I libdrm libdrm_nouveau
> > xf86driproto)
> > +
> > include ../Makefile.xorg
> > diff --git a/src/gallium/targets/xorg-nouveau/nouveau_xorg.c
> > b/src/gallium/targets/xorg-nouveau/nouveau_xorg.c
> > index a25254a..43470a1 100644
> > --- a/src/gallium/targets/xorg-nouveau/nouveau_xorg.c
> > +++ b/src/gallium/targets/xorg-nouveau/nouveau_xorg.c
> > @@ -29,6 +29,9 @@
> > */
> >
> > #include "../../state_trackers/xorg/xorg_winsys.h"
> > +#include <nouveau_drmif.h>
> > +#include <xorg/dri.h>
> > +#include <xf86drmMode.h>
> >
> > static void nouveau_xorg_identify(int flags);
> > static Bool nouveau_xorg_pci_probe(DriverPtr driver, int entity_num,
> > @@ -38,16 +41,9 @@ static Bool nouveau_xorg_pci_probe(DriverPtr
> > driver, int entity_num,
> > static const struct pci_id_match nouveau_xorg_device_match[] = {
> > { 0x10de, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY,
> > 0x00030000, 0x00ffffff, 0 },
> > - { 0x12d2, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY,
> > - 0x00030000, 0x00ffffff, 0 },
> > {0, 0, 0},
> > };
> >
> > -static SymTabRec nouveau_xorg_chipsets[] = {
> > - {PCI_MATCH_ANY, "NVIDIA Graphics Device"},
> > - {-1, NULL}
> > -};
> > -
> > static PciChipsets nouveau_xorg_pci_devices[] = {
> > {PCI_MATCH_ANY, PCI_MATCH_ANY, NULL},
> > {-1, -1, NULL}
> > @@ -121,8 +117,7 @@ nouveau_xorg_setup(pointer module, pointer opts,
> > int *errmaj, int *errmin)
> > static void
> > nouveau_xorg_identify(int flags)
> > {
> > - xf86PrintChipsets("nouveau2", "Driver for Modesetting Kernel
> > Drivers",
> > - nouveau_xorg_chipsets);
> > + xf86DrvMsg(0, X_INFO, "nouveau2: Gallium3D based 2D driver for
> > NV30+ NVIDIA chipsets\n");
> > }
> >
> > static Bool
> > @@ -131,6 +126,56 @@ nouveau_xorg_pci_probe(DriverPtr driver,
> > {
> > ScrnInfoPtr scrn = NULL;
> > EntityInfoPtr entity;
> > + struct nouveau_device *dev = NULL;
> > + char *busid;
> > + int chipset, ret;
> > +
> > + if (device->vendor_id != 0x10DE)
> > + return FALSE;
> > +
> > + if (!xf86LoaderCheckSymbol("DRICreatePCIBusID")) {
> > + xf86DrvMsg(-1, X_ERROR, "[drm] No DRICreatePCIBusID symbol\n");
> > + return FALSE;
> > + }
> > + busid = DRICreatePCIBusID(device);
> > +
> > + ret = nouveau_device_open(&dev, busid);
> > + if (ret) {
> > + xf86DrvMsg(-1, X_ERROR, "[drm] failed to open device\n");
> > + free(busid);
> > + return FALSE;
> > + }
> > +
> > + chipset = dev->chipset;
> > + nouveau_device_close(&dev);
> > +
> > + ret = drmCheckModesettingSupported(busid);
> > + free(busid);
> > + if (ret) {
> > + xf86DrvMsg(-1, X_ERROR, "[drm] KMS not enabled\n");
> > + return FALSE;
> > + }
> > +
> > + switch (chipset & 0xf0) {
> > + case 0x00:
> > + case 0x10:
> > + case 0x20:
> > + xf86DrvMsg(-1, X_NOTICE, "Too old chipset: NV%02x\n", chipset);
> > + return FALSE;
> > + case 0x30:
> > + case 0x40:
> > + case 0x60:
> > + case 0x50:
> > + case 0x80:
> > + case 0x90:
> > + case 0xa0:
> > + case 0xc0:
> 0xd0 should be added here, there's NVD9 already.
There's no point in adding it now - mesa does not support it...
(see nouveau_drm_screen_create in src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c)
> > + xf86DrvMsg(-1, X_INFO, "Detected chipset: NV%02x\n", chipset);
> > + break;
> > + default:
> > + xf86DrvMsg(-1, X_ERROR, "Unknown chipset: NV%02x\n", chipset);
> > + return FALSE;
> > + }
> >
> > scrn = xf86ConfigPciEntity(scrn, 0, entity_num,
> > nouveau_xorg_pci_devices,
> > NULL, NULL, NULL, NULL, NULL);
>
More information about the Nouveau
mailing list