Patchwork [2/5] sparc: use asm-generic/dma-mapping-common.h

login
register
mail settings
Submitter FUJITA Tomonori
Date July 6, 2009, 6:13 a.m.
Message ID <1246860820-20629-3-git-send-email-fujita.tomonori@lab.ntt.co.jp>
Download mbox | patch
Permalink /patch/29484/
State Superseded
Delegated to: David Miller
Headers show

Comments

FUJITA Tomonori - July 6, 2009, 6:13 a.m.
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
---
 arch/sparc/Kconfig                   |    1 +
 arch/sparc/include/asm/dma-mapping.h |  104 +++------------------------------
 arch/sparc/kernel/dma.c              |    4 +-
 arch/sparc/kernel/iommu.c            |    4 +-
 arch/sparc/kernel/pci_sun4v.c        |    2 +-
 5 files changed, 16 insertions(+), 99 deletions(-)
Arnd Bergmann - July 6, 2009, 8:26 a.m.
On Monday 06 July 2009, FUJITA Tomonori wrote:
> +static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> +{
> +       return dma_ops;
> +}
> +
> +#define flush_write_buffers()
> +
> +#include <asm-generic/dma-mapping-common.h>

I still think the flush_write_buffers() x86-ism should not be required
to use dma-mapping-common.h and only be used in arch/x86/kernel/pci-nommu.c
so you don't have to add dummy definitions to all architectures.

See http://lkml.org/lkml/2009/6/30/134

Otherwise, your series looks good!

	Arnd <><
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller - July 7, 2009, 1:11 a.m.
From: Arnd Bergmann <arnd@arndb.de>
Date: Mon, 6 Jul 2009 10:26:28 +0200

> On Monday 06 July 2009, FUJITA Tomonori wrote:
>> +static inline struct dma_map_ops *get_dma_ops(struct device *dev)
>> +{
>> +       return dma_ops;
>> +}
>> +
>> +#define flush_write_buffers()
>> +
>> +#include <asm-generic/dma-mapping-common.h>
> 
> I still think the flush_write_buffers() x86-ism should not be required
> to use dma-mapping-common.h and only be used in arch/x86/kernel/pci-nommu.c
> so you don't have to add dummy definitions to all architectures.
> 
> See http://lkml.org/lkml/2009/6/30/134
> 
> Otherwise, your series looks good!

Since we have until the 2.6.32 merge window to merge this, why
don't we take care of this flush_write_buffers() thing first?

I'm completely fine with these changes otherwise, thanks!
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
FUJITA Tomonori - July 9, 2009, 9:55 a.m.
On Mon, 06 Jul 2009 18:11:31 -0700 (PDT)
David Miller <davem@davemloft.net> wrote:

> From: Arnd Bergmann <arnd@arndb.de>
> Date: Mon, 6 Jul 2009 10:26:28 +0200
> 
> > On Monday 06 July 2009, FUJITA Tomonori wrote:
> >> +static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> >> +{
> >> +       return dma_ops;
> >> +}
> >> +
> >> +#define flush_write_buffers()
> >> +
> >> +#include <asm-generic/dma-mapping-common.h>
> > 
> > I still think the flush_write_buffers() x86-ism should not be required
> > to use dma-mapping-common.h and only be used in arch/x86/kernel/pci-nommu.c
> > so you don't have to add dummy definitions to all architectures.
> > 
> > See http://lkml.org/lkml/2009/6/30/134
> > 
> > Otherwise, your series looks good!
> 
> Since we have until the 2.6.32 merge window to merge this, why
> don't we take care of this flush_write_buffers() thing first?
>
> I'm completely fine with these changes otherwise, thanks!

The logic to move flush_write_buffers() from dma-mapping-common.h to
arch/x86/kernel/pci-nommu.c makes sense and it doesn't break anything.
However, I'd like to see the confirmation from a person who added
flush_write_buffers() long ago. I thought that we might overlook
something subtle.

I'll put Arnd's patch in the next submission if you like.


btw, Robert asked me about the dma-debug feature so I uploaded the new
version (I also found and fixed one bug wrt dma_{alloc|free}_coherent
for pci devices on SPARC32):

