[Openpvrsgx-devgroup] [PATCH] drm: pvrsgx: dmabuf import - Do not assume scatterlist memory is contiguous

Ivaylo Dimitrov ivo.g.dimitrov.75 at gmail.com
Mon Nov 15 22:26:33 CET 2021


Please ignore, I will send v2 patch that fixes some issues I found after 
I sent this.


On 13.11.21 г. 12:08 ч., Ivaylo Dimitrov wrote:
> TILER backed BOs are not a single block of contiguous memory
> 
> Signed-off-by: Ivaylo Dimitrov <ivo.g.dimitrov.75 at gmail.com>
> ---
>   .../eurasia_km/services4/srvkm/env/linux/dmabuf.c  | 39 ++++++++++++++++++++--
>   1 file changed, 37 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/pvrsgx/1.17.4948957/eurasia_km/services4/srvkm/env/linux/dmabuf.c b/drivers/gpu/drm/pvrsgx/1.17.4948957/eurasia_km/services4/srvkm/env/linux/dmabuf.c
> index 707cb13..9fefa9f 100644
> --- a/drivers/gpu/drm/pvrsgx/1.17.4948957/eurasia_km/services4/srvkm/env/linux/dmabuf.c
> +++ b/drivers/gpu/drm/pvrsgx/1.17.4948957/eurasia_km/services4/srvkm/env/linux/dmabuf.c
> @@ -189,7 +189,43 @@ PVRSRV_ERROR DmaBufImportAndAcquirePhysAddr(const IMG_INT32 i32FD,
>   
>   	*puiMemInfoOffset = (uiDmaBufOffset - start_offset);
>   
> -	npages = (end_offset - start_offset) >> PAGE_SHIFT;
> +	/* Calculate the number of pages needed for mapping the scatterlist */
> +	buf_offset = 0;
> +	remainder = buf_size;
> +	start_offset = PAGE_MASK & uiDmaBufOffset;
> +	end_offset = PAGE_ALIGN(uiDmaBufOffset + buf_size);
> +
> +	for_each_sg(import->sg_table->sgl, sg, import->sg_table->nents, i)
> +	{
> +		if (buf_offset >= end_offset)
> +		{
> +			break;
> +		}
> +
> +		if ((start_offset >= buf_offset) && (start_offset < buf_offset + sg_dma_len(sg)))
> +		{
> +			size_t sg_start;
> +			size_t sg_pos;
> +			size_t sg_remainder;
> +
> +			sg_start = start_offset - buf_offset;
> +
> +			sg_remainder = MIN(sg_dma_len(sg) - sg_start, remainder);
> +
> +			for (sg_pos = sg_start; sg_pos < sg_start + sg_remainder; sg_pos += PAGE_SIZE)
> +			{
> +				npages++;
> +			}
> +
> +			remainder -= sg_remainder;
> +			buf_offset += sg_dma_len(sg);
> +			start_offset = buf_offset;
> +		}
> +		else
> +		{
> +			buf_offset += sg_dma_len(sg);
> +		}
> +	}
>   
>   	/* The following allocation will be freed by the caller */
>   	eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
> @@ -205,7 +241,6 @@ PVRSRV_ERROR DmaBufImportAndAcquirePhysAddr(const IMG_INT32 i32FD,
>   	buf_offset = 0;
>   	remainder = buf_size;
>   	start_offset = PAGE_MASK & uiDmaBufOffset;
> -	end_offset = PAGE_ALIGN(uiDmaBufOffset + buf_size);
>   
>   	for_each_sg(import->sg_table->sgl, sg, import->sg_table->nents, i)
>   	{
> 


More information about the openpvrsgx-devgroup mailing list