[PATCH v5 11/13] xen: introduce xen_alloc/free_coherent_pages
From: Stefano Stabellini <hidden>
Date: 2013-09-06 14:59:24
Also in:
lkml, xen-devel
On Fri, 6 Sep 2013, Catalin Marinas wrote:
On Thu, Sep 05, 2013 at 05:43:33PM +0100, Stefano Stabellini wrote:quoted
On Thu, 5 Sep 2013, Catalin Marinas wrote:quoted
On Thu, Aug 29, 2013 at 07:32:32PM +0100, Stefano Stabellini wrote:quoted
xen_swiotlb_alloc_coherent needs to allocate a coherent buffer for cpu and devices. On native x86 and ARMv8 is sufficient to call __get_free_pages in order to get a coherent buffer, while on ARM we need to call arm_dma_ops.alloc.Don't bet on this for ARMv8. It's not mandated for the architecture, so at some point some SoC will require non-cacheable buffers for coherency.I see. Would it be better if I implemented xen_alloc_coherent_pages on armv8 by calling arm64_swiotlb_dma_ops.alloc?What does this buffer do exactly? Is it allocated by guests?
It is allocated by Dom0 to do DMA to/from a device. It is the buffer that is going to be returned by dma_map_ops.alloc to the caller: On x86: dma_map_ops.alloc -> xen_swiotlb_alloc_coherent -> xen_alloc_coherent_pages -> __get_free_pages On ARM: dma_map_ops.alloc -> xen_swiotlb_alloc_coherent -> xen_alloc_coherent_pages -> arm_dma_ops.alloc On ARM64 dma_map_ops.alloc -> xen_swiotlb_alloc_coherent -> xen_alloc_coherent_pages -> ????
Currently arm64_swiotlb_dma_ops assume cache-coherent DMA. I have a patch which introduces new ops for non-coherent DMA but this should really be orthogonal to swiotlb. You can basically have 4 combinations of coherent/non-coherent and swiotlb/iommu. Mark Rutland is currently looking into how best to describe this via DT as it may not even be per SoC but per bus or device.
It seems to me that calling arm64_swiotlb_dma_ops.alloc would ensure that we allocate the right buffer for the right device?