Commit da0e1407 authored by Rob Clark's avatar Rob Clark
Browse files

drm/msm: Collapse vma allocation and initialization



Now that we've dropped vram carveout support, we can collapse vma
allocation and initialization.  This better matches how things work
with drm_gpuvm.

Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
Signed-off-by: default avatarRob Clark <robin.clark@oss.qualcomm.com>
Tested-by: default avatarAntonino Maniscalco <antomani103@gmail.com>
Reviewed-by: default avatarAntonino Maniscalco <antomani103@gmail.com>
Patchwork: https://patchwork.freedesktop.org/patch/661471/
parent eab7766c
Loading
Loading
Loading
Loading
+3 −27
Original line number Diff line number Diff line
@@ -333,23 +333,6 @@ uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj)
	return offset;
}

static struct msm_gem_vma *add_vma(struct drm_gem_object *obj,
		struct msm_gem_vm *vm)
{
	struct msm_gem_object *msm_obj = to_msm_bo(obj);
	struct msm_gem_vma *vma;

	msm_gem_assert_locked(obj);

	vma = msm_gem_vma_new(vm);
	if (!vma)
		return ERR_PTR(-ENOMEM);

	list_add_tail(&vma->list, &msm_obj->vmas);

	return vma;
}

static struct msm_gem_vma *lookup_vma(struct drm_gem_object *obj,
		struct msm_gem_vm *vm)
{
@@ -416,6 +399,7 @@ static struct msm_gem_vma *get_vma_locked(struct drm_gem_object *obj,
		struct msm_gem_vm *vm,
		u64 range_start, u64 range_end)
{
	struct msm_gem_object *msm_obj = to_msm_bo(obj);
	struct msm_gem_vma *vma;

	msm_gem_assert_locked(obj);
@@ -423,18 +407,10 @@ static struct msm_gem_vma *get_vma_locked(struct drm_gem_object *obj,
	vma = lookup_vma(obj, vm);

	if (!vma) {
		int ret;

		vma = add_vma(obj, vm);
		vma = msm_gem_vma_new(vm, obj, range_start, range_end);
		if (IS_ERR(vma))
			return vma;

		ret = msm_gem_vma_init(vma, obj->size,
			range_start, range_end);
		if (ret) {
			del_vma(vma);
			return ERR_PTR(ret);
		}
		list_add_tail(&vma->list, &msm_obj->vmas);
	} else {
		GEM_WARN_ON(vma->iova < range_start);
		GEM_WARN_ON((vma->iova + obj->size) > range_end);
+2 −2
Original line number Diff line number Diff line
@@ -66,8 +66,8 @@ struct msm_gem_vma {
	bool mapped;
};

struct msm_gem_vma *msm_gem_vma_new(struct msm_gem_vm *vm);
int msm_gem_vma_init(struct msm_gem_vma *vma, int size,
struct msm_gem_vma *
msm_gem_vma_new(struct msm_gem_vm *vm, struct drm_gem_object *obj,
		u64 range_start, u64 range_end);
void msm_gem_vma_purge(struct msm_gem_vma *vma);
int msm_gem_vma_map(struct msm_gem_vma *vma, int prot, struct sg_table *sgt, int size);
+15 −21
Original line number Diff line number Diff line
@@ -106,47 +106,41 @@ void msm_gem_vma_close(struct msm_gem_vma *vma)
	msm_gem_vm_put(vm);
}

struct msm_gem_vma *msm_gem_vma_new(struct msm_gem_vm *vm)
/* Create a new vma and allocate an iova for it */
struct msm_gem_vma *
msm_gem_vma_new(struct msm_gem_vm *vm, struct drm_gem_object *obj,
		u64 range_start, u64 range_end)
{
	struct msm_gem_vma *vma;
	int ret;

	vma = kzalloc(sizeof(*vma), GFP_KERNEL);
	if (!vma)
		return NULL;
		return ERR_PTR(-ENOMEM);

	vma->vm = vm;

	return vma;
}

/* Initialize a new vma and allocate an iova for it */
int msm_gem_vma_init(struct msm_gem_vma *vma, int size,
		u64 range_start, u64 range_end)
{
	struct msm_gem_vm *vm = vma->vm;
	int ret;

	if (GEM_WARN_ON(!vm))
		return -EINVAL;

	if (GEM_WARN_ON(vma->iova))
		return -EBUSY;

	spin_lock(&vm->lock);
	ret = drm_mm_insert_node_in_range(&vm->mm, &vma->node,
					  size, PAGE_SIZE, 0,
					  obj->size, PAGE_SIZE, 0,
					  range_start, range_end, 0);
	spin_unlock(&vm->lock);

	if (ret)
		return ret;
		goto err_free_vma;

	vma->iova = vma->node.start;
	vma->mapped = false;

	INIT_LIST_HEAD(&vma->list);

	kref_get(&vm->kref);

	return 0;
	return vma;

err_free_vma:
	kfree(vma);
	return ERR_PTR(ret);
}

struct msm_gem_vm *