From: Takashi Iwai <tiwai@suse.de>
To: "Geoffrey D. Bennett" <g@b4.vu>
Cc: Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>,
alsa-devel@alsa-project.org
Subject: Re: [PATCH RFC] ALSA: scarlett2: Add ioctls for user-space access
Date: Tue, 17 Oct 2023 09:53:21 +0200 [thread overview]
Message-ID: <87edhtn0r2.wl-tiwai@suse.de> (raw)
In-Reply-To: <ZS1asqF0cXRUzBwb@m.b4.vu>
On Mon, 16 Oct 2023 17:45:54 +0200,
Geoffrey D. Bennett wrote:
>
> On Mon, Oct 16, 2023 at 03:28:11PM +0200, Jaroslav Kysela wrote:
> > On 16. 10. 23 14:32, Geoffrey D. Bennett wrote:
> > > On Mon, Oct 16, 2023 at 09:04:21AM +0200, Jaroslav Kysela wrote:
> > > > On 14. 10. 23 15:58, Geoffrey D. Bennett wrote:
> > > > > In order to support functions such as firmware upgrade from
> > > > > user-space, add ioctls for submitting arbitrary proprietary requests
> > > > > through scarlett2_usb() and requesting/releasing exclusive access.
> > > > > ---
> > > > >
> > > > > Hi Takashi,
> > > > >
> > > > > I recently figured how to update the firmware on Scarlett Gen 2+
> > > > > devices. I think the best way to implement this is with an ioctl
> > > > > giving access to the scarlett2_usb() function from user-space, plus
> > > > > two ioctls to request/release exclusive access.
> > > > >
> > > > > Does something like this seem reasonable?
> > > >
> > > > Maybe you can use libusb for this job without an additional kernel
> > > > interface. It allows to detach the USB kernel driver and attach it again
> > > > when the job is complete.
> > >
> > > Hi Jaroslav,
> > >
> > > I considered using libusb (I used it during initial development of the
> > > driver), and if the only purpose of the ioctl would be for firmware
> > > updates then it would be reasonable to detach the kernel driver for
> > > that. However...
> > >
> > > Beyond just being able to do firmware operations, that ioctl would
> > > also allow access to all of the configuration space using cmd =
> > > SCARLETT2_USB_GET_DATA and SCARLETT2_USB_SET_DATA. I think this would
> > > be the cleanest way to allow implementing non-mixer related
> > > functionality in user-space, such as reading the current firmware
> > > version, reading/updating the device name and channel names, and
> > > updating the software configuration space for Focusrite Control
> > > compatibility to name a few. These sorts of applications need to be
> > > able to make these proprietary requests through the scarlett2 driver
> > > to avoid disrupting it (or disrupting audio).
> >
> > Thank you for this bigger picture. But except the firmware upgrade, all
> > those functions seem to be implementable in a more abstract way using
> > standard control API. Note that we can assign the controls also to card
> > (e.g. SNDRV_CTL_ELEM_IFACE_CARD) to classify them as non-mixer.
>
> Hi Jaroslav,
>
> By "more abstract way", you mean to have a control for every parameter
> which could be read or written? I can see that working for things like
> firmware version, device name, and channel name, but I think it would
> be pretty awful for the software configuration space that Focusrite
> Control uses, and bloat the driver quite a bit for what seems to me to
> be something more suited to user-land implementation.
>
> (an aside, will alsactl store/restore SNDRV_CTL_ELEM_TYPE_BYTES?)
>
> Or am I misunderstanding and you mean there is already a way (like
> SNDRV_CTL_IOCTL_TLV_COMMAND?) to send commands & get responses?
>
> By "pretty awful"/bloat, a bit more explanation:
>
> (1) Part of the NVRAM that can be accessed refers to the hardware
> controls which the driver allows the user to read/write (such as
> dim/mute/volume/level/pad/air/phantom/etc.)
>
> (2) Part of the NVRAM is used by the Focusrite Control software to
> store the state of the interface in a higher-level way. It does not
> support all features of the hardware (e.g. routing is quite
> restricted).
>
> It's not possible to represent all functions of (1) inside (2), so
> when I developed the driver I ignored (2) and implemented all features
> of (1). It doesn't make sense to implement (2) in the kernel as that
> would double the number of controls, but what would make sense would
> be a user-space application that implements read/write of (2) with a
> UI that restricts the user to what can be represented in (2).
>
> For example: in (1), routing is all mono vs. in (2) routing is
> stereo-only, channels can be paired together, and there are
> balance/pan controls. I feel strongly this is the sort of thing where
> the kernel provides the low-level (1) hardware interface, and a
> user-space app provides a higher-level (2) interface.
>
> It'd be nice if the app could store this data on the device itself
> like Focusrite Control does. And perhaps it could even do this in a
> non-Focusrite Control compatible way (for additional functionality
> when compatibility is not desired). But those options are not feasible
> if there is no access to read/write NVRAM arbitrarily.
>
> That's why I came up with the proposed ioctl interface to the
> scarlett2_usb() function. That will allow user-space to access all
> applicable functions:
>
> - reboot
> - get flash info
> - get flash segment info
> - erase flash segment
> - get erase segment progress
> - write flash segment
> - read NVRAM
> - write NVRAM
>
> through a common interface, without disconnecting the kernel driver,
> and without adding specific support for a bunch of things that are not
> applicable to the hardware controls (1).
I caught a flu and am still in sick leave since the last week, so
this is just a short followup from my side.
First off, I don't think it appropriate to expose a generic register
access via (hwdep) ioctl as your RFC patch. Then it allows to screw
up the hardware too easily by sending random bytes. It may result in
a severe defect, too.
If you have some proper "features" to be implemented as the driver
functionality, they can be provided via ioctl, though; but then each
ioctl must serve for only a single purpose.
OTOH, if you need a handy register access for debugging, providing a
debugfs interface could be a solution, too. It's safer than ioctl
(as it's not allowed for every user unlike ioctl), and it can be
disabled on a production system.
thanks,
Takashi
next prev parent reply other threads:[~2023-10-17 7:54 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-14 13:58 [PATCH RFC] ALSA: scarlett2: Add ioctls for user-space access Geoffrey D. Bennett
2023-10-16 7:04 ` Jaroslav Kysela
2023-10-16 12:32 ` Geoffrey D. Bennett
2023-10-16 13:28 ` Jaroslav Kysela
2023-10-16 15:45 ` Geoffrey D. Bennett
2023-10-17 7:53 ` Takashi Iwai [this message]
2023-11-19 17:35 ` [PATCH RFC v2] " Geoffrey D. Bennett
2023-11-24 13:39 ` Takashi Iwai
2023-11-27 18:32 ` Geoffrey D. Bennett
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=87edhtn0r2.wl-tiwai@suse.de \
--to=tiwai@suse.de \
--cc=alsa-devel@alsa-project.org \
--cc=g@b4.vu \
--cc=perex@perex.cz \
--cc=tiwai@suse.com \
/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