mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	drm/syncobj: add transition iotcls between binary and timeline v2
we need to import/export timeline point. v2: unify to one transfer ioctl Signed-off-by: Chunming Zhou <david1.zhou@amd.com> Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Link: https://patchwork.freedesktop.org/patch/295790/?series=58813&rev=1
This commit is contained in:
		
							parent
							
								
									bc9c80fe01
								
							
						
					
					
						commit
						ea569910cb
					
				
					 4 changed files with 88 additions and 0 deletions
				
			
		|  | @ -180,6 +180,8 @@ int drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, void *data, | |||
| 				   struct drm_file *file_private); | ||||
| int drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data, | ||||
| 				   struct drm_file *file_private); | ||||
| int drm_syncobj_transfer_ioctl(struct drm_device *dev, void *data, | ||||
| 			       struct drm_file *file_private); | ||||
| int drm_syncobj_wait_ioctl(struct drm_device *dev, void *data, | ||||
| 			   struct drm_file *file_private); | ||||
| int drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void *data, | ||||
|  |  | |||
|  | @ -686,6 +686,8 @@ static const struct drm_ioctl_desc drm_ioctls[] = { | |||
| 		      DRM_UNLOCKED|DRM_RENDER_ALLOW), | ||||
| 	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, drm_syncobj_fd_to_handle_ioctl, | ||||
| 		      DRM_UNLOCKED|DRM_RENDER_ALLOW), | ||||
| 	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TRANSFER, drm_syncobj_transfer_ioctl, | ||||
| 		      DRM_UNLOCKED|DRM_RENDER_ALLOW), | ||||
| 	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl, | ||||
| 		      DRM_UNLOCKED|DRM_RENDER_ALLOW), | ||||
| 	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, drm_syncobj_timeline_wait_ioctl, | ||||
|  |  | |||
|  | @ -680,6 +680,80 @@ drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data, | |||
| 					&args->handle); | ||||
| } | ||||
| 
 | ||||
| static int drm_syncobj_transfer_to_timeline(struct drm_file *file_private, | ||||
| 					    struct drm_syncobj_transfer *args) | ||||
| { | ||||
| 	struct drm_syncobj *timeline_syncobj = NULL; | ||||
| 	struct dma_fence *fence; | ||||
| 	struct dma_fence_chain *chain; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	timeline_syncobj = drm_syncobj_find(file_private, args->dst_handle); | ||||
| 	if (!timeline_syncobj) { | ||||
| 		return -ENOENT; | ||||
| 	} | ||||
| 	ret = drm_syncobj_find_fence(file_private, args->src_handle, | ||||
| 				     args->src_point, args->flags, | ||||
| 				     &fence); | ||||
| 	if (ret) | ||||
| 		goto err; | ||||
| 	chain = kzalloc(sizeof(struct dma_fence_chain), GFP_KERNEL); | ||||
| 	if (!chain) { | ||||
| 		ret = -ENOMEM; | ||||
| 		goto err1; | ||||
| 	} | ||||
| 	drm_syncobj_add_point(timeline_syncobj, chain, fence, args->dst_point); | ||||
| err1: | ||||
| 	dma_fence_put(fence); | ||||
| err: | ||||
| 	drm_syncobj_put(timeline_syncobj); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| drm_syncobj_transfer_to_binary(struct drm_file *file_private, | ||||
| 			       struct drm_syncobj_transfer *args) | ||||
| { | ||||
| 	struct drm_syncobj *binary_syncobj = NULL; | ||||
| 	struct dma_fence *fence; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	binary_syncobj = drm_syncobj_find(file_private, args->dst_handle); | ||||
| 	if (!binary_syncobj) | ||||
| 		return -ENOENT; | ||||
| 	ret = drm_syncobj_find_fence(file_private, args->src_handle, | ||||
| 				     args->src_point, args->flags, &fence); | ||||
| 	if (ret) | ||||
| 		goto err; | ||||
| 	drm_syncobj_replace_fence(binary_syncobj, fence); | ||||
| 	dma_fence_put(fence); | ||||
| err: | ||||
| 	drm_syncobj_put(binary_syncobj); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| int | ||||
| drm_syncobj_transfer_ioctl(struct drm_device *dev, void *data, | ||||
| 			   struct drm_file *file_private) | ||||
| { | ||||
| 	struct drm_syncobj_transfer *args = data; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	if (args->pad) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if (args->dst_point) | ||||
| 		ret = drm_syncobj_transfer_to_timeline(file_private, args); | ||||
| 	else | ||||
| 		ret = drm_syncobj_transfer_to_binary(file_private, args); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static void syncobj_wait_fence_func(struct dma_fence *fence, | ||||
| 				    struct dma_fence_cb *cb) | ||||
| { | ||||
|  |  | |||
|  | @ -735,6 +735,15 @@ struct drm_syncobj_handle { | |||
| 	__u32 pad; | ||||
| }; | ||||
| 
 | ||||
| struct drm_syncobj_transfer { | ||||
| 	__u32 src_handle; | ||||
| 	__u32 dst_handle; | ||||
| 	__u64 src_point; | ||||
| 	__u64 dst_point; | ||||
| 	__u32 flags; | ||||
| 	__u32 pad; | ||||
| }; | ||||
| 
 | ||||
| #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0) | ||||
| #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1) | ||||
| #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE (1 << 2) /* wait for time point to become available */ | ||||
|  | @ -933,6 +942,7 @@ extern "C" { | |||
| 
 | ||||
| #define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT	DRM_IOWR(0xCA, struct drm_syncobj_timeline_wait) | ||||
| #define DRM_IOCTL_SYNCOBJ_QUERY		DRM_IOWR(0xCB, struct drm_syncobj_timeline_array) | ||||
| #define DRM_IOCTL_SYNCOBJ_TRANSFER	DRM_IOWR(0xCC, struct drm_syncobj_transfer) | ||||
| 
 | ||||
| /**
 | ||||
|  * Device specific ioctls should only be in their respective headers | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Chunming Zhou
						Chunming Zhou