drm: Add drm mode lease ioctl wrappers [v3]
authorKeith Packard <keithp@keithp.com>
Fri, 17 Mar 2017 01:11:05 +0000 (18:11 -0700)
committerDave Airlie <airlied@redhat.com>
Mon, 18 Dec 2017 00:04:02 +0000 (10:04 +1000)
drmModeCreateLease
drmModeListLessees
drmModeGetLease
drmModeRevokeLease

Changes for v2:

Remove lessee id from GetLease
Remove lessor_id from ListLeases
Add revoke
Renumber to track kernel rebase on drm-next

Signed-off-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
xf86drmMode.c
xf86drmMode.h

index 2b3887b..eddad8c 100644 (file)
@@ -1485,3 +1485,92 @@ drmModeDestroyPropertyBlob(int fd, uint32_t id)
        destroy.blob_id = id;
        return DRM_IOCTL(fd, DRM_IOCTL_MODE_DESTROYPROPBLOB, &destroy);
 }
+
+int
+drmModeCreateLease(int fd, const uint32_t *objects, int num_objects, int flags, uint32_t *lessee_id)
+{
+       struct drm_mode_create_lease create;
+       int ret;
+
+       memclear(create);
+       create.object_ids = (uintptr_t) objects;
+       create.object_count = num_objects;
+       create.flags = flags;
+
+       ret = DRM_IOCTL(fd, DRM_IOCTL_MODE_CREATE_LEASE, &create);
+       if (ret == 0) {
+               *lessee_id = create.lessee_id;
+               return create.fd;
+       }
+       return -errno;
+}
+
+drmModeLesseeListPtr
+drmModeListLessees(int fd)
+{
+       struct drm_mode_list_lessees list;
+       uint32_t count;
+       drmModeLesseeListPtr ret;
+
+       memclear(list);
+
+       if (DRM_IOCTL(fd, DRM_IOCTL_MODE_LIST_LESSEES, &list))
+               return NULL;
+
+       count = list.count_lessees;
+       ret = drmMalloc(sizeof (drmModeLesseeListRes) + count * sizeof (ret->lessees[0]));
+       if (!ret)
+               return NULL;
+
+       list.lessees_ptr = VOID2U64(&ret->lessees[0]);
+       if (DRM_IOCTL(fd, DRM_IOCTL_MODE_LIST_LESSEES, &list)) {
+               drmFree(ret);
+               return NULL;
+       }
+
+       ret->count = count;
+       return ret;
+}
+
+drmModeObjectListPtr
+drmModeGetLease(int fd)
+{
+       struct drm_mode_get_lease get;
+       uint32_t count;
+       drmModeObjectListPtr ret;
+
+       memclear(get);
+
+       if (DRM_IOCTL(fd, DRM_IOCTL_MODE_GET_LEASE, &get))
+               return NULL;
+
+       count = get.count_objects;
+       ret = drmMalloc(sizeof (drmModeObjectListRes) + count * sizeof (ret->objects[0]));
+       if (!ret)
+               return NULL;
+
+       get.objects_ptr = VOID2U64(&ret->objects[0]);
+       if (DRM_IOCTL(fd, DRM_IOCTL_MODE_GET_LEASE, &get)) {
+               drmFree(ret);
+               return NULL;
+       }
+
+       ret->count = count;
+       return ret;
+}
+
+int
+drmModeRevokeLease(int fd, uint32_t lessee_id)
+{
+       struct drm_mode_revoke_lease revoke;
+       int ret;
+
+       memclear(revoke);
+
+       revoke.lessee_id = lessee_id;
+
+       ret = DRM_IOCTL(fd, DRM_IOCTL_MODE_REVOKE_LEASE, &revoke);
+       if (ret == 0)
+               return 0;
+       return -errno;
+}
index 6dbe335..3cd27ae 100644 (file)
@@ -521,6 +521,28 @@ extern int drmModeCreatePropertyBlob(int fd, const void *data, size_t size,
                                     uint32_t *id);
 extern int drmModeDestroyPropertyBlob(int fd, uint32_t id);
 
+/*
+ * DRM mode lease APIs. These create and manage new drm_masters with
+ * access to a subset of the available DRM resources
+ */
+
+extern int drmModeCreateLease(int fd, const uint32_t *objects, int num_objects, int flags, uint32_t *lessee_id);
+
+typedef struct drmModeLesseeList {
+       uint32_t count;
+       uint32_t lessees[0];
+} drmModeLesseeListRes, *drmModeLesseeListPtr;
+
+extern drmModeLesseeListPtr drmModeListLessees(int fd);
+
+typedef struct drmModeObjectList {
+       uint32_t count;
+       uint32_t objects[0];
+} drmModeObjectListRes, *drmModeObjectListPtr;
+
+extern drmModeObjectListPtr drmModeGetLease(int fd);
+
+extern int drmModeRevokeLease(int fd, uint32_t lessee_id);
 
 #if defined(__cplusplus)
 }