Lines Matching +full:scatter +full:- +full:gather

1 // SPDX-License-Identifier: GPL-2.0-or-later
12 #include <linux/dma-buf.h>
13 #include <linux/dma-mapping.h>
46 * __drm_gem_cma_create - Create a GEM CMA object without allocating memory
55 * A struct drm_gem_cma_object * on success or an ERR_PTR()-encoded negative
65 if (drm->driver->gem_create_object) in __drm_gem_cma_create()
66 gem_obj = drm->driver->gem_create_object(drm, size); in __drm_gem_cma_create()
70 return ERR_PTR(-ENOMEM); in __drm_gem_cma_create()
72 if (!gem_obj->funcs) in __drm_gem_cma_create()
73 gem_obj->funcs = &drm_gem_cma_default_funcs; in __drm_gem_cma_create()
80 /* Always use writecombine for dma-buf mappings */ in __drm_gem_cma_create()
81 cma_obj->map_noncoherent = false; in __drm_gem_cma_create()
102 * drm_gem_cma_create - allocate an object with the given size
110 * A struct drm_gem_cma_object * on success or an ERR_PTR()-encoded negative
125 if (cma_obj->map_noncoherent) { in drm_gem_cma_create()
126 cma_obj->vaddr = dma_alloc_noncoherent(drm->dev, size, in drm_gem_cma_create()
127 &cma_obj->paddr, in drm_gem_cma_create()
131 cma_obj->vaddr = dma_alloc_wc(drm->dev, size, &cma_obj->paddr, in drm_gem_cma_create()
134 if (!cma_obj->vaddr) { in drm_gem_cma_create()
137 ret = -ENOMEM; in drm_gem_cma_create()
144 drm_gem_object_put(&cma_obj->base); in drm_gem_cma_create()
150 * drm_gem_cma_create_with_handle - allocate an object with the given size and
152 * @file_priv: DRM file-private structure to register the handle for
162 * A struct drm_gem_cma_object * on success or an ERR_PTR()-encoded negative
178 gem_obj = &cma_obj->base; in drm_gem_cma_create_with_handle()
185 /* drop reference from allocate - handle holds it now. */ in drm_gem_cma_create_with_handle()
194 * drm_gem_cma_free_object - free resources associated with a CMA GEM object
206 struct dma_buf_map map = DMA_BUF_MAP_INIT_VADDR(cma_obj->vaddr); in drm_gem_cma_free_object()
208 if (gem_obj->import_attach) { in drm_gem_cma_free_object()
209 if (cma_obj->vaddr) in drm_gem_cma_free_object()
210 dma_buf_vunmap(gem_obj->import_attach->dmabuf, &map); in drm_gem_cma_free_object()
211 drm_prime_gem_destroy(gem_obj, cma_obj->sgt); in drm_gem_cma_free_object()
212 } else if (cma_obj->vaddr) { in drm_gem_cma_free_object()
213 dma_free_wc(gem_obj->dev->dev, cma_obj->base.size, in drm_gem_cma_free_object()
214 cma_obj->vaddr, cma_obj->paddr); in drm_gem_cma_free_object()
224 * drm_gem_cma_dumb_create_internal - create a dumb buffer object
225 * @file_priv: DRM file-private structure to create the dumb buffer for
241 unsigned int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8); in drm_gem_cma_dumb_create_internal()
244 if (args->pitch < min_pitch) in drm_gem_cma_dumb_create_internal()
245 args->pitch = min_pitch; in drm_gem_cma_dumb_create_internal()
247 if (args->size < args->pitch * args->height) in drm_gem_cma_dumb_create_internal()
248 args->size = args->pitch * args->height; in drm_gem_cma_dumb_create_internal()
250 cma_obj = drm_gem_cma_create_with_handle(file_priv, drm, args->size, in drm_gem_cma_dumb_create_internal()
251 &args->handle); in drm_gem_cma_dumb_create_internal()
257 * drm_gem_cma_dumb_create - create a dumb buffer object
258 * @file_priv: DRM file-private structure to create the dumb buffer for
280 args->pitch = DIV_ROUND_UP(args->width * args->bpp, 8); in drm_gem_cma_dumb_create()
281 args->size = args->pitch * args->height; in drm_gem_cma_dumb_create()
283 cma_obj = drm_gem_cma_create_with_handle(file_priv, drm, args->size, in drm_gem_cma_dumb_create()
284 &args->handle); in drm_gem_cma_dumb_create()
297 * drm_gem_cma_get_unmapped_area - propose address for mapping in noMMU cases
320 struct drm_file *priv = filp->private_data; in drm_gem_cma_get_unmapped_area()
321 struct drm_device *dev = priv->minor->dev; in drm_gem_cma_get_unmapped_area()
325 return -ENODEV; in drm_gem_cma_get_unmapped_area()
327 drm_vma_offset_lock_lookup(dev->vma_offset_manager); in drm_gem_cma_get_unmapped_area()
328 node = drm_vma_offset_exact_lookup_locked(dev->vma_offset_manager, in drm_gem_cma_get_unmapped_area()
334 * When the object is being freed, after it hits 0-refcnt it in drm_gem_cma_get_unmapped_area()
337 * mgr->vm_lock. Therefore if we find an object with a 0-refcnt in drm_gem_cma_get_unmapped_area()
339 * destroyed and will be freed as soon as we release the lock - in drm_gem_cma_get_unmapped_area()
340 * so we have to check for the 0-refcnted object and treat it as in drm_gem_cma_get_unmapped_area()
343 if (!kref_get_unless_zero(&obj->refcount)) in drm_gem_cma_get_unmapped_area()
347 drm_vma_offset_unlock_lookup(dev->vma_offset_manager); in drm_gem_cma_get_unmapped_area()
350 return -EINVAL; in drm_gem_cma_get_unmapped_area()
354 return -EACCES; in drm_gem_cma_get_unmapped_area()
361 return cma_obj->vaddr ? (unsigned long)cma_obj->vaddr : -EINVAL; in drm_gem_cma_get_unmapped_area()
367 * drm_gem_cma_print_info() - Print &drm_gem_cma_object info for debugfs
372 * This function can be used as the &drm_driver->gem_print_info callback.
380 drm_printf_indent(p, indent, "paddr=%pad\n", &cma_obj->paddr); in drm_gem_cma_print_info()
381 drm_printf_indent(p, indent, "vaddr=%p\n", cma_obj->vaddr); in drm_gem_cma_print_info()
386 * drm_gem_cma_get_sg_table - provide a scatter/gather table of pinned
390 * This function exports a scatter/gather table by
395 * A pointer to the scatter/gather table of pinned pages or NULL on failure.
405 return ERR_PTR(-ENOMEM); in drm_gem_cma_get_sg_table()
407 ret = dma_get_sgtable(obj->dev->dev, sgt, cma_obj->vaddr, in drm_gem_cma_get_sg_table()
408 cma_obj->paddr, obj->size); in drm_gem_cma_get_sg_table()
421 * drm_gem_cma_prime_import_sg_table - produce a CMA GEM object from another
422 * driver's scatter/gather table of pinned pages
424 * @attach: DMA-BUF attachment
425 * @sgt: scatter/gather table of pinned pages
427 * This function imports a scatter/gather table exported via DMA-BUF by
429 * (i.e. the scatter/gather table must contain a single entry). Drivers that
434 * A pointer to a newly created GEM object or an ERR_PTR-encoded negative
445 if (drm_prime_get_contiguous_size(sgt) < attach->dmabuf->size) in drm_gem_cma_prime_import_sg_table()
446 return ERR_PTR(-EINVAL); in drm_gem_cma_prime_import_sg_table()
449 cma_obj = __drm_gem_cma_create(dev, attach->dmabuf->size, true); in drm_gem_cma_prime_import_sg_table()
453 cma_obj->paddr = sg_dma_address(sgt->sgl); in drm_gem_cma_prime_import_sg_table()
454 cma_obj->sgt = sgt; in drm_gem_cma_prime_import_sg_table()
456 DRM_DEBUG_PRIME("dma_addr = %pad, size = %zu\n", &cma_obj->paddr, attach->dmabuf->size); in drm_gem_cma_prime_import_sg_table()
458 return &cma_obj->base; in drm_gem_cma_prime_import_sg_table()
463 * drm_gem_cma_vmap - map a CMA GEM object into the kernel's virtual
482 dma_buf_map_set_vaddr(map, cma_obj->vaddr); in drm_gem_cma_vmap()
489 * drm_gem_cma_mmap - memory-map an exported CMA GEM object
495 * object instead of using on-demand faulting. Drivers that use the CMA
511 vma->vm_pgoff -= drm_vma_node_start(&obj->vma_node); in drm_gem_cma_mmap()
512 vma->vm_flags &= ~VM_PFNMAP; in drm_gem_cma_mmap()
516 if (cma_obj->map_noncoherent) { in drm_gem_cma_mmap()
517 vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); in drm_gem_cma_mmap()
519 ret = dma_mmap_pages(cma_obj->base.dev->dev, in drm_gem_cma_mmap()
520 vma, vma->vm_end - vma->vm_start, in drm_gem_cma_mmap()
521 virt_to_page(cma_obj->vaddr)); in drm_gem_cma_mmap()
523 ret = dma_mmap_wc(cma_obj->base.dev->dev, vma, cma_obj->vaddr, in drm_gem_cma_mmap()
524 cma_obj->paddr, vma->vm_end - vma->vm_start); in drm_gem_cma_mmap()
534 * drm_gem_cma_prime_import_sg_table_vmap - PRIME import another driver's
535 * scatter/gather table and get the virtual address of the buffer
537 * @attach: DMA-BUF attachment
538 * @sgt: Scatter/gather table of pinned pages
540 * This function imports a scatter/gather table using
550 * A pointer to a newly created GEM object or an ERR_PTR-encoded negative
563 ret = dma_buf_vmap(attach->dmabuf, &map); in drm_gem_cma_prime_import_sg_table_vmap()
571 dma_buf_vunmap(attach->dmabuf, &map); in drm_gem_cma_prime_import_sg_table_vmap()
576 cma_obj->vaddr = map.vaddr; in drm_gem_cma_prime_import_sg_table_vmap()