sh: use dma_to_phys() instead of dev->dma_pfn_offset
diff mbox series

Message ID 20191011165129.29655-1-nsaenzjulienne@suse.de
State New, archived
Headers show
Series
  • sh: use dma_to_phys() instead of dev->dma_pfn_offset
Related show

Commit Message

Nicolas Saenz Julienne Oct. 11, 2019, 4:51 p.m. UTC
It's more explicit and lets dma-direct handle the specifics of how to
translate addresses.

On top of that get rid of warnings as, since the introduction of commit
6fa1d28e38c ("sh: use generic dma_noncoherent_ops"), it's impossible for
the dev to be NULL.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---

NOTE: this was only compile tested.

 arch/sh/kernel/dma-coherent.c | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

Comments

Christoph Hellwig Oct. 15, 2019, 7:43 a.m. UTC | #1
On Fri, Oct 11, 2019 at 06:51:29PM +0200, Nicolas Saenz Julienne wrote:
> It's more explicit and lets dma-direct handle the specifics of how to
> translate addresses.
> 
> On top of that get rid of warnings as, since the introduction of commit
> 6fa1d28e38c ("sh: use generic dma_noncoherent_ops"), it's impossible for
> the dev to be NULL.

This looks ok, but the real answer is to switch sh to the generic
dma remapping code.  I've been trying to get this included for about
a year now, but never managed to get a reply from the sh maintainers.

Here is the last one:

http://git.infradead.org/users/hch/misc.git/shortlog/refs/heads/sh-dma-remap
Nicolas Saenz Julienne Oct. 15, 2019, 8:05 a.m. UTC | #2
On Tue, 2019-10-15 at 00:43 -0700, Christoph Hellwig wrote:
> On Fri, Oct 11, 2019 at 06:51:29PM +0200, Nicolas Saenz Julienne wrote:
> > It's more explicit and lets dma-direct handle the specifics of how to
> > translate addresses.
> > 
> > On top of that get rid of warnings as, since the introduction of commit
> > 6fa1d28e38c ("sh: use generic dma_noncoherent_ops"), it's impossible for
> > the dev to be NULL.
> 
> This looks ok, but the real answer is to switch sh to the generic
> dma remapping code.  I've been trying to get this included for about
> a year now, but never managed to get a reply from the sh maintainers.

I see, well I guess this one will get ignored too :)

> Here is the last one:
> 
> http://git.infradead.org/users/hch/misc.git/shortlog/refs/heads/sh-dma-remap

I'd be happy with your series too.

In case you're wondering why I want this: I'm interested in supporting multiple
dma-ranges in DT. So I was looking at the amount of work needed to centralize
usage of dev->dma_pfn_offset. This one patch seemed trivial enough to send
right away.

Regards,
Nicolas
Christoph Hellwig Oct. 15, 2019, 9:49 a.m. UTC | #3
On Tue, Oct 15, 2019 at 10:05:52AM +0200, Nicolas Saenz Julienne wrote:
> I see, well I guess this one will get ignored too :)
> 
> > Here is the last one:
> > 
> > http://git.infradead.org/users/hch/misc.git/shortlog/refs/heads/sh-dma-remap
> 
> I'd be happy with your series too.

Let's see if we can make any progress this merge window..

> In case you're wondering why I want this: I'm interested in supporting multiple
> dma-ranges in DT. So I was looking at the amount of work needed to centralize
> usage of dev->dma_pfn_offset. This one patch seemed trivial enough to send
> right away.

Sounds useful, thanks!

Patch
diff mbox series

diff --git a/arch/sh/kernel/dma-coherent.c b/arch/sh/kernel/dma-coherent.c
index b17514619b7e..f6618ed01a42 100644
--- a/arch/sh/kernel/dma-coherent.c
+++ b/arch/sh/kernel/dma-coherent.c
@@ -4,6 +4,7 @@ 
  */
 #include <linux/mm.h>
 #include <linux/init.h>
+#include <linux/dma-direct.h>
 #include <linux/dma-noncoherent.h>
 #include <linux/module.h>
 #include <asm/cacheflush.h>
@@ -36,9 +37,7 @@  void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
 
 	split_page(pfn_to_page(virt_to_phys(ret) >> PAGE_SHIFT), order);
 
-	*dma_handle = virt_to_phys(ret);
-	if (!WARN_ON(!dev))
-		*dma_handle -= PFN_PHYS(dev->dma_pfn_offset);
+	*dma_handle = phys_to_dma(dev, virt_to_phys(ret));
 
 	return ret_nocache;
 }
@@ -47,12 +46,9 @@  void arch_dma_free(struct device *dev, size_t size, void *vaddr,
 		dma_addr_t dma_handle, unsigned long attrs)
 {
 	int order = get_order(size);
-	unsigned long pfn = (dma_handle >> PAGE_SHIFT);
+	unsigned long pfn = __phys_to_pfn(dma_to_phys(dev, dma_handle));
 	int k;
 
-	if (!WARN_ON(!dev))
-		pfn += dev->dma_pfn_offset;
-
 	for (k = 0; k < (1 << order); k++)
 		__free_pages(pfn_to_page(pfn + k), 0);