[PATCH] libdrm: Add drm function for KMS checkin that checks if kernel module is loaded.

Pauli Nieminen suokkos at gmail.com
Mon Feb 22 17:44:07 PST 2010


drmCheckModesettingSupported did erronously report that
kernel doesn't have modesetting support if kernel module
wasn't preloaded.

To make KMS checking load kernel module before retring
drmCheckModuleAndModesettingSupported takes module_name
as parameter. If drm module isn't loaded drm tries to
load the module.

drmCheckModesettingSupported is now deprecated.

Version bump is also required for the interface change.

Signed-off-by: Pauli Nieminen <suokkos at gmail.com>
---
 configure.ac  |    2 +-
 xf86drm.c     |    3 ++-
 xf86drmMode.c |   29 ++++++++++++++++++++++++++++-
 xf86drmMode.h |    6 ++++++
 4 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/configure.ac b/configure.ac
index ef7700f..e279885 100644
--- a/configure.ac
+++ b/configure.ac
@@ -19,7 +19,7 @@
 #  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 AC_PREREQ(2.60)
-AC_INIT([libdrm], 2.4.18, [dri-devel at lists.sourceforge.net], libdrm)
+AC_INIT([libdrm], 2.4.19, [dri-devel at lists.sourceforge.net], libdrm)
 AC_USE_SYSTEM_EXTENSIONS
 AC_CONFIG_SRCDIR([Makefile.am])
 AM_INIT_AUTOMAKE([dist-bzip2])
diff --git a/xf86drm.c b/xf86drm.c
index 220aaa1..b3b426f 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -797,9 +797,10 @@ drmVersionPtr drmGetLibVersion(int fd)
      *   revision 1.2.x = added drmSetInterfaceVersion
      *                    modified drmOpen to handle both busid and name
      *   revision 1.3.x = added server + memory manager
+     *   revision 1.4.x = added drmCheckModuleAndModesettingSupported
      */
     version->version_major      = 1;
-    version->version_minor      = 3;
+    version->version_minor      = 4;
     version->version_patchlevel = 0;
 
     return (drmVersionPtr)version;
diff --git a/xf86drmMode.c b/xf86drmMode.c
index f330e6f..e4f363f 100644
--- a/xf86drmMode.c
+++ b/xf86drmMode.c
@@ -655,7 +655,8 @@ int drmModeConnectorSetProperty(int fd, uint32_t connector_id, uint32_t property
  *  -EINVAL or invalid bus id
  *  -ENOSYS if no modesetting support
 */
-int drmCheckModesettingSupported(const char *busid)
+int drmCheckModuleAndModesettingSupported(const char *module_name,
+		const char *busid)
 {
 #ifdef __linux__
 	char pci_dev_dir[1024];
@@ -664,6 +665,28 @@ int drmCheckModesettingSupported(const char *busid)
 	struct dirent *dent;
 	int found = 0, ret;
 
+	if (module_name) {
+		/* Check that kernel module is loaded */
+		/* If first try fails try again soon after */
+		int retries = 1;
+		int fd;
+		do {
+			fd = drmOpen( module_name, busid );
+			if (fd != -1)
+				break;
+			if (!retries--)
+				break;
+			usleep(100000);
+		} while (1);
+
+		if (fd == -1)
+			return -ENOSYS;
+
+		drmClose(fd);
+	} else {
+		drmMsg("[drm] Checking for kernel modesetting without module_name is deprecated.\n");
+	}
+
 	ret = sscanf(busid, "pci:%04x:%02x:%02x.%d", &domain, &bus, &dev, &func);
 	if (ret != 4)
 		return -EINVAL;
@@ -712,6 +735,10 @@ int drmCheckModesettingSupported(const char *busid)
 
 }
 
+int drmCheckModesettingSupported(const char *busid)
+{
+	return drmCheckModuleAndModesettingSupported(NULL, busid);
+}
 int drmModeCrtcGetGamma(int fd, uint32_t crtc_id, uint32_t size,
 			uint16_t *red, uint16_t *green, uint16_t *blue)
 {
diff --git a/xf86drmMode.h b/xf86drmMode.h
index 44d90ed..6c81ed6 100644
--- a/xf86drmMode.h
+++ b/xf86drmMode.h
@@ -378,6 +378,12 @@ extern drmModePropertyBlobPtr drmModeGetPropertyBlob(int fd, uint32_t blob_id);
 extern void drmModeFreePropertyBlob(drmModePropertyBlobPtr ptr);
 extern int drmModeConnectorSetProperty(int fd, uint32_t connector_id, uint32_t property_id,
 				    uint64_t value);
+
+extern int drmCheckModuleAndModesettingSupported(const char *module_name,
+		const char *busid);
+/**
+ * Deprecated because of possible bugs that kernel module is not loaded early
+ */
 extern int drmCheckModesettingSupported(const char *busid);
 
 extern int drmModeCrtcSetGamma(int fd, uint32_t crtc_id, uint32_t size,
-- 
1.6.3.3



More information about the xorg-driver-ati mailing list