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 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) (limited to 'xf86drm.c') 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(). * -- cgit v1.2.3