/** * drm_gem_cma_prime_get_sg_table - provide a scatter/gather table of pinned * pages for a CMA GEM object * @obj: GEM object * * This function exports a scatter/gather table suitable for PRIME usage by * calling the standard DMA mapping API. Drivers using the CMA helpers should * set this as their DRM driver's ->gem_prime_get_sg_table() callback. * * Returns: * A pointer to the scatter/gather table of pinned pages or NULL on failure. */ struct sg_table *drm_gem_cma_prime_get_sg_table(struct drm_gem_object *obj) { struct drm_gem_cma_object *cma_obj = to_drm_gem_cma_obj(obj); struct sg_table *sgt; int ret; sgt = kzalloc(sizeof(*sgt), GFP_KERNEL); if (!sgt) return NULL; ret = dma_get_sgtable(obj->dev->dev, sgt, cma_obj->vaddr, cma_obj->paddr, obj->size); if (ret < 0) goto out; return sgt; out: kfree(sgt); return NULL; }
static int isp_stat_bufs_alloc_one(struct device *dev, struct ispstat_buffer *buf, unsigned int size) { int ret; buf->virt_addr = dma_alloc_coherent(dev, size, &buf->dma_addr, GFP_KERNEL | GFP_DMA); if (!buf->virt_addr) return -ENOMEM; ret = dma_get_sgtable(dev, &buf->sgt, buf->virt_addr, buf->dma_addr, size); if (ret < 0) { dma_free_coherent(dev, size, buf->virt_addr, buf->dma_addr); buf->virt_addr = NULL; buf->dma_addr = 0; return ret; } return 0; }