Esempio n. 1
0
int
drm_gem_flink_ioctl(struct drm_device *dev, void *data,
    struct drm_file *file_priv)
{
	struct drm_gem_flink *args;
	struct drm_gem_object *obj;
	int error;

	if (!drm_core_check_feature(dev, DRIVER_GEM))
		return (ENODEV);
	args = data;

	obj = drm_gem_name_ref(&file_priv->object_names, args->handle,
	    (void (*)(void *))drm_gem_object_reference);
	if (obj == NULL)
		return (ENOENT);
	error = drm_gem_name_create(&dev->object_names, obj, &obj->name);
	if (error != 0) {
		if (error == EALREADY)
			error = 0;
		drm_gem_object_unreference_unlocked(obj);
	}
	if (error == 0)
		args->name = obj->name;
	return (error);
}
Esempio n. 2
0
int
drm_gem_flink_ioctl(struct drm_device *dev, void *data,
                    struct drm_file *file_priv)
{
    struct drm_gem_flink *args = data;
    struct drm_gem_object *obj;
    int ret;

    if (!(dev->driver->driver_features & DRIVER_GEM))
        return -ENODEV;

    obj = drm_gem_object_lookup(dev, file_priv, args->handle);
    if (obj == NULL)
        return -ENOENT;

    ret = drm_gem_name_create(&dev->object_names, obj, &obj->name);
    if (ret != 0) {
        if (ret == -EALREADY)
            ret = 0;
        drm_gem_object_unreference_unlocked(obj);
    }
    if (ret == 0)
        args->name = obj->name;
    return ret;
}
Esempio n. 3
0
/**
 * Create a handle for this object. This adds a handle reference
 * to the object, which includes a regular reference count. Callers
 * will likely want to dereference the object afterwards.
 */
int
drm_gem_handle_create(struct drm_file *file_priv,
                      struct drm_gem_object *obj,
                      u32 *handlep)
{
    struct drm_device *dev = obj->dev;
    int ret;

    *handlep = 0;
    ret = drm_gem_name_create(&file_priv->object_names, obj, handlep);
    if (ret != 0)
        return ret;

    drm_gem_object_handle_reference(obj);

    if (dev->driver->gem_open_object) {
        ret = dev->driver->gem_open_object(obj, file_priv);
        if (ret) {
            drm_gem_handle_delete(file_priv, *handlep);
            return ret;
        }
    }

    return 0;
}
Esempio n. 4
0
static int
create_hw_context(struct drm_device *dev,
		  struct drm_i915_file_private *file_priv,
		  struct i915_hw_context **ret_ctx)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct i915_hw_context *ctx;
	int ret, id;

	ctx = malloc(sizeof(*ctx), DRM_I915_GEM, M_NOWAIT | M_ZERO);
	if (ctx == NULL)
		return (-ENOMEM);

	ctx->obj = i915_gem_alloc_object(dev, dev_priv->hw_context_size);
	if (ctx->obj == NULL) {
		free(ctx, DRM_I915_GEM);
		DRM_DEBUG_DRIVER("Context object allocated failed\n");
		return (-ENOMEM);
	}

	if (INTEL_INFO(dev)->gen >= 7) {
		ret = i915_gem_object_set_cache_level(ctx->obj,
						      I915_CACHE_LLC_MLC);
		if (ret)
			goto err_out;
	}

	/* The ring associated with the context object is handled by the normal
	 * object tracking code. We give an initial ring value simple to pass an
	 * assertion in the context switch code.
	 */
	ctx->ring = &dev_priv->rings[RCS];

	/* Default context will never have a file_priv */
	if (file_priv == NULL) {
		*ret_ctx = ctx;
		return (0);
	}

	ctx->file_priv = file_priv;

again:
	id = 0;
	ret = drm_gem_name_create(&file_priv->context_idr, ctx, &id);
	if (ret == 0)
		ctx->id = id;

	if (ret == -EAGAIN)
		goto again;
	else if (ret)
		goto err_out;

	*ret_ctx = ctx;
	return (0);

err_out:
	do_destroy(ctx);
	return (ret);
}
Esempio n. 5
0
int
drm_gem_handle_create(struct drm_file *file_priv, struct drm_gem_object *obj,
    uint32_t *handle)
{
	int error;

	error = drm_gem_name_create(&file_priv->object_names, obj, handle);
	if (error != 0)
		return (error);
	drm_gem_object_handle_reference(obj);
	return (0);
}