示例#1
0
static struct sync_pt *
viv_sync_pt_dup(
    struct sync_pt * sync_pt
    )
{
    gceSTATUS status;
    struct viv_sync_pt *pt;
    struct viv_sync_pt *src;
    struct viv_sync_timeline *obj;

    src = (struct viv_sync_pt *) sync_pt;
    obj = (struct viv_sync_timeline *) sync_pt->parent;

    /* Create the new sync_pt. */
    pt = (struct viv_sync_pt *)
        sync_pt_create(&obj->obj, sizeof(struct viv_sync_pt));

    pt->stamp = src->stamp;
    pt->sync = src->sync;

    /* Reference sync point. */
    status = gckOS_ReferenceSyncPoint(obj->os, pt->sync);

    if (gcmIS_ERROR(status))
    {
        sync_pt_free((struct sync_pt *)pt);
        return NULL;
    }

    return (struct sync_pt *)pt;
}
static struct sync_fence *adf_sw_complete_fence(struct adf_device *dev)
{
	struct sync_pt *pt;
	struct sync_fence *complete_fence;

	if (!dev->timeline) {
		dev->timeline = sw_sync_timeline_create(dev->base.name);
		if (!dev->timeline)
			return ERR_PTR(-ENOMEM);
		dev->timeline_max = 1;
	}

	dev->timeline_max++;
	pt = sw_sync_pt_create(dev->timeline, dev->timeline_max);
	if (!pt)
		goto err_pt_create;
	complete_fence = sync_fence_create(dev->base.name, pt);
	if (!complete_fence)
		goto err_fence_create;

	return complete_fence;

err_fence_create:
	sync_pt_free(pt);
err_pt_create:
	dev->timeline_max--;
	return ERR_PTR(-ENOSYS);
}
示例#3
0
struct sync_pt *
viv_sync_pt_create(
    struct viv_sync_timeline * obj,
    gctSYNC_POINT SyncPoint
    )
{
    gceSTATUS status;
    struct viv_sync_pt * pt;

    pt = (struct viv_sync_pt *)
        sync_pt_create(&obj->obj, sizeof(struct viv_sync_pt));

    pt->stamp = obj->stamp++;
    pt->sync  = SyncPoint;

    /* Dup signal. */
    status = gckOS_ReferenceSyncPoint(obj->os, SyncPoint);

    if (gcmIS_ERROR(status))
    {
        sync_pt_free((struct sync_pt *)pt);
        return NULL;
    }

    return (struct sync_pt *) pt;
}
int k3fb_buf_sync_create_fence(struct k3_fb_data_type *k3fd, unsigned value)
{
	int fd = -1;
	struct sync_fence *fence = NULL;
	struct sync_pt *pt = NULL;

	BUG_ON(k3fd == NULL);

	fd = get_unused_fd();
	if (fd < 0) {
		K3_FB_ERR("get_unused_fd failed!\n");
		return fd;
	}

	pt = sw_sync_pt_create(k3fd->buf_sync_ctrl.timeline, value);
	if (pt == NULL) {
		return -ENOMEM;
	}

	fence = sync_fence_create(BUF_SYNC_FENCE_NAME, pt);
	if (fence == NULL) {
		sync_pt_free(pt);
		return -ENOMEM;
	}

	sync_fence_install(fence, fd);

	return fd;
}
示例#5
0
int fence_create(struct sw_sync_timeline *obj, struct fence_data *data)
{
    int fd = get_unused_fd();
    int err;
    struct sync_pt *pt;
    struct sync_fence *fence;

    if (fd < 0)
        return fd;

    pt = sw_sync_pt_create(obj, data->value);
    if (pt == NULL) {
        err = -ENOMEM;
        goto err;
    }

    data->name[sizeof(data->name) - 1] = '\0';
    fence = sync_fence_create(data->name, pt);
    if (fence == NULL) {
        sync_pt_free(pt);
        err = -ENOMEM;
        goto err;
    }

    data->fence = fd;

    sync_fence_install(fence, fd);

    return 0;

err:
    put_unused_fd(fd);
    return err;
}
void i915_sync_cancel_request(void *handle,
				struct drm_i915_gem_execbuffer2 *args,
				struct intel_ring_buffer *ring)
{
	struct sync_pt *pt = (struct sync_pt *)handle;

