Re: [PATCH v3 11/16] rust: io: register: support fixed offset register without bitfield

From: Alexandre Courbot

Date: Thu Aug 27 2026 - 20:38:39 EST


On Wed Aug 19, 2026 at 8:09 PM JST, Gary Guo wrote:
> Add a rule to allow creating `IoLoc` in `register!()` using an existing
> type and not create a bitfield. Add an example to demonstrate this for FIFO
> registers.
>
> This rule is also going to be used to create subregions for registers; the
> example of doing so will be added later when relative registers are
> removed.
>
> Signed-off-by: Gary Guo <gary@xxxxxxxxxxx>

Reviewed-by: Alexandre Courbot <acourbot@xxxxxxxxxx>

> ---
> rust/kernel/io/register.rs | 30 ++++++++++++++++
> rust/macros/io/register.rs | 86 +++++++++++++++++++++++++++++++---------------
> 2 files changed, 89 insertions(+), 27 deletions(-)
>
> diff --git a/rust/kernel/io/register.rs b/rust/kernel/io/register.rs
> index f622057f7346..63c054162e54 100644
> --- a/rust/kernel/io/register.rs
> +++ b/rust/kernel/io/register.rs
> @@ -182,6 +182,23 @@ fn offset(self) -> usize {
> }
> }
>
> +#[doc(hidden)]
> +pub struct OffsetLoc<Base: ?Sized, T>(usize, PhantomData<(T, Base)>);

A short comment (not doccomment) quickly explaining the purpose of this
type would be helpful to readers.

<...>
> diff --git a/rust/macros/io/register.rs b/rust/macros/io/register.rs
> index cb02e850b23f..0b4e0d1903dd 100644
> --- a/rust/macros/io/register.rs
> +++ b/rust/macros/io/register.rs
> @@ -14,9 +14,11 @@
> bracketed,
> parenthesized,
> parse::Parse,
> + parse_quote,
> spanned::Spanned,
> token,
> Attribute,
> + Error,
> Expr,
> Ident,
> Path,
> @@ -49,11 +51,11 @@ struct Reg {
> attrs: Vec<Attribute>,
> vis: Visibility,
> name: Ident,
> - storage: Type,
> + ty: Type,
> array: Option<RegArrayDef>,
> relative_base: Option<Path>,
> offset: RegOffset,
> - bitfield_args: Group,
> + bitfield: Option<(Type, Group)>,
> }
>
> impl Parse for Reg {
> @@ -61,11 +63,23 @@ fn parse(input: syn::parse::ParseStream<'_>) -> Result<Self> {
> let attrs = input.call(Attribute::parse_outer)?;
> let vis = input.parse()?;
> let name = input.parse()?;
> - let storage = {
> +
> + let lh = input.lookahead1();
> + let mut bitfield_storage = None;

You can avoid using `mut` if you turn the next line into `let
(bitfield_storage, ty) = ...`. The final form of the patchset already
uses a tuple due to `unique` anyway.