All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>
To: chris-YvXeqwSYzG2sTnJN9+BGXg@public.gmane.org,
	jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Cc: linux-xtensa-PjhNF2WwrV/0Sa2dR60CXw@public.gmane.org,
	iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
Subject: Re: [PATCH] xtensa: use generic dma_noncoherent_ops
Date: Wed, 11 Jul 2018 17:32:59 +0200	[thread overview]
Message-ID: <20180711153259.GB31946@lst.de> (raw)
In-Reply-To: <20180619070316.26327-1-hch-jcswGhMUV9g@public.gmane.org>

ping?  Any comments?

On Tue, Jun 19, 2018 at 09:03:16AM +0200, Christoph Hellwig wrote:
> Switch to the generic noncoherent direct mapping implementation.
> 
> Signed-off-by: Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>
> ---
>  arch/xtensa/Kconfig                   |   3 +
>  arch/xtensa/include/asm/Kbuild        |   1 +
>  arch/xtensa/include/asm/dma-mapping.h |  26 ------
>  arch/xtensa/kernel/pci-dma.c          | 130 +++-----------------------
>  4 files changed, 19 insertions(+), 141 deletions(-)
>  delete mode 100644 arch/xtensa/include/asm/dma-mapping.h
> 
> diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
> index d575e8701955..373708c77367 100644
> --- a/arch/xtensa/Kconfig
> +++ b/arch/xtensa/Kconfig
> @@ -5,11 +5,14 @@ config ZONE_DMA
>  config XTENSA
>  	def_bool y
>  	select ARCH_NO_COHERENT_DMA_MMAP if !MMU
> +	select ARCH_HAS_SYNC_DMA_FOR_CPU
> +	select ARCH_HAS_SYNC_DMA_FOR_DEVICE
>  	select ARCH_WANT_FRAME_POINTERS
>  	select ARCH_WANT_IPC_PARSE_VERSION
>  	select BUILDTIME_EXTABLE_SORT
>  	select CLONE_BACKWARDS
>  	select COMMON_CLK
> +	select DMA_NONCOHERENT_OPS
>  	select GENERIC_ATOMIC64
>  	select GENERIC_CLOCKEVENTS
>  	select GENERIC_IRQ_SHOW
> diff --git a/arch/xtensa/include/asm/Kbuild b/arch/xtensa/include/asm/Kbuild
> index e5e1e61c538c..82c756431b49 100644
> --- a/arch/xtensa/include/asm/Kbuild
> +++ b/arch/xtensa/include/asm/Kbuild
> @@ -3,6 +3,7 @@ generic-y += compat.h
>  generic-y += device.h
>  generic-y += div64.h
>  generic-y += dma-contiguous.h
> +generic-y += dma-mapping.h
>  generic-y += emergency-restart.h
>  generic-y += exec.h
>  generic-y += extable.h
> diff --git a/arch/xtensa/include/asm/dma-mapping.h b/arch/xtensa/include/asm/dma-mapping.h
> deleted file mode 100644
> index 44098800dad7..000000000000
> --- a/arch/xtensa/include/asm/dma-mapping.h
> +++ /dev/null
> @@ -1,26 +0,0 @@
> -/*
> - * This file is subject to the terms and conditions of the GNU General Public
> - * License.  See the file "COPYING" in the main directory of this archive
> - * for more details.
> - *
> - * Copyright (C) 2003 - 2005 Tensilica Inc.
> - * Copyright (C) 2015 Cadence Design Systems Inc.
> - */
> -
> -#ifndef _XTENSA_DMA_MAPPING_H
> -#define _XTENSA_DMA_MAPPING_H
> -
> -#include <asm/cache.h>
> -#include <asm/io.h>
> -
> -#include <linux/mm.h>
> -#include <linux/scatterlist.h>
> -
> -extern const struct dma_map_ops xtensa_dma_map_ops;
> -
> -static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
> -{
> -	return &xtensa_dma_map_ops;
> -}
> -
> -#endif	/* _XTENSA_DMA_MAPPING_H */
> diff --git a/arch/xtensa/kernel/pci-dma.c b/arch/xtensa/kernel/pci-dma.c
> index 392b4a80ebc2..a83d60e92908 100644
> --- a/arch/xtensa/kernel/pci-dma.c
> +++ b/arch/xtensa/kernel/pci-dma.c
> @@ -16,26 +16,24 @@
>   */
>  
>  #include <linux/dma-contiguous.h>
> +#include <linux/dma-noncoherent.h>
>  #include <linux/dma-direct.h>
>  #include <linux/gfp.h>
>  #include <linux/highmem.h>
>  #include <linux/mm.h>
> -#include <linux/module.h>
> -#include <linux/pci.h>
> -#include <linux/string.h>
>  #include <linux/types.h>
>  #include <asm/cacheflush.h>
>  #include <asm/io.h>
>  
> -static void do_cache_op(dma_addr_t dma_handle, size_t size,
> +static void do_cache_op(phys_addr_t paddr, size_t size,
>  			void (*fn)(unsigned long, unsigned long))
>  {
> -	unsigned long off = dma_handle & (PAGE_SIZE - 1);
> -	unsigned long pfn = PFN_DOWN(dma_handle);
> +	unsigned long off = paddr & (PAGE_SIZE - 1);
> +	unsigned long pfn = PFN_DOWN(paddr);
>  	struct page *page = pfn_to_page(pfn);
>  
>  	if (!PageHighMem(page))
> -		fn((unsigned long)bus_to_virt(dma_handle), size);
> +		fn((unsigned long)phys_to_virt(paddr), size);
>  	else
>  		while (size > 0) {
>  			size_t sz = min_t(size_t, size, PAGE_SIZE - off);
> @@ -49,14 +47,13 @@ static void do_cache_op(dma_addr_t dma_handle, size_t size,
>  		}
>  }
>  
> -static void xtensa_sync_single_for_cpu(struct device *dev,
> -				       dma_addr_t dma_handle, size_t size,
> -				       enum dma_data_direction dir)
> +void arch_sync_dma_for_cpu(struct device *dev, phys_addr_t paddr,
> +		size_t size, enum dma_data_direction dir)
>  {
>  	switch (dir) {
>  	case DMA_BIDIRECTIONAL:
>  	case DMA_FROM_DEVICE:
> -		do_cache_op(dma_handle, size, __invalidate_dcache_range);
> +		do_cache_op(paddr, size, __invalidate_dcache_range);
>  		break;
>  
>  	case DMA_NONE:
> @@ -68,15 +65,14 @@ static void xtensa_sync_single_for_cpu(struct device *dev,
>  	}
>  }
>  
> -static void xtensa_sync_single_for_device(struct device *dev,
> -					  dma_addr_t dma_handle, size_t size,
> -					  enum dma_data_direction dir)
> +void arch_sync_dma_for_device(struct device *dev, phys_addr_t paddr,
> +		size_t size, enum dma_data_direction dir)
>  {
>  	switch (dir) {
>  	case DMA_BIDIRECTIONAL:
>  	case DMA_TO_DEVICE:
>  		if (XCHAL_DCACHE_IS_WRITEBACK)
> -			do_cache_op(dma_handle, size, __flush_dcache_range);
> +			do_cache_op(paddr, size, __flush_dcache_range);
>  		break;
>  
>  	case DMA_NONE:
> @@ -88,40 +84,13 @@ static void xtensa_sync_single_for_device(struct device *dev,
>  	}
>  }
>  
> -static void xtensa_sync_sg_for_cpu(struct device *dev,
> -				   struct scatterlist *sg, int nents,
> -				   enum dma_data_direction dir)
> -{
> -	struct scatterlist *s;
> -	int i;
> -
> -	for_each_sg(sg, s, nents, i) {
> -		xtensa_sync_single_for_cpu(dev, sg_dma_address(s),
> -					   sg_dma_len(s), dir);
> -	}
> -}
> -
> -static void xtensa_sync_sg_for_device(struct device *dev,
> -				      struct scatterlist *sg, int nents,
> -				      enum dma_data_direction dir)
> -{
> -	struct scatterlist *s;
> -	int i;
> -
> -	for_each_sg(sg, s, nents, i) {
> -		xtensa_sync_single_for_device(dev, sg_dma_address(s),
> -					      sg_dma_len(s), dir);
> -	}
> -}
> -
>  /*
>   * Note: We assume that the full memory space is always mapped to 'kseg'
>   *	 Otherwise we have to use page attributes (not implemented).
>   */
>  
> -static void *xtensa_dma_alloc(struct device *dev, size_t size,
> -			      dma_addr_t *handle, gfp_t flag,
> -			      unsigned long attrs)
> +void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
> +		gfp_t flag, unsigned long attrs)
>  {
>  	unsigned long ret;
>  	unsigned long uncached;
> @@ -171,8 +140,8 @@ static void *xtensa_dma_alloc(struct device *dev, size_t size,
>  	return (void *)uncached;
>  }
>  
> -static void xtensa_dma_free(struct device *dev, size_t size, void *vaddr,
> -			    dma_addr_t dma_handle, unsigned long attrs)
> +void arch_dma_free(struct device *dev, size_t size, void *vaddr,
> +		dma_addr_t dma_handle, unsigned long attrs)
>  {
>  	unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT;
>  	unsigned long addr = (unsigned long)vaddr;
> @@ -192,72 +161,3 @@ static void xtensa_dma_free(struct device *dev, size_t size, void *vaddr,
>  	if (!dma_release_from_contiguous(dev, page, count))
>  		__free_pages(page, get_order(size));
>  }
> -
> -static dma_addr_t xtensa_map_page(struct device *dev, struct page *page,
> -				  unsigned long offset, size_t size,
> -				  enum dma_data_direction dir,
> -				  unsigned long attrs)
> -{
> -	dma_addr_t dma_handle = page_to_phys(page) + offset;
> -
> -	if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC))
> -		xtensa_sync_single_for_device(dev, dma_handle, size, dir);
> -
> -	return dma_handle;
> -}
> -
> -static void xtensa_unmap_page(struct device *dev, dma_addr_t dma_handle,
> -			      size_t size, enum dma_data_direction dir,
> -			      unsigned long attrs)
> -{
> -	if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC))
> -		xtensa_sync_single_for_cpu(dev, dma_handle, size, dir);
> -}
> -
> -static int xtensa_map_sg(struct device *dev, struct scatterlist *sg,
> -			 int nents, enum dma_data_direction dir,
> -			 unsigned long attrs)
> -{
> -	struct scatterlist *s;
> -	int i;
> -
> -	for_each_sg(sg, s, nents, i) {
> -		s->dma_address = xtensa_map_page(dev, sg_page(s), s->offset,
> -						 s->length, dir, attrs);
> -	}
> -	return nents;
> -}
> -
> -static void xtensa_unmap_sg(struct device *dev,
> -			    struct scatterlist *sg, int nents,
> -			    enum dma_data_direction dir,
> -			    unsigned long attrs)
> -{
> -	struct scatterlist *s;
> -	int i;
> -
> -	for_each_sg(sg, s, nents, i) {
> -		xtensa_unmap_page(dev, sg_dma_address(s),
> -				  sg_dma_len(s), dir, attrs);
> -	}
> -}
> -
> -int xtensa_dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
> -{
> -	return 0;
> -}
> -
> -const struct dma_map_ops xtensa_dma_map_ops = {
> -	.alloc = xtensa_dma_alloc,
> -	.free = xtensa_dma_free,
> -	.map_page = xtensa_map_page,
> -	.unmap_page = xtensa_unmap_page,
> -	.map_sg = xtensa_map_sg,
> -	.unmap_sg = xtensa_unmap_sg,
> -	.sync_single_for_cpu = xtensa_sync_single_for_cpu,
> -	.sync_single_for_device = xtensa_sync_single_for_device,
> -	.sync_sg_for_cpu = xtensa_sync_sg_for_cpu,
> -	.sync_sg_for_device = xtensa_sync_sg_for_device,
> -	.mapping_error = xtensa_dma_mapping_error,
> -};
> -EXPORT_SYMBOL(xtensa_dma_map_ops);
> -- 
> 2.17.1
> 
> _______________________________________________
> iommu mailing list
> iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
> https://lists.linuxfoundation.org/mailman/listinfo/iommu
---end quoted text---

  parent reply	other threads:[~2018-07-11 15:32 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-19  7:03 [PATCH] xtensa: use generic dma_noncoherent_ops Christoph Hellwig
     [not found] ` <20180619070316.26327-1-hch-jcswGhMUV9g@public.gmane.org>
2018-07-11 15:32   ` Christoph Hellwig [this message]
2018-07-11 17:57   ` Max Filippov
     [not found]     ` <CAMo8BfKzV6fhANk=ymsWFWoVtsYq3wXh559==rfjG2FimEC3+g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2018-07-11 18:00       ` Christoph Hellwig
     [not found]         ` <20180711180040.GA4262-jcswGhMUV9g@public.gmane.org>
2018-07-11 18:06           ` Max Filippov

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=20180711153259.GB31946@lst.de \
    --to=hch-jcswghmuv9g@public.gmane.org \
    --cc=chris-YvXeqwSYzG2sTnJN9+BGXg@public.gmane.org \
    --cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
    --cc=jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=linux-xtensa-PjhNF2WwrV/0Sa2dR60CXw@public.gmane.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.