Re: [PATCH v3 14/16] rust: io: register: remove relative registers
From: Alexandre Courbot
Date: Thu Aug 27 2026 - 21:34:11 EST
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 <gary@xxxxxxxxxxx>
Reviewed-by: Alexandre Courbot <acourbot@xxxxxxxxxx>
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"