diff --git a/src/radeon_probe.c b/src/radeon_probe.c index 42e7259..ae0545c 100644 --- a/src/radeon_probe.c +++ b/src/radeon_probe.c @@ -31,6 +31,8 @@ #endif #include +#include +#include /* * Authors: @@ -87,6 +89,40 @@ RADEONIdentify(int flags) #ifdef XF86DRM_MODE +static Bool radeon_check_kernel_module_is_loaded(ScrnInfoPtr pScrn, char *busIdString) +{ + drmSetVersion saveSv, sv; + int fd = -1, err; + int count = 10; + + sv.drm_di_major = 1; + sv.drm_di_minor = 1; + sv.drm_dd_major = -1; + + saveSv = sv; + while (count--) { + fd = drmOpen(RADEON_DRIVER_NAME, busIdString); + + if (fd < 0) { + xf86DrvMsgVerb(pScrn->scrnIndex, X_ERROR, 0, + "[KMS] drmOpen failed.\n"); + return FALSE; + } + + err = drmSetInterfaceVersion(fd, &sv); + + if (err != -EPERM) + break; + + sv = saveSv; + drmClose(fd); + fd = -1; + usleep(100000); + } + + return fd != -1 ? TRUE : FALSE; +} + static Bool radeon_kernel_mode_enabled(ScrnInfoPtr pScrn, struct pci_device *pci_dev) { char *busIdString; @@ -99,6 +135,12 @@ static Bool radeon_kernel_mode_enabled(ScrnInfoPtr pScrn, struct pci_device *pci } busIdString = DRICreatePCIBusID(pci_dev); + + if (!radeon_check_kernel_module_is_loaded(pScrn, busIdString)) { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0, + "[KMS] drm kernel module is not loaded, no kernel modesetting.\n"); + return FALSE; + } ret = drmCheckModesettingSupported(busIdString); xfree(busIdString); if (ret) {