mirror of https://gitee.com/openkylin/linux.git
drm/lima: add lima_vm_map_bo
For dynamically mapping added backup memory of lima_bo to vm. This is a preparation for adding heap buffer support. Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com> Tested-by: Andreas Baierl <ichgeh@imkreisrum.de> Signed-off-by: Qiang Yu <yuq825@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200116131157.13346-3-yuq825@gmail.com
This commit is contained in:
parent
500edbbd53
commit
dc76cb7a1f
|
@ -277,3 +277,45 @@ void lima_vm_print(struct lima_vm *vm)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
int lima_vm_map_bo(struct lima_vm *vm, struct lima_bo *bo, int pageoff)
|
||||
{
|
||||
struct lima_bo_va *bo_va;
|
||||
struct sg_dma_page_iter sg_iter;
|
||||
int offset = 0, err;
|
||||
u32 base;
|
||||
|
||||
mutex_lock(&bo->lock);
|
||||
|
||||
bo_va = lima_vm_bo_find(vm, bo);
|
||||
if (!bo_va) {
|
||||
err = -ENOENT;
|
||||
goto err_out0;
|
||||
}
|
||||
|
||||
mutex_lock(&vm->lock);
|
||||
|
||||
base = bo_va->node.start + (pageoff << PAGE_SHIFT);
|
||||
for_each_sg_dma_page(bo->base.sgt->sgl, &sg_iter,
|
||||
bo->base.sgt->nents, pageoff) {
|
||||
err = lima_vm_map_page(vm, sg_page_iter_dma_address(&sg_iter),
|
||||
base + offset);
|
||||
if (err)
|
||||
goto err_out1;
|
||||
|
||||
offset += PAGE_SIZE;
|
||||
}
|
||||
|
||||
mutex_unlock(&vm->lock);
|
||||
|
||||
mutex_unlock(&bo->lock);
|
||||
return 0;
|
||||
|
||||
err_out1:
|
||||
if (offset)
|
||||
lima_vm_unmap_range(vm, base, base + offset - 1);
|
||||
mutex_unlock(&vm->lock);
|
||||
err_out0:
|
||||
mutex_unlock(&bo->lock);
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -58,5 +58,6 @@ static inline void lima_vm_put(struct lima_vm *vm)
|
|||
}
|
||||
|
||||
void lima_vm_print(struct lima_vm *vm);
|
||||
int lima_vm_map_bo(struct lima_vm *vm, struct lima_bo *bo, int pageoff);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue