linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] powerpc: Implement dma_mmap_coherent()
@ 2011-03-25  6:50 Benjamin Herrenschmidt
  2011-03-25  8:06 ` Takashi Iwai
  2011-03-29  0:30 ` Benjamin Herrenschmidt
  0 siblings, 2 replies; 7+ messages in thread
From: Benjamin Herrenschmidt @ 2011-03-25  6:50 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: Takashi Iwai

This is used by Alsa to mmap buffers allocated with dma_alloc_coherent()
into userspace. We need a special variant to handle machines with
non-coherent DMAs as those buffers have "special" virt addresses and
require non-cachable mappings

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---

Dunno if anybody with CONFIG_NOT_COHERENT_CACHE has some audio device
that uses dma buffers (ie not usb-audio) and wants to try that out...
should fix a long standing problem.

 arch/powerpc/include/asm/dma-mapping.h |    7 +++++++
 arch/powerpc/kernel/dma.c              |   18 ++++++++++++++++++
 arch/powerpc/mm/dma-noncoherent.c      |   20 ++++++++++++++++++++
 3 files changed, 45 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/include/asm/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h
index 6d2416a..41e0eb7 100644
--- a/arch/powerpc/include/asm/dma-mapping.h
+++ b/arch/powerpc/include/asm/dma-mapping.h
@@ -42,6 +42,7 @@ extern void __dma_free_coherent(size_t size, void *vaddr);
 extern void __dma_sync(void *vaddr, size_t size, int direction);
 extern void __dma_sync_page(struct page *page, unsigned long offset,
 				 size_t size, int direction);
+extern unsigned long __dma_get_coherent_pfn(void *cpu_addr);
 
 #else /* ! CONFIG_NOT_COHERENT_CACHE */
 /*
@@ -52,6 +53,7 @@ extern void __dma_sync_page(struct page *page, unsigned long offset,
 #define __dma_free_coherent(size, addr)		((void)0)
 #define __dma_sync(addr, size, rw)		((void)0)
 #define __dma_sync_page(pg, off, sz, rw)	((void)0)
+#define __dma_get_coherent_pfn(cpu_addr)	(0)
 
 #endif /* ! CONFIG_NOT_COHERENT_CACHE */
 
@@ -198,6 +200,11 @@ static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t daddr)
 #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
 #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
 
+extern int dma_mmap_coherent(struct device *, struct vm_area_struct *,
+			     void *, dma_addr_t, size_t);
+#define ARCH_HAS_DMA_MMAP_COHERENT
+
+
 static inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
 		enum dma_data_direction direction)
 {
diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c
index cf02cad..0f52235 100644
--- a/arch/powerpc/kernel/dma.c
+++ b/arch/powerpc/kernel/dma.c
@@ -179,3 +179,21 @@ static int __init dma_init(void)
        return 0;
 }
 fs_initcall(dma_init);
+
+int dma_mmap_coherent(struct device *dev, struct vm_area_struct *vma,
+		      void *cpu_addr, dma_addr_t handle, size_t size)
+{
+	unsigned long pfn;
+
+#ifdef CONFIG_NOT_COHERENT_CACHE
+	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+	pfn = __dma_get_coherent_pfn(cpu_addr);
+#else
+	pfn = page_to_pfn(virt_to_page(cpu_addr));
+#endif
+	return remap_pfn_range(vma, vma->vm_start,
+			       pfn + vma->vm_pgoff,
+			       vma->vm_end - vma->vm_start,
+			       vma->vm_page_prot);
+}
+
diff --git a/arch/powerpc/mm/dma-noncoherent.c b/arch/powerpc/mm/dma-noncoherent.c
index 757c0be..174b10a 100644
--- a/arch/powerpc/mm/dma-noncoherent.c
+++ b/arch/powerpc/mm/dma-noncoherent.c
@@ -399,3 +399,23 @@ void __dma_sync_page(struct page *page, unsigned long offset,
 #endif
 }
 EXPORT_SYMBOL(__dma_sync_page);
+
+/*
+ * Return the PFN for a given cpu virtual address returned by
+ * __dma_alloc_coherent. This is used by dma_mmap_coherent()
+ */
+unsigned long __dma_get_coherent_pfn(void *cpu_addr)
+{	
+	/* This should always be populated, so we don't test every
+	 * level. If that fails, we'll have a nice crash which
+	 * will be as good as a BUG_ON()
+	 */
+	pgd_t *pgd = pgd_offset_k(cpu_addr);
+	pud_t *pud = pud_offset(pgd, cpu_addr);
+	pmd_t *pmd = pmd_offset(pud, cpu_addr);
+	pte_t *ptep = pte_offset_kernel(pmd, cpu_addr);
+
+	if (pte_none(*ptep) || !pte_present(*ptep))
+		return 0;
+	return pte_pfn(*ptep);	
+}

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] powerpc: Implement dma_mmap_coherent()
  2011-03-25  6:50 [PATCH] powerpc: Implement dma_mmap_coherent() Benjamin Herrenschmidt
@ 2011-03-25  8:06 ` Takashi Iwai
  2011-03-25  9:11   ` Benjamin Herrenschmidt
  2011-03-29  0:30 ` Benjamin Herrenschmidt
  1 sibling, 1 reply; 7+ messages in thread
From: Takashi Iwai @ 2011-03-25  8:06 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: linuxppc-dev

At Fri, 25 Mar 2011 17:50:06 +1100,
Benjamin Herrenschmidt wrote:
> 
> This is used by Alsa to mmap buffers allocated with dma_alloc_coherent()
> into userspace. We need a special variant to handle machines with
> non-coherent DMAs as those buffers have "special" virt addresses and
> require non-cachable mappings
> 
> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> ---
> 
> Dunno if anybody with CONFIG_NOT_COHERENT_CACHE has some audio device
> that uses dma buffers (ie not usb-audio) and wants to try that out...
> should fix a long standing problem.
> 
>  arch/powerpc/include/asm/dma-mapping.h |    7 +++++++
>  arch/powerpc/kernel/dma.c              |   18 ++++++++++++++++++
>  arch/powerpc/mm/dma-noncoherent.c      |   20 ++++++++++++++++++++
>  3 files changed, 45 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h
> index 6d2416a..41e0eb7 100644
> --- a/arch/powerpc/include/asm/dma-mapping.h
> +++ b/arch/powerpc/include/asm/dma-mapping.h
> @@ -42,6 +42,7 @@ extern void __dma_free_coherent(size_t size, void *vaddr);
>  extern void __dma_sync(void *vaddr, size_t size, int direction);
>  extern void __dma_sync_page(struct page *page, unsigned long offset,
>  				 size_t size, int direction);
> +extern unsigned long __dma_get_coherent_pfn(void *cpu_addr);
>  
>  #else /* ! CONFIG_NOT_COHERENT_CACHE */
>  /*
> @@ -52,6 +53,7 @@ extern void __dma_sync_page(struct page *page, unsigned long offset,
>  #define __dma_free_coherent(size, addr)		((void)0)
>  #define __dma_sync(addr, size, rw)		((void)0)
>  #define __dma_sync_page(pg, off, sz, rw)	((void)0)
> +#define __dma_get_coherent_pfn(cpu_addr)	(0)

Just nitpicking: shouldn't we define some real thing like
	page_to_pfn(virt_to_page(cpu_addr))
or put something to trigger an error?  Setting a bogus zero can be
easily overlooked, I'm afraid.



thanks,

Takashi

>  
>  #endif /* ! CONFIG_NOT_COHERENT_CACHE */
>  
> @@ -198,6 +200,11 @@ static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t daddr)
>  #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
>  #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
>  
> +extern int dma_mmap_coherent(struct device *, struct vm_area_struct *,
> +			     void *, dma_addr_t, size_t);
> +#define ARCH_HAS_DMA_MMAP_COHERENT
> +
> +
>  static inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
>  		enum dma_data_direction direction)
>  {
> diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c
> index cf02cad..0f52235 100644
> --- a/arch/powerpc/kernel/dma.c
> +++ b/arch/powerpc/kernel/dma.c
> @@ -179,3 +179,21 @@ static int __init dma_init(void)
>         return 0;
>  }
>  fs_initcall(dma_init);
> +
> +int dma_mmap_coherent(struct device *dev, struct vm_area_struct *vma,
> +		      void *cpu_addr, dma_addr_t handle, size_t size)
> +{
> +	unsigned long pfn;
> +
> +#ifdef CONFIG_NOT_COHERENT_CACHE
> +	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
> +	pfn = __dma_get_coherent_pfn(cpu_addr);
> +#else
> +	pfn = page_to_pfn(virt_to_page(cpu_addr));
> +#endif
> +	return remap_pfn_range(vma, vma->vm_start,
> +			       pfn + vma->vm_pgoff,
> +			       vma->vm_end - vma->vm_start,
> +			       vma->vm_page_prot);
> +}
> +
> diff --git a/arch/powerpc/mm/dma-noncoherent.c b/arch/powerpc/mm/dma-noncoherent.c
> index 757c0be..174b10a 100644
> --- a/arch/powerpc/mm/dma-noncoherent.c
> +++ b/arch/powerpc/mm/dma-noncoherent.c
> @@ -399,3 +399,23 @@ void __dma_sync_page(struct page *page, unsigned long offset,
>  #endif
>  }
>  EXPORT_SYMBOL(__dma_sync_page);
> +
> +/*
> + * Return the PFN for a given cpu virtual address returned by
> + * __dma_alloc_coherent. This is used by dma_mmap_coherent()
> + */
> +unsigned long __dma_get_coherent_pfn(void *cpu_addr)
> +{	
> +	/* This should always be populated, so we don't test every
> +	 * level. If that fails, we'll have a nice crash which
> +	 * will be as good as a BUG_ON()
> +	 */
> +	pgd_t *pgd = pgd_offset_k(cpu_addr);
> +	pud_t *pud = pud_offset(pgd, cpu_addr);
> +	pmd_t *pmd = pmd_offset(pud, cpu_addr);
> +	pte_t *ptep = pte_offset_kernel(pmd, cpu_addr);
> +
> +	if (pte_none(*ptep) || !pte_present(*ptep))
> +		return 0;
> +	return pte_pfn(*ptep);	
> +}
> 
> 
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] powerpc: Implement dma_mmap_coherent()
  2011-03-25  8:06 ` Takashi Iwai
@ 2011-03-25  9:11   ` Benjamin Herrenschmidt
  2011-03-25  9:13     ` Takashi Iwai
  0 siblings, 1 reply; 7+ messages in thread
From: Benjamin Herrenschmidt @ 2011-03-25  9:11 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: linuxppc-dev

On Fri, 2011-03-25 at 09:06 +0100, Takashi Iwai wrote:
> > @@ -52,6 +53,7 @@ extern void __dma_sync_page(struct page *page,
> unsigned long offset,
> >  #define __dma_free_coherent(size, addr)              ((void)0)
> >  #define __dma_sync(addr, size, rw)           ((void)0)
> >  #define __dma_sync_page(pg, off, sz, rw)     ((void)0)
> > +#define __dma_get_coherent_pfn(cpu_addr)     (0)
> 
> Just nitpicking: shouldn't we define some real thing like
>         page_to_pfn(virt_to_page(cpu_addr))
> or put something to trigger an error?  Setting a bogus zero can be
> easily overlooked, I'm afraid.

Yes, all those variants are bogus if you noticed :-) The trick is that
they aren't actually called when CONFIG_NOT_COHERENT_CACHE is not set
anyways, with the exception of __dma_sync(), so I want to just remove
them all. But I'll do that in a separate patch.

Cheers,
Ben.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] powerpc: Implement dma_mmap_coherent()
  2011-03-25  9:11   ` Benjamin Herrenschmidt
@ 2011-03-25  9:13     ` Takashi Iwai
  0 siblings, 0 replies; 7+ messages in thread
From: Takashi Iwai @ 2011-03-25  9:13 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: linuxppc-dev

At Fri, 25 Mar 2011 20:11:57 +1100,
Benjamin Herrenschmidt wrote:
> 
> On Fri, 2011-03-25 at 09:06 +0100, Takashi Iwai wrote:
> > > @@ -52,6 +53,7 @@ extern void __dma_sync_page(struct page *page,
> > unsigned long offset,
> > >  #define __dma_free_coherent(size, addr)              ((void)0)
> > >  #define __dma_sync(addr, size, rw)           ((void)0)
> > >  #define __dma_sync_page(pg, off, sz, rw)     ((void)0)
> > > +#define __dma_get_coherent_pfn(cpu_addr)     (0)
> > 
> > Just nitpicking: shouldn't we define some real thing like
> >         page_to_pfn(virt_to_page(cpu_addr))
> > or put something to trigger an error?  Setting a bogus zero can be
> > easily overlooked, I'm afraid.
> 
> Yes, all those variants are bogus if you noticed :-) The trick is that
> they aren't actually called when CONFIG_NOT_COHERENT_CACHE is not set
> anyways, with the exception of __dma_sync(), so I want to just remove
> them all. But I'll do that in a separate patch.

OK, that makes sense.


thanks,

Takashi

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] powerpc: Implement dma_mmap_coherent()
  2011-03-25  6:50 [PATCH] powerpc: Implement dma_mmap_coherent() Benjamin Herrenschmidt
  2011-03-25  8:06 ` Takashi Iwai
@ 2011-03-29  0:30 ` Benjamin Herrenschmidt
  1 sibling, 0 replies; 7+ messages in thread
