From 0c5aaeef51233aec89ee1f43f03d457f278f8fa0 Mon Sep 17 00:00:00 2001 From: Frank Binns Date: Wed, 14 Jan 2015 14:07:51 +0000 Subject: Add new drmOpenRender function Add a new function, drmOpenRender, that can be used to open render nodes. This can be used in the same way that drmOpenControl is used to open control nodes. Signed-off-by: Frank Binns Reviewed-by: Rob Clark --- xf86drm.c | 40 ++++++++++++++++++++++++++++++++++++++-- xf86drm.h | 2 ++ 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 @@ #define DRM_NODE_CONTROL 0 #define DRM_NODE_PRIMARY 1 +#define DRM_NODE_RENDER 2 static drmServerInfoPtr drm_server_info; @@ -305,6 +306,7 @@ static int chown_check_return(const char *path, uid_t owner, gid_t group) static int drmOpenDevice(long dev, int minor, int type) { stat_t st; + const char *dev_name; char buf[64]; int fd; mode_t devmode = DRM_DEV_MODE, serv_mode; @@ -312,7 +314,21 @@ static int drmOpenDevice(long dev, int minor, int type) uid_t user = DRM_DEV_UID; gid_t group = DRM_DEV_GID, serv_group; - sprintf(buf, type ? DRM_DEV_NAME : DRM_CONTROL_DEV_NAME, DRM_DIR_NAME, minor); + switch (type) { + case DRM_NODE_PRIMARY: + dev_name = DRM_DEV_NAME; + break; + case DRM_NODE_CONTROL: + dev_name = DRM_CONTROL_DEV_NAME; + break; + case DRM_NODE_RENDER: + dev_name = DRM_RENDER_DEV_NAME; + break; + default: + return -EINVAL; + }; + + sprintf(buf, dev_name, DRM_DIR_NAME, minor); drmMsg("drmOpenDevice: node name is %s\n", buf); if (drm_server_info) { @@ -417,11 +433,26 @@ static int drmOpenMinor(int minor, int create, int type) { int fd; char buf[64]; + const char *dev_name; if (create) return drmOpenDevice(makedev(DRM_MAJOR, minor), minor, type); - sprintf(buf, type ? DRM_DEV_NAME : DRM_CONTROL_DEV_NAME, DRM_DIR_NAME, minor); + switch (type) { + case DRM_NODE_PRIMARY: + dev_name = DRM_DEV_NAME; + break; + case DRM_NODE_CONTROL: + dev_name = DRM_CONTROL_DEV_NAME; + break; + case DRM_NODE_RENDER: + dev_name = DRM_RENDER_DEV_NAME; + break; + default: + return -EINVAL; + }; + + sprintf(buf, dev_name, DRM_DIR_NAME, minor); if ((fd = open(buf, O_RDWR, 0)) >= 0) return fd; return -errno; @@ -646,6 +677,11 @@ int drmOpenControl(int minor) return drmOpenMinor(minor, 0, DRM_NODE_CONTROL); } +int drmOpenRender(int minor) +{ + return drmOpenMinor(minor, 0, DRM_NODE_RENDER); +} + /** * Free the version information returned by drmGetVersion(). * diff --git a/xf86drm.h b/xf86drm.h index c024cc44..bfd0670b 100644 --- a/xf86drm.h +++ b/xf86drm.h @@ -79,6 +79,7 @@ extern "C" { #define DRM_DIR_NAME "/dev/dri" #define DRM_DEV_NAME "%s/card%d" #define DRM_CONTROL_DEV_NAME "%s/controlD%d" +#define DRM_RENDER_DEV_NAME "%s/renderD%d" #define DRM_PROC_NAME "/proc/dri/" /* For backward Linux compatibility */ #define DRM_ERR_NO_DEVICE (-1001) @@ -552,6 +553,7 @@ do { register unsigned int __old __asm("o0"); \ extern int drmAvailable(void); extern int drmOpen(const char *name, const char *busid); extern int drmOpenControl(int minor); +extern int drmOpenRender(int minor); extern int drmClose(int fd); extern drmVersionPtr drmGetVersion(int fd); extern drmVersionPtr drmGetLibVersion(int fd); -- cgit v1.2.3