Lines Matching refs:exynos_gem
23 static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem) in exynos_drm_alloc_buf() argument
25 struct drm_device *dev = exynos_gem->base.dev; in exynos_drm_alloc_buf()
31 if (exynos_gem->dma_addr) { in exynos_drm_alloc_buf()
36 init_dma_attrs(&exynos_gem->dma_attrs); in exynos_drm_alloc_buf()
43 if (!(exynos_gem->flags & EXYNOS_BO_NONCONTIG)) in exynos_drm_alloc_buf()
44 dma_set_attr(DMA_ATTR_FORCE_CONTIGUOUS, &exynos_gem->dma_attrs); in exynos_drm_alloc_buf()
50 if (exynos_gem->flags & EXYNOS_BO_WC || in exynos_drm_alloc_buf()
51 !(exynos_gem->flags & EXYNOS_BO_CACHABLE)) in exynos_drm_alloc_buf()
56 dma_set_attr(attr, &exynos_gem->dma_attrs); in exynos_drm_alloc_buf()
57 dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &exynos_gem->dma_attrs); in exynos_drm_alloc_buf()
59 nr_pages = exynos_gem->size >> PAGE_SHIFT; in exynos_drm_alloc_buf()
61 exynos_gem->pages = drm_calloc_large(nr_pages, sizeof(struct page *)); in exynos_drm_alloc_buf()
62 if (!exynos_gem->pages) { in exynos_drm_alloc_buf()
67 exynos_gem->cookie = dma_alloc_attrs(dev->dev, exynos_gem->size, in exynos_drm_alloc_buf()
68 &exynos_gem->dma_addr, GFP_KERNEL, in exynos_drm_alloc_buf()
69 &exynos_gem->dma_attrs); in exynos_drm_alloc_buf()
70 if (!exynos_gem->cookie) { in exynos_drm_alloc_buf()
75 ret = dma_get_sgtable_attrs(dev->dev, &sgt, exynos_gem->cookie, in exynos_drm_alloc_buf()
76 exynos_gem->dma_addr, exynos_gem->size, in exynos_drm_alloc_buf()
77 &exynos_gem->dma_attrs); in exynos_drm_alloc_buf()
83 if (drm_prime_sg_to_page_addr_arrays(&sgt, exynos_gem->pages, NULL, in exynos_drm_alloc_buf()
93 (unsigned long)exynos_gem->dma_addr, exynos_gem->size); in exynos_drm_alloc_buf()
100 dma_free_attrs(dev->dev, exynos_gem->size, exynos_gem->cookie, in exynos_drm_alloc_buf()
101 exynos_gem->dma_addr, &exynos_gem->dma_attrs); in exynos_drm_alloc_buf()
103 drm_free_large(exynos_gem->pages); in exynos_drm_alloc_buf()
108 static void exynos_drm_free_buf(struct exynos_drm_gem *exynos_gem) in exynos_drm_free_buf() argument
110 struct drm_device *dev = exynos_gem->base.dev; in exynos_drm_free_buf()
112 if (!exynos_gem->dma_addr) { in exynos_drm_free_buf()
118 (unsigned long)exynos_gem->dma_addr, exynos_gem->size); in exynos_drm_free_buf()
120 dma_free_attrs(dev->dev, exynos_gem->size, exynos_gem->cookie, in exynos_drm_free_buf()
121 (dma_addr_t)exynos_gem->dma_addr, in exynos_drm_free_buf()
122 &exynos_gem->dma_attrs); in exynos_drm_free_buf()
124 drm_free_large(exynos_gem->pages); in exynos_drm_free_buf()
149 void exynos_drm_gem_destroy(struct exynos_drm_gem *exynos_gem) in exynos_drm_gem_destroy() argument
151 struct drm_gem_object *obj = &exynos_gem->base; in exynos_drm_gem_destroy()
162 drm_prime_gem_destroy(obj, exynos_gem->sgt); in exynos_drm_gem_destroy()
164 exynos_drm_free_buf(exynos_gem); in exynos_drm_gem_destroy()
169 kfree(exynos_gem); in exynos_drm_gem_destroy()
176 struct exynos_drm_gem *exynos_gem; in exynos_drm_gem_get_size() local
185 exynos_gem = to_exynos_gem(obj); in exynos_drm_gem_get_size()
189 return exynos_gem->size; in exynos_drm_gem_get_size()
195 struct exynos_drm_gem *exynos_gem; in exynos_drm_gem_init() local
199 exynos_gem = kzalloc(sizeof(*exynos_gem), GFP_KERNEL); in exynos_drm_gem_init()
200 if (!exynos_gem) in exynos_drm_gem_init()
203 exynos_gem->size = size; in exynos_drm_gem_init()
204 obj = &exynos_gem->base; in exynos_drm_gem_init()
209 kfree(exynos_gem); in exynos_drm_gem_init()
216 kfree(exynos_gem); in exynos_drm_gem_init()
222 return exynos_gem; in exynos_drm_gem_init()
229 struct exynos_drm_gem *exynos_gem; in exynos_drm_gem_create() local
244 exynos_gem = exynos_drm_gem_init(dev, size); in exynos_drm_gem_create()
245 if (IS_ERR(exynos_gem)) in exynos_drm_gem_create()
246 return exynos_gem; in exynos_drm_gem_create()
249 exynos_gem->flags = flags; in exynos_drm_gem_create()
251 ret = exynos_drm_alloc_buf(exynos_gem); in exynos_drm_gem_create()
253 drm_gem_object_release(&exynos_gem->base); in exynos_drm_gem_create()
254 kfree(exynos_gem); in exynos_drm_gem_create()
258 return exynos_gem; in exynos_drm_gem_create()
265 struct exynos_drm_gem *exynos_gem; in exynos_drm_gem_create_ioctl() local
268 exynos_gem = exynos_drm_gem_create(dev, args->flags, args->size); in exynos_drm_gem_create_ioctl()
269 if (IS_ERR(exynos_gem)) in exynos_drm_gem_create_ioctl()
270 return PTR_ERR(exynos_gem); in exynos_drm_gem_create_ioctl()
272 ret = exynos_drm_gem_handle_create(&exynos_gem->base, file_priv, in exynos_drm_gem_create_ioctl()
275 exynos_drm_gem_destroy(exynos_gem); in exynos_drm_gem_create_ioctl()
286 struct exynos_drm_gem *exynos_gem; in exynos_drm_gem_get_dma_addr() local
295 exynos_gem = to_exynos_gem(obj); in exynos_drm_gem_get_dma_addr()
297 return &exynos_gem->dma_addr; in exynos_drm_gem_get_dma_addr()
321 static int exynos_drm_gem_mmap_buffer(struct exynos_drm_gem *exynos_gem, in exynos_drm_gem_mmap_buffer() argument
324 struct drm_device *drm_dev = exynos_gem->base.dev; in exynos_drm_gem_mmap_buffer()
334 if (vm_size > exynos_gem->size) in exynos_drm_gem_mmap_buffer()
337 ret = dma_mmap_attrs(drm_dev->dev, vma, exynos_gem->pages, in exynos_drm_gem_mmap_buffer()
338 exynos_gem->dma_addr, exynos_gem->size, in exynos_drm_gem_mmap_buffer()
339 &exynos_gem->dma_attrs); in exynos_drm_gem_mmap_buffer()
351 struct exynos_drm_gem *exynos_gem; in exynos_drm_gem_get_ioctl() local
364 exynos_gem = to_exynos_gem(obj); in exynos_drm_gem_get_ioctl()
366 args->flags = exynos_gem->flags; in exynos_drm_gem_get_ioctl()
367 args->size = exynos_gem->size; in exynos_drm_gem_get_ioctl()
410 struct exynos_drm_gem *exynos_gem; in exynos_drm_gem_dumb_create() local
428 exynos_gem = exynos_drm_gem_create(dev, flags, args->size); in exynos_drm_gem_dumb_create()
429 if (IS_ERR(exynos_gem)) { in exynos_drm_gem_dumb_create()
431 return PTR_ERR(exynos_gem); in exynos_drm_gem_dumb_create()
434 ret = exynos_drm_gem_handle_create(&exynos_gem->base, file_priv, in exynos_drm_gem_dumb_create()
437 exynos_drm_gem_destroy(exynos_gem); in exynos_drm_gem_dumb_create()
478 struct exynos_drm_gem *exynos_gem = to_exynos_gem(obj); in exynos_drm_gem_fault() local
486 if (page_offset >= (exynos_gem->size >> PAGE_SHIFT)) { in exynos_drm_gem_fault()
492 pfn = page_to_pfn(exynos_gem->pages[page_offset]); in exynos_drm_gem_fault()
510 struct exynos_drm_gem *exynos_gem; in exynos_drm_gem_mmap() local
522 exynos_gem = to_exynos_gem(obj); in exynos_drm_gem_mmap()
524 DRM_DEBUG_KMS("flags = 0x%x\n", exynos_gem->flags); in exynos_drm_gem_mmap()
527 if (exynos_gem->flags & EXYNOS_BO_CACHABLE) in exynos_drm_gem_mmap()
529 else if (exynos_gem->flags & EXYNOS_BO_WC) in exynos_drm_gem_mmap()
536 ret = exynos_drm_gem_mmap_buffer(exynos_gem, vma); in exynos_drm_gem_mmap()
551 struct exynos_drm_gem *exynos_gem = to_exynos_gem(obj); in exynos_drm_gem_prime_get_sg_table() local
554 npages = exynos_gem->size >> PAGE_SHIFT; in exynos_drm_gem_prime_get_sg_table()
556 return drm_prime_pages_to_sg(exynos_gem->pages, npages); in exynos_drm_gem_prime_get_sg_table()
564 struct exynos_drm_gem *exynos_gem; in exynos_drm_gem_prime_import_sg_table() local
568 exynos_gem = exynos_drm_gem_init(dev, attach->dmabuf->size); in exynos_drm_gem_prime_import_sg_table()
569 if (IS_ERR(exynos_gem)) { in exynos_drm_gem_prime_import_sg_table()
570 ret = PTR_ERR(exynos_gem); in exynos_drm_gem_prime_import_sg_table()
574 exynos_gem->dma_addr = sg_dma_address(sgt->sgl); in exynos_drm_gem_prime_import_sg_table()
576 npages = exynos_gem->size >> PAGE_SHIFT; in exynos_drm_gem_prime_import_sg_table()
577 exynos_gem->pages = drm_malloc_ab(npages, sizeof(struct page *)); in exynos_drm_gem_prime_import_sg_table()
578 if (!exynos_gem->pages) { in exynos_drm_gem_prime_import_sg_table()
583 ret = drm_prime_sg_to_page_addr_arrays(sgt, exynos_gem->pages, NULL, in exynos_drm_gem_prime_import_sg_table()
588 exynos_gem->sgt = sgt; in exynos_drm_gem_prime_import_sg_table()
592 exynos_gem->flags |= EXYNOS_BO_CONTIG; in exynos_drm_gem_prime_import_sg_table()
600 exynos_gem->flags |= EXYNOS_BO_NONCONTIG; in exynos_drm_gem_prime_import_sg_table()
603 return &exynos_gem->base; in exynos_drm_gem_prime_import_sg_table()
606 drm_free_large(exynos_gem->pages); in exynos_drm_gem_prime_import_sg_table()
608 drm_gem_object_release(&exynos_gem->base); in exynos_drm_gem_prime_import_sg_table()
609 kfree(exynos_gem); in exynos_drm_gem_prime_import_sg_table()