	if (pt)
		sync_pt_free(pt);
}
示例#7
0
int mali_stream_create_fence(mali_sync_pt *pt)
{
	struct sync_fence *fence;
	struct fdtable * fdt;
	struct files_struct * files;
	int fd = -1;

	fence = sync_fence_create("mali_fence", pt);
	if (!fence)
	{
		sync_pt_free(pt);
		fd = -EFAULT;
		goto out;
	}

	/* create a fd representing the fence */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)
	fd = get_unused_fd_flags(O_CLOEXEC);
	if (fd < 0)
	{
		sync_fence_put(fence);
		goto out;
	}
#else
	fd = get_unused_fd();
	if (fd < 0)
	{
		sync_fence_put(fence);
		goto out;
	}

	files = current->files;
	spin_lock(&files->file_lock);
	fdt = files_fdtable(files);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)
	__set_close_on_exec(fd, fdt);
#else
	FD_SET(fd, fdt->close_on_exec);
#endif
	spin_unlock(&files->file_lock);
#endif /* Linux > 3.6 */

	/* bind fence to the new fd */
	sync_fence_install(fence, fd);

out:
	return fd;
}
static long sw_sync_ioctl_create_fence(struct sw_sync_timeline *obj,
				       unsigned long arg)
{
	int fd = get_unused_fd_flags(O_CLOEXEC);
	int err;
	struct sync_pt *pt;
	struct sync_fence *fence;
	struct sw_sync_create_fence_data data;

	if (fd < 0)
		return fd;

	if (copy_from_user(&data, (void __user *)arg, sizeof(data))) {
		err = -EFAULT;
		goto err;
	}

	pt = sw_sync_pt_create(obj, data.value);
	if (pt == NULL) {
		err = -ENOMEM;
		goto err;
	}

	data.name[sizeof(data.name) - 1] = '\0';
	fence = sync_fence_create(data.name, pt);
	if (fence == NULL) {
		sync_pt_free(pt);
		err = -ENOMEM;
		goto err;
	}

	data.fence = fd;
	if (copy_to_user((void __user *)arg, &data, sizeof(data))) {
		sync_fence_put(fence);
		err = -EFAULT;
		goto err;
	}

	sync_fence_install(fence, fd);

	return 0;

err:
	put_unused_fd(fd);
	return err;
}
示例#9
0
/**
 * _sde_fence_create_fd - create fence object and return an fd for it
 * This function is NOT thread-safe.
 * @timeline: Timeline to associate with fence
 * @name: Name for fence
 * @val: Timeline value at which to signal the fence
 * Return: File descriptor on success, or error code on error
 */
static int _sde_fence_create_fd(void *timeline, const char *name, uint32_t val)
{
	struct sync_pt *sync_pt;
	struct sync_fence *fence;
	signed int fd = -EINVAL;

	if (!timeline) {
		SDE_ERROR("invalid timeline\n");
		goto exit;
	}

	if (!name)
		name = "sde_fence";

	/* create sync point */
	sync_pt = sw_sync_pt_create(timeline, val);
	if (sync_pt == NULL) {
		SDE_ERROR("failed to create sync point, %s\n", name);
		goto exit;
	}

	/* create fence */
	fence = sync_fence_create(name, sync_pt);
	if (fence == NULL) {
		sync_pt_free(sync_pt);
		SDE_ERROR("couldn't create fence, %s\n", name);
		goto exit;
	}

	/* create fd */
	fd = get_unused_fd_flags(0);
	if (fd < 0) {
		SDE_ERROR("failed to get_unused_fd_flags(), %s\n", name);
		sync_fence_put(fence);
		goto exit;
	}

	sync_fence_install(fence, fd);
exit:
	return fd;
}
STATIC int balong_ade_overlay_fence_create(struct sw_sync_timeline * timeline,
        const char * fence_name, unsigned value)
{
    int    fd;
    struct sync_fence *fence;
    struct sync_pt    *pt;

    if (timeline == NULL){
        return -EINVAL;
    }

    fd = get_unused_fd();
    if (fd < 0) {
        balongfb_loge("failed to get fd in create fence!\n");
        return fd;
    }

    pt = sw_sync_pt_create(timeline, value);
    if (pt == NULL) {
        put_unused_fd(fd);
        balongfb_loge("failed to create pt in create fence!\n");
        return -ENOMEM;
    }

    fence = sync_fence_create(fence_name, pt);
    if (fence == NULL) {
        sync_pt_free(pt);
        put_unused_fd(fd);
        balongfb_loge("failed to create fence in create fence!\n");
        return -ENOMEM;
    }

    sync_fence_install(fence, fd);

    return fd;
}
int kbase_stream_create_fence(int tl_fd)
{
	struct sync_timeline *tl;
	struct sync_pt *pt;
	struct sync_fence *fence;
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 7, 0)
	struct files_struct *files;
	struct fdtable *fdt;