git://git.kernel.org/pub/scm/linux/kernel/git/tomo/linux-2.6-misc.git sparc
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Arnd Bergmann - July 9, 2009, 12:29 p.m.
On Thursday 09 July 2009, FUJITA Tomonori wrote:
> The logic to move flush_write_buffers() from dma-mapping-common.h to
> arch/x86/kernel/pci-nommu.c makes sense and it doesn't break anything.
> However, I'd like to see the confirmation from a person who added
> flush_write_buffers() long ago. I thought that we might overlook
> something subtle.

I've tried to find out where it comes from, but unfortunately it's
from prehistoric times (Linux-2.4.14.2), the commit is in 

http://git.kernel.org/?p=linux/kernel/git/tglx/history.git;a=commitdiff;h=a8a2069f432c5597bdf9c83ab3045b9ef32ab5e3

None of the comments in that commit seem to refer to
the actual change.

	Arnd <><
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig
index 3f8b6a9..5f2df99 100644
--- a/arch/sparc/Kconfig
+++ b/arch/sparc/Kconfig
@@ -25,6 +25,7 @@  config SPARC
 	select ARCH_WANT_OPTIONAL_GPIOLIB
 	select RTC_CLASS
 	select RTC_DRV_M48T59
+	select HAVE_DMA_ATTRS
 
 config SPARC32
 	def_bool !64BIT
diff --git a/arch/sparc/include/asm/dma-mapping.h b/arch/sparc/include/asm/dma-mapping.h
index 893f3ec..1a2ec4c 100644
--- a/arch/sparc/include/asm/dma-mapping.h
+++ b/arch/sparc/include/asm/dma-mapping.h
@@ -13,7 +13,16 @@  extern int dma_set_mask(struct device *dev, u64 dma_mask);
 #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
 #define dma_is_consistent(d, h)	(1)
 
-extern const struct dma_map_ops *dma_ops;
+extern struct dma_map_ops *dma_ops;
+
+static inline struct dma_map_ops *get_dma_ops(struct device *dev)
+{
+	return dma_ops;
+}
+
+#define flush_write_buffers()
+
+#include <asm-generic/dma-mapping-common.h>
 
 static inline void *dma_alloc_coherent(struct device *dev, size_t size,
 				       dma_addr_t *dma_handle, gfp_t flag)
@@ -27,99 +36,6 @@  static inline void dma_free_coherent(struct device *dev, size_t size,
 	dma_ops->free_coherent(dev, size, cpu_addr, dma_handle);
 }
 
