aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xf86drm.c40
-rw-r--r--xf86drm.h2
2 files changed, 40 insertions, 2 deletions
diff --git a/xf86drm.c b/xf86drm.c
index a23d029b..345325a3 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -87,6 +87,7 @@
87 87
88#define DRM_NODE_CONTROL 0 88#define DRM_NODE_CONTROL 0
89#define DRM_NODE_PRIMARY 1 89#define DRM_NODE_PRIMARY 1
90#define DRM_NODE_RENDER 2
90 91
91static drmServerInfoPtr drm_server_info; 92static drmServerInfoPtr drm_server_info;
92 93
@@ -305,6 +306,7 @@ static int chown_check_return(const char *path, uid_t owner, gid_t group)
305static int drmOpenDevice(long dev, int minor, int type) 306static int drmOpenDevice(long dev, int minor, int type)
306{ 307{
307 stat_t st; 308 stat_t st;
309 const char *dev_name;
308 char buf[64]; 310 char buf[64];
309 int fd; 311 int fd;
310 mode_t devmode = DRM_DEV_MODE, serv_mode; 312 mode_t devmode = DRM_DEV_MODE, serv_mode;
@@ -312,7 +314,21 @@ static int drmOpenDevice(long dev, int minor, int type)
312 uid_t user = DRM_DEV_UID; 314 uid_t user = DRM_DEV_UID;
313 gid_t group = DRM_DEV_GID, serv_group; 315 gid_t group = DRM_DEV_GID, serv_group;
314 316
315 sprintf(buf, type ? DRM_DEV_NAME : DRM_CONTROL_DEV_NAME, DRM_DIR_NAME, minor); 317 switch (type) {
318 case DRM_NODE_PRIMARY:
319 dev_name = DRM_DEV_NAME;
320 break;
321 case DRM_NODE_CONTROL:
322 dev_name = DRM_CONTROL_DEV_NAME;
323 break;
324 case DRM_NODE_RENDER:
325 dev_name = DRM_RENDER_DEV_NAME;
326 break;
327 default:
328 return -EINVAL;
329 };
330
331 sprintf(buf, dev_name, DRM_DIR_NAME, minor);
316 drmMsg("drmOpenDevice: node name is %s\n", buf); 332 drmMsg("drmOpenDevice: node name is %s\n", buf);
317 333
318 if (drm_server_info) { 334 if (drm_server_info) {
@@ -417,11 +433,26 @@ static int drmOpenMinor(int minor, int create, int type)
417{ 433{
418 int fd; 434 int fd;
419 char buf[64]; 435 char buf[64];
436 const char *dev_name;
420 437
421 if (create) 438 if (create)
422 return drmOpenDevice(makedev(DRM_MAJOR, minor), minor, type); 439 return drmOpenDevice(makedev(DRM_MAJOR, minor), minor, type);
423 440
424 sprintf(buf, type ? DRM_DEV_NAME : DRM_CONTROL_DEV_NAME, DRM_DIR_NAME, minor); 441 switch (type) {
442 case DRM_NODE_PRIMARY:
443 dev_name = DRM_DEV_NAME;
444 break;
445 case DRM_NODE_CONTROL:
446 dev_name = DRM_CONTROL_DEV_NAME;
447 break;
448 case DRM_NODE_RENDER:
449 dev_name = DRM_RENDER_DEV_NAME;
450 break;
451 default:
452 return -EINVAL;
453 };
454
455 sprintf(buf, dev_name, DRM_DIR_NAME, minor);
425 if ((fd = open(buf, O_RDWR, 0)) >= 0) 456 if ((fd = open(buf, O_RDWR, 0)) >= 0)
426 return fd; 457 return fd;
427 return -errno; 458 return -errno;
@@ -646,6 +677,11 @@ int drmOpenControl(int minor)
646 return drmOpenMinor(minor, 0, DRM_NODE_CONTROL); 677 return drmOpenMinor(minor, 0, DRM_NODE_CONTROL);
647} 678}
648 679
680int drmOpenRender(int minor)
681{
682 return drmOpenMinor(minor, 0, DRM_NODE_RENDER);
683}
684
649/** 685/**
650 * Free the version information returned by drmGetVersion(). 686 * Free the version information returned by drmGetVersion().
651 * 687 *
diff --git a/xf86drm.h b/xf86drm.h
index c024cc44..bfd0670b 100644
--- a/xf86drm.h
+++ b/xf86drm.h
@@ -79,6 +79,7 @@ extern "C" {
79#define DRM_DIR_NAME "/dev/dri" 79#define DRM_DIR_NAME "/dev/dri"
80#define DRM_DEV_NAME "%s/card%d" 80#define DRM_DEV_NAME "%s/card%d"
81#define DRM_CONTROL_DEV_NAME "%s/controlD%d" 81#define DRM_CONTROL_DEV_NAME "%s/controlD%d"
82#define DRM_RENDER_DEV_NAME "%s/renderD%d"
82#define DRM_PROC_NAME "/proc/dri/" /* For backward Linux compatibility */ 83#define DRM_PROC_NAME "/proc/dri/" /* For backward Linux compatibility */
83 84
84#define DRM_ERR_NO_DEVICE (-1001) 85#define DRM_ERR_NO_DEVICE (-1001)
@@ -552,6 +553,7 @@ do { register unsigned int __old __asm("o0"); \
552extern int drmAvailable(void); 553extern int drmAvailable(void);
553extern int drmOpen(const char *name, const char *busid); 554extern int drmOpen(const char *name, const char *busid);
554extern int drmOpenControl(int minor); 555extern int drmOpenControl(int minor);
556extern int drmOpenRender(int minor);
555extern int drmClose(int fd); 557extern int drmClose(int fd);
556extern drmVersionPtr drmGetVersion(int fd); 558extern drmVersionPtr drmGetVersion(int fd);
557extern drmVersionPtr drmGetLibVersion(int fd); 559extern drmVersionPtr drmGetLibVersion(int fd);