On Fri Jun 12, 2026 at 1:28 AM JST, Gary Guo wrote:
> Currently the `Io` trait exposes a bunch of untyped IO accesses, but if the
> `Io` region itself is typed, then it might be weird to have
>
>     let io: Mmio<u32> = /* ... */;
>     io.read8(1);
>
> while not unsound, it is surely strange. Thus, restrict the untyped methods
> and also the register macro to `Region` type only.
>
> Implement it by adding a generic type to `IoLoc` indicating allowed base
> types. This also paves the way to add typed register blocks in the future;
> for example, we could use this mechanism to block driver A's `register!()`
> generated macro from being used on driver B's MMIO. The same mechanism
> could be used for relative IO registers. These are future opportunities,
> and for now restrict everything to require `IoLoc<Region<SIZE>, _>`.
>
> Suggested-by: Alexandre Courbot <[email protected]>
> Link: 
> https://lore.kernel.org/rust-for-linux/[email protected]/
> Signed-off-by: Gary Guo <[email protected]>

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

<...>
> --- a/rust/kernel/io/register.rs
> +++ b/rust/kernel/io/register.rs
> @@ -113,6 +113,8 @@
>      io::IoLoc, //
>  };
>  
> +use super::Region;
> +
>  /// Trait implemented by all registers.
>  pub trait Register: Sized {
>      /// Backing primitive type of the register.
> @@ -129,7 +131,7 @@ pub trait FixedRegister: Register {}
>  
>  /// Allows `()` to be used as the `location` parameter of 
> [`Io::write`](super::Io::write) when
>  /// passing a [`FixedRegister`] value.
> -impl<T> IoLoc<T> for ()
> +impl<const SIZE: usize, T> IoLoc<Region<SIZE>, T> for ()
>  where
>      T: FixedRegister,
>  {
> @@ -143,7 +145,7 @@ fn offset(self) -> usize {
>  
>  /// A [`FixedRegister`] carries its location in its type. Thus 
> `FixedRegister` values can be used
>  /// as an [`IoLoc`].
> -impl<T> IoLoc<T> for T
> +impl<const SIZE: usize, T> IoLoc<Region<SIZE>, T> for T
>  where
>      T: FixedRegister,
>  {
> @@ -168,7 +170,7 @@ pub const fn new() -> Self {
>      }
>  }
>  
> -impl<T> IoLoc<T> for FixedRegisterLoc<T>
> +impl<const SIZE: usize, T> IoLoc<Region<SIZE>, T> for FixedRegisterLoc<T>
>  where
>      T: FixedRegister,
>  {
> @@ -239,7 +241,8 @@ const fn offset(self) -> usize {
>      }
>  }
>  
> -impl<T, B> IoLoc<T> for RelativeRegisterLoc<T, B>
> +// FIXME: Make use of `Base` type parameter of `Region` directly.

`Region` does not have any `Base` type parameter, so I am not sure what
this refers to.

Is this to make relative registers tied to a specific register block
type? If so, it would help to expand this FIXME a bit as it might be
difficult to understand without context.

Reply via email to