OSDN Git Service

amdgpu: Provide more specific error message if non-privileged user runs amdgpu_test
[android-x86/external-libdrm.git] / xf86drmMode.c
index 23348d7..fb22f68 100644 (file)
@@ -34,7 +34,7 @@
  */
 
 /*
- * TODO the types we are after are defined in diffrent headers on diffrent
+ * TODO the types we are after are defined in different headers on different
  * platforms find which headers to include to get uint32_t
  */
 
@@ -249,7 +249,7 @@ err_allocs:
 }
 
 int drmModeAddFB(int fd, uint32_t width, uint32_t height, uint8_t depth,
-                 uint8_t bpp, uint32_t pitch, uint32_t bo_handle,
+                uint8_t bpp, uint32_t pitch, uint32_t bo_handle,
                 uint32_t *buf_id)
 {
        struct drm_mode_fb_cmd f;
@@ -270,10 +270,10 @@ int drmModeAddFB(int fd, uint32_t width, uint32_t height, uint8_t depth,
        return 0;
 }
 
-int drmModeAddFB2(int fd, uint32_t width, uint32_t height,
-                 uint32_t pixel_format, uint32_t bo_handles[4],
-                 uint32_t pitches[4], uint32_t offsets[4],
-                 uint32_t *buf_id, uint32_t flags)
+int drmModeAddFB2WithModifiers(int fd, uint32_t width, uint32_t height,
+                               uint32_t pixel_format, uint32_t bo_handles[4],
+                               uint32_t pitches[4], uint32_t offsets[4],
+                               uint64_t modifier[4], uint32_t *buf_id, uint32_t flags)
 {
        struct drm_mode_fb_cmd2 f;
        int ret;
@@ -286,6 +286,8 @@ int drmModeAddFB2(int fd, uint32_t width, uint32_t height,
        memcpy(f.handles, bo_handles, 4 * sizeof(bo_handles[0]));
        memcpy(f.pitches, pitches, 4 * sizeof(pitches[0]));
        memcpy(f.offsets, offsets, 4 * sizeof(offsets[0]));
+       if (modifier)
+               memcpy(f.modifier, modifier, 4 * sizeof(modifier[0]));
 
        if ((ret = DRM_IOCTL(fd, DRM_IOCTL_MODE_ADDFB2, &f)))
                return ret;
@@ -294,6 +296,17 @@ int drmModeAddFB2(int fd, uint32_t width, uint32_t height,
        return 0;
 }
 
+int drmModeAddFB2(int fd, uint32_t width, uint32_t height,
+                  uint32_t pixel_format, uint32_t bo_handles[4],
+                  uint32_t pitches[4], uint32_t offsets[4],
+                  uint32_t *buf_id, uint32_t flags)
+{
+       return drmModeAddFB2WithModifiers(fd, width, height,
+                                         pixel_format, bo_handles,
+                                         pitches, offsets, NULL,
+                                         buf_id, flags);
+}
+
 int drmModeRmFB(int fd, uint32_t bufferId)
 {
        return DRM_IOCTL(fd, DRM_IOCTL_MODE_RMFB, &bufferId);
@@ -374,7 +387,7 @@ drmModeCrtcPtr drmModeGetCrtc(int fd, uint32_t crtcId)
 }
 
 int drmModeSetCrtc(int fd, uint32_t crtcId, uint32_t bufferId,
-                   uint32_t x, uint32_t y, uint32_t *connectors, int count,
+                  uint32_t x, uint32_t y, uint32_t *connectors, int count,
                   drmModeModeInfoPtr mode)
 {
        struct drm_mode_crtc crtc;
@@ -475,12 +488,13 @@ _drmModeGetConnector(int fd, uint32_t connector_id, int probe)
 {
        struct drm_mode_get_connector conn, counts;
        drmModeConnectorPtr r = NULL;
+       struct drm_mode_modeinfo stack_mode;
 
        memclear(conn);
        conn.connector_id = connector_id;
        if (!probe) {
                conn.count_modes = 1;
-               conn.modes_ptr = VOID2U64(drmMalloc(sizeof(struct drm_mode_modeinfo)));
+               conn.modes_ptr = VOID2U64(&stack_mode);
        }
 
        if (drmIoctl(fd, DRM_IOCTL_MODE_GETCONNECTOR, &conn))
@@ -504,7 +518,7 @@ retry:
                        goto err_allocs;
        } else {
                conn.count_modes = 1;
-               conn.modes_ptr = VOID2U64(drmMalloc(sizeof(struct drm_mode_modeinfo)));
+               conn.modes_ptr = VOID2U64(&stack_mode);
        }
 
        if (conn.count_encoders) {
@@ -525,7 +539,8 @@ retry:
            counts.count_encoders < conn.count_encoders) {
                drmFree(U642VOID(conn.props_ptr));
                drmFree(U642VOID(conn.prop_values_ptr));
-               drmFree(U642VOID(conn.modes_ptr));
+               if (U642VOID(conn.modes_ptr) != &stack_mode)
+                       drmFree(U642VOID(conn.modes_ptr));
                drmFree(U642VOID(conn.encoders_ptr));
 
                goto retry;
@@ -567,7 +582,8 @@ retry:
 err_allocs:
        drmFree(U642VOID(conn.prop_values_ptr));
        drmFree(U642VOID(conn.props_ptr));
-       drmFree(U642VOID(conn.modes_ptr));
+       if (U642VOID(conn.modes_ptr) != &stack_mode)
+               drmFree(U642VOID(conn.modes_ptr));
        drmFree(U642VOID(conn.encoders_ptr));
 
        return r;
@@ -873,7 +889,7 @@ int drmHandleEvent(int fd, drmEventContextPtr evctx)
        int len, i;
        struct drm_event *e;
        struct drm_event_vblank *vblank;
-       
+
        /* The DRM read semantics guarantees that we always get only
         * complete events. */
 
@@ -893,7 +909,7 @@ int drmHandleEvent(int fd, drmEventContextPtr evctx)
                                break;
                        vblank = (struct drm_event_vblank *) e;
                        evctx->vblank_handler(fd,
-                                             vblank->sequence, 
+                                             vblank->sequence,
                                              vblank->tv_sec,
                                              vblank->tv_usec,
                                              U642VOID (vblank->user_data));
@@ -932,6 +948,22 @@ int drmModePageFlip(int fd, uint32_t crtc_id, uint32_t fb_id,
        return DRM_IOCTL(fd, DRM_IOCTL_MODE_PAGE_FLIP, &flip);
 }
 
+int drmModePageFlipTarget(int fd, uint32_t crtc_id, uint32_t fb_id,
+                         uint32_t flags, void *user_data,
+                         uint32_t target_vblank)
+{
+       struct drm_mode_crtc_page_flip_target flip_target;
+
+       memclear(flip_target);
+       flip_target.fb_id = fb_id;
+       flip_target.crtc_id = crtc_id;
+       flip_target.user_data = VOID2U64(user_data);
+       flip_target.flags = flags;
+       flip_target.sequence = target_vblank;
+
+       return DRM_IOCTL(fd, DRM_IOCTL_MODE_PAGE_FLIP, &flip_target);
+}
+
 int drmModeSetPlane(int fd, uint32_t plane_id, uint32_t crtc_id,
                    uint32_t fb_id, uint32_t flags,
                    int32_t crtc_x, int32_t crtc_y,
@@ -1189,6 +1221,9 @@ drmModeAtomicReqPtr drmModeAtomicDuplicate(drmModeAtomicReqPtr old)
 {
        drmModeAtomicReqPtr new;
 
+       if (!old)
+               return NULL;
+
        new = drmMalloc(sizeof *new);
        if (!new)
                return NULL;
@@ -1213,6 +1248,9 @@ drmModeAtomicReqPtr drmModeAtomicDuplicate(drmModeAtomicReqPtr old)
 
 int drmModeAtomicMerge(drmModeAtomicReqPtr base, drmModeAtomicReqPtr augment)
 {
+       if (!base)
+               return -EINVAL;
+
        if (!augment || augment->cursor == 0)
                return 0;
 
@@ -1239,12 +1277,15 @@ int drmModeAtomicMerge(drmModeAtomicReqPtr base, drmModeAtomicReqPtr augment)
 
 int drmModeAtomicGetCursor(drmModeAtomicReqPtr req)
 {
+       if (!req)
+               return -EINVAL;
        return req->cursor;
 }
 
 void drmModeAtomicSetCursor(drmModeAtomicReqPtr req, int cursor)
 {
-       req->cursor = cursor;
+       if (req)
+               req->cursor = cursor;
 }
 
 int drmModeAtomicAddProperty(drmModeAtomicReqPtr req,
@@ -1252,6 +1293,9 @@ int drmModeAtomicAddProperty(drmModeAtomicReqPtr req,
                             uint32_t property_id,
                             uint64_t value)
 {
+       if (!req)
+               return -EINVAL;
+
        if (req->cursor >= req->size_items) {
                drmModeAtomicReqItemPtr new;
 
@@ -1309,6 +1353,9 @@ int drmModeAtomicCommit(int fd, drmModeAtomicReqPtr req, uint32_t flags,
        int obj_idx = -1;
        int ret = -1;
 
+       if (!req)
+               return -EINVAL;
+
        if (req->cursor == 0)
                return 0;