-static inline dma_addr_t dma_map_single(struct device *dev, void *cpu_addr,
-					size_t size,
-					enum dma_data_direction direction)
-{
-	return dma_ops->map_page(dev, virt_to_page(cpu_addr),
-				 (unsigned long)cpu_addr & ~PAGE_MASK, size,
-				 direction, NULL);
-}
-
-static inline void dma_unmap_single(struct device *dev, dma_addr_t dma_addr,
-				    size_t size,
-				    enum dma_data_direction direction)
-{
-	dma_ops->unmap_page(dev, dma_addr, size, direction, NULL);
-}
-
-static inline dma_addr_t dma_map_page(struct device *dev, struct page *page,
-				      unsigned long offset, size_t size,
-				      enum dma_data_direction direction)
-{
-	return dma_ops->map_page(dev, page, offset, size, direction, NULL);
-}
-
-static inline void dma_unmap_page(struct device *dev, dma_addr_t dma_address,
-				  size_t size,
-				  enum dma_data_direction direction)
-{
-	dma_ops->unmap_page(dev, dma_address, size, direction, NULL);
-}
-
-static inline int dma_map_sg(struct device *dev, struct scatterlist *sg,
-			     int nents, enum dma_data_direction direction)
-{
-	return dma_ops->map_sg(dev, sg, nents, direction, NULL);
-}
-
-static inline void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
-				int nents, enum dma_data_direction direction)
-{
-	dma_ops->unmap_sg(dev, sg, nents, direction, NULL);
-}
-
-static inline void dma_sync_single_for_cpu(struct device *dev,
-					   dma_addr_t dma_handle, size_t size,
-					   enum dma_data_direction direction)
-{
-	dma_ops->sync_single_for_cpu(dev, dma_handle, size, direction);
-}
-
-static inline void dma_sync_single_for_device(struct device *dev,
-					      dma_addr_t dma_handle,
-					      size_t size,
-					      enum dma_data_direction direction)
-{
-	if (dma_ops->sync_single_for_device)
-		dma_ops->sync_single_for_device(dev, dma_handle, size,
-						direction);
-}
-
-static inline void dma_sync_sg_for_cpu(struct device *dev,
-				       struct scatterlist *sg, int nelems,
-				       enum dma_data_direction direction)
-{
-	dma_ops->sync_sg_for_cpu(dev, sg, nelems, direction);
-}
-
-static inline void dma_sync_sg_for_device(struct device *dev,
-					  struct scatterlist *sg, int nelems,
-					  enum dma_data_direction direction)
-{
-	if (dma_ops->sync_sg_for_device)
-		dma_ops->sync_sg_for_device(dev, sg, nelems, direction);
-}
-
-static inline void dma_sync_single_range_for_cpu(struct device *dev,
-						 dma_addr_t dma_handle,
-						 unsigned long offset,
-						 size_t size,
-						 enum dma_data_direction dir)
-{
-	dma_sync_single_for_cpu(dev, dma_handle+offset, size, dir);
-}
-
-static inline void dma_sync_single_range_for_device(struct device *dev,
-						    dma_addr_t dma_handle,
-						    unsigned long offset,
-						    size_t size,
-						    enum dma_data_direction dir)
-{
-	dma_sync_single_for_device(dev, dma_handle+offset, size, dir);
-}
-
-
 static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
 {
 	return (dma_addr == DMA_ERROR_CODE);
diff --git a/arch/sparc/kernel/dma.c b/arch/sparc/kernel/dma.c
index 473a3fc..15820a9 100644
--- a/arch/sparc/kernel/dma.c
+++ b/arch/sparc/kernel/dma.c
@@ -165,7 +165,7 @@  static void dma32_sync_sg_for_device(struct device *dev,
 	BUG();
 }
 
-static const struct dma_map_ops dma32_dma_ops = {
+static struct dma_map_ops dma32_dma_ops = {
 	.alloc_coherent		= dma32_alloc_coherent,
 	.free_coherent		= dma32_free_coherent,
 	.map_page		= dma32_map_page,
@@ -178,5 +178,5 @@  static const struct dma_map_ops dma32_dma_ops = {
 	.sync_sg_for_device	= dma32_sync_sg_for_device,
 };
 
-const struct dma_map_ops *dma_ops = &dma32_dma_ops;
+struct dma_map_ops *dma_ops = &dma32_dma_ops;
 EXPORT_SYMBOL(dma_ops);
diff --git a/arch/sparc/kernel/iommu.c b/arch/sparc/kernel/iommu.c
index a9f0ad9..74b289c 100644
--- a/arch/sparc/kernel/iommu.c
+++ b/arch/sparc/kernel/iommu.c
@@ -826,7 +826,7 @@  static void dma_4u_sync_sg_for_cpu(struct device *dev,
 	spin_unlock_irqrestore(&iommu->lock, flags);
 }
 
-static const struct dma_map_ops sun4u_dma_ops = {
+static struct dma_map_ops sun4u_dma_ops = {
 	.alloc_coherent		= dma_4u_alloc_coherent,
 	.free_coherent		= dma_4u_free_coherent,
 	.map_page		= dma_4u_map_page,
@@ -837,7 +837,7 @@  static const struct dma_map_ops sun4u_dma_ops = {
 	.sync_sg_for_cpu	= dma_4u_sync_sg_for_cpu,
 };
 
-const struct dma_map_ops *dma_ops = &sun4u_dma_ops;
+struct dma_map_ops *dma_ops = &sun4u_dma_ops;
 EXPORT_SYMBOL(dma_ops);
 
 int dma_supported(struct device *dev, u64 device_mask)
diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c
index c4f7dce..ee800f9 100644
--- a/arch/sparc/kernel/pci_sun4v.c
+++ b/arch/sparc/kernel/pci_sun4v.c
@@ -539,7 +539,7 @@  static void dma_4v_sync_sg_for_cpu(struct device *dev,
 	/* Nothing to do... */
 }
 
-static const struct dma_map_ops sun4v_dma_ops = {
+static struct dma_map_ops sun4v_dma_ops = {
 	.alloc_coherent			= dma_4v_alloc_coherent,
 	.free_coherent			= dma_4v_free_coherent,
 	.map_page			= dma_4v_map_page,