From: "Alexandre Courbot" <acourbot@nvidia.com>
To: "Gary Guo" <gary@garyguo.net>
Cc: "Danilo Krummrich" <dakr@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Daniel Almeida" <daniel.almeida@collabora.com>,
"Miguel Ojeda" <ojeda@kernel.org>,
"Boqun Feng" <boqun@kernel.org>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <lossin@kernel.org>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Trevor Gross" <tmgross@umich.edu>,
"Tamir Duberstein" <tamird@kernel.org>,
"Onur Özkan" <work@onurozkan.dev>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Bjorn Helgaas" <bhelgaas@google.com>,
"Krzysztof Wilczyński" <kwilczynski@kernel.org>,
driver-core@lists.linux.dev, rust-for-linux@vger.kernel.org,
linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev,
dri-devel@lists.freedesktop.org, linux-pci@vger.kernel.org
Subject: Re: [PATCH v3 10/16] rust: io: register: make register have a typed base
Date: Thu, 27 Aug 2026 22:42:01 +0900 [thread overview]
Message-ID: <DKZRPYOFOIY5.3RAONSST6MTL4@nvidia.com> (raw)
In-Reply-To: <20260819-typed_register-v3-10-3699a75fadf1@garyguo.net>
On Wed Aug 19, 2026 at 8:09 PM JST, Gary Guo wrote:
> Previously `register!` defined registers can be used on any untyped I/O
> regions. With all users specifying their desired register type now,
> propagate the specified type and restrict I/O access only when type
> matches.
>
> Also, add an `io_project!` example which is enabled by this change.
>
> Signed-off-by: Gary Guo <gary@garyguo.net>
> ---
> rust/kernel/io.rs | 13 +++++++++++
> rust/kernel/io/register.rs | 55 ++++++++++++++++++++++++++++++++--------------
> rust/macros/io/register.rs | 34 ++++++++++++++--------------
> 3 files changed, 68 insertions(+), 34 deletions(-)
>
> diff --git a/rust/kernel/io.rs b/rust/kernel/io.rs
> index 84dd876b3407..4542187d6b91 100644
> --- a/rust/kernel/io.rs
> +++ b/rust/kernel/io.rs
> @@ -1692,21 +1692,34 @@ pub fn project_loc<U, L>(self, location: L) -> <T::Backend as IoBackend>::View<'
> /// The syntax is of form `io_project!(io, proj)` where `io` is an expression to a type that
> /// implements [`Io`] and `proj` is a [projection specification](kernel::ptr::project!).
> ///
> +/// `io_project!` can also project to subview of registers defined with [`register!`] macro.
nit: "to a subview".
<...>
> +/// Helper function for register alias implementation.
> +///
> +/// This is used to enforce base matching. Only called during const eval.
> +#[doc(hidden)]
> +#[inline(always)]
> +pub const fn alias_offset<Base: ?Sized, Alias: Register<Base = Base>>() -> usize {
> + Alias::OFFSET
> +}
> +
> +/// Helper function for register element alias implementation.
> +///
> +/// This is used to enforce base matching and provide bounds checking. Only called during const
> +/// eval.
> +#[doc(hidden)]
> +#[inline(always)]
> +pub const fn element_alias_offset<Base: ?Sized, Alias: RegisterArray<Base = Base>>(
> + idx: usize,
> +) -> usize {
> + build_assert!(idx < Alias::SIZE);
> + Alias::OFFSET + idx * Alias::STRIDE
> +}
You could convert the `build_assert!` (always good to eschew) into a
`const_assert!` if you turn `idx` into a generic parameter:
pub const fn element_alias_offset<
Base: ?Sized,
Alias: RegisterArray<Base = Base>,
const IDX: usize,
>() -> usize {
crate::const_assert!(IDX < Alias::SIZE);
Alias::OFFSET + IDX * Alias::STRIDE
}
You get a better error message, the const parameter is used in a
very controlled environment well within the expressive power of const
generics, and that function is not public interface anyway.
If you don't like it (recent discussions make me think you might not
:)), then let's remove the `build_assert!` and keep the `static_assert`
emitted by the macro until this patch; it's not as elegant as checking
the condition into the same block of code that uses it, but again we are
in a controlled environment and static_assert > const_assert >
build_assert so this may actually be my preferred solution. You can
document the invariant in `element_alias_offset`.
> +
> /// Defines a dedicated type for a register, including getter and setter methods for its fields and
> /// methods to read and write it from an [`Io`](kernel::io::Io) region.
> ///
> diff --git a/rust/macros/io/register.rs b/rust/macros/io/register.rs
> index 2fb48e1be82d..cb02e850b23f 100644
> --- a/rust/macros/io/register.rs
> +++ b/rust/macros/io/register.rs
> @@ -140,21 +140,23 @@ fn parse(input: syn::parse::ParseStream<'_>) -> Result<Self> {
> }
>
> pub(crate) struct RegDef {
> - base: Option<Type>,
> + base: Type,
> regs: Vec<Reg>,
> }
>
> impl Parse for RegDef {
> fn parse(input: syn::parse::ParseStream<'_>) -> Result<Self> {
> - let base = if input.peek(kw::base) {
> - let _: kw::base = input.parse()?;
> - let _: Token![:] = input.parse()?;
> - let base = input.parse()?;
> - let _: Token![;] = input.parse()?;
> - Some(base)
> - } else {
> - None
> - };
> + if !input.peek(kw::base) {
> + Err(input.error(
> + "a base type needs to be specified for `register!` invocation with `base: ty;`",
> + ))?;
> + }
> +
> + let _: kw::base = input.parse()?;
IIUC here you can avoid the peek/parse and just do
let _: kw::base = input.parse().map_err(|e| {
Error::new(
e.span(),
"a base type needs to be specified for `register!` invocation with `base: ty;`",
)
})?;
next prev parent reply other threads:[~2026-08-27 13:42 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-19 11:09 [PATCH v3 00/16] rust: io: support register projections and remove relative registers Gary Guo
2026-08-19 11:09 ` [PATCH v3 01/16] rust: io: register: reimplement as proc macro Gary Guo
2026-08-27 6:16 ` Alexandre Courbot
2026-08-27 14:23 ` Gary Guo
2026-08-19 11:09 ` [PATCH v3 02/16] rust: mem: add `transmute` with deferred size check Gary Guo
2026-08-27 6:24 ` Alexandre Courbot
2026-08-27 14:26 ` Gary Guo
2026-08-19 11:09 ` [PATCH v3 03/16] rust: mem: add `AsRepr` and `AsReprMut` Gary Guo
2026-08-26 11:25 ` Alexandre Courbot
2026-08-26 11:50 ` Gary Guo
2026-08-26 13:30 ` Alexandre Courbot
2026-08-19 11:09 ` [PATCH v3 04/16] rust: io: perform conversions using `AsRepr` Gary Guo
2026-08-27 6:53 ` Alexandre Courbot
2026-08-27 14:21 ` Gary Guo
2026-08-27 14:39 ` Alexandre Courbot
2026-08-19 11:09 ` [PATCH v3 05/16] rust: io: support register projections Gary Guo
2026-08-27 7:01 ` Alexandre Courbot
2026-08-19 11:09 ` [PATCH v3 06/16] rust: io: register: allow explicit base type specification Gary Guo
2026-08-27 7:17 ` Alexandre Courbot
2026-08-19 11:09 ` [PATCH v3 07/16] gpu: nova-core: specify base type for registers Gary Guo
2026-08-27 11:20 ` Alexandre Courbot
2026-08-19 11:09 ` [PATCH v3 08/16] drm/tyr: " Gary Guo
2026-08-19 11:09 ` [PATCH v3 09/16] samples: rust: pci: " Gary Guo
2026-08-27 11:29 ` Alexandre Courbot
2026-08-19 11:09 ` [PATCH v3 10/16] rust: io: register: make register have a typed base Gary Guo
2026-08-27 13:42 ` Alexandre Courbot [this message]
2026-08-27 14:32 ` Gary Guo
2026-08-28 0:01 ` Alexandre Courbot
2026-08-19 11:09 ` [PATCH v3 11/16] rust: io: register: support fixed offset register without bitfield Gary Guo
2026-08-28 0:38 ` Alexandre Courbot
2026-08-19 11:09 ` [PATCH v3 12/16] gpu: nova-core: use projection for PFALCON and PFALCON2 registers Gary Guo
2026-08-28 1:04 ` Alexandre Courbot
2026-08-28 1:24 ` Alexandre Courbot
2026-08-19 11:09 ` [PATCH v3 13/16] gpu: nova-core: convert hshub0 from relative register to projection Gary Guo
2026-08-28 1:29 ` Alexandre Courbot
2026-08-19 11:09 ` [PATCH v3 14/16] rust: io: register: remove relative registers Gary Guo
2026-08-28 1:33 ` Alexandre Courbot
2026-08-19 11:09 ` [PATCH v3 15/16] rust: io: register: remove `Register` trait and cleanup macro Gary Guo
2026-08-28 2:07 ` Alexandre Courbot
2026-08-19 11:09 ` [PATCH v3 16/16] rust: io: register: unify handling of register with/without bitfields Gary Guo
2026-08-28 2:07 ` 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=DKZRPYOFOIY5.3RAONSST6MTL4@nvidia.com \
--to=acourbot@nvidia.com \
--cc=a.hindborg@kernel.org \
--cc=airlied@gmail.com \
--cc=aliceryhl@google.com \
--cc=bhelgaas@google.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun@kernel.org \
--cc=dakr@kernel.org \
--cc=daniel.almeida@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=driver-core@lists.linux.dev \
--cc=gary@garyguo.net \
--cc=kwilczynski@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lossin@kernel.org \
--cc=nova-gpu@lists.linux.dev \
--cc=ojeda@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=simona@ffwll.ch \
--cc=tamird@kernel.org \
--cc=tmgross@umich.edu \
--cc=work@onurozkan.dev \
/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