#endif
	int fd;
	struct file *tl_file;

	tl_file = fget(tl_fd);
	if (tl_file == NULL)
		return -EBADF;

	if (tl_file->f_op != &stream_fops) {
		fd = -EBADF;
		goto out;
	}

	tl = tl_file->private_data;

	pt = kbase_sync_pt_alloc(tl);
	if (!pt) {
		fd = -EFAULT;
		goto out;
	}

	fence = sync_fence_create("mali_fence", pt);
	if (!fence) {
		sync_pt_free(pt);
		fd = -EFAULT;
		goto out;
	}

	/* from here the fence owns the sync_pt */

	/* create a fd representing the fence */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0)
	fd = get_unused_fd_flags(O_RDWR | O_CLOEXEC);
	if (fd < 0) {
		sync_fence_put(fence);
		goto out;
	}
#else
	fd = get_unused_fd();
	if (fd < 0) {
		sync_fence_put(fence);
		goto out;
	}

	files = current->files;
	spin_lock(&files->file_lock);
	fdt = files_fdtable(files);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
	__set_close_on_exec(fd, fdt);
#else
	FD_SET(fd, fdt->close_on_exec);
#endif
	spin_unlock(&files->file_lock);
#endif  /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0) */

	/* bind fence to the new fd */
	sync_fence_install(fence, fd);

 out:
	fput(tl_file);

	return fd;
}
示例#12
0
/*
 * This should only be called on sync_pts which have been created but
 * not added to a fence.
 */
void kgsl_sync_pt_destroy(struct sync_pt *pt)
{
	sync_pt_free(pt);
}
示例#13
0
int sprd_fence_create(struct ion_fence_data *data, char *name)
{
	int fd = get_unused_fd();
	struct sync_pt *pt;
	struct sync_fence *fence;
	struct sync_timeline_data *parent = NULL;

	if (data == NULL || name == NULL)
	{
		printk(KERN_ERR "sprd_fence_create input para is NULL\n");
		return -EFAULT;
	}


	if (fd < 0)
	{
		fd = get_unused_fd();
		if (fd < 0)
		{
			printk(KERN_ERR "sprd_sync_pt_create failed to get fd\n");
		}
		return -EFAULT;
	}

	if (data->device_type == SPRD_DEVICE_PRIMARY_SYNC)
	{
		parent = &sprd_timeline;
	}
	else if (data->device_type == SPRD_DEVICE_VIRTUAL_SYNC)
	{
		parent = &sprd_timeline_virtual;
	}

	if (parent == NULL)
	{
		printk(KERN_ERR "sprd_fence_create failed to get sync timeline\n");
		return -EFAULT;
	}

	mutex_lock(&(parent->sync_mutex));

	pt = sprd_sync_pt_create(parent->timeline, parent->timeline_value + data->life_value);
	if (pt == NULL)
	{
		printk(KERN_ERR "sprd_sync_pt_create failed\n");
		goto err;
	}

	fence = sync_fence_create(name, pt);
	if (fence == NULL)
	{
		sync_pt_free(pt);
		printk(KERN_ERR "sprd_create_fence failed\n");
		goto err;
	}

	sync_fence_install(fence, fd);

	mutex_unlock(&(parent->sync_mutex));

	pr_debug("create a fence: %p, fd: %d, life_value: %d, name: %s\n",
			(void *)fence, fd, data->life_value, name);

    return fd;

err:
   put_unused_fd(fd);
   mutex_unlock(&(parent->sync_mutex));
   return -ENOMEM;
}