-----Original Message----- From: dri-devel dri-devel-bounces@lists.freedesktop.org On Behalf Of Marek Szyprowski Sent: Sunday, March 29, 2020 5:56 AM To: Ruhl, Michael J michael.j.ruhl@intel.com; dri- devel@lists.freedesktop.org; linux-samsung-soc@vger.kernel.org; linux- kernel@vger.kernel.org Cc: Bartlomiej Zolnierkiewicz b.zolnierkie@samsung.com; David Airlie airlied@linux.ie; Shane Francis bigbeeshane@gmail.com; stable@vger.kernel.org; Thomas Zimmermann tzimmermann@suse.de; Alex Deucher alexander.deucher@amd.com Subject: Re: [PATCH v2] drm/prime: fix extracting of the DMA addresses from a scatterlist
Hi Michael,
<snip>
Is there an example of what the scatterlist would look like in this case?
DMA framework or IOMMU is allowed to join consecutive chunks while mapping if such operation is supported by the hw. Here is the example:
Lets assume that we have a scatterlist with 4 4KiB pages of the physical addresses: 0x12000000, 0x13011000, 0x13012000, 0x11011000. The total size of the buffer is 16KiB. After mapping this scatterlist to a device behind an IOMMU it may end up as a contiguous buffer in the DMA (IOVA) address space. at 0xf0010000. The scatterlist will look like this:
sg[0].page = 0x12000000 sg[0].len = 4096 sg[0].dma_addr = 0xf0010000 sg[0].dma_len = 16384 sg[1].page = 0x13011000 sg[1].len = 4096 sg[1].dma_addr = 0 sg[1].dma_len = 0 sg[2].page = 0x13012000 sg[2].len = 4096 sg[2].dma_addr = 0 sg[2].dma_len = 0 sg[3].page = 0x11011000 sg[3].len = 4096 sg[3].dma_addr = 0 sg[3].dma_len = 0
(I've intentionally wrote page as physical address to make it easier to understand, in real SGs it is stored a struct page pointer).
Does each SG entry always have the page and dma info? or could you have entries that have page information only, and entries that have dma info
only? When SG is not mapped yet it contains only the ->pages and ->len entries. I'm not aware of the SGs with the DMA information only, but in theory it might be possible to have such.
If the same entry has different size info (page_len = PAGE_SIZE, dma_len = 4 * PAGE_SIZE?), are we guaranteed that the arrays (page and
addrs) have
been sized correctly?
There are always no more DMA related entries than the phys pages. If there is 1:1 mapping between physical memory and DMA (IOVA) space, then each SG entry will have len == dma_len, and dma_addr will be describing the same as page entry. DMA mapping framework is allowed only to join entries while mapping to DMA (IOVA).
Just trying to get my head wrapped around this.
Sure, I hope my explanation helps a bit.
That is a great example! Thank you very much for the explanation.
I was somehow seeing it as the dma side getting split and extended (rather than consolidated) into more possible entries. This clarifies the issue for me.
Thanks!
Mike
Best regards
Marek Szyprowski, PhD Samsung R&D Institute Poland
dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel