From: Takashi Iwai <tiwai@suse.de>
To: alsa-devel@alsa-project.org
Cc: linux-kernel@vger.kernel.org, Takashi Iwai <tiwai@suse.de>
Subject: [PATCH v2 23/25] ALSA: doc: Update description for the new PCM copy ops
Date: Tue, 15 Aug 2023 21:01:34 +0200 [thread overview]
Message-ID: <20230815190136.8987-24-tiwai@suse.de> (raw)
In-Reply-To: <20230815190136.8987-1-tiwai@suse.de>
Update the documentation about the PCM copy callbacks.
The update was kept minimalistic, just correcting the use of copy_user
ops with the single copy ops, and drop/update the text mentioning the
copy_kernel.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
.../kernel-api/writing-an-alsa-driver.rst | 58 ++++++-------------
1 file changed, 19 insertions(+), 39 deletions(-)
diff --git a/Documentation/sound/kernel-api/writing-an-alsa-driver.rst b/Documentation/sound/kernel-api/writing-an-alsa-driver.rst
index 4335c98b3d82..cd421856409e 100644
--- a/Documentation/sound/kernel-api/writing-an-alsa-driver.rst
+++ b/Documentation/sound/kernel-api/writing-an-alsa-driver.rst
@@ -2018,8 +2018,8 @@ sleeping poll threads, etc.
This callback is also atomic by default.
-copy_user, copy_kernel and fill_silence ops
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+copy and fill_silence ops
+~~~~~~~~~~~~~~~~~~~~~~~~~
These callbacks are not mandatory, and can be omitted in most cases.
These callbacks are used when the hardware buffer cannot be in the
@@ -3444,8 +3444,8 @@ external hardware buffer in interrupts (or in tasklets, preferably).
The first case works fine if the external hardware buffer is large
enough. This method doesn't need any extra buffers and thus is more
-efficient. You need to define the ``copy_user`` and ``copy_kernel``
-callbacks for the data transfer, in addition to the ``fill_silence``
+efficient. You need to define the ``copy`` callback
+for the data transfer, in addition to the ``fill_silence``
callback for playback. However, there is a drawback: it cannot be
mmapped. The examples are GUS's GF1 PCM or emu8000's wavetable PCM.
@@ -3458,22 +3458,22 @@ Another case is when the chip uses a PCI memory-map region for the
buffer instead of the host memory. In this case, mmap is available only
on certain architectures like the Intel one. In non-mmap mode, the data
cannot be transferred as in the normal way. Thus you need to define the
-``copy_user``, ``copy_kernel`` and ``fill_silence`` callbacks as well,
+``copy`` and ``fill_silence`` callbacks as well,
as in the cases above. Examples are found in ``rme32.c`` and
``rme96.c``.
-The implementation of the ``copy_user``, ``copy_kernel`` and
+The implementation of the ``copy`` and
``silence`` callbacks depends upon whether the hardware supports
-interleaved or non-interleaved samples. The ``copy_user`` callback is
+interleaved or non-interleaved samples. The ``copy`` callback is
defined like below, a bit differently depending on whether the direction
is playback or capture::
- static int playback_copy_user(struct snd_pcm_substream *substream,
+ static int playback_copy(struct snd_pcm_substream *substream,
int channel, unsigned long pos,
- void __user *src, unsigned long count);
- static int capture_copy_user(struct snd_pcm_substream *substream,
+ struct iov_iter *src, unsigned long count);
+ static int capture_copy(struct snd_pcm_substream *substream,
int channel, unsigned long pos,
- void __user *dst, unsigned long count);
+ struct iov_iter *dst, unsigned long count);
In the case of interleaved samples, the second argument (``channel``) is
not used. The third argument (``pos``) specifies the position in bytes.
@@ -3490,18 +3490,17 @@ of data (``count``) at the specified pointer (``src``) to the specified
offset (``pos``) in the hardware buffer. When coded like memcpy-like
way, the copy would look like::
- my_memcpy_from_user(my_buffer + pos, src, count);
+ my_memcpy_from_iter(my_buffer + pos, src, count);
For the capture direction, you copy the given amount of data (``count``)
at the specified offset (``pos``) in the hardware buffer to the
specified pointer (``dst``)::
- my_memcpy_to_user(dst, my_buffer + pos, count);
+ my_memcpy_to_iter(dst, my_buffer + pos, count);
-Here the functions are named ``from_user`` and ``to_user`` because
-it's the user-space buffer that is passed to these callbacks. That
-is, the callback is supposed to copy data from/to the user-space
-directly to/from the hardware buffer.
+The given ``src`` or ``dst`` a struct iov_iter pointer containing the
+pointer and the size. Use the existing helpers to copy or access the
+data as defined in ``linux/uio.h``.
Careful readers might notice that these callbacks receive the
arguments in bytes, not in frames like other callbacks. It's because
@@ -3519,25 +3518,6 @@ the given user-space buffer, but only for the given channel. For
details, please check ``isa/gus/gus_pcm.c`` or ``pci/rme9652/rme9652.c``
as examples.
-The above callbacks are the copies from/to the user-space buffer. There
-are some cases where we want to copy from/to the kernel-space buffer
-instead. In such a case, the ``copy_kernel`` callback is called. It'd
-look like::
-
- static int playback_copy_kernel(struct snd_pcm_substream *substream,
- int channel, unsigned long pos,
- void *src, unsigned long count);
- static int capture_copy_kernel(struct snd_pcm_substream *substream,
- int channel, unsigned long pos,
- void *dst, unsigned long count);
-
-As found easily, the only difference is that the buffer pointer is
-without a ``__user`` prefix; that is, a kernel-buffer pointer is passed
-in the fourth argument. Correspondingly, the implementation would be
-a version without the user-copy, such as::
-
- my_memcpy(my_buffer + pos, src, count);
-
Usually for the playback, another callback ``fill_silence`` is
defined. It's implemented in a similar way as the copy callbacks
above::
@@ -3545,10 +3525,10 @@ above::
static int silence(struct snd_pcm_substream *substream, int channel,
unsigned long pos, unsigned long count);
-The meanings of arguments are the same as in the ``copy_user`` and
-``copy_kernel`` callbacks, although there is no buffer pointer
+The meanings of arguments are the same as in the ``copy`` callback,
+although there is no buffer pointer
argument. In the case of interleaved samples, the channel argument has
-no meaning, as for the ``copy_*`` callbacks.
+no meaning, as for the ``copy`` callback.
The role of the ``fill_silence`` callback is to set the given amount
(``count``) of silence data at the specified offset (``pos``) in the
--
2.35.3
next prev parent reply other threads:[~2023-08-15 19:03 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-15 19:01 [PATCH v2 00/25] ALSA: Generic PCM copy ops using iov_iter Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 01/25] iov_iter: Export import_ubuf() Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 02/25] ALSA: pcm: Add copy ops with iov_iter Takashi Iwai
2023-09-02 5:30 ` Al Viro
2023-09-02 6:00 ` Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 03/25] ALSA: core: Add memory copy helpers between iov_iter and iomem Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 04/25] ALSA: dummy: Convert to generic PCM copy ops Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 05/25] ALSA: gus: " Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 06/25] ALSA: emu8000: " Takashi Iwai
2023-09-02 5:36 ` Al Viro
2023-09-02 6:01 ` Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 07/25] ALSA: es1938: " Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 08/25] ALSA: korg1212: " Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 09/25] ALSA: nm256: " Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 10/25] ALSA: rme32: " Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 11/25] ALSA: rme96: " Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 12/25] ALSA: hdsp: " Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 13/25] ALSA: rme9652: " Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 14/25] ALSA: sh: " Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 15/25] ALSA: xen: " Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 16/25] ALSA: pcmtest: Update comment about " Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 17/25] media: solo6x10: Convert to generic " Takashi Iwai
2023-08-18 7:48 ` Hans Verkuil
2023-08-15 19:01 ` [PATCH v2 18/25] ASoC: component: Add " Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 19/25] ASoC: mediatek: Convert to " Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 20/25] ASoC: qcom: " Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 21/25] ASoC: dmaengine: " Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 22/25] ASoC: dmaengine: Use iov_iter for process callback, too Takashi Iwai
2023-08-15 19:01 ` Takashi Iwai [this message]
2023-08-15 19:01 ` [PATCH v2 24/25] ASoC: pcm: Drop obsoleted PCM copy_user ops Takashi Iwai
2023-08-15 19:01 ` [PATCH v2 25/25] ALSA: pcm: Drop obsoleted PCM copy_user and copy_kernel ops 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=20230815190136.8987-24-tiwai@suse.de \
--to=tiwai@suse.de \
--cc=alsa-devel@alsa-project.org \
--cc=linux-kernel@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®