All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alexandre Courbot" <acourbot@nvidia.com>
To: "Dirk Behme" <dirk.behme@gmail.com>
Cc: "Danilo Krummrich" <dakr@kernel.org>,
	"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 v6 0/9] rust: add `register!` macro
Date: Sun, 22 Feb 2026 22:25:31 +0900	[thread overview]
Message-ID: <DGLIVZZMHZ21.26OXTMDN4L2CJ@nvidia.com> (raw)
In-Reply-To: <e5c01465-9571-442b-8490-6ae336cffba8@gmail.com>

Hi Dirk,

On Fri Feb 20, 2026 at 10:20 PM JST, Dirk Behme wrote:
> Hi Alexandre,
>
> On 16.02.26 09:04, Alexandre Courbot wrote:
>> This new revision took some time because it is (yet another) overhaul.
>> ^_^;
>> 
>> Thanks to a breakthrough by Gary, we found a way to have the I/O type
>> perform the actual I/O instead of the register type, which moves us from
>> this access pattern:
>> 
>>     let boot0 = regs::NV_PMC_BOOT_0::read(bar);
>> 
>> to this arguably more natural one:
>> 
>>     let boot0 = bar.read(regs::NV_PMC_BOOT_0);
>> 
>> It also has the benefit of taking advantage of deref coercion for types
>> that wrap an `Io`, something the register-based methods couldn't do and
>> which would have required extra `AsRef` implementations just for this
>> purpose.
>> 
>> Furthermore, this resolves the inconsistency of the former register API
>> that couldn't use the `try_` I/O accessors (and even had methods whose
>> names clashed with them). Now if `Io` supports it, it can be done on a
>> register.
>> 
>> Another benefit is that there is less work done within macros, and more
>> in generic code, which is (generally) a win for readability. The
>> `register!` macro is considerably smaller and easier to work on, and now
>> mostly made up of the bitfield accessors that will eventually be moved
>> into another macro.
>> 
>> I decided to remove a couple of tags because the code has changed quite
>> a bit since they were obtained.
>
> Last time I gave this a try was with v2. From my aarch64 simple timer
> test on that version I have [1] below. Could you give a hint how to
> convert this to v6? :)

Yeah I'm sorry, this is quite a heavy change. An LLM should do a good
job at updating your code once you give it an example.

>
> Many thanks!
>
> Dirk
>
> [1]
>
> register!(TCR(u16) @ 0x10 {
>         9:9    icpf;
>         8:8    unf;
>         7:6    icpe;
> 	5:5    unie;
> 	4:3    ckeg;
> 	2:0    tpsc;
> });

This would become:

register! {
    TCR(u16) @ 0x10 {
        9:9    icpf;
        8:8    unf;
        7:6    icpe;
        5:5    unie;
        4:3    ckeg;
        2:0    tpsc;
    }
}

This part doesn't change much - it would however if the fields were
documented.

Note also that you can now declare several registers in the same
`register!` invocation.

>
>
> impl TCR {
> 	fn handle_underflow<const SIZE: usize, T>(io: &T)
> 	where
> 	    T: Deref<Target = Io<SIZE>>,

`Io` is a trait now, so this will need updating as well.

> 	{
> 	    let tcr = Self::read(io);

        // Note `TCR` exists as both the type and the contant. `read`
        // expects the latter, so you cannot use `Self` here.
        let tcr = io.read(TCR);

> 	    if tcr.unf().into() {
> 	        tcr.set_unf(false).write(io);
> 	    }

        if tcr.unf().into_bool() {
            // You will need to have `IoRef` (`IoLoc` in v7) in scope
            // for `set` to be visible.
            io.write(TCR.set(tcr.with_unf(false)));
        }

The direction of `read` and `write` is now more natural (and more
flexible with respect to the way I/O now works).

I am also contemplating allowing the following syntax for the write:

            io.write(tcr.with_unf(false));

which is shorter, but will also only work for fixed registers. Guess I
should ask for opinions as an RFC patch.

Hope this helps - let me know if anything is unclear or if you notice
pain points!

      reply	other threads:[~2026-02-22 13:25 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-16  8:04 [PATCH v6 0/9] rust: add `register!` macro Alexandre Courbot
2026-02-16  8:04 ` [PATCH v6 1/9] rust: enable the `generic_arg_infer` feature Alexandre Courbot
2026-02-16  8:04 ` [PATCH v6 2/9] rust: num: add `shr` and `shl` methods to `Bounded` Alexandre Courbot
2026-02-16  8:55   ` Alice Ryhl
2026-02-16  8:04 ` [PATCH v6 3/9] rust: num: add `into_bool` method " Alexandre Courbot
2026-02-16  8:04 ` [PATCH v6 4/9] rust: num: make Bounded::get const Alexandre Courbot
2026-02-16  8:56   ` Alice Ryhl
2026-02-16  9:16     ` Gary Guo
2026-02-16  8:04 ` [PATCH v6 5/9] rust: io: add IoRef and IoWrite types Alexandre Courbot
2026-02-16  9:01   ` Alice Ryhl
2026-02-16  9:36     ` Alexandre Courbot
2026-02-16 10:35       ` Alice Ryhl
2026-02-16 10:52         ` Alexandre Courbot
2026-02-20  6:38           ` Alexandre Courbot
2026-02-20  8:18             ` Alice Ryhl
2026-02-20 14:45               ` Alexandre Courbot
2026-02-21  8:43                 ` Alice Ryhl
2026-02-16  8:04 ` [PATCH v6 6/9] rust: io: use generic read/write accessors for primitive accesses Alexandre Courbot
2026-02-16  8:04 ` [PATCH v6 7/9] rust: io: add `register!` macro Alexandre Courbot
2026-02-16  8:04 ` [PATCH v6 8/9] sample: rust: pci: use " Alexandre Courbot
2026-02-16  8:04 ` [PATCH FOR REFERENCE v6 9/9] gpu: nova-core: use the kernel " Alexandre Courbot
2026-02-20 13:20 ` [PATCH v6 0/9] rust: add " Dirk Behme
2026-02-22 13:25   ` Alexandre Courbot [this message]

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=DGLIVZZMHZ21.26OXTMDN4L2CJ@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=dirk.behme@gmail.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 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.