Lines Matching refs:vm

18 	struct lima_vm *vm;
35 static void lima_vm_unmap_range(struct lima_vm *vm, u32 start, u32 end)
43 vm->bts[pbe].cpu[bte] = 0;
47 static int lima_vm_map_page(struct lima_vm *vm, dma_addr_t pa, u32 va)
52 if (!vm->bts[pbe].cpu) {
57 vm->bts[pbe].cpu = dma_alloc_wc(
58 vm->dev->dev, LIMA_PAGE_SIZE << LIMA_VM_NUM_PT_PER_BT_SHIFT,
59 &vm->bts[pbe].dma, GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO);
60 if (!vm->bts[pbe].cpu)
63 pts = vm->bts[pbe].dma;
64 pd = vm->pd.cpu + (pbe << LIMA_VM_NUM_PT_PER_BT_SHIFT);
71 vm->bts[pbe].cpu[bte] = pa | LIMA_VM_FLAGS_CACHE;
77 lima_vm_bo_find(struct lima_vm *vm, struct lima_bo *bo)
82 if (bo_va->vm == vm) {
91 int lima_vm_bo_add(struct lima_vm *vm, struct lima_bo *bo, bool create)
99 bo_va = lima_vm_bo_find(vm, bo);
118 bo_va->vm = vm;
121 mutex_lock(&vm->lock);
123 err = drm_mm_insert_node(&vm->mm, &bo_va->node, lima_bo_size(bo));
128 err = lima_vm_map_page(vm, sg_page_iter_dma_address(&sg_iter),
136 mutex_unlock(&vm->lock);
145 lima_vm_unmap_range(vm, bo_va->node.start, bo_va->node.start + offset - 1);
148 mutex_unlock(&vm->lock);
155 void lima_vm_bo_del(struct lima_vm *vm, struct lima_bo *bo)
162 bo_va = lima_vm_bo_find(vm, bo);
168 mutex_lock(&vm->lock);
171 lima_vm_unmap_range(vm, bo_va->node.start,
176 mutex_unlock(&vm->lock);
185 u32 lima_vm_get_va(struct lima_vm *vm, struct lima_bo *bo)
192 bo_va = lima_vm_bo_find(vm, bo);
202 struct lima_vm *vm;
204 vm = kzalloc(sizeof(*vm), GFP_KERNEL);
205 if (!vm)
208 vm->dev = dev;
209 mutex_init(&vm->lock);
210 kref_init(&vm->refcount);
212 vm->pd.cpu = dma_alloc_wc(dev->dev, LIMA_PAGE_SIZE, &vm->pd.dma,
214 if (!vm->pd.cpu)
219 vm, dev->dlbu_dma, LIMA_VA_RESERVE_DLBU);
224 drm_mm_init(&vm->mm, dev->va_start, dev->va_end - dev->va_start);
226 return vm;
229 dma_free_wc(dev->dev, LIMA_PAGE_SIZE, vm->pd.cpu, vm->pd.dma);
231 kfree(vm);
237 struct lima_vm *vm = container_of(kref, struct lima_vm, refcount);
240 drm_mm_takedown(&vm->mm);
243 if (vm->bts[i].cpu)
244 dma_free_wc(vm->dev->dev, LIMA_PAGE_SIZE << LIMA_VM_NUM_PT_PER_BT_SHIFT,
245 vm->bts[i].cpu, vm->bts[i].dma);
248 if (vm->pd.cpu)
249 dma_free_wc(vm->dev->dev, LIMA_PAGE_SIZE, vm->pd.cpu, vm->pd.dma);
251 kfree(vm);
254 void lima_vm_print(struct lima_vm *vm)
259 if (!vm->pd.cpu)
262 pd = vm->pd.cpu;
264 if (!vm->bts[i].cpu)
267 pt = vm->bts[i].cpu;
271 printk(KERN_INFO "lima vm pd %03x:%08x\n", idx, pd[idx]);
283 int lima_vm_map_bo(struct lima_vm *vm, struct lima_bo *bo, int pageoff)
292 bo_va = lima_vm_bo_find(vm, bo);
298 mutex_lock(&vm->lock);
302 err = lima_vm_map_page(vm, sg_page_iter_dma_address(&sg_iter),
310 mutex_unlock(&vm->lock);
317 lima_vm_unmap_range(vm, base, base + offset - 1);
318 mutex_unlock(&vm->lock);