From: Benjamin Herrenschmidt @ 2011-03-29  0:30 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: Takashi Iwai

On Fri, 2011-03-25 at 17:50 +1100, Benjamin Herrenschmidt wrote:
> This is used by Alsa to mmap buffers allocated with dma_alloc_coherent()
> into userspace. We need a special variant to handle machines with
> non-coherent DMAs as those buffers have "special" virt addresses and
> require non-cachable mappings

Missing an EXPORT_SYMBOL_GPL... will fix that up before I merge.

Cheers,
Ben.

> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> ---
> 
> Dunno if anybody with CONFIG_NOT_COHERENT_CACHE has some audio device
> that uses dma buffers (ie not usb-audio) and wants to try that out...
> should fix a long standing problem.
> 
>  arch/powerpc/include/asm/dma-mapping.h |    7 +++++++
>  arch/powerpc/kernel/dma.c              |   18 ++++++++++++++++++
>  arch/powerpc/mm/dma-noncoherent.c      |   20 ++++++++++++++++++++
>  3 files changed, 45 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h
> index 6d2416a..41e0eb7 100644
> --- a/arch/powerpc/include/asm/dma-mapping.h
> +++ b/arch/powerpc/include/asm/dma-mapping.h
> @@ -42,6 +42,7 @@ extern void __dma_free_coherent(size_t size, void *vaddr);
>  extern void __dma_sync(void *vaddr, size_t size, int direction);
>  extern void __dma_sync_page(struct page *page, unsigned long offset,
>  				 size_t size, int direction);
> +extern unsigned long __dma_get_coherent_pfn(void *cpu_addr);
>  
>  #else /* ! CONFIG_NOT_COHERENT_CACHE */
>  /*
> @@ -52,6 +53,7 @@ extern void __dma_sync_page(struct page *page, unsigned long offset,
>  #define __dma_free_coherent(size, addr)		((void)0)
>  #define __dma_sync(addr, size, rw)		((void)0)
>  #define __dma_sync_page(pg, off, sz, rw)	((void)0)
> +#define __dma_get_coherent_pfn(cpu_addr)	(0)
>  
>  #endif /* ! CONFIG_NOT_COHERENT_CACHE */
>  
> @@ -198,6 +200,11 @@ static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t daddr)
>  #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
>  #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
>  
> +extern int dma_mmap_coherent(struct device *, struct vm_area_struct *,
> +			     void *, dma_addr_t, size_t);
> +#define ARCH_HAS_DMA_MMAP_COHERENT
> +
> +
>  static inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
>  		enum dma_data_direction direction)
>  {
> diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c
> index cf02cad..0f52235 100644
> --- a/arch/powerpc/kernel/dma.c
> +++ b/arch/powerpc/kernel/dma.c
> @@ -179,3 +179,21 @@ static int __init dma_init(void)
>         return 0;
>  }
>  fs_initcall(dma_init);
> +
> +int dma_mmap_coherent(struct device *dev, struct vm_area_struct *vma,
> +		      void *cpu_addr, dma_addr_t handle, size_t size)
> +{
> +	unsigned long pfn;
> +
> +#ifdef CONFIG_NOT_COHERENT_CACHE
> +	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
> +	pfn = __dma_get_coherent_pfn(cpu_addr);
> +#else
> +	pfn = page_to_pfn(virt_to_page(cpu_addr));
> +#endif
> +	return remap_pfn_range(vma, vma->vm_start,
> +			       pfn + vma->vm_pgoff,
> +			       vma->vm_end - vma->vm_start,
> +			       vma->vm_page_prot);
> +}
> +
> diff --git a/arch/powerpc/mm/dma-noncoherent.c b/arch/powerpc/mm/dma-noncoherent.c
> index 757c0be..174b10a 100644
> --- a/arch/powerpc/mm/dma-noncoherent.c
> +++ b/arch/powerpc/mm/dma-noncoherent.c
> @@ -399,3 +399,23 @@ void __dma_sync_page(struct page *page, unsigned long offset,
>  #endif
>  }
>  EXPORT_SYMBOL(__dma_sync_page);
> +
> +/*
> + * Return the PFN for a given cpu virtual address returned by
> + * __dma_alloc_coherent. This is used by dma_mmap_coherent()
> + */
> +unsigned long __dma_get_coherent_pfn(void *cpu_addr)
> +{	
> +	/* This should always be populated, so we don't test every
> +	 * level. If that fails, we'll have a nice crash which
> +	 * will be as good as a BUG_ON()
> +	 */
> +	pgd_t *pgd = pgd_offset_k(cpu_addr);
> +	pud_t *pud = pud_offset(pgd, cpu_addr);
> +	pmd_t *pmd = pmd_offset(pud, cpu_addr);
> +	pte_t *ptep = pte_offset_kernel(pmd, cpu_addr);
> +
> +	if (pte_none(*ptep) || !pte_present(*ptep))
> +		return 0;
> +	return pte_pfn(*ptep);	
> +}
> 
> 
> 
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] powerpc: Implement dma_mmap_coherent()
@ 2011-03-31 20:39 Gerhard Pircher
  2011-03-31 21:05 ` Benjamin Herrenschmidt
  0 siblings, 1 reply; 7+ messages in thread
From: Gerhard Pircher @ 2011-03-31 20:39 UTC (permalink / raw)
  To: Benjamin Herrenschmidt, linuxppc-dev; +Cc: tiwai

-------- Original-Nachricht --------
> Datum: Fri, 25 Mar 2011 17:50:06 +1100
> Von: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> An: linuxppc-dev <linuxppc-dev@lists.ozlabs.org>
> CC: Takashi Iwai <tiwai@suse.de>
> Betreff: [PATCH] powerpc: Implement dma_mmap_coherent()

> This is used by Alsa to mmap buffers allocated with dma_alloc_coherent()
> into userspace. We need a special variant to handle machines with
> non-coherent DMAs as those buffers have "special" virt addresses and
> require non-cachable mappings
> 
> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> ---
> 
> Dunno if anybody with CONFIG_NOT_COHERENT_CACHE has some audio device
> that uses dma buffers (ie not usb-audio) and wants to try that out...
> should fix a long standing problem.

Compilation fails here with these error messages:

>   CC      arch/powerpc/mm/dma-noncoherent.o
> arch/powerpc/mm/dma-noncoherent.c: In function ‘__dma_get_coherent_pfn’:
> arch/powerpc/mm/dma-noncoherent.c:413: error: invalid operands to binary >> (have ‘void *’ and ‘int’)
> cc1: warnings being treated as errors
> arch/powerpc/mm/dma-noncoherent.c:414: error: passing argument 2 of ‘pud_offset’ makes integer from pointer without a cast
> arch/powerpc/mm/dma-noncoherent.c:415: error: passing argument 2 of ‘pmd_offset’ makes integer from pointer without a cast
> arch/powerpc/mm/dma-noncoherent.c:416: error: invalid operands to binary >> (have ‘void *’ and ‘int’)
> make[1]: *** [arch/powerpc/mm/dma-noncoherent.o] Fehler 1
> make: *** [arch/powerpc/mm] Fehler 2

Anyway, it compiles with explicit type casts and I could test it on my
semi-noncoherent AmigaOne. So far it works just fine with the VIA onboard
sound and a Soundblaster Live PCI card.

Thanks a lot for the fix!

regards,
Gerhard

-- 
NEU: FreePhone - kostenlos mobil telefonieren und surfen!			
Jetzt informieren: http://www.gmx.net/de/go/freephone

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] powerpc: Implement dma_mmap_coherent()
  2011-03-31 20:39 Gerhard Pircher
@ 2011-03-31 21:05 ` Benjamin Herrenschmidt
  0 siblings, 0 replies; 7+ messages in thread
From: Benjamin Herrenschmidt @ 2011-03-31 21:05 UTC (permalink / raw)
  To: Gerhard Pircher; +Cc: tiwai, linuxppc-dev

On Thu, 2011-03-31 at 22:39 +0200, Gerhard Pircher wrote:
> Anyway, it compiles with explicit type casts and I could test it on my
> semi-noncoherent AmigaOne. So far it works just fine with the VIA
> onboard
> sound and a Soundblaster Live PCI card.
> 
> Thanks a lot for the fix!

Yes, the version I sent to Linus has that fixed, I forgot to send it to
the list also :-)

Cheers,
Ben.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2011-03-31 21:05 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-25  6:50 [PATCH] powerpc: Implement dma_mmap_coherent() Benjamin Herrenschmidt
2011-03-25  8:06 ` Takashi Iwai
2011-03-25  9:11   ` Benjamin Herrenschmidt
2011-03-25  9:13     ` Takashi Iwai
2011-03-29  0:30 ` Benjamin Herrenschmidt
  -- strict thread matches above, loose matches on Subject: below --
2011-03-31 20:39 Gerhard Pircher
2011-03-31 21:05 ` Benjamin Herrenschmidt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).