diff options
| -rw-r--r-- | drivers/gpu/drm/drm_internal.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_ioctl.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_syncobj.c | 33 | ||||
| -rw-r--r-- | include/uapi/drm/drm.h | 7 |
4 files changed, 44 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h index 534e5ac43bf8..83f1615eb1ec 100644 --- a/drivers/gpu/drm/drm_internal.h +++ b/drivers/gpu/drm/drm_internal.h | |||
| @@ -169,3 +169,5 @@ int drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data, | |||
| 169 | struct drm_file *file_private); | 169 | struct drm_file *file_private); |
| 170 | int drm_syncobj_wait_ioctl(struct drm_device *dev, void *data, | 170 | int drm_syncobj_wait_ioctl(struct drm_device *dev, void *data, |
| 171 | struct drm_file *file_private); | 171 | struct drm_file *file_private); |
| 172 | int drm_syncobj_reset_ioctl(struct drm_device *dev, void *data, | ||
| 173 | struct drm_file *file_private); | ||
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c index b4f443417a28..16c5d51a43aa 100644 --- a/drivers/gpu/drm/drm_ioctl.c +++ b/drivers/gpu/drm/drm_ioctl.c | |||
| @@ -659,6 +659,8 @@ static const struct drm_ioctl_desc drm_ioctls[] = { | |||
| 659 | DRM_UNLOCKED|DRM_RENDER_ALLOW), | 659 | DRM_UNLOCKED|DRM_RENDER_ALLOW), |
| 660 | DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl, | 660 | DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl, |
| 661 | DRM_UNLOCKED|DRM_RENDER_ALLOW), | 661 | DRM_UNLOCKED|DRM_RENDER_ALLOW), |
| 662 | DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_RESET, drm_syncobj_reset_ioctl, | ||
| 663 | DRM_UNLOCKED|DRM_RENDER_ALLOW), | ||
| 662 | }; | 664 | }; |
| 663 | 665 | ||
| 664 | #define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls ) | 666 | #define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls ) |
diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index 15e74ca61760..40d2ad293661 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c | |||
| @@ -885,3 +885,36 @@ drm_syncobj_wait_ioctl(struct drm_device *dev, void *data, | |||
| 885 | 885 | ||
| 886 | return ret; | 886 | return ret; |
| 887 | } | 887 | } |
| 888 | |||
| 889 | int | ||
| 890 | drm_syncobj_reset_ioctl(struct drm_device *dev, void *data, | ||
| 891 | struct drm_file *file_private) | ||
| 892 | { | ||
| 893 | struct drm_syncobj_array *args = data; | ||
| 894 | struct drm_syncobj **syncobjs; | ||
| 895 | uint32_t i; | ||
| 896 | int ret; | ||
| 897 | |||
| 898 | if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) | ||
| 899 | return -ENODEV; | ||
| 900 | |||
| 901 | if (args->pad != 0) | ||
| 902 | return -EINVAL; | ||
| 903 | |||
| 904 | if (args->count_handles == 0) | ||
| 905 | return -EINVAL; | ||
| 906 | |||
| 907 | ret = drm_syncobj_array_find(file_private, | ||
| 908 | u64_to_user_ptr(args->handles), | ||
| 909 | args->count_handles, | ||
| 910 | &syncobjs); | ||
| 911 | if (ret < 0) | ||
| 912 | return ret; | ||
| 913 | |||
| 914 | for (i = 0; i < args->count_handles; i++) | ||
| 915 | drm_syncobj_replace_fence(syncobjs[i], NULL); | ||
| 916 | |||
| 917 | drm_syncobj_array_free(syncobjs, args->count_handles); | ||
| 918 | |||
| 919 | return 0; | ||
| 920 | } | ||
diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h index 4c746597225e..b037fdf9e43b 100644 --- a/include/uapi/drm/drm.h +++ b/include/uapi/drm/drm.h | |||
| @@ -731,6 +731,12 @@ struct drm_syncobj_wait { | |||
| 731 | __u32 pad; | 731 | __u32 pad; |
| 732 | }; | 732 | }; |
| 733 | 733 | ||
| 734 | struct drm_syncobj_array { | ||
| 735 | __u64 handles; | ||
| 736 | __u32 count_handles; | ||
| 737 | __u32 pad; | ||
| 738 | }; | ||
| 739 | |||
| 734 | #if defined(__cplusplus) | 740 | #if defined(__cplusplus) |
| 735 | } | 741 | } |
| 736 | #endif | 742 | #endif |
| @@ -854,6 +860,7 @@ extern "C" { | |||
| 854 | #define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD DRM_IOWR(0xC1, struct drm_syncobj_handle) | 860 | #define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD DRM_IOWR(0xC1, struct drm_syncobj_handle) |
| 855 | #define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE DRM_IOWR(0xC2, struct drm_syncobj_handle) | 861 | #define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE DRM_IOWR(0xC2, struct drm_syncobj_handle) |
| 856 | #define DRM_IOCTL_SYNCOBJ_WAIT DRM_IOWR(0xC3, struct drm_syncobj_wait) | 862 | #define DRM_IOCTL_SYNCOBJ_WAIT DRM_IOWR(0xC3, struct drm_syncobj_wait) |
| 863 | #define DRM_IOCTL_SYNCOBJ_RESET DRM_IOWR(0xC4, struct drm_syncobj_array) | ||
| 857 | 864 | ||
| 858 | /** | 865 | /** |
| 859 | * Device specific ioctls should only be in their respective headers | 866 | * Device specific ioctls should only be in their respective headers |
