Lines Matching refs:region
35 struct dfl_afu_dma_region *region) in afu_dma_pin_pages() argument
37 int npages = region->length >> PAGE_SHIFT; in afu_dma_pin_pages()
45 region->pages = kcalloc(npages, sizeof(struct page *), GFP_KERNEL); in afu_dma_pin_pages()
46 if (!region->pages) { in afu_dma_pin_pages()
51 pinned = pin_user_pages_fast(region->user_addr, npages, FOLL_WRITE, in afu_dma_pin_pages()
52 region->pages); in afu_dma_pin_pages()
66 unpin_user_pages(region->pages, pinned); in afu_dma_pin_pages()
68 kfree(region->pages); in afu_dma_pin_pages()
83 struct dfl_afu_dma_region *region) in afu_dma_unpin_pages() argument
85 long npages = region->length >> PAGE_SHIFT; in afu_dma_unpin_pages()
88 unpin_user_pages(region->pages, npages); in afu_dma_unpin_pages()
89 kfree(region->pages); in afu_dma_unpin_pages()
102 static bool afu_dma_check_continuous_pages(struct dfl_afu_dma_region *region) in afu_dma_check_continuous_pages() argument
104 int npages = region->length >> PAGE_SHIFT; in afu_dma_check_continuous_pages()
108 if (page_to_pfn(region->pages[i]) + 1 != in afu_dma_check_continuous_pages()
109 page_to_pfn(region->pages[i + 1])) in afu_dma_check_continuous_pages()
124 static bool dma_region_check_iova(struct dfl_afu_dma_region *region, in dma_region_check_iova() argument
127 if (!size && region->iova != iova) in dma_region_check_iova()
130 return (region->iova <= iova) && in dma_region_check_iova()
131 (region->length + region->iova >= iova + size); in dma_region_check_iova()
144 struct dfl_afu_dma_region *region) in afu_dma_region_add() argument
150 (unsigned long long)region->iova); in afu_dma_region_add()
161 if (dma_region_check_iova(this, region->iova, region->length)) in afu_dma_region_add()
164 if (region->iova < this->iova) in afu_dma_region_add()
166 else if (region->iova > this->iova) in afu_dma_region_add()
172 rb_link_node(®ion->node, parent, new); in afu_dma_region_add()
173 rb_insert_color(®ion->node, &afu->dma_regions); in afu_dma_region_add()
186 struct dfl_afu_dma_region *region) in afu_dma_region_remove() argument
191 (unsigned long long)region->iova); in afu_dma_region_remove()
194 rb_erase(®ion->node, &afu->dma_regions); in afu_dma_region_remove()
207 struct dfl_afu_dma_region *region; in afu_dma_region_destroy() local
210 region = container_of(node, struct dfl_afu_dma_region, node); in afu_dma_region_destroy()
213 (unsigned long long)region->iova); in afu_dma_region_destroy()
217 if (region->iova) in afu_dma_region_destroy()
219 region->iova, region->length, in afu_dma_region_destroy()
222 if (region->pages) in afu_dma_region_destroy()
223 afu_dma_unpin_pages(pdata, region); in afu_dma_region_destroy()
226 kfree(region); in afu_dma_region_destroy()
252 struct dfl_afu_dma_region *region; in afu_dma_region_find() local
254 region = container_of(node, struct dfl_afu_dma_region, node); in afu_dma_region_find()
256 if (dma_region_check_iova(region, iova, size)) { in afu_dma_region_find()
258 (unsigned long long)region->iova); in afu_dma_region_find()
259 return region; in afu_dma_region_find()
262 if (iova < region->iova) in afu_dma_region_find()
264 else if (iova > region->iova) in afu_dma_region_find()
304 struct dfl_afu_dma_region *region; in afu_dma_map_region() local
318 region = kzalloc(sizeof(*region), GFP_KERNEL); in afu_dma_map_region()
319 if (!region) in afu_dma_map_region()
322 region->user_addr = user_addr; in afu_dma_map_region()
323 region->length = length; in afu_dma_map_region()
326 ret = afu_dma_pin_pages(pdata, region); in afu_dma_map_region()
333 if (!afu_dma_check_continuous_pages(region)) { in afu_dma_map_region()
340 region->iova = dma_map_page(dfl_fpga_pdata_to_parent(pdata), in afu_dma_map_region()
341 region->pages[0], 0, in afu_dma_map_region()
342 region->length, in afu_dma_map_region()
344 if (dma_mapping_error(dfl_fpga_pdata_to_parent(pdata), region->iova)) { in afu_dma_map_region()
350 *iova = region->iova; in afu_dma_map_region()
353 ret = afu_dma_region_add(pdata, region); in afu_dma_map_region()
364 region->iova, region->length, DMA_BIDIRECTIONAL); in afu_dma_map_region()
366 afu_dma_unpin_pages(pdata, region); in afu_dma_map_region()
368 kfree(region); in afu_dma_map_region()
382 struct dfl_afu_dma_region *region; in afu_dma_unmap_region() local
385 region = afu_dma_region_find_iova(pdata, iova); in afu_dma_unmap_region()
386 if (!region) { in afu_dma_unmap_region()
391 if (region->in_use) { in afu_dma_unmap_region()
396 afu_dma_region_remove(pdata, region); in afu_dma_unmap_region()
400 region->iova, region->length, DMA_BIDIRECTIONAL); in afu_dma_unmap_region()
401 afu_dma_unpin_pages(pdata, region); in afu_dma_unmap_region()
402 kfree(region); in afu_dma_unmap_region()