All of lore.kernel.org
 help / color / mirror / Atom feed
From: Robin Murphy <robin.murphy@arm.com>
To: Sinan Kaya <okaya@codeaurora.org>,
	linux-arm-kernel@lists.infradead.org, timur@codeaurora.org,
	cov@codeaurora.org, nwatters@codeaurora.org
Cc: linux-mips@linux-mips.org, linux-ia64@vger.kernel.org,
	linux-xtensa@linux-xtensa.org,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will.deacon@arm.com>,
	Max Filippov <jcmvbkbc@gmail.com>,
	Chris Metcalf <cmetcalf@ezchip.com>,
	Paul Mackerras <paulus@samba.org>,
	"H. Peter Anvin" <hpa@zytor.com>, Huacai Chen <chenhc@lemote.com>,
	Guan Xuetao <gxt@mprc.pku.edu.cn>,
	Marek Szyprowski <m.szyprowski@samsung.com>,
	Jisheng Zhang <jszhang@marvell.com>,
	Florian Fainelli <f.fainelli@gmail.com>,
	Russell King <linux@arm.linux.org.uk>,
	Aaro Koskinen <aaro.koskinen@iki.fi>,
	Michael Ellerman <mpe@ellerman.id.au>,
	x86@kernel.org, Ingo Molnar <mingo@redhat.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Guenter Roeck <linux@roeck-us.net>,
	Fenghua Yu <fenghua.yu@intel.com>,
	Denys Vlasenko <dvlasenk@redhat.com>,
	Arnd Bergmann <arnd@arndb.de>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Akinobu Mita <akinobu.mita@gmail.com>,
	Bjorn Helgaas <bhelgaas@google.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Valentin Rothberg <valentinrothberg@gmail.com>,
	Chris Zankel <chris@zankel.net>, Tony Luck <tony.luck@intel.com>,
	linux-pci@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	Dean Nelson <dnelson@redhat.com>,
	linux-kernel@vger.kernel.org, Ralf Baechle <ralf@linux-mips.org>,
	"Suthikulpanit, Suravee" <Suravee.Suthikulpanit@amd.com>,
	Joe Perches <joe@perches.com>,
	Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH 2/3] swiotlb: prefix dma_to_phys and phys_to_dma functions
Date: Fri, 18 Mar 2016 12:12:10 +0000	[thread overview]
Message-ID: <56EBF09A.1060503@arm.com> (raw)
In-Reply-To: <1458252137-24497-2-git-send-email-okaya@codeaurora.org>

On 17/03/16 22:02, Sinan Kaya wrote:
> Prefixing dma_to_phys and phys_to_dma API with swiotlb so that
> they are no longer part of the DMA API. These APIs do not exist
> on all architectures and breaks compatibility.
>
> In preparation for the clean up, also make the ARCH implementation
> known by defining swiotlb_phys_do_dma and swiotlb_dma_to_phys.
>
> Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
> ---
>   arch/arm/include/asm/dma-mapping.h                 |  8 ++-
>   arch/arm64/include/asm/dma-mapping.h               |  9 ++-
>   arch/arm64/mm/dma-mapping.c                        | 75 ++++++++++++++--------

[...]

> diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
> index a6e757c..ada00c3 100644
> --- a/arch/arm64/mm/dma-mapping.c
> +++ b/arch/arm64/mm/dma-mapping.c
> @@ -107,7 +107,7 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size,
>   		if (!page)
>   			return NULL;
>
> -		*dma_handle = phys_to_dma(dev, page_to_phys(page));
> +		*dma_handle = swiotlb_phys_to_dma(dev, page_to_phys(page));
>   		addr = page_address(page);
>   		memset(addr, 0, size);
>   		return addr;
> @@ -121,7 +121,7 @@ static void __dma_free_coherent(struct device *dev, size_t size,
>   				struct dma_attrs *attrs)
>   {
>   	bool freed;
> -	phys_addr_t paddr = dma_to_phys(dev, dma_handle);
> +	phys_addr_t paddr = swiotlb_dma_to_phys(dev, dma_handle);
>
>   	if (dev = NULL) {
>   		WARN_ONCE(1, "Use an actual device structure for DMA allocation\n");
> @@ -151,7 +151,8 @@ static void *__dma_alloc(struct device *dev, size_t size,
>   		void *addr = __alloc_from_pool(size, &page, flags);
>
>   		if (addr)
> -			*dma_handle = phys_to_dma(dev, page_to_phys(page));
> +			*dma_handle = swiotlb_phys_to_dma(dev,
> +							  page_to_phys(page));
>
>   		return addr;
>   	}
> @@ -187,7 +188,7 @@ static void __dma_free(struct device *dev, size_t size,
>   		       void *vaddr, dma_addr_t dma_handle,
>   		       struct dma_attrs *attrs)
>   {
> -	void *swiotlb_addr = phys_to_virt(dma_to_phys(dev, dma_handle));
> +	void *swiotlb_addr = phys_to_virt(swiotlb_dma_to_phys(dev, dma_handle));
>
>   	size = PAGE_ALIGN(size);
>
> @@ -208,7 +209,8 @@ static dma_addr_t __swiotlb_map_page(struct device *dev, struct page *page,
>
>   	dev_addr = swiotlb_map_page(dev, page, offset, size, dir, attrs);
>   	if (!is_device_dma_coherent(dev))
> -		__dma_map_area(phys_to_virt(dma_to_phys(dev, dev_addr)), size, dir);
> +		__dma_map_area(phys_to_virt(swiotlb_dma_to_phys(dev, dev_addr)),
> +			       size, dir);
>
>   	return dev_addr;
>   }
> @@ -218,8 +220,11 @@ static void __swiotlb_unmap_page(struct device *dev, dma_addr_t dev_addr,
>   				 size_t size, enum dma_data_direction dir,
>   				 struct dma_attrs *attrs)
>   {
> -	if (!is_device_dma_coherent(dev))
> -		__dma_unmap_area(phys_to_virt(dma_to_phys(dev, dev_addr)), size, dir);
> +	if (!is_device_dma_coherent(dev)) {
> +		phys_addr_t phys = swiotlb_dma_to_phys(dev, dev_addr);
> +
> +		__dma_unmap_area(phys_to_virt(phys), size, dir);
> +	}
>   	swiotlb_unmap_page(dev, dev_addr, size, dir, attrs);
>   }
>
> @@ -232,9 +237,12 @@ static int __swiotlb_map_sg_attrs(struct device *dev, struct scatterlist *sgl,
>
>   	ret = swiotlb_map_sg_attrs(dev, sgl, nelems, dir, attrs);
>   	if (!is_device_dma_coherent(dev))
> -		for_each_sg(sgl, sg, ret, i)
> -			__dma_map_area(phys_to_virt(dma_to_phys(dev, sg->dma_address)),
> -				       sg->length, dir);
> +		for_each_sg(sgl, sg, ret, i) {
> +			dma_addr_t dma = sg->dma_address;
> +			phys_addr_t phys = swiotlb_dma_to_phys(dev, dma);
> +
> +			__dma_map_area(phys_to_virt(phys), sg->length, dir);
> +		}
>
>   	return ret;
>   }
> @@ -248,9 +256,12 @@ static void __swiotlb_unmap_sg_attrs(struct device *dev,
>   	int i;
>
>   	if (!is_device_dma_coherent(dev))
> -		for_each_sg(sgl, sg, nelems, i)
> -			__dma_unmap_area(phys_to_virt(dma_to_phys(dev, sg->dma_address)),
> -					 sg->length, dir);
> +		for_each_sg(sgl, sg, nelems, i) {
> +			dma_addr_t dma = sg->dma_address;
> +			phys_addr_t phys = swiotlb_dma_to_phys(dev, dma);
> +
> +			__dma_unmap_area(phys_to_virt(phys), sg->length, dir);
> +		}
>   	swiotlb_unmap_sg_attrs(dev, sgl, nelems, dir, attrs);
>   }
>
> @@ -258,8 +269,11 @@ static void __swiotlb_sync_single_for_cpu(struct device *dev,
>   					  dma_addr_t dev_addr, size_t size,
>   					  enum dma_data_direction dir)
>   {
> -	if (!is_device_dma_coherent(dev))
> -		__dma_unmap_area(phys_to_virt(dma_to_phys(dev, dev_addr)), size, dir);
> +	if (!is_device_dma_coherent(dev)) {
> +		phys_addr_t phys = swiotlb_dma_to_phys(dev, dev_addr);
> +
> +		__dma_unmap_area(phys_to_virt(phys), size, dir);
> +	}
>   	swiotlb_sync_single_for_cpu(dev, dev_addr, size, dir);
>   }
>
> @@ -269,7 +283,8 @@ static void __swiotlb_sync_single_for_device(struct device *dev,
>   {
>   	swiotlb_sync_single_for_device(dev, dev_addr, size, dir);
>   	if (!is_device_dma_coherent(dev))
> -		__dma_map_area(phys_to_virt(dma_to_phys(dev, dev_addr)), size, dir);
> +		__dma_map_area(phys_to_virt(swiotlb_dma_to_phys(dev, dev_addr)),
> +			       size, dir);
>   }
>
>   static void __swiotlb_sync_sg_for_cpu(struct device *dev,
> @@ -280,9 +295,12 @@ static void __swiotlb_sync_sg_for_cpu(struct device *dev,
>   	int i;
>
>   	if (!is_device_dma_coherent(dev))
> -		for_each_sg(sgl, sg, nelems, i)
> -			__dma_unmap_area(phys_to_virt(dma_to_phys(dev, sg->dma_address)),
> -					 sg->length, dir);
> +		for_each_sg(sgl, sg, nelems, i) {
> +			dma_addr_t dma = sg->dma_address;
> +			phys_addr_t phys = swiotlb_dma_to_phys(dev, dma);
> +
> +			__dma_unmap_area(phys_to_virt(phys), sg->length, dir);
> +		}
>   	swiotlb_sync_sg_for_cpu(dev, sgl, nelems, dir);
>   }
>
> @@ -295,9 +313,12 @@ static void __swiotlb_sync_sg_for_device(struct device *dev,
>
>   	swiotlb_sync_sg_for_device(dev, sgl, nelems, dir);
>   	if (!is_device_dma_coherent(dev))
> -		for_each_sg(sgl, sg, nelems, i)
> -			__dma_map_area(phys_to_virt(dma_to_phys(dev, sg->dma_address)),
> -				       sg->length, dir);
> +		for_each_sg(sgl, sg, nelems, i) {
> +			dma_addr_t dma = sg->dma_address;
> +			phys_addr_t phys = swiotlb_dma_to_phys(dev, dma);
> +
> +			__dma_map_area(phys_to_virt(phys), sg->length, dir);
> +		}
>   }
>
>   static int __swiotlb_mmap(struct device *dev,
> @@ -309,7 +330,7 @@ static int __swiotlb_mmap(struct device *dev,
>   	unsigned long nr_vma_pages = (vma->vm_end - vma->vm_start) >>
>   					PAGE_SHIFT;
>   	unsigned long nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT;
> -	unsigned long pfn = dma_to_phys(dev, dma_addr) >> PAGE_SHIFT;
> +	unsigned long pfn = swiotlb_dma_to_phys(dev, dma_addr) >> PAGE_SHIFT;
>   	unsigned long off = vma->vm_pgoff;
>
>   	vma->vm_page_prot = __get_dma_pgprot(attrs, vma->vm_page_prot,
> @@ -334,9 +355,11 @@ static int __swiotlb_get_sgtable(struct device *dev, struct sg_table *sgt,
>   {
>   	int ret = sg_alloc_table(sgt, 1, GFP_KERNEL);
>
> -	if (!ret)
> -		sg_set_page(sgt->sgl, phys_to_page(dma_to_phys(dev, handle)),
> -			    PAGE_ALIGN(size), 0);
> +	if (!ret) {
> +		phys_addr_t phys = swiotlb_dma_to_phys(dev, handle);
> +
> +		sg_set_page(sgt->sgl, phys_to_page(phys), PAGE_ALIGN(size), 0);
> +	}
>
>   	return ret;
>   }

Since we know for sure that swiotlb_to_phys is a no-op on arm64, it 
might be cleaner to simply not reference it at all. I suppose we could 
have some private local wrappers, e.g.:

#define swiotlb_to_virt(addr) phys_to_virt((phys_addr_t)(addr))

to keep the intent of the code clear (and just in case anyone ever 
builds a system mad enough to warrant switching out that definition, but 
I'd hope that never happens).

Otherwise, looks good - thanks for doing this!

Robin.

WARNING: multiple messages have this Message-ID (diff)
From: Robin Murphy <robin.murphy@arm.com>
To: Sinan Kaya <okaya@codeaurora.org>,
	linux-arm-kernel@lists.infradead.org, timur@codeaurora.org,
	cov@codeaurora.org, nwatters@codeaurora.org
Cc: linux-mips@linux-mips.org, linux-ia64@vger.kernel.org,
	linux-xtensa@linux-xtensa.org,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will.deacon@arm.com>,
	Max Filippov <jcmvbkbc@gmail.com>,
	Chris Metcalf <cmetcalf@ezchip.com>,
	Paul Mackerras <paulus@samba.org>,
	"H. Peter Anvin" <hpa@zytor.com>, Huacai Chen <chenhc@lemote.com>,
	Guan Xuetao <gxt@mprc.pku.edu.cn>,
	Marek Szyprowski <m.szyprowski@samsung.com>,
	Jisheng Zhang <jszhang@marvell.com>,
	Florian Fainelli <f.fainelli@gmail.com>,
	Russell King <linux@arm.linux.org.uk>,
	Aaro Koskinen <aaro.koskinen@iki.fi>,
	Michael Ellerman <mpe@ellerman.id.au>,
	x86@kernel.org, Ingo Molnar <mingo@redhat.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Guenter Roeck <linux@roeck-us.net>,
	Fenghua Yu <fenghua.yu@intel.com>,
	Denys Vlasenko <dvlasenk@redhat.com>,
	Arnd Bergmann <arnd@arndb.de>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Akinobu Mita <akinobu.mita@gmail.com>,
	Bjorn Helgaas <bhelgaas@google.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Valentin Rothberg <valentinrothberg@gmail.com>,
	Chris Zankel <chris@zankel.net>, Tony Luck <tony.luck@intel.com>,
	linux-pci@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	Dean Nelson <dnelson@redhat.com>,
	linux-kernel@vger.kernel.org, Ralf Baechle <ralf@linux-mips.org>,
	"Suthikulpanit, Suravee" <Suravee.Suthikulpanit@amd.com>,
	Joe Perches <joe@perches.com>,
	Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH 2/3] swiotlb: prefix dma_to_phys and phys_to_dma functions
Date: Fri, 18 Mar 2016 12:12:10 +0000	[thread overview]
Message-ID: <56EBF09A.1060503@arm.com> (raw)
In-Reply-To: <1458252137-24497-2-git-send-email-okaya@codeaurora.org>

On 17/03/16 22:02, Sinan Kaya wrote:
> Prefixing dma_to_phys and phys_to_dma API with swiotlb so that
> they are no longer part of the DMA API. These APIs do not exist
> on all architectures and breaks compatibility.
>
> In preparation for the clean up, also make the ARCH implementation
> known by defining swiotlb_phys_do_dma and swiotlb_dma_to_phys.
>
> Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
> ---
>   arch/arm/include/asm/dma-mapping.h                 |  8 ++-
>   arch/arm64/include/asm/dma-mapping.h               |  9 ++-
>   arch/arm64/mm/dma-mapping.c                        | 75 ++++++++++++++--------

[...]

> diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
> index a6e757c..ada00c3 100644
> --- a/arch/arm64/mm/dma-mapping.c
> +++ b/arch/arm64/mm/dma-mapping.c
> @@ -107,7 +107,7 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size,
>   		if (!page)
>   			return NULL;
>
> -		*dma_handle = phys_to_dma(dev, page_to_phys(page));
> +		*dma_handle = swiotlb_phys_to_dma(dev, page_to_phys(page));
>   		addr = page_address(page);
>   		memset(addr, 0, size);
>   		return addr;
> @@ -121,7 +121,7 @@ static void __dma_free_coherent(struct device *dev, size_t size,
>   				struct dma_attrs *attrs)
>   {
>   	bool freed;
> -	phys_addr_t paddr = dma_to_phys(dev, dma_handle);
> +	phys_addr_t paddr = swiotlb_dma_to_phys(dev, dma_handle);
>
>   	if (dev == NULL) {
>   		WARN_ONCE(1, "Use an actual device structure for DMA allocation\n");
> @@ -151,7 +151,8 @@ static void *__dma_alloc(struct device *dev, size_t size,
>   		void *addr = __alloc_from_pool(size, &page, flags);
>
>   		if (addr)
> -			*dma_handle = phys_to_dma(dev, page_to_phys(page));
> +			*dma_handle = swiotlb_phys_to_dma(dev,
> +							  page_to_phys(page));
>
>   		return addr;
>   	}
> @@ -187,7 +188,7 @@ static void __dma_free(struct device *dev, size_t size,
>   		       void *vaddr, dma_addr_t dma_handle,
>   		       struct dma_attrs *attrs)
>   {
> -	void *swiotlb_addr = phys_to_virt(dma_to_phys(dev, dma_handle));
> +	void *swiotlb_addr = phys_to_virt(swiotlb_dma_to_phys(dev, dma_handle));
>
>   	size = PAGE_ALIGN(size);
>
> @@ -208,7 +209,8 @@ static dma_addr_t __swiotlb_map_page(struct device *dev, struct page *page,
>
>   	dev_addr = swiotlb_map_page(dev, page, offset, size, dir, attrs);
>   	if (!is_device_dma_coherent(dev))
> -		__dma_map_area(phys_to_virt(dma_to_phys(dev, dev_addr)), size, dir);
> +		__dma_map_area(phys_to_virt(swiotlb_dma_to_phys(dev, dev_addr)),
> +			       size, dir);
>
>   	return dev_addr;
>   }
> @@ -218,8 +220,11 @@ static void __swiotlb_unmap_page(struct device *dev, dma_addr_t dev_addr,
>   				 size_t size, enum dma_data_direction dir,
>   				 struct dma_attrs *attrs)
>   {
> -	if (!is_device_dma_coherent(dev))
> -		__dma_unmap_area(phys_to_virt(dma_to_phys(dev, dev_addr)), size, dir);
> +	if (!is_device_dma_coherent(dev)) {
> +		phys_addr_t phys = swiotlb_dma_to_phys(dev, dev_addr);
> +
> +		__dma_unmap_area(phys_to_virt(phys), size, dir);
> +	}
>   	swiotlb_unmap_page(dev, dev_addr, size, dir, attrs);
>   }
>
> @@ -232,9 +237,12 @@ static int __swiotlb_map_sg_attrs(struct device *dev, struct scatterlist *sgl,
>
>   	ret = swiotlb_map_sg_attrs(dev, sgl, nelems, dir, attrs);
>   	if (!is_device_dma_coherent(dev))
> -		for_each_sg(sgl, sg, ret, i)
> -			__dma_map_area(phys_to_virt(dma_to_phys(dev, sg->dma_address)),
> -				       sg->length, dir);
> +		for_each_sg(sgl, sg, ret, i) {
> +			dma_addr_t dma = sg->dma_address;
> +			phys_addr_t phys = swiotlb_dma_to_phys(dev, dma);
> +
> +			__dma_map_area(phys_to_virt(phys), sg->length, dir);
> +		}
>
>   	return ret;
>   }
> @@ -248,9 +256,12 @@ static void __swiotlb_unmap_sg_attrs(struct device *dev,
>   	int i;
>
>   	if (!is_device_dma_coherent(dev))
> -		for_each_sg(sgl, sg, nelems, i)
> -			__dma_unmap_area(phys_to_virt(dma_to_phys(dev, sg->dma_address)),
> -					 sg->length, dir);
> +		for_each_sg(sgl, sg, nelems, i) {
> +			dma_addr_t dma = sg->dma_address;
> +			phys_addr_t phys = swiotlb_dma_to_phys(dev, dma);
> +
> +			__dma_unmap_area(phys_to_virt(phys), sg->length, dir);
> +		}
>   	swiotlb_unmap_sg_attrs(dev, sgl, nelems, dir, attrs);
>   }
>
> @@ -258,8 +269,11 @@ static void __swiotlb_sync_single_for_cpu(struct device *dev,
>   					  dma_addr_t dev_addr, size_t size,
>   					  enum dma_data_direction dir)
>   {
> -	if (!is_device_dma_coherent(dev))
> -		__dma_unmap_area(phys_to_virt(dma_to_phys(dev, dev_addr)), size, dir);
> +	if (!is_device_dma_coherent(dev)) {
> +		phys_addr_t phys = swiotlb_dma_to_phys(dev, dev_addr);
> +
> +		__dma_unmap_area(phys_to_virt(phys), size, dir);
> +	}
>   	swiotlb_sync_single_for_cpu(dev, dev_addr, size, dir);
>   }
>
> @@ -269,7 +283,8 @@ static void __swiotlb_sync_single_for_device(struct device *dev,
>   {
>   	swiotlb_sync_single_for_device(dev, dev_addr, size, dir);
>   	if (!is_device_dma_coherent(dev))
> -		__dma_map_area(phys_to_virt(dma_to_phys(dev, dev_addr)), size, dir);
> +		__dma_map_area(phys_to_virt(swiotlb_dma_to_phys(dev, dev_addr)),
> +			       size, dir);
>   }
>
>   static void __swiotlb_sync_sg_for_cpu(struct device *dev,
> @@ -280,9 +295,12 @@ static void __swiotlb_sync_sg_for_cpu(struct device *dev,
>   	int i;
>
>   	if (!is_device_dma_coherent(dev))
> -		for_each_sg(sgl, sg, nelems, i)
> -			__dma_unmap_area(phys_to_virt(dma_to_phys(dev, sg->dma_address)),
> -					 sg->length, dir);
> +		for_each_sg(sgl, sg, nelems, i) {
> +			dma_addr_t dma = sg->dma_address;
> +			phys_addr_t phys = swiotlb_dma_to_phys(dev, dma);
> +
> +			__dma_unmap_area(phys_to_virt(phys), sg->length, dir);
> +		}
>   	swiotlb_sync_sg_for_cpu(dev, sgl, nelems, dir);
>   }
>
> @@ -295,9 +313,12 @@ static void __swiotlb_sync_sg_for_device(struct device *dev,
>
>   	swiotlb_sync_sg_for_device(dev, sgl, nelems, dir);
>   	if (!is_device_dma_coherent(dev))
> -		for_each_sg(sgl, sg, nelems, i)
> -			__dma_map_area(phys_to_virt(dma_to_phys(dev, sg->dma_address)),
> -				       sg->length, dir);
> +		for_each_sg(sgl, sg, nelems, i) {
> +			dma_addr_t dma = sg->dma_address;
> +			phys_addr_t phys = swiotlb_dma_to_phys(dev, dma);
> +
> +			__dma_map_area(phys_to_virt(phys), sg->length, dir);
> +		}
>   }
>
>   static int __swiotlb_mmap(struct device *dev,
> @@ -309,7 +330,7 @@ static int __swiotlb_mmap(struct device *dev,
>   	unsigned long nr_vma_pages = (vma->vm_end - vma->vm_start) >>
>   					PAGE_SHIFT;
>   	unsigned long nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT;
> -	unsigned long pfn = dma_to_phys(dev, dma_addr) >> PAGE_SHIFT;
> +	unsigned long pfn = swiotlb_dma_to_phys(dev, dma_addr) >> PAGE_SHIFT;
>   	unsigned long off = vma->vm_pgoff;
>
>   	vma->vm_page_prot = __get_dma_pgprot(attrs, vma->vm_page_prot,
> @@ -334,9 +355,11 @@ static int __swiotlb_get_sgtable(struct device *dev, struct sg_table *sgt,
>   {
>   	int ret = sg_alloc_table(sgt, 1, GFP_KERNEL);
>
> -	if (!ret)
> -		sg_set_page(sgt->sgl, phys_to_page(dma_to_phys(dev, handle)),
> -			    PAGE_ALIGN(size), 0);
> +	if (!ret) {
> +		phys_addr_t phys = swiotlb_dma_to_phys(dev, handle);
> +
> +		sg_set_page(sgt->sgl, phys_to_page(phys), PAGE_ALIGN(size), 0);
> +	}
>
>   	return ret;
>   }

Since we know for sure that swiotlb_to_phys is a no-op on arm64, it 
might be cleaner to simply not reference it at all. I suppose we could 
have some private local wrappers, e.g.:

#define swiotlb_to_virt(addr) phys_to_virt((phys_addr_t)(addr))

to keep the intent of the code clear (and just in case anyone ever 
builds a system mad enough to warrant switching out that definition, but 
I'd hope that never happens).

Otherwise, looks good - thanks for doing this!

Robin.

WARNING: multiple messages have this Message-ID (diff)
From: robin.murphy@arm.com (Robin Murphy)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/3] swiotlb: prefix dma_to_phys and phys_to_dma functions
Date: Fri, 18 Mar 2016 12:12:10 +0000	[thread overview]
Message-ID: <56EBF09A.1060503@arm.com> (raw)
In-Reply-To: <1458252137-24497-2-git-send-email-okaya@codeaurora.org>

On 17/03/16 22:02, Sinan Kaya wrote:
> Prefixing dma_to_phys and phys_to_dma API with swiotlb so that
> they are no longer part of the DMA API. These APIs do not exist
> on all architectures and breaks compatibility.
>
> In preparation for the clean up, also make the ARCH implementation
> known by defining swiotlb_phys_do_dma and swiotlb_dma_to_phys.
>
> Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
> ---
>   arch/arm/include/asm/dma-mapping.h                 |  8 ++-
>   arch/arm64/include/asm/dma-mapping.h               |  9 ++-
>   arch/arm64/mm/dma-mapping.c                        | 75 ++++++++++++++--------

[...]

> diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
> index a6e757c..ada00c3 100644
> --- a/arch/arm64/mm/dma-mapping.c
> +++ b/arch/arm64/mm/dma-mapping.c
> @@ -107,7 +107,7 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size,
>   		if (!page)
>   			return NULL;
>
> -		*dma_handle = phys_to_dma(dev, page_to_phys(page));
> +		*dma_handle = swiotlb_phys_to_dma(dev, page_to_phys(page));
>   		addr = page_address(page);
>   		memset(addr, 0, size);
>   		return addr;
> @@ -121,7 +121,7 @@ static void __dma_free_coherent(struct device *dev, size_t size,
>   				struct dma_attrs *attrs)
>   {
>   	bool freed;
> -	phys_addr_t paddr = dma_to_phys(dev, dma_handle);
> +	phys_addr_t paddr = swiotlb_dma_to_phys(dev, dma_handle);
>
>   	if (dev == NULL) {
>   		WARN_ONCE(1, "Use an actual device structure for DMA allocation\n");
> @@ -151,7 +151,8 @@ static void *__dma_alloc(struct device *dev, size_t size,
>   		void *addr = __alloc_from_pool(size, &page, flags);
>
>   		if (addr)
> -			*dma_handle = phys_to_dma(dev, page_to_phys(page));
> +			*dma_handle = swiotlb_phys_to_dma(dev,
> +							  page_to_phys(page));
>
>   		return addr;
>   	}
> @@ -187,7 +188,7 @@ static void __dma_free(struct device *dev, size_t size,
>   		       void *vaddr, dma_addr_t dma_handle,
>   		       struct dma_attrs *attrs)
>   {
> -	void *swiotlb_addr = phys_to_virt(dma_to_phys(dev, dma_handle));
> +	void *swiotlb_addr = phys_to_virt(swiotlb_dma_to_phys(dev, dma_handle));
>
>   	size = PAGE_ALIGN(size);
>
> @@ -208,7 +209,8 @@ static dma_addr_t __swiotlb_map_page(struct device *dev, struct page *page,
>
>   	dev_addr = swiotlb_map_page(dev, page, offset, size, dir, attrs);
>   	if (!is_device_dma_coherent(dev))
> -		__dma_map_area(phys_to_virt(dma_to_phys(dev, dev_addr)), size, dir);
> +		__dma_map_area(phys_to_virt(swiotlb_dma_to_phys(dev, dev_addr)),
> +			       size, dir);
>
>   	return dev_addr;
>   }
> @@ -218,8 +220,11 @@ static void __swiotlb_unmap_page(struct device *dev, dma_addr_t dev_addr,
>   				 size_t size, enum dma_data_direction dir,
>   				 struct dma_attrs *attrs)
>   {
> -	if (!is_device_dma_coherent(dev))
> -		__dma_unmap_area(phys_to_virt(dma_to_phys(dev, dev_addr)), size, dir);
> +	if (!is_device_dma_coherent(dev)) {
> +		phys_addr_t phys = swiotlb_dma_to_phys(dev, dev_addr);
> +
> +		__dma_unmap_area(phys_to_virt(phys), size, dir);
> +	}
>   	swiotlb_unmap_page(dev, dev_addr, size, dir, attrs);
>   }
>
> @@ -232,9 +237,12 @@ static int __swiotlb_map_sg_attrs(struct device *dev, struct scatterlist *sgl,
>
>   	ret = swiotlb_map_sg_attrs(dev, sgl, nelems, dir, attrs);
>   	if (!is_device_dma_coherent(dev))
> -		for_each_sg(sgl, sg, ret, i)
> -			__dma_map_area(phys_to_virt(dma_to_phys(dev, sg->dma_address)),
> -				       sg->length, dir);
> +		for_each_sg(sgl, sg, ret, i) {
> +			dma_addr_t dma = sg->dma_address;
> +			phys_addr_t phys = swiotlb_dma_to_phys(dev, dma);
> +
> +			__dma_map_area(phys_to_virt(phys), sg->length, dir);
> +		}
>
>   	return ret;
>   }
> @@ -248,9 +256,12 @@ static void __swiotlb_unmap_sg_attrs(struct device *dev,
>   	int i;
>
>   	if (!is_device_dma_coherent(dev))
> -		for_each_sg(sgl, sg, nelems, i)
> -			__dma_unmap_area(phys_to_virt(dma_to_phys(dev, sg->dma_address)),
> -					 sg->length, dir);
> +		for_each_sg(sgl, sg, nelems, i) {
> +			dma_addr_t dma = sg->dma_address;
> +			phys_addr_t phys = swiotlb_dma_to_phys(dev, dma);
> +
> +			__dma_unmap_area(phys_to_virt(phys), sg->length, dir);
> +		}
>   	swiotlb_unmap_sg_attrs(dev, sgl, nelems, dir, attrs);
>   }
>
> @@ -258,8 +269,11 @@ static void __swiotlb_sync_single_for_cpu(struct device *dev,
>   					  dma_addr_t dev_addr, size_t size,
>   					  enum dma_data_direction dir)
>   {
> -	if (!is_device_dma_coherent(dev))
> -		__dma_unmap_area(phys_to_virt(dma_to_phys(dev, dev_addr)), size, dir);
> +	if (!is_device_dma_coherent(dev)) {
> +		phys_addr_t phys = swiotlb_dma_to_phys(dev, dev_addr);
> +
> +		__dma_unmap_area(phys_to_virt(phys), size, dir);
> +	}
>   	swiotlb_sync_single_for_cpu(dev, dev_addr, size, dir);
>   }
>
> @@ -269,7 +283,8 @@ static void __swiotlb_sync_single_for_device(struct device *dev,
>   {
>   	swiotlb_sync_single_for_device(dev, dev_addr, size, dir);
>   	if (!is_device_dma_coherent(dev))
> -		__dma_map_area(phys_to_virt(dma_to_phys(dev, dev_addr)), size, dir);
> +		__dma_map_area(phys_to_virt(swiotlb_dma_to_phys(dev, dev_addr)),
> +			       size, dir);
>   }
>
>   static void __swiotlb_sync_sg_for_cpu(struct device *dev,
> @@ -280,9 +295,12 @@ static void __swiotlb_sync_sg_for_cpu(struct device *dev,
>   	int i;
>
>   	if (!is_device_dma_coherent(dev))
> -		for_each_sg(sgl, sg, nelems, i)
> -			__dma_unmap_area(phys_to_virt(dma_to_phys(dev, sg->dma_address)),
> -					 sg->length, dir);
> +		for_each_sg(sgl, sg, nelems, i) {
> +			dma_addr_t dma = sg->dma_address;
> +			phys_addr_t phys = swiotlb_dma_to_phys(dev, dma);
> +
> +			__dma_unmap_area(phys_to_virt(phys), sg->length, dir);
> +		}
>   	swiotlb_sync_sg_for_cpu(dev, sgl, nelems, dir);
>   }
>
> @@ -295,9 +313,12 @@ static void __swiotlb_sync_sg_for_device(struct device *dev,
>
>   	swiotlb_sync_sg_for_device(dev, sgl, nelems, dir);
>   	if (!is_device_dma_coherent(dev))
> -		for_each_sg(sgl, sg, nelems, i)
> -			__dma_map_area(phys_to_virt(dma_to_phys(dev, sg->dma_address)),
> -				       sg->length, dir);
> +		for_each_sg(sgl, sg, nelems, i) {
> +			dma_addr_t dma = sg->dma_address;
> +			phys_addr_t phys = swiotlb_dma_to_phys(dev, dma);
> +
> +			__dma_map_area(phys_to_virt(phys), sg->length, dir);
> +		}
>   }
>
>   static int __swiotlb_mmap(struct device *dev,
> @@ -309,7 +330,7 @@ static int __swiotlb_mmap(struct device *dev,
>   	unsigned long nr_vma_pages = (vma->vm_end - vma->vm_start) >>
>   					PAGE_SHIFT;
>   	unsigned long nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT;
> -	unsigned long pfn = dma_to_phys(dev, dma_addr) >> PAGE_SHIFT;
> +	unsigned long pfn = swiotlb_dma_to_phys(dev, dma_addr) >> PAGE_SHIFT;
>   	unsigned long off = vma->vm_pgoff;
>
>   	vma->vm_page_prot = __get_dma_pgprot(attrs, vma->vm_page_prot,
> @@ -334,9 +355,11 @@ static int __swiotlb_get_sgtable(struct device *dev, struct sg_table *sgt,
>   {
>   	int ret = sg_alloc_table(sgt, 1, GFP_KERNEL);
>
> -	if (!ret)
> -		sg_set_page(sgt->sgl, phys_to_page(dma_to_phys(dev, handle)),
> -			    PAGE_ALIGN(size), 0);
> +	if (!ret) {
> +		phys_addr_t phys = swiotlb_dma_to_phys(dev, handle);
> +
> +		sg_set_page(sgt->sgl, phys_to_page(phys), PAGE_ALIGN(size), 0);
> +	}
>
>   	return ret;
>   }

Since we know for sure that swiotlb_to_phys is a no-op on arm64, it 
might be cleaner to simply not reference it at all. I suppose we could 
have some private local wrappers, e.g.:

#define swiotlb_to_virt(addr) phys_to_virt((phys_addr_t)(addr))

to keep the intent of the code clear (and just in case anyone ever 
builds a system mad enough to warrant switching out that definition, but 
I'd hope that never happens).

Otherwise, looks good - thanks for doing this!

Robin.

  reply	other threads:[~2016-03-18 12:12 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-17 22:02 [PATCH 1/3] crypto: marvell/cesa - replace dma_to_phys with dma_map_single Sinan Kaya
2016-03-17 22:02 ` Sinan Kaya
2016-03-17 22:02 ` [PATCH 2/3] swiotlb: prefix dma_to_phys and phys_to_dma functions Sinan Kaya
2016-03-17 22:02   ` Sinan Kaya
2016-03-17 22:02   ` Sinan Kaya
2016-03-18 12:12   ` Robin Murphy [this message]
2016-03-18 12:12     ` Robin Murphy
2016-03-18 12:12     ` Robin Murphy
2016-03-18 15:00     ` Sinan Kaya
2016-03-18 15:00       ` Sinan Kaya
2016-03-18 15:00       ` Sinan Kaya
2016-03-28 18:29       ` Konrad Rzeszutek Wilk
2016-03-28 18:29         ` Konrad Rzeszutek Wilk
2016-03-28 18:29         ` Konrad Rzeszutek Wilk
2016-03-29 12:44         ` Stefano Stabellini
2016-03-29 12:44           ` Stefano Stabellini
2016-03-29 12:44           ` Stefano Stabellini
2016-03-29 12:57           ` Sinan Kaya
2016-03-29 12:57             ` Sinan Kaya
2016-03-29 12:57             ` Sinan Kaya
2016-03-29 19:32         ` Arnd Bergmann
2016-03-29 19:32           ` Arnd Bergmann
2016-03-29 19:32           ` Arnd Bergmann
2016-03-17 22:02 ` [PATCH 3/3] dma-mapping: move swiotlb dma-phys functions to common header Sinan Kaya
2016-03-17 22:02   ` Sinan Kaya
2016-03-17 22:02   ` Sinan Kaya
2016-03-18 11:31   ` Robin Murphy
2016-03-18 11:31     ` Robin Murphy
2016-03-18 13:55     ` Sinan Kaya
2016-03-18 13:55       ` Sinan Kaya
2016-03-18 13:55       ` Sinan Kaya
2016-03-17 22:54 ` [PATCH 1/3] crypto: marvell/cesa - replace dma_to_phys with dma_map_single Russell King - ARM Linux
2016-03-17 22:54   ` Russell King - ARM Linux
2016-03-17 23:17   ` okaya
2016-03-17 23:17     ` okaya at codeaurora.org
2016-03-17 23:50     ` Russell King - ARM Linux
2016-03-17 23:50       ` Russell King - ARM Linux
2016-03-18  9:30       ` Boris Brezillon
2016-03-18  9:30         ` Boris Brezillon
2016-03-18 11:25         ` Robin Murphy
2016-03-18 11:25           ` Robin Murphy
2016-03-18 11:32           ` Boris Brezillon
2016-03-18 11:32             ` Boris Brezillon
2016-03-18 13:51           ` Sinan Kaya
2016-03-18 13:51             ` Sinan Kaya
2016-03-18 14:00             ` Sinan Kaya
2016-03-18 14:00               ` Sinan Kaya
2016-03-18 14:20             ` Boris Brezillon
2016-03-18 14:20               ` Boris Brezillon
2016-03-18 14:21               ` Sinan Kaya
2016-03-18 14:21                 ` Sinan Kaya
2016-03-18 20:18 ` kbuild test robot
2016-03-18 20:18   ` kbuild test robot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56EBF09A.1060503@arm.com \
    --to=robin.murphy@arm.com \
    --cc=Suravee.Suthikulpanit@amd.com \
    --cc=aaro.koskinen@iki.fi \
    --cc=akinobu.mita@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=arnd@arndb.de \
    --cc=benh@kernel.crashing.org \
    --cc=bhelgaas@google.com \
    --cc=catalin.marinas@arm.com \
    --cc=chenhc@lemote.com \
    --cc=chris@zankel.net \
    --cc=cmetcalf@ezchip.com \
    --cc=cov@codeaurora.org \
    --cc=dnelson@redhat.com \
    --cc=dvlasenk@redhat.com \
    --cc=f.fainelli@gmail.com \
    --cc=fenghua.yu@intel.com \
    --cc=gxt@mprc.pku.edu.cn \
    --cc=hpa@zytor.com \
    --cc=jcmvbkbc@gmail.com \
    --cc=joe@perches.com \
    --cc=jszhang@marvell.com \
    --cc=konrad.wilk@oracle.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-ia64@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@linux-mips.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-xtensa@linux-xtensa.org \
    --cc=linux@arm.linux.org.uk \
    --cc=linux@roeck-us.net \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=m.szyprowski@samsung.com \
    --cc=mingo@redhat.com \
    --cc=mpe@ellerman.id.au \
    --cc=nwatters@codeaurora.org \
    --cc=okaya@codeaurora.org \
    --cc=paulus@samba.org \
    --cc=ralf@linux-mips.org \
    --cc=tglx@linutronix.de \
    --cc=timur@codeaurora.org \
    --cc=tony.luck@intel.com \
    --cc=valentinrothberg@gmail.com \
    --cc=will.deacon@arm.com \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.