[Openpvrsgx-devgroup] [PATCH v2] drm: pvrsgx: dmabuf import - Do not assume scatterlist memory is contiguous
Ivaylo Dimitrov
ivo.g.dimitrov.75 at gmail.com
Thu Dec 2 18:44:20 CET 2021
gentle ping
On 19.11.21 г. 10:45 ч., 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 | 55 +++++++++++++++++++---
> 1 file changed, 48 insertions(+), 7 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..59d0487 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
> @@ -157,7 +157,8 @@ PVRSRV_ERROR DmaBufImportAndAcquirePhysAddr(const IMG_INT32 i32FD,
> goto error;
> }
>
> - buf_size = uiSize ? uiSize : import->dma_buf->size;
> + /* dma_buf memory must be page aligned an its size should account for that */
> + buf_size = PAGE_ALIGN(uiSize ? uiSize : import->dma_buf->size);
>
> if ((uiDmaBufOffset + buf_size) > import->dma_buf->size ||
> (size_t)(uiDmaBufOffset + buf_size) < buf_size)
> @@ -189,7 +190,46 @@ 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)
> + {
> + size_t dma_len = PAGE_ALIGN(sg_dma_len(sg));
> +
> + if (buf_offset >= end_offset)
> + {
> + break;
> + }
> +
> + if ((start_offset >= buf_offset) && (start_offset < buf_offset + dma_len))
> + {
> + size_t sg_start;
> + size_t sg_pos;
> + size_t sg_remainder;
> +
> +
> + sg_start = start_offset - buf_offset;
> +
> + sg_remainder = MIN(dma_len - sg_start, remainder);
> +
> + for (sg_pos = sg_start; sg_pos < sg_start + sg_remainder; sg_pos += PAGE_SIZE)
> + {
> + npages++;
> + }
> +
> + remainder -= sg_remainder;
> + buf_offset += dma_len;
> + start_offset = buf_offset;
> + }
> + else
> + {
> + buf_offset += dma_len;
> + }
> + }
>
> /* The following allocation will be freed by the caller */
> eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
> @@ -205,16 +245,17 @@ 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)
> {
> + size_t dma_len = PAGE_ALIGN(sg_dma_len(sg));
> +
> if (buf_offset >= end_offset)
> {
> break;
> }
>
> - if ((start_offset >= buf_offset) && (start_offset < buf_offset + sg_dma_len(sg)))
> + if ((start_offset >= buf_offset) && (start_offset < buf_offset + dma_len))
> {
> size_t sg_start;
> size_t sg_pos;
> @@ -222,7 +263,7 @@ PVRSRV_ERROR DmaBufImportAndAcquirePhysAddr(const IMG_INT32 i32FD,
>
> sg_start = start_offset - buf_offset;
>
> - sg_remainder = MIN(sg_dma_len(sg) - sg_start, remainder);
> + sg_remainder = MIN(dma_len - sg_start, remainder);
>
> for (sg_pos = sg_start; sg_pos < sg_start + sg_remainder; sg_pos += PAGE_SIZE)
> {
> @@ -235,12 +276,12 @@ PVRSRV_ERROR DmaBufImportAndAcquirePhysAddr(const IMG_INT32 i32FD,
> }
>
> remainder -= sg_remainder;
> - buf_offset += sg_dma_len(sg);
> + buf_offset += dma_len;
> start_offset = buf_offset;
> }
> else
> {
> - buf_offset += sg_dma_len(sg);
> + buf_offset += dma_len;
> }
> }
> BUG_ON(remainder);
>
More information about the openpvrsgx-devgroup
mailing list