diff options
author | Dave Airlie <airlied@redhat.com> | 2012-05-13 19:36:39 +0100 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-06-11 15:38:15 +0100 |
commit | 9cb45be3890faa5fe35136b1c6aad54a1103a8c4 (patch) | |
tree | 7b26defdec9f081ce008a1c5c057adcc7f4ba61e | |
parent | 43b230ffd79fffd3c6f46b1af8bde933e500a826 (diff) |
drm/gem: add flink support
-rw-r--r-- | include/drm/drm.h | 14 | ||||
-rw-r--r-- | xf86drm.c | 25 | ||||
-rw-r--r-- | xf86drm.h | 1 |
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) @@ -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; @@ -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); |