mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 14:53:58 -04:00
Merge branch 'drm-next-4.15' of git://people.freedesktop.org/~agd5f/linux into drm-next
More new stuff for 4.15. Highlights: - Add clock query interface for raven - Add new FENCE_TO_HANDLE ioctl - UVD video encode ring support on polaris - transparent huge page DMA support - deadlock fixes - compute pipe lru tweaks - powerplay cleanups and regression fixes - fix duplicate symbol issue with radeon and amdgpu - misc bug fixes * 'drm-next-4.15' of git://people.freedesktop.org/~agd5f/linux: (72 commits) drm/radeon/dp: make radeon_dp_get_dp_link_config static drm/radeon: move ci_send_msg_to_smc to where it's used drm/amd/sched: fix deadlock caused by unsignaled fences of deleted jobs drm/amd/sched: NULL out the s_fence field after run_job drm/amd/sched: move adding finish callback to amd_sched_job_begin drm/amd/sched: fix an outdated comment drm/amd/sched: rename amd_sched_entity_pop_job drm/amdgpu: minor coding style fix drm/ttm: add transparent huge page support for DMA allocations v2 drm/ttm: add support for different pool sizes drm/ttm: remove unsued options from ttm_mem_global_alloc_page drm/amdgpu: add uvd enc irq drm/amdgpu: add uvd enc ib test drm/amdgpu: add uvd enc ring test drm/amdgpu: add uvd enc vm functions (v2) drm/amdgpu: add uvd enc into run queue drm/amdgpu: add uvd enc rings drm/amdgpu: add new uvd enc ring methods drm/amdgpu: add uvd enc command in header drm/amdgpu: add uvd enc registers in header ...
This commit is contained in:
@@ -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)
|
||||
/**
|
||||
* 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)
|
||||
@@ -345,33 +386,38 @@ static int drm_syncobj_alloc_file(struct drm_syncobj *syncobj)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drm_syncobj_get_fd(struct drm_syncobj *syncobj, int *p_fd)
|
||||
{
|
||||
int ret;
|
||||
int fd;
|
||||
|
||||
fd = get_unused_fd_flags(O_CLOEXEC);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
if (!syncobj->file) {
|
||||
ret = drm_syncobj_alloc_file(syncobj);
|
||||
if (ret) {
|
||||
put_unused_fd(fd);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
fd_install(fd, syncobj->file);
|
||||
*p_fd = fd;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_syncobj_get_fd);
|
||||
|
||||
static int drm_syncobj_handle_to_fd(struct drm_file *file_private,
|
||||
u32 handle, int *p_fd)
|
||||
{
|
||||
struct drm_syncobj *syncobj = drm_syncobj_find(file_private, handle);
|
||||
int ret;
|
||||
int fd;
|
||||
|
||||
if (!syncobj)
|
||||
return -EINVAL;
|
||||
|
||||
fd = get_unused_fd_flags(O_CLOEXEC);
|
||||
if (fd < 0) {
|
||||
drm_syncobj_put(syncobj);
|
||||
return fd;
|
||||
}
|
||||
|
||||
if (!syncobj->file) {
|
||||
ret = drm_syncobj_alloc_file(syncobj);
|
||||
if (ret)
|
||||
goto out_put_fd;
|
||||
}
|
||||
fd_install(fd, syncobj->file);
|
||||
drm_syncobj_put(syncobj);
|
||||
*p_fd = fd;
|
||||
return 0;
|
||||
out_put_fd:
|
||||
put_unused_fd(fd);
|
||||
ret = drm_syncobj_get_fd(syncobj, p_fd);
|
||||
drm_syncobj_put(syncobj);
|
||||
return ret;
|
||||
}
|
||||
@@ -522,8 +568,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
|
||||
|
||||
Reference in New Issue
Block a user