Re: [PATCH v3 14/16] rust: io: register: remove relative registers

"Alexandre Courbot" <[email protected]>
Newsgroups dev.linux.lists.nova-gpu,dev.linux.lists.driver-core,org.freedesktop.lists.dri-devel,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pci,org.kernel.vger.rust-for-linux
Message-ID <[email protected]>
On Wed Aug 19, 2026 at 8:09 PM JST, Gary Guo wrote:
> Relative registers can be better served by projection to subregion instead
> of ad-hoc handling in register macro. Projection composes better (e.g. it
> natively allows relative registers of relative registers without needing
> additional support).
>
> Remove relative register support, and update the documentation to
> demonstrate how projection and subregions can be used to achieve this
> instead.
>
> Signed-off-by: Gary Guo <[email protected]>

Reviewed-by: Alexandre Courbot <[email protected]>

And good riddance!

<...>
> @@ -763,115 +511,83 @@ pub const fn element_alias_offset<Base: ?Sized, Alias: RegisterArray<Base = Base
>  /// # }
>  /// ```
>  ///
> -/// ## Relative arrays of registers
> +/// ## Relative registers
>  ///
> -/// Combining the two features described in the sections above, arrays of registers accessible from
> -/// a base can also be defined:
> +/// There are cases where a register region is subdivided into small subregions, and you may wish to
> +/// have your register definition be relative to these subregions. This may be needed, for example,
> +/// if these subregions are instantiated several times, or you just want it for encapsulation
> +/// purpose.
>  ///
> -/// ```ignore
> -/// register! {
> -///     ...
> -///     pub RELATIVE_REGISTER_ARRAY(u8)[10, stride = 4] @ Base + 0x100 {
> -///         ...
> -///     }
> -/// }
> +/// For instance, imagine the following I/O space:
> +///
> +/// ```text
> +///           +-----------------------------+
> +///           |             ...             |
> +///           |                             |
> +///  0x100--->+------------CPU0-------------+
> +///           |                             |
> +///  0x110--->+-----------------------------+
> +///           |           CPU_CTL           |
> +///           +-----------------------------+
> +///           |             ...             |
> +///           |                             |
> +///           |                             |
> +///  0x200--->+------------CPU1-------------+
> +///           |                             |
> +///  0x210--->+-----------------------------+
> +///           |           CPU_CTL           |
> +///           +-----------------------------+
> +///           |             ...             |
> +///           +-----------------------------+
>  /// ```
>  ///
> -/// Like relative registers, they implement the [`WithBase`] trait. However the return value of
> -/// [`WithBase::of`] cannot be used directly as a location and must be further specified using the
> -/// [`at`](RelativeRegisterLoc::at) method.
> +/// `CPU0` and `CPU1` both have a `CPU_CTL` register that starts at offset `0x10` of their I/O
> +/// space segment. Since both instances of `CPU_CTL` share the same layout, we don't want to define
> +/// them twice and would prefer a way to select which one to use from a single definition.
> +///
> +/// This can be done define a new type for the subregion, and then define registers that use the new

nit: "done by defining ... and then defining registers"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.