From: Wu Zhangjin <wuzhangjin@gmail.com>
To: Takashi Iwai <tiwai@suse.de>
Cc: Ralf Baechle <ralf@linux-mips.org>,
linux-mips <linux-mips@linux-mips.org>
Subject: Re: About MIPS specific dma_mmap_coherent()
Date: Wed, 14 Apr 2010 12:21:29 +0800 [thread overview]
Message-ID: <1271218889.25872.27.camel@falcon> (raw)
In-Reply-To: <s5hmxx7z4a7.wl%tiwai@suse.de>
Hi,
> > $ mplayer -ao alsa file.mp3
> >
> > but without it, the ALSA output is broken.
>
> Hm, which driver/device are you using? Also, how is it broken?
I'm using the cs5535 audio in my Yeeloong laptop with the config
"CONFIG_SND_CS5535AUDIO=m"
the above 'broken' means there is audio output with ALSA, but the output
is not normal for it has lots of noises: sha sha sha...
>
> There is already a low-level hack in sound/core/pcm_native.c for MIPS,
> so I thought the kernel oops should have been avoided, at least.
> Maybe still pgprot_noncached() is missing, though.
You mean this part for MIPS:
static inline struct page *
snd_pcm_default_page_ops(struct snd_pcm_substream *substream, unsigned
long ofs)
{
void *vaddr = substream->runtime->dma_area + ofs;
#if defined(CONFIG_MIPS) && defined(CONFIG_DMA_NONCOHERENT)
if (substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV)
return virt_to_page(CAC_ADDR(vaddr));
#endif
...
}
Yes, it was already there from one of your patches to linux-2.6.33, but
the pgprot_noncached() was missing as you mentioned above.
And I have found you have added the ARM specific dma_mmap_coherent() to
snd_pcm_default_mmap() to mmap the DMA buffer on RAM:
/*
* mmap the DMA buffer on RAM
*/
static int snd_pcm_default_mmap(struct snd_pcm_substream *substream,
struct vm_area_struct *area)
{
area->vm_flags |= VM_RESERVED;
#ifdef ARCH_HAS_DMA_MMAP_COHERENT
if (!substream->ops->page &&
substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV)
return dma_mmap_coherent(substream->dma_buffer.dev.dev,
area,
substream->runtime->dma_area,
substream->runtime->dma_addr,
area->vm_end - area->vm_start);
#endif /* ARCH_HAS_DMA_MMAP_COHERENT */
/* mmap with fault handler */
area->vm_ops = &snd_pcm_vm_ops_data_fault;
return 0;
}
Before, we have added the low-level handling with pgprot_noncached() in
snd_pcm_mmap() to fix it, but now, can we add MIPS specific
dma_mmap_coherent() as ARM did?
Regards,
Wu Zhangjin
> > [2 0001-MIPS-Implement-dma_mmap_coherent-for-ALSA-audio-outp.patch <text/x-patch; UTF-8 (7bit)>]
> > >From a6ee304febbd609d2936dd5b33a16482ef224c97 Mon Sep 17 00:00:00 2001
> > From: Wu Zhangjin <wuzhangjin@gmail.com>
> > Date: Sun, 11 Apr 2010 03:58:13 +0800
> > Subject: [PATCH] MIPS: Implement dma_mmap_coherent() for ALSA audio output
> >
> > A lazy version of dma_mmap_coherent() implementation for MIPS.
> >
> > Without this patch, the ALSA sound output of MIPS is broken:
> >
> > $ mplayer -ao alsa file.mp3
> >
> > (This patch was sent out by Takashi Iwai at '18 Aug 2008' but not have
> > been applied yet for it is not suitable for all MIPS variants. If you
> > need more info, please access:
> > http://www.linux-mips.org/archives/linux-mips/2008-08/msg00178.html)
> >
> > Signed-off-by: Takashi Iwai <tiwai@suse.de>
> > ---
> > arch/mips/include/asm/dma-mapping.h | 4 ++++
> > arch/mips/mm/dma-default.c | 13 +++++++++++++
> > 2 files changed, 17 insertions(+), 0 deletions(-)
> >
> > diff --git a/arch/mips/include/asm/dma-mapping.h b/arch/mips/include/asm/dma-mapping.h
> > index 664ba53..c39bfdf 100644
> > --- a/arch/mips/include/asm/dma-mapping.h
> > +++ b/arch/mips/include/asm/dma-mapping.h
> > @@ -74,4 +74,8 @@ extern int dma_is_consistent(struct device *dev, dma_addr_t dma_addr);
> > extern void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
> > enum dma_data_direction direction);
> >
> > +#define ARCH_HAS_DMA_MMAP_COHERENT
> > +extern int dma_mmap_coherent(struct device *dev, struct vm_area_struct *vma,
> > + void *cpu_addr, dma_addr_t handle, size_t size);
> > +
> > #endif /* _ASM_DMA_MAPPING_H */
> > diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c
> > index 9547bc0..8388428 100644
> > --- a/arch/mips/mm/dma-default.c
> > +++ b/arch/mips/mm/dma-default.c
> > @@ -375,3 +375,16 @@ void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
> > }
> >
> > EXPORT_SYMBOL(dma_cache_sync);
> > +
> > +int __weak dma_mmap_coherent(struct device *dev, struct vm_area_struct *vma,
> > + void *cpu_addr, dma_addr_t handle, size_t size)
> > +{
> > + struct page *pg;
> > + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
> > + cpu_addr = (void *)dma_addr_to_virt(dev, handle);
> > + pg = virt_to_page(cpu_addr);
> > + return remap_pfn_range(vma, vma->vm_start,
> > + page_to_pfn(pg) + vma->vm_pgoff,
> > + size, vma->vm_page_prot);
> > +}
> > +EXPORT_SYMBOL(dma_mmap_coherent);
> > --
> > 1.7.0
> >
next prev parent reply other threads:[~2010-04-14 4:21 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-13 4:58 About MIPS specific dma_mmap_coherent() Wu Zhangjin
2010-04-13 16:49 ` Takashi Iwai
2010-04-14 4:21 ` Wu Zhangjin [this message]
2010-04-14 6:31 ` Takashi Iwai
2010-04-14 9:00 ` Wu Zhangjin
2010-04-14 15:46 ` Takashi Iwai
2010-05-11 18:48 ` Ralf Baechle
2010-05-12 6:42 ` Wu Zhangjin
2010-05-12 8:41 ` Takashi Iwai
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=1271218889.25872.27.camel@falcon \
--to=wuzhangjin@gmail.com \
--cc=linux-mips@linux-mips.org \
--cc=ralf@linux-mips.org \
--cc=tiwai@suse.de \
/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.