drm: introduce a capability flag for syncobj timeline support
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Tue, 16 Apr 2019 12:57:50 +0000 (13:57 +0100)
committerDave Airlie <airlied@redhat.com>
Thu, 2 May 2019 02:36:47 +0000 (12:36 +1000)
Unfortunately userspace users of this API cannot be publicly disclosed
yet.

This commit effectively disables timeline syncobj ioctls for all
drivers. Each driver wishing to support this feature will need to
expose DRIVER_SYNCOBJ_TIMELINE.

v2: Add uAPI capability check (Christian)

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Christian König <christian.koenig@amd.com> (v1)
Cc: Dave Airlie <airlied@redhat.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Christian König <christian.koenig@amd.com>
Cc: Chunming Zhou <david1.zhou@amd.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190416125750.31370-1-lionel.g.landwerlin@intel.com
drivers/gpu/drm/drm_ioctl.c
drivers/gpu/drm/drm_syncobj.c
include/drm/drm_drv.h
include/uapi/drm/drm.h

index 5878145077d0428eb685797be95d2987046357d4..2263e3ddd8222bbc2732a2d93328edcd99de8842 100644 (file)
@@ -245,6 +245,9 @@ static int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_
        case DRM_CAP_SYNCOBJ:
                req->value = drm_core_check_feature(dev, DRIVER_SYNCOBJ);
                return 0;
+       case DRM_CAP_SYNCOBJ_TIMELINE:
+               req->value = drm_core_check_feature(dev, DRIVER_SYNCOBJ_TIMELINE);
+               return 0;
        }
 
        /* Other caps only work with KMS drivers */
index d141dee386403bd6d4c601709a51827dcb1a079a..361a01a08c1856532a29460e5e21e8a63cbaaf24 100644 (file)
@@ -740,7 +740,7 @@ drm_syncobj_transfer_ioctl(struct drm_device *dev, void *data,
        struct drm_syncobj_transfer *args = data;
        int ret;
 
-       if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
+       if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ_TIMELINE))
                return -EOPNOTSUPP;
 
        if (args->pad)
@@ -1091,7 +1091,7 @@ drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void *data,
        struct drm_syncobj **syncobjs;
        int ret = 0;
 
-       if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
+       if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ_TIMELINE))
                return -EOPNOTSUPP;
 
        if (args->flags & ~(DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL |
@@ -1195,7 +1195,7 @@ drm_syncobj_timeline_signal_ioctl(struct drm_device *dev, void *data,
        uint32_t i, j;
        int ret;
 
-       if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
+       if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ_TIMELINE))
                return -EOPNOTSUPP;
 
        if (args->pad != 0)
@@ -1266,8 +1266,8 @@ int drm_syncobj_query_ioctl(struct drm_device *dev, void *data,
        uint32_t i;
        int ret;
 
-       if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
-               return -ENODEV;
+       if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ_TIMELINE))
+               return -EOPNOTSUPP;
 
        if (args->pad != 0)
                return -EINVAL;
index 5cc7f728ec73dbad4ca437feb6f6eda88f82f099..68ca736c548d460279c9ebc74c10abb21235fb82 100644 (file)
@@ -91,6 +91,13 @@ enum drm_driver_feature {
         * submission.
         */
        DRIVER_SYNCOBJ                  = BIT(5),
+       /**
+        * @DRIVER_SYNCOBJ_TIMELINE:
+        *
+        * Driver supports the timeline flavor of &drm_syncobj for explicit
+        * synchronization of command submission.
+        */
+       DRIVER_SYNCOBJ_TIMELINE         = BIT(6),
 
        /* IMPORTANT: Below are all the legacy flags, add new ones above. */
 
index 236b01a1fabfe601a0a3ec59dc526641e230921c..661d73f9a919996f88bec2c37e1e5543b8159373 100644 (file)
@@ -649,6 +649,7 @@ struct drm_gem_open {
 #define DRM_CAP_PAGE_FLIP_TARGET       0x11
 #define DRM_CAP_CRTC_IN_VBLANK_EVENT   0x12
 #define DRM_CAP_SYNCOBJ                0x13
+#define DRM_CAP_SYNCOBJ_TIMELINE       0x14
 
 /** DRM_IOCTL_GET_CAP ioctl argument type */
 struct drm_get_cap {