* [patch] alsa: provide a more useful get_unmapped_area handler for pcm
@ 2009-03-26 13:26 Daniel Glöckner
0 siblings, 0 replies; 3+ messages in thread
From: Daniel Glöckner @ 2009-03-26 13:26 UTC (permalink / raw)
To: Takashi Iwai; +Cc: Cliff Cai, alsa-devel, Daniel Glöckner
Shared memory mappings on nommu machines require a get_unmapped_area
file operation that suggests an address for the mapping. The current
implementation returns 0 and thus forces the driver to implement an
mmap handler that fixes up the start and end address of the vma.
This patch returns the address of the dma buffer, so it should work
out of the box for all drivers that use the snd_pcm_runtime->dma_area
pointer.
Addresses for mapping the status and control pages are returned as
well, but to make those work the conditional compilation of
snd_pcm_mmap_{status,control} would need to be revised.
Signed-off-by: Daniel Glöckner <dg@emlix.com>
---
sound/core/pcm_native.c | 30 ++++++++++++++++++++++--------
1 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index a789efc..09ec8d7 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -3377,14 +3377,28 @@ out:
#endif /* CONFIG_SND_SUPPORT_OLD_API */
#ifndef CONFIG_MMU
-unsigned long dummy_get_unmapped_area(struct file *file, unsigned long addr,
- unsigned long len, unsigned long pgoff,
- unsigned long flags)
-{
- return 0;
+static unsigned long snd_pcm_get_unmapped_area(struct file *file,
+ unsigned long addr,
+ unsigned long len,
+ unsigned long pgoff,
+ unsigned long flags)
+{
+ struct snd_pcm_file *pcm_file = file->private_data;
+ struct snd_pcm_substream *substream = pcm_file->substream;
+ struct snd_pcm_runtime *runtime = substream->runtime;
+ unsigned long offset = pgoff << PAGE_SHIFT;
+
+ switch (offset) {
+ case SNDRV_PCM_MMAP_OFFSET_STATUS:
+ return (unsigned long)runtime->status;
+ case SNDRV_PCM_MMAP_OFFSET_CONTROL:
+ return (unsigned long)runtime->control;
+ default:
+ return (unsigned long)runtime->dma_area + offset;
+ }
}
#else
-# define dummy_get_unmapped_area NULL
+# define snd_pcm_get_unmapped_area NULL
#endif
/*
@@ -3403,7 +3417,7 @@ const struct file_operations snd_pcm_f_ops[2] = {
.compat_ioctl = snd_pcm_ioctl_compat,
.mmap = snd_pcm_mmap,
.fasync = snd_pcm_fasync,
- .get_unmapped_area = dummy_get_unmapped_area,
+ .get_unmapped_area = snd_pcm_get_unmapped_area,
},
{
.owner = THIS_MODULE,
@@ -3416,6 +3430,6 @@ const struct file_operations snd_pcm_f_ops[2] = {
.compat_ioctl = snd_pcm_ioctl_compat,
.mmap = snd_pcm_mmap,
.fasync = snd_pcm_fasync,
- .get_unmapped_area = dummy_get_unmapped_area,
+ .get_unmapped_area = snd_pcm_get_unmapped_area,
}
};
--
1.6.2.107.ge47ee
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
^ permalink raw reply related [flat|nested] 3+ messages in thread* [PATCH] alsa: provide a more useful get_unmapped_area handler for pcm
@ 2010-03-09 17:57 Mike Frysinger
2010-03-10 9:43 ` Takashi Iwai
0 siblings, 1 reply; 3+ messages in thread
From: Mike Frysinger @ 2010-03-09 17:57 UTC (permalink / raw)
To: alsa-devel, Takashi Iwai
Cc: uclinux-dist-devel, Cliff Cai, Daniel Glöckner
From: Daniel Glöckner <dg@emlix.com>
Shared memory mappings on nommu machines require a get_unmapped_area
file operation that suggests an address for the mapping. The current
implementation returns 0 and thus forces the driver to implement an
mmap handler that fixes up the start and end address of the vma.
This patch returns the address of the dma buffer, so it should work
out of the box for all drivers that use the snd_pcm_runtime->dma_area
pointer.
Addresses for mapping the status and control pages are returned as
well, but to make those work the conditional compilation of
snd_pcm_mmap_{status,control} would need to be revised.
URL: http://thread.gmane.org/gmane.linux.alsa.devel/61230
Signed-off-by: Daniel Glöckner <dg@emlix.com>
Signed-off-by: Cliff Cai <cliff.cai@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
---
this has been posted before but didnt seem to get any feedback ...
sound/core/pcm_native.c | 30 ++++++++++++++++++++++--------
1 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index 8728876..9681518 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -3434,14 +3434,28 @@ out:
#endif /* CONFIG_SND_SUPPORT_OLD_API */
#ifndef CONFIG_MMU
-unsigned long dummy_get_unmapped_area(struct file *file, unsigned long addr,
- unsigned long len, unsigned long pgoff,
- unsigned long flags)
-{
- return 0;
+static unsigned long snd_pcm_get_unmapped_area(struct file *file,
+ unsigned long addr,
+ unsigned long len,
+ unsigned long pgoff,
+ unsigned long flags)
+{
+ struct snd_pcm_file *pcm_file = file->private_data;
+ struct snd_pcm_substream *substream = pcm_file->substream;
+ struct snd_pcm_runtime *runtime = substream->runtime;
+ unsigned long offset = pgoff << PAGE_SHIFT;
+
+ switch (offset) {
+ case SNDRV_PCM_MMAP_OFFSET_STATUS:
+ return (unsigned long)runtime->status;
+ case SNDRV_PCM_MMAP_OFFSET_CONTROL:
+ return (unsigned long)runtime->control;
+ default:
+ return (unsigned long)runtime->dma_area + offset;
+ }
}
#else
-# define dummy_get_unmapped_area NULL
+# define snd_pcm_get_unmapped_area NULL
#endif
/*
@@ -3460,7 +3474,7 @@ const struct file_operations snd_pcm_f_ops[2] = {
.compat_ioctl = snd_pcm_ioctl_compat,
.mmap = snd_pcm_mmap,
.fasync = snd_pcm_fasync,
- .get_unmapped_area = dummy_get_unmapped_area,
+ .get_unmapped_area = snd_pcm_get_unmapped_area,
},
{
.owner = THIS_MODULE,
@@ -3473,6 +3487,6 @@ const struct file_operations snd_pcm_f_ops[2] = {
.compat_ioctl = snd_pcm_ioctl_compat,
.mmap = snd_pcm_mmap,
.fasync = snd_pcm_fasync,
- .get_unmapped_area = dummy_get_unmapped_area,
+ .get_unmapped_area = snd_pcm_get_unmapped_area,
}
};
--
1.7.0.2
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] alsa: provide a more useful get_unmapped_area handler for pcm
2010-03-09 17:57 [PATCH] " Mike Frysinger
@ 2010-03-10 9:43 ` Takashi Iwai
0 siblings, 0 replies; 3+ messages in thread
From: Takashi Iwai @ 2010-03-10 9:43 UTC (permalink / raw)
To: Mike Frysinger
Cc: uclinux-dist-devel, alsa-devel, Cliff Cai, Daniel Glöckner
At Tue, 9 Mar 2010 12:57:52 -0500,
Mike Frysinger wrote:
>
> From: Daniel Glöckner <dg@emlix.com>
>
> Shared memory mappings on nommu machines require a get_unmapped_area
> file operation that suggests an address for the mapping. The current
> implementation returns 0 and thus forces the driver to implement an
> mmap handler that fixes up the start and end address of the vma.
>
> This patch returns the address of the dma buffer, so it should work
> out of the box for all drivers that use the snd_pcm_runtime->dma_area
> pointer.
>
> Addresses for mapping the status and control pages are returned as
> well, but to make those work the conditional compilation of
> snd_pcm_mmap_{status,control} would need to be revised.
>
> URL: http://thread.gmane.org/gmane.linux.alsa.devel/61230
> Signed-off-by: Daniel Glöckner <dg@emlix.com>
> Signed-off-by: Cliff Cai <cliff.cai@analog.com>
> Signed-off-by: Mike Frysinger <vapier@gentoo.org>
> ---
> this has been posted before but didnt seem to get any feedback ...
Looks so.
Now I applied the patch. I'll add it for 2.6.34 merge, too.
This doesn't work for every case, though. But the irregular cases
without dma_area setup don't provide mmap usually, so mostly OK :)
thanks,
Takashi
>
> sound/core/pcm_native.c | 30 ++++++++++++++++++++++--------
> 1 files changed, 22 insertions(+), 8 deletions(-)
>
> diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
> index 8728876..9681518 100644
> --- a/sound/core/pcm_native.c
> +++ b/sound/core/pcm_native.c
> @@ -3434,14 +3434,28 @@ out:
> #endif /* CONFIG_SND_SUPPORT_OLD_API */
>
> #ifndef CONFIG_MMU
> -unsigned long dummy_get_unmapped_area(struct file *file, unsigned long addr,
> - unsigned long len, unsigned long pgoff,
> - unsigned long flags)
> -{
> - return 0;
> +static unsigned long snd_pcm_get_unmapped_area(struct file *file,
> + unsigned long addr,
> + unsigned long len,
> + unsigned long pgoff,
> + unsigned long flags)
> +{
> + struct snd_pcm_file *pcm_file = file->private_data;
> + struct snd_pcm_substream *substream = pcm_file->substream;
> + struct snd_pcm_runtime *runtime = substream->runtime;
> + unsigned long offset = pgoff << PAGE_SHIFT;
> +
> + switch (offset) {
> + case SNDRV_PCM_MMAP_OFFSET_STATUS:
> + return (unsigned long)runtime->status;
> + case SNDRV_PCM_MMAP_OFFSET_CONTROL:
> + return (unsigned long)runtime->control;
> + default:
> + return (unsigned long)runtime->dma_area + offset;
> + }
> }
> #else
> -# define dummy_get_unmapped_area NULL
> +# define snd_pcm_get_unmapped_area NULL
> #endif
>
> /*
> @@ -3460,7 +3474,7 @@ const struct file_operations snd_pcm_f_ops[2] = {
> .compat_ioctl = snd_pcm_ioctl_compat,
> .mmap = snd_pcm_mmap,
> .fasync = snd_pcm_fasync,
> - .get_unmapped_area = dummy_get_unmapped_area,
> + .get_unmapped_area = snd_pcm_get_unmapped_area,
> },
> {
> .owner = THIS_MODULE,
> @@ -3473,6 +3487,6 @@ const struct file_operations snd_pcm_f_ops[2] = {
> .compat_ioctl = snd_pcm_ioctl_compat,
> .mmap = snd_pcm_mmap,
> .fasync = snd_pcm_fasync,
> - .get_unmapped_area = dummy_get_unmapped_area,
> + .get_unmapped_area = snd_pcm_get_unmapped_area,
> }
> };
> --
> 1.7.0.2
>
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-03-10 9:43 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-26 13:26 [patch] alsa: provide a more useful get_unmapped_area handler for pcm Daniel Glöckner
-- strict thread matches above, loose matches on Subject: below --
2010-03-09 17:57 [PATCH] " Mike Frysinger
2010-03-10 9:43 ` Takashi Iwai
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).