From: "Alexandre Courbot" <acourbot@nvidia.com>
To: "Danilo Krummrich" <dakr@kernel.org>
Cc: "Alice Ryhl" <aliceryhl@google.com>,
"Daniel Almeida" <daniel.almeida@collabora.com>,
"Miguel Ojeda" <ojeda@kernel.org>, "Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <lossin@kernel.org>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Trevor Gross" <tmgross@umich.edu>,
"Boqun Feng" <boqun@kernel.org>,
"Yury Norov" <yury.norov@gmail.com>,
"John Hubbard" <jhubbard@nvidia.com>,
"Alistair Popple" <apopple@nvidia.com>,
"Joel Fernandes" <joelagnelf@nvidia.com>,
"Timur Tabi" <ttabi@nvidia.com>, "Edwin Peer" <epeer@nvidia.com>,
"Eliot Courtney" <ecourtney@nvidia.com>,
"Dirk Behme" <dirk.behme@de.bosch.com>,
"Steven Price" <steven.price@arm.com>,
rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v8 07/10] rust: io: introduce `IntoIoVal` trait and single-argument `write_val`
Date: Wed, 11 Mar 2026 22:28:38 +0900 [thread overview]
Message-ID: <DGZZLNFLSJ4E.2P42FMI1XT47W@nvidia.com> (raw)
In-Reply-To: <DGZ8XPCCUDQ5.14RUPZWK8L509@kernel.org>
On Wed Mar 11, 2026 at 1:34 AM JST, Danilo Krummrich wrote:
> On Mon Mar 9, 2026 at 4:14 PM CET, Alexandre Courbot wrote:
>> + /// Generic infallible write of value bearing its location, with compile-time bounds check.
>> + ///
>> + /// # Examples
>> + ///
>> + /// Tuples carrying a location and a value can be used with this method:
>> + ///
>> + /// ```no_run
>> + /// use kernel::io::{Io, Mmio};
>> + ///
>> + /// fn do_writes(io: &Mmio) {
>> + /// // 32-bit write of value `1` at address `0x10`.
>> + /// io.write_val((0x10, 1u32));
>> + /// }
>> + /// ```
>> + #[inline(always)]
>> + fn write_val<T, L, V>(&self, value: V)
>
> Still not super satisfied with the name write_val() plus I have some more
> considerations, sorry. :)
>
> Let's look at this:
>
> let reg = bar.read(regs::NV_PMC_BOOT_0);
>
> // Pass around, do some modifications, etc.
>
> bar.write_val(reg);
>
> In this case read() returns an object that encodes the absolute location and
> value, i.e. read() pairs with write_val(), which is a bit odd.
>
> In this example:
>
> let reg = bar.read(regs::NV_PFALCON_FALCON_RM::of::<E>());
>
> // Pass around, do some modifications, etc.
>
> bar.write(WithBase::of::<E>(), reg);
>
> read() pairs with write(), since the object returned by read() does only encode
> a relative location, so we have to supply the base location through the first
> argument of write().
>
> Well, technically it also pairs with write_val(), as we could also pass this as
> tuple to write_val().
>
> bar.write_val((WithBase::of::<E>(), reg));
>
> However, my point is that this is a bit inconsistent and I think a user would
> expect something more symmetric.
>
> For instance, let's say write() would become the single argument one, then
> read() could return an impl of IntoIoVal, so we would have
>
> let reg = bar.read(regs::NV_PMC_BOOT_0);
> bar.write(reg);
>
> let reg = bar.read(regs::NV_PFALCON_FALCON_RM::of::<E>());
> bar.write(reg);
>
> and additionally we can have
>
> let val = bar.read_val(regs::NV_PFALCON_FALCON_RM::of::<E>());
> bar.write_val(WithBase::of::<E>(), val);
>
> The same goes for
>
> let val = bar.read_val(regs::NV_PMC_BOOT_0);
> bar.write_val(regs::NV_PMC_BOOT_0, val);
>
> which for complex values does not achieve anything, but makes sense for the FIFO
> register use-case, as val could also be a primitive, e.g. u32.
>
> With a dynamic base, and a single field we could just do the following to
> support such primitives:
>
> let val = bar.read_val(regs::NV_PFALCON_FALCON_RM::of::<E>());
> bar.write_val(regs::NV_PFALCON_FALCON_RM::of::<E>(), val);
>
> I think adding this symmetry should be trivial, as most of this already compiles
> with the current code.
Not quite, if I understood your idea correctly.
The new `read` would need to return some new type (except for fixed
offset registers) that contains the corresponding `IoLoc`, creating
overhead for the default I/O methods (so at the very least, I think they
should be the ones with the suffix). Accessing the value of that new
type would require some indirection, and probably the return of
closures. And having two pairs of read/write methods that work eerily
similarly but are marginally distinct sounds to me like it could itself
become a source of confusion.
>
> Also, let's not get into a discussion whether we name on or the other write()
> vs. write_foo(). I just turned it around as I think with the specific name
> write_val() it makes more sense this way around.
>
> But I'm perfectly happy either way as long as we find descriptive names that
> actually make sense.
>
> Unfortunately, I can't really think of a good name for write_val() with its
> current semantics. If we flip it around as in my examples above, the _val()
> prefix seems fine. Maybe write_reg() and read_reg()?
The fact is, there is a symmetry between `read` and `write`:
- `read` takes a location and returns a value,
- `write` takes a location and a value.
`write_val` is really nothing but a convenience shortcut that has
technically no strong reason to exist. As Gary pointed out, the
counterpart of
let reg = bar.read(regs::NV_PMC_BOOT_0);
is
bar.write(regs::NV_PMC_BOOT_0, reg);
... and we introduced `write_val` for those cases where the value
in itself provides its location, as `NV_PMC_BOOT_0` is redundant. But
the above statement could also be written:
bar.write((), reg);
which is exactly the same length as the `write_val` equivalent - it's
just that you need to remember that `()` can be used in this case. But
if you can remember that your register type can be used with
`write_val`, then why not this? This actually makes me doubt that
`write_val` is needed at all, and if we get rid of it, then we have a
symmetric API.
We were so focused on this single issue for the last few revisions that
the single-argument write variant sounded like the only way to handle
this properly, but the `()` use proposed by Gary actually fulfills the
same role and doesn't introduce more burden when you think of it.
So why not try without `write_val` at first? We can always add it later
if we feel the need (and the same applies to a `(location, value)`
symmetric read/write API).
And most importantly, that way we also don't have to worry about its
name. :)
next prev parent reply other threads:[~2026-03-11 13:28 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-09 15:13 [PATCH v8 00/10] rust: add `register!` macro Alexandre Courbot
2026-03-09 15:13 ` [PATCH v8 01/10] rust: enable the `generic_arg_infer` feature Alexandre Courbot
2026-03-11 0:13 ` Yury Norov
2026-03-11 6:16 ` Miguel Ojeda
2026-03-09 15:13 ` [PATCH v8 02/10] rust: num: add `shr` and `shl` methods to `Bounded` Alexandre Courbot
2026-03-11 0:26 ` Yury Norov
2026-03-09 15:14 ` [PATCH v8 03/10] rust: num: add `into_bool` method " Alexandre Courbot
2026-03-11 0:29 ` Yury Norov
2026-03-09 15:14 ` [PATCH v8 04/10] rust: num: make Bounded::get const Alexandre Courbot
2026-03-09 15:14 ` [PATCH v8 05/10] rust: io: add IoLoc type and generic I/O accessors Alexandre Courbot
2026-03-10 15:15 ` Danilo Krummrich
2026-03-09 15:14 ` [PATCH v8 06/10] rust: io: use generic read/write accessors for primitive accesses Alexandre Courbot
2026-03-09 15:29 ` Gary Guo
2026-03-10 1:57 ` Alexandre Courbot
2026-03-10 1:59 ` Alexandre Courbot
2026-03-10 2:04 ` Gary Guo
2026-03-10 15:17 ` Danilo Krummrich
2026-03-09 15:14 ` [PATCH v8 07/10] rust: io: introduce `IntoIoVal` trait and single-argument `write_val` Alexandre Courbot
2026-03-09 15:30 ` Gary Guo
2026-03-10 2:05 ` Alexandre Courbot
2026-03-10 16:34 ` Danilo Krummrich
2026-03-10 22:33 ` Gary Guo
2026-03-11 13:25 ` Danilo Krummrich
2026-03-11 13:42 ` Alexandre Courbot
2026-03-11 13:28 ` Alexandre Courbot [this message]
2026-03-11 14:56 ` Danilo Krummrich
2026-03-11 15:42 ` Gary Guo
2026-03-11 16:22 ` Danilo Krummrich
2026-03-11 17:16 ` Gary Guo
2026-03-12 13:53 ` Alexandre Courbot
2026-03-12 15:54 ` Danilo Krummrich
2026-03-14 1:19 ` Alexandre Courbot
2026-03-09 15:14 ` [PATCH v8 08/10] rust: io: add `register!` macro Alexandre Courbot
2026-03-10 16:39 ` Danilo Krummrich
2026-03-09 15:14 ` [PATCH v8 09/10] sample: rust: pci: use " Alexandre Courbot
2026-03-09 15:14 ` [PATCH FOR REFERENCE v8 10/10] gpu: nova-core: use the kernel " Alexandre Courbot
2026-03-09 15:43 ` Joel Fernandes
2026-03-09 17:34 ` John Hubbard
2026-03-09 17:51 ` Joel Fernandes
2026-03-09 18:01 ` John Hubbard
2026-03-09 18:28 ` Gary Guo
2026-03-09 18:34 ` John Hubbard
2026-03-09 18:42 ` Danilo Krummrich
2026-03-09 18:47 ` John Hubbard
2026-03-09 18:42 ` Gary Guo
2026-03-09 18:50 ` John Hubbard
2026-03-09 18:04 ` Danilo Krummrich
2026-03-09 18:06 ` John Hubbard
2026-03-10 2:18 ` Alexandre Courbot
2026-03-09 18:05 ` [PATCH v8 00/10] rust: add " John Hubbard
2026-03-09 21:08 ` Daniel Almeida
2026-03-10 17:20 ` Danilo Krummrich
2026-03-11 13:01 ` Alexandre Courbot
2026-03-11 13:07 ` Danilo Krummrich
2026-03-11 13:35 ` Alexandre Courbot
2026-03-11 13:38 ` Danilo Krummrich
2026-03-12 2:23 ` Alexandre Courbot
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=DGZZLNFLSJ4E.2P42FMI1XT47W@nvidia.com \
--to=acourbot@nvidia.com \
--cc=a.hindborg@kernel.org \
--cc=aliceryhl@google.com \
--cc=apopple@nvidia.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun@kernel.org \
--cc=dakr@kernel.org \
--cc=daniel.almeida@collabora.com \
--cc=dirk.behme@de.bosch.com \
--cc=ecourtney@nvidia.com \
--cc=epeer@nvidia.com \
--cc=gary@garyguo.net \
--cc=jhubbard@nvidia.com \
--cc=joelagnelf@nvidia.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lossin@kernel.org \
--cc=ojeda@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=steven.price@arm.com \
--cc=tmgross@umich.edu \
--cc=ttabi@nvidia.com \
--cc=yury.norov@gmail.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