drm: gem_cma_helper.c: Allow importing of contiguous scatterlists with nents > 1
drm_gem_cma_prime_import_sg_table() will fail if the number of entries in the sg_table > 1. However, you can have a device that uses an IOMMU engine and can map a discontiguous buffer with multiple entries that have consecutive sg_dma_addresses, effectively making it contiguous. Allow for that scenario by testing the entries in the sg_table for contiguous coverage. Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Liviu Dudau <liviu.dudau@arm.com> Signed-off-by: Noralf Trønnes <noralf@tronnes.org> Link: https://patchwork.freedesktop.org/patch/msgid/20171110133310.1225-1-Liviu.Dudau@arm.com
This commit is contained in:
parent
1f2d9bdc90
commit
998fb1a0f4
|
@ -475,8 +475,26 @@ drm_gem_cma_prime_import_sg_table(struct drm_device *dev,
|
||||||
{
|
{
|
||||||
struct drm_gem_cma_object *cma_obj;
|
struct drm_gem_cma_object *cma_obj;
|
||||||
|
|
||||||
if (sgt->nents != 1)
|
if (sgt->nents != 1) {
|
||||||
return ERR_PTR(-EINVAL);
|
/* check if the entries in the sg_table are contiguous */
|
||||||
|
dma_addr_t next_addr = sg_dma_address(sgt->sgl);
|
||||||
|
struct scatterlist *s;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for_each_sg(sgt->sgl, s, sgt->nents, i) {
|
||||||
|
/*
|
||||||
|
* sg_dma_address(s) is only valid for entries
|
||||||
|
* that have sg_dma_len(s) != 0
|
||||||
|
*/
|
||||||
|
if (!sg_dma_len(s))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (sg_dma_address(s) != next_addr)
|
||||||
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
|
next_addr = sg_dma_address(s) + sg_dma_len(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Create a CMA GEM buffer. */
|
/* Create a CMA GEM buffer. */
|
||||||
cma_obj = __drm_gem_cma_create(dev, attach->dmabuf->size);
|
cma_obj = __drm_gem_cma_create(dev, attach->dmabuf->size);
|
||||||
|
|
|
@ -8,7 +8,9 @@
|
||||||
* struct drm_gem_cma_object - GEM object backed by CMA memory allocations
|
* struct drm_gem_cma_object - GEM object backed by CMA memory allocations
|
||||||
* @base: base GEM object
|
* @base: base GEM object
|
||||||
* @paddr: physical address of the backing memory
|
* @paddr: physical address of the backing memory
|
||||||
* @sgt: scatter/gather table for imported PRIME buffers
|
* @sgt: scatter/gather table for imported PRIME buffers. The table can have
|
||||||
|
* more than one entry but they are guaranteed to have contiguous
|
||||||
|
* DMA addresses.
|
||||||
* @vaddr: kernel virtual address of the backing memory
|
* @vaddr: kernel virtual address of the backing memory
|
||||||
*/
|
*/
|
||||||
struct drm_gem_cma_object {
|
struct drm_gem_cma_object {
|
||||||
|
|
Loading…
Reference in New Issue