On 2017å¹´09æ??13æ?¥ 04:42, Marek Olšák wrote: > From: Marek Olšák <marek.olsak at amd.com> > > For amdgpu. > > drm_syncobj_create is renamed to drm_syncobj_create_as_handle, and new > helpers drm_syncobj_create and drm_syncobj_get_handle are added. > > Signed-off-by: Marek Olšák <marek.olsak at amd.com> > --- > drivers/gpu/drm/drm_syncobj.c | 49 +++++++++++++++++++++++++++++++++++++++---- > include/drm/drm_syncobj.h | 4 ++++ > 2 files changed, 49 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c > index 0422b8c..0bb1741 100644 > --- a/drivers/gpu/drm/drm_syncobj.c > +++ b/drivers/gpu/drm/drm_syncobj.c > @@ -262,8 +262,14 @@ void drm_syncobj_free(struct kref *kref) > } > EXPORT_SYMBOL(drm_syncobj_free); > > -static int drm_syncobj_create(struct drm_file *file_private, > - u32 *handle, uint32_t flags) You can add a new parameter for passing dma fence, then in patch3, you can directly use it for AMDGPU_FENCE_TO HANDLE_GET_SYNCOBJ. otherwise the set looks good to me. Regards, David Zhou > +/** > + * drm_syncobj_create - create a new syncobj > + * @out_syncobj: returned syncobj > + * @flags: DRM_SYNCOBJ_* flags > + * @fence: if non-NULL, the syncobj will represent this fence > + */ > +int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags, > + struct dma_fence *fence) > { > int ret; > struct drm_syncobj *syncobj; > @@ -284,6 +290,25 @@ static int drm_syncobj_create(struct drm_file *file_private, > } > } > > + if (fence) > + drm_syncobj_replace_fence(syncobj, fence); > + > + *out_syncobj = syncobj; > + return 0; > +} > +EXPORT_SYMBOL(drm_syncobj_create); > + > +/** > + * drm_syncobj_get_handle - get a handle from a syncobj > + */ > +int drm_syncobj_get_handle(struct drm_file *file_private, > + struct drm_syncobj *syncobj, u32 *handle) > +{ > + int ret; > + > + /* take a reference to put in the idr */ > + drm_syncobj_get(syncobj); > + > idr_preload(GFP_KERNEL); > spin_lock(&file_private->syncobj_table_lock); > ret = idr_alloc(&file_private->syncobj_idr, syncobj, 1, 0, GFP_NOWAIT); > @@ -299,6 +324,22 @@ static int drm_syncobj_create(struct drm_file *file_private, > *handle = ret; > return 0; > } > +EXPORT_SYMBOL(drm_syncobj_get_handle); > + > +static int drm_syncobj_create_as_handle(struct drm_file *file_private, > + u32 *handle, uint32_t flags) > +{ > + int ret; > + struct drm_syncobj *syncobj; > + > + ret = drm_syncobj_create(&syncobj, flags, NULL); > + if (ret) > + return ret; > + > + ret = drm_syncobj_get_handle(file_private, syncobj, handle); > + drm_syncobj_put(syncobj); > + return ret; > +} > > static int drm_syncobj_destroy(struct drm_file *file_private, > u32 handle) > @@ -522,8 +563,8 @@ drm_syncobj_create_ioctl(struct drm_device *dev, void *data, > if (args->flags & ~DRM_SYNCOBJ_CREATE_SIGNALED) > return -EINVAL; > > - return drm_syncobj_create(file_private, > - &args->handle, args->flags); > + return drm_syncobj_create_as_handle(file_private, > + &args->handle, args->flags); > } > > int > diff --git a/include/drm/drm_syncobj.h b/include/drm/drm_syncobj.h > index c00fee5..e7f0035 100644 > --- a/include/drm/drm_syncobj.h > +++ b/include/drm/drm_syncobj.h > @@ -136,5 +136,9 @@ int drm_syncobj_find_fence(struct drm_file *file_private, > u32 handle, > struct dma_fence **fence); > void drm_syncobj_free(struct kref *kref); > +int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags, > + struct dma_fence *fence); > +int drm_syncobj_get_handle(struct drm_file *file_private, > + struct drm_syncobj *syncobj, u32 *handle); > > #endif