mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 09:04:39 +02:00
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: Rob Clark <robdclark@chromium.org> Signed-off-by: Rob Clark <robin.clark@oss.qualcomm.com> Tested-by: Antonino Maniscalco <antomani103@gmail.com> Reviewed-by: Antonino Maniscalco <antomani103@gmail.com> Patchwork: https://patchwork.freedesktop.org/patch/661471/
This commit is contained in:
parent
eab7766c79
commit
da0e1407be
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 *
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user