diff options
-rw-r--r-- | src/rhd_driver.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/rhd_driver.c b/src/rhd_driver.c index 2d7f803..a7447f3 100644 --- a/src/rhd_driver.c +++ b/src/rhd_driver.c @@ -2,6 +2,8 @@ * Copyright 2007-2009 Luc Verhaegen <libv@exsuse.de> * Copyright 2007-2009 Matthias Hopf <mhopf@novell.com> * Copyright 2007-2009 Egbert Eich <eich@novell.com> + * Copyright 2009 Dave Airlie <airlied@redhat.com> + * Copyright 2009 Hans Ulrich Niedermann <hun@n-dimensional.de> * Copyright 2007-2009 Advanced Micro Devices, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a @@ -88,6 +90,7 @@ #define _XF86DRI_SERVER_ #include "dri.h" #include "GL/glxint.h" +#include "xf86drmMode.h" #endif #if HAVE_XF86_ANSIC_H @@ -398,6 +401,34 @@ RHDAvailableOptions(int chipid, int busid) * */ #ifdef XSERVER_LIBPCIACCESS + +/* The radeon_kernel_mode_enabled() function is taken verbatim from + * radeon's radeon_probe.c file. */ +static Bool radeon_kernel_mode_enabled(ScrnInfoPtr pScrn, struct pci_device *pci_dev) +{ + char *busIdString; + int ret; + + if (!xf86LoaderCheckSymbol("DRICreatePCIBusID")) { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0, + "[KMS] No DRICreatePCIBusID symbol, no kernel modesetting.\n"); + return FALSE; + } + + busIdString = DRICreatePCIBusID(pci_dev); + ret = drmCheckModesettingSupported(busIdString); + xfree(busIdString); + if (ret) { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0, + "[KMS] drm report modesetting isn't supported.\n"); + return FALSE; + } + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0, + "[KMS] Kernel modesetting enabled.\n"); + return TRUE; +} + static Bool RHDPciProbe(DriverPtr drv, int entityNum, struct pci_device *dev, intptr_t matchData) @@ -409,6 +440,21 @@ RHDPciProbe(DriverPtr drv, int entityNum, RES_SHARED_VGA, NULL, NULL, NULL, NULL); if (pScrn != NULL) { + if (dev) { + Bool kms = radeon_kernel_mode_enabled(pScrn, dev); + if (kms) { + xf86DrvMsgVerb(pScrn->scrnIndex, X_ERROR, 0, + "FATAL: RADEONHD does not work with kernel modesetting (KMS).\n" + "\tAppend \"nomodeset\" or \"radeon.modeset=0\" (depending\n" + "\ton your kernel version, or just add both to be sure) to \n" + "\tyour kernel command line in /boot/grub/grub.conf.\n"); + return FALSE; + } else { + xf86DrvMsgVerb(pScrn->scrnIndex, X_ERROR, 0, + "KMS is disabled. This is good for us, because RADEONHD conflicts with KMS.\n"); + } + } + pScrn->driverVersion = RHD_VERSION; pScrn->driverName = RHD_DRIVER_NAME; pScrn->name = RHD_NAME; |