From d24f563ec332d0fc9081e7f68bdaa1b78423dbf0 Mon Sep 17 00:00:00 2001 From: Tomasz Pala Date: Sat, 6 Sep 2008 19:39:03 +0000 Subject: [PATCH] - from FC Changed files: libdrm-2.4.0-no-bc.patch -> 1.1 libdrm-2.4.0-no-freaking-mknod.patch -> 1.1 libdrm-make-dri-perms-okay.patch -> 1.1 libdrm-wait-udev.patch -> 1.1 --- libdrm-2.4.0-no-bc.patch | 54 ++++++++++++++++ libdrm-2.4.0-no-freaking-mknod.patch | 94 ++++++++++++++++++++++++++++ libdrm-make-dri-perms-okay.patch | 12 ++++ libdrm-wait-udev.patch | 68 ++++++++++++++++++++ 4 files changed, 228 insertions(+) create mode 100644 libdrm-2.4.0-no-bc.patch create mode 100644 libdrm-2.4.0-no-freaking-mknod.patch create mode 100644 libdrm-make-dri-perms-okay.patch create mode 100644 libdrm-wait-udev.patch diff --git a/libdrm-2.4.0-no-bc.patch b/libdrm-2.4.0-no-bc.patch new file mode 100644 index 0000000..709c5f3 --- /dev/null +++ b/libdrm-2.4.0-no-bc.patch @@ -0,0 +1,54 @@ +diff -up libdrm-20080811/libdrm/xf86drm.c.jx libdrm-20080811/libdrm/xf86drm.c +--- libdrm-20080811/libdrm/xf86drm.c.jx 2008-08-11 13:48:47.000000000 -0400 ++++ libdrm-20080811/libdrm/xf86drm.c 2008-08-11 15:12:02.000000000 -0400 +@@ -393,11 +393,6 @@ int drmAvailable(void) + int fd; + + if ((fd = drmOpenMinor(0, 1)) < 0) { +-#ifdef __linux__ +- /* Try proc for backward Linux compatibility */ +- if (!access("/proc/dri/0", R_OK)) +- return 1; +-#endif + return 0; + } + +@@ -516,38 +511,6 @@ static int drmOpenByName(const char *nam + } + } + +-#ifdef __linux__ +- /* Backward-compatibility /proc support */ +- for (i = 0; i < 8; i++) { +- char proc_name[64], buf[512]; +- char *driver, *pt, *devstring; +- int retcode; +- +- sprintf(proc_name, "/proc/dri/%d/name", i); +- if ((fd = open(proc_name, 0, 0)) >= 0) { +- retcode = read(fd, buf, sizeof(buf)-1); +- close(fd); +- if (retcode) { +- buf[retcode-1] = '\0'; +- for (driver = pt = buf; *pt && *pt != ' '; ++pt) +- ; +- if (*pt) { /* Device is next */ +- *pt = '\0'; +- if (!strcmp(driver, name)) { /* Match */ +- for (devstring = ++pt; *pt && *pt != ' '; ++pt) +- ; +- if (*pt) { /* Found busid */ +- return drmOpenByBusid(++pt); +- } else { /* No busid */ +- return drmOpenDevice(strtol(devstring, NULL, 0),i); +- } +- } +- } +- } +- } +- } +-#endif +- + return -1; + } + diff --git a/libdrm-2.4.0-no-freaking-mknod.patch b/libdrm-2.4.0-no-freaking-mknod.patch new file mode 100644 index 0000000..08bee1d --- /dev/null +++ b/libdrm-2.4.0-no-freaking-mknod.patch @@ -0,0 +1,94 @@ +diff -up libdrm-2.4.0/libdrm/xf86drm.c.mknod libdrm-2.4.0/libdrm/xf86drm.c +--- libdrm-2.4.0/libdrm/xf86drm.c.mknod 2007-10-30 20:10:10.000000000 -0400 ++++ libdrm-2.4.0/libdrm/xf86drm.c 2007-11-12 19:26:12.000000000 -0500 +@@ -266,64 +266,12 @@ static int drmMatchBusID(const char *id1 + */ + static int drmOpenDevice(long dev, int minor) + { +- stat_t st; + char buf[64]; + int fd; +- mode_t devmode = DRM_DEV_MODE, serv_mode; +- int isroot = !geteuid(); +- uid_t user = DRM_DEV_UID; +- gid_t group = DRM_DEV_GID, serv_group; + + sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor); + drmMsg("drmOpenDevice: node name is %s\n", buf); + +- if (drm_server_info) { +- drm_server_info->get_perms(&serv_group, &serv_mode); +- devmode = serv_mode ? serv_mode : DRM_DEV_MODE; +- devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH); +- group = (serv_group >= 0) ? serv_group : DRM_DEV_GID; +- } +- +- if (stat(DRM_DIR_NAME, &st)) { +- if (!isroot) +- return DRM_ERR_NOT_ROOT; +- mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE); +- chown(DRM_DIR_NAME, 0, 0); /* root:root */ +- chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE); +- } +- +- /* Check if the device node exists and create it if necessary. */ +- if (stat(buf, &st)) { +- if (!isroot) +- return DRM_ERR_NOT_ROOT; +- remove(buf); +- mknod(buf, S_IFCHR | devmode, dev); +- } +- +- if (drm_server_info) { +- chown(buf, user, group); +- chmod(buf, devmode); +- } +- +- fd = open(buf, O_RDWR, 0); +- drmMsg("drmOpenDevice: open result is %d, (%s)\n", +- fd, fd < 0 ? strerror(errno) : "OK"); +- if (fd >= 0) +- return fd; +- +- /* Check if the device node is not what we expect it to be, and recreate it +- * and try again if so. +- */ +- if (st.st_rdev != dev) { +- if (!isroot) +- return DRM_ERR_NOT_ROOT; +- remove(buf); +- mknod(buf, S_IFCHR | devmode, dev); +- if (drm_server_info) { +- chown(buf, user, group); +- chmod(buf, devmode); +- } +- } + fd = open(buf, O_RDWR, 0); + drmMsg("drmOpenDevice: open result is %d, (%s)\n", + fd, fd < 0 ? strerror(errno) : "OK"); +@@ -331,7 +279,6 @@ static int drmOpenDevice(long dev, int m + return fd; + + drmMsg("drmOpenDevice: Open failed\n"); +- remove(buf); + return -errno; + } + +diff -up libdrm-2.4.0/libdrm/xf86drm.h.mknod libdrm-2.4.0/libdrm/xf86drm.h +--- libdrm-2.4.0/libdrm/xf86drm.h.mknod 2007-07-19 00:27:52.000000000 -0400 ++++ libdrm-2.4.0/libdrm/xf86drm.h 2007-11-12 19:27:51.000000000 -0500 +@@ -39,14 +39,6 @@ + #include + #include + +- /* Defaults, if nothing set in xf86config */ +-#define DRM_DEV_UID 0 +-#define DRM_DEV_GID 0 +-/* Default /dev/dri directory permissions 0755 */ +-#define DRM_DEV_DIRMODE \ +- (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) +-#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) +- + #define DRM_DIR_NAME "/dev/dri" + #define DRM_DEV_NAME "%s/card%d" + #define DRM_PROC_NAME "/proc/dri/" /* For backward Linux compatibility */ diff --git a/libdrm-make-dri-perms-okay.patch b/libdrm-make-dri-perms-okay.patch new file mode 100644 index 0000000..d9913c4 --- /dev/null +++ b/libdrm-make-dri-perms-okay.patch @@ -0,0 +1,12 @@ +diff -up libdrm-20080303/libdrm/xf86drm.h.da libdrm-20080303/libdrm/xf86drm.h +--- libdrm-20080303/libdrm/xf86drm.h.da 2008-03-19 15:26:31.000000000 +1000 ++++ libdrm-20080303/libdrm/xf86drm.h 2008-03-19 15:26:46.000000000 +1000 +@@ -45,7 +45,7 @@ + /* Default /dev/dri directory permissions 0755 */ + #define DRM_DEV_DIRMODE \ + (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) +-#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) ++#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) + + #define DRM_DIR_NAME "/dev/dri" + #define DRM_DEV_NAME "%s/card%d" diff --git a/libdrm-wait-udev.patch b/libdrm-wait-udev.patch new file mode 100644 index 0000000..29051ae --- /dev/null +++ b/libdrm-wait-udev.patch @@ -0,0 +1,68 @@ +diff --git a/configure.ac b/configure.ac +index 1cf877d..0cf0974 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -34,6 +34,9 @@ AC_SYS_LARGEFILE + + pkgconfigdir=${libdir}/pkgconfig + AC_SUBST(pkgconfigdir) ++AC_ARG_ENABLE(udev, AS_HELP_STRING([--enable-udev], ++ [Enable support for using udev instead of mknod (default: disabled)]), ++ [UDEV=$enableval], [UDEV=no]) + + + dnl =========================================================================== +@@ -101,6 +104,10 @@ AC_CACHE_CHECK([for supported warning flags], libdrm_cv_warn_cflags, [ + AC_MSG_CHECKING([which warning flags were supported])]) + WARN_CFLAGS="$libdrm_cv_warn_cflags" + ++if test "x$UDEV" = xyes; then ++ AC_DEFINE(UDEV, 1, [Have UDEV support]) ++fi ++ + AC_SUBST(WARN_CFLAGS) + AC_OUTPUT([ + Makefile +diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c +index 150dd5f..5d8819a 100644 +--- a/libdrm/xf86drm.c ++++ b/libdrm/xf86drm.c +@@ -297,6 +297,7 @@ static int drmOpenDevice(long dev, int minor) + group = (serv_group >= 0) ? serv_group : DRM_DEV_GID; + } + ++#if !defined(UDEV) + if (stat(DRM_DIR_NAME, &st)) { + if (!isroot) + return DRM_ERR_NOT_ROOT; +@@ -317,6 +318,30 @@ static int drmOpenDevice(long dev, int minor) + chown(buf, user, group); + chmod(buf, devmode); + } ++#else ++ /* if we modprobed then wait for udev */ ++ { ++ int udev_count = 0; ++wait_for_udev: ++ if (stat(DRM_DIR_NAME, &st)) { ++ usleep(20); ++ udev_count++; ++ ++ if (udev_count == 50) ++ return -1; ++ goto wait_for_udev; ++ } ++ ++ if (stat(buf, &st)) { ++ usleep(20); ++ udev_count++; ++ ++ if (udev_count == 50) ++ return -1; ++ goto wait_for_udev; ++ } ++ } ++#endif + + fd = open(buf, O_RDWR, 0); + drmMsg("drmOpenDevice: open result is %d, (%s)\n", -- 2.44.0