Home | History | Annotate | Line # | Download | only in common
      1 /*
      2  * Copyright  2020 Intel Corporation
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice shall be included
     12  * in all copies or substantial portions of the Software.
     13  *
     14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     15  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     17  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     20  * DEALINGS IN THE SOFTWARE.
     21  */
     22 
     23 #include "intel_gem.h"
     24 #include "drm-uapi/i915_drm.h"
     25 
     26 bool
     27 intel_gem_supports_syncobj_wait(int fd)
     28 {
     29    int ret;
     30 
     31    struct drm_syncobj_create create = {
     32       .flags = 0,
     33    };
     34    ret = intel_ioctl(fd, DRM_IOCTL_SYNCOBJ_CREATE, &create);
     35    if (ret)
     36       return false;
     37 
     38    uint32_t syncobj = create.handle;
     39 
     40    struct drm_syncobj_wait wait = {
     41       .handles = (uint64_t)(uintptr_t)&create,
     42       .count_handles = 1,
     43       .timeout_nsec = 0,
     44       .flags = DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT,
     45    };
     46    ret = intel_ioctl(fd, DRM_IOCTL_SYNCOBJ_WAIT, &wait);
     47 
     48    struct drm_syncobj_destroy destroy = {
     49       .handle = syncobj,
     50    };
     51    intel_ioctl(fd, DRM_IOCTL_SYNCOBJ_DESTROY, &destroy);
     52 
     53    /* If it timed out, then we have the ioctl and it supports the
     54     * DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT flag.
     55     */
     56    return ret == -1 && errno == ETIME;
     57 }
     58