Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

Qiang Yu dc76cb7a 500edbbd

+43
+42
drivers/gpu/drm/lima/lima_vm.c
··· 277 277 } 278 278 } 279 279 } 280 + 281 + int lima_vm_map_bo(struct lima_vm *vm, struct lima_bo *bo, int pageoff) 282 + { 283 + struct lima_bo_va *bo_va; 284 + struct sg_dma_page_iter sg_iter; 285 + int offset = 0, err; 286 + u32 base; 287 + 288 + mutex_lock(&bo->lock); 289 + 290 + bo_va = lima_vm_bo_find(vm, bo); 291 + if (!bo_va) { 292 + err = -ENOENT; 293 + goto err_out0; 294 + } 295 + 296 + mutex_lock(&vm->lock); 297 + 298 + base = bo_va->node.start + (pageoff << PAGE_SHIFT); 299 + for_each_sg_dma_page(bo->base.sgt->sgl, &sg_iter, 300 + bo->base.sgt->nents, pageoff) { 301 + err = lima_vm_map_page(vm, sg_page_iter_dma_address(&sg_iter), 302 + base + offset); 303 + if (err) 304 + goto err_out1; 305 + 306 + offset += PAGE_SIZE; 307 + } 308 + 309 + mutex_unlock(&vm->lock); 310 + 311 + mutex_unlock(&bo->lock); 312 + return 0; 313 + 314 + err_out1: 315 + if (offset) 316 + lima_vm_unmap_range(vm, base, base + offset - 1); 317 + mutex_unlock(&vm->lock); 318 + err_out0: 319 + mutex_unlock(&bo->lock); 320 + return err; 321 + }
+1
drivers/gpu/drm/lima/lima_vm.h
··· 58 58 } 59 59 60 60 void lima_vm_print(struct lima_vm *vm); 61 + int lima_vm_map_bo(struct lima_vm *vm, struct lima_bo *bo, int pageoff); 61 62 62 63 #endif