Message ID | 1246860820-20629-3-git-send-email-fujita.tomonori@lab.ntt.co.jp |
---|---|
State | Superseded |
Delegated to: | David Miller |
Headers | show |
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
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
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
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
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,
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(-)