summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2012-05-13 19:36:39 +0100
committerDave Airlie <airlied@redhat.com>2012-06-11 15:38:15 +0100
commit9cb45be3890faa5fe35136b1c6aad54a1103a8c4 (patch)
tree7b26defdec9f081ce008a1c5c057adcc7f4ba61e
parent43b230ffd79fffd3c6f46b1af8bde933e500a826 (diff)
drm/gem: add flink support
-rw-r--r--include/drm/drm.h14
-rw-r--r--xf86drm.c25
-rw-r--r--xf86drm.h1
3 files changed, 40 insertions, 0 deletions
diff --git a/include/drm/drm.h b/include/drm/drm.h
index cbf80bbf..53eac4a4 100644
--- a/include/drm/drm.h
+++ b/include/drm/drm.h
@@ -618,6 +618,19 @@ struct drm_get_cap {
__u64 value;
};
+struct drm_gem_flink_to {
+ /** Handle for the object being named */
+ __u32 handle;
+
+ /** Magic for destination file_priv */
+ __u32 magic;
+
+ /** Returned name for the object */
+ __u32 name;
+
+ __u32 pad;
+};
+
#define DRM_CLOEXEC O_CLOEXEC
struct drm_prime_handle {
__u32 handle;
@@ -650,6 +663,7 @@ struct drm_prime_handle {
#define DRM_IOCTL_GEM_FLINK DRM_IOWR(0x0a, struct drm_gem_flink)
#define DRM_IOCTL_GEM_OPEN DRM_IOWR(0x0b, struct drm_gem_open)
#define DRM_IOCTL_GET_CAP DRM_IOWR(0x0c, struct drm_get_cap)
+#define DRM_IOCTL_GEM_FLINK_TO DRM_IOWR(0x0d, struct drm_gem_flink_to)
#define DRM_IOCTL_SET_UNIQUE DRM_IOW( 0x10, struct drm_unique)
#define DRM_IOCTL_AUTH_MAGIC DRM_IOW( 0x11, struct drm_auth)
diff --git a/xf86drm.c b/xf86drm.c
index 2a74c807..00a25cf3 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2543,6 +2543,31 @@ char *drmGetDeviceNameFromFd(int fd)
return strdup(name);
}
+uint32_t drmGemFlinkTo(int fd, drm_magic_t magic, uint32_t handle)
+{
+ struct drm_gem_flink_to flink_to;
+ int ret;
+
+ memset(&flink_to, 0, sizeof flink_to);
+
+ flink_to.handle = handle;
+ flink_to.magic = magic;
+
+ do {
+ ret = ioctl(fd,
+ DRM_IOCTL_GEM_FLINK_TO,
+ &flink_to);
+ } while (ret == -1 && errno == EINTR);
+
+ if (ret != 0) {
+ fprintf(stderr, "Couldn't flink_to handle 0x%08x: %s\n",
+ handle, strerror(errno));
+ return 0;
+ }
+
+ return flink_to.name;
+}
+
int drmPrimeHandleToFD(int fd, uint32_t handle, uint32_t flags, int *prime_fd)
{
struct drm_prime_handle args;
diff --git a/xf86drm.h b/xf86drm.h
index 5ecb2846..bcaae35f 100644
--- a/xf86drm.h
+++ b/xf86drm.h
@@ -727,6 +727,7 @@ extern int drmHandleEvent(int fd, drmEventContextPtr evctx);
extern char *drmGetDeviceNameFromFd(int fd);
+extern uint32_t drmGemFlinkTo(int fd, drm_magic_t magic, uint32_t handle);
extern int drmPrimeHandleToFD(int fd, uint32_t handle, uint32_t flags, int *prime_fd);
extern int drmPrimeFDToHandle(int fd, int prime_fd, uint32_t *handle);