Re: [PATCH v6 06/20] rust: io: rename `Mmio` to `MmioOwned`

Daniel Almeida <[email protected]>
Newsgroups org.kernel.vger.linux-pwm,dev.linux.lists.driver-core,dev.linux.lists.nova-gpu,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 6 Jul 2026, at 09:44, Gary Guo <[email protected]> wrote:
> 
> Most users would more commonly reach out to a view of `Mmio` rather than an
> owned instance of `Mmio`. Only implementor of `Io` like `Bar` or `IoMem`

implementor -> implementors

> would need the owned version. Thus, rename `Mmio` to `MmioOwned` so that
> the name `Mmio` can be used for the view type instead.
> 
> Reviewed-by: Alexandre Courbot <[email protected]>
> Signed-off-by: Gary Guo <[email protected]>
> ---
> rust/kernel/devres.rs      |  6 ++--
> rust/kernel/io.rs          | 77 +++++++++++++++++++++++-----------------------
> rust/kernel/io/mem.rs      |  8 ++---
> rust/kernel/io/poll.rs     |  8 ++---
> rust/kernel/io/register.rs | 24 +++++++--------
> rust/kernel/pci/io.rs      |  6 ++--
> 6 files changed, 65 insertions(+), 64 deletions(-)
> 
> diff --git a/rust/kernel/devres.rs b/rust/kernel/devres.rs
> index d0c677fd7932..aed0c994fd30 100644
> --- a/rust/kernel/devres.rs
> +++ b/rust/kernel/devres.rs
> @@ -68,7 +68,7 @@ struct Inner<T> {
> ///     devres::Devres,
> ///     io::{
> ///         Io,
> -///         Mmio,
> +///         MmioOwned,
> ///         MmioRaw,
> ///         PhysAddr,
> ///         Region, //
> @@ -105,11 +105,11 @@ struct Inner<T> {
> /// }
> ///
> /// impl<const SIZE: usize> Deref for IoMem<SIZE> {
> -///    type Target = Mmio<SIZE>;
> +///    type Target = MmioOwned<SIZE>;
> ///
> ///    fn deref(&self) -> &Self::Target {
> ///         // SAFETY: The memory range stored in `self` has been properly mapped in `Self::new`.
> -///         unsafe { Mmio::from_raw(&self.0) }
> +///         unsafe { MmioOwned::from_raw(&self.0) }
> ///    }
> /// }
> /// # fn no_run(dev: &Device<Bound>) -> Result<(), Error> {
> diff --git a/rust/kernel/io.rs b/rust/kernel/io.rs
> index 12be266d7ed7..f93be7f78069 100644
> --- a/rust/kernel/io.rs
> +++ b/rust/kernel/io.rs
> @@ -94,8 +94,8 @@ fn size(p: *const Self) -> usize {
> /// the represented MMIO region does exist or is properly mapped.
> ///
> /// Instead, the bus specific MMIO implementation must convert this raw representation into an
> -/// `Mmio` instance providing the actual memory accessors. Only by the conversion into an `Mmio`
> -/// structure any guarantees are given.
> +/// `MmioOwned` instance providing the actual memory accessors. Only by the conversion into an
> +/// `MmioOwned` structure any guarantees are given.
> pub struct MmioRaw<T: ?Sized> {
>     /// Pointer is in I/O address space.
>     ///
> @@ -170,7 +170,7 @@ pub fn size(&self) -> usize {
> ///     ffi::c_void,
> ///     io::{
> ///         Io,
> -///         Mmio,
> +///         MmioOwned,
> ///         MmioRaw,
> ///         PhysAddr,
> ///         Region,
> @@ -206,11 +206,11 @@ pub fn size(&self) -> usize {
> /// }
> ///
> /// impl<const SIZE: usize> Deref for IoMem<SIZE> {
> -///    type Target = Mmio<SIZE>;
> +///    type Target = MmioOwned<SIZE>;
> ///
> ///    fn deref(&self) -> &Self::Target {
> ///         // SAFETY: The memory range stored in `self` has been properly mapped in `Self::new`.
> -///         unsafe { Mmio::from_raw(&self.0) }
> +///         unsafe { MmioOwned::from_raw(&self.0) }
> ///    }
> /// }
> ///
> @@ -224,7 +224,7 @@ pub fn size(&self) -> usize {
> /// # }
> /// ```
> #[repr(transparent)]
> -pub struct Mmio<const SIZE: usize = 0>(MmioRaw<Region<SIZE>>);
> +pub struct MmioOwned<const SIZE: usize = 0>(MmioRaw<Region<SIZE>>);
> 
> /// Checks whether an access of type `U` at the given `base` and the given `offset`
> /// is valid within this region.
> @@ -537,10 +537,10 @@ fn write64(self, value: u64, offset: usize)
>     /// ```no_run
>     /// use kernel::io::{
>     ///     Io,
> -    ///     Mmio,
> +    ///     MmioOwned,
>     /// };
>     ///
> -    /// fn do_reads(io: &Mmio) -> Result {
> +    /// fn do_reads(io: &MmioOwned) -> Result {
>     ///     // 32-bit read from address `0x10`.
>     ///     let v: u32 = io.try_read(0x10)?;
>     ///
> @@ -571,10 +571,10 @@ fn try_read<T, L>(self, location: L) -> Result<T>
>     /// ```no_run
>     /// use kernel::io::{
>     ///     Io,
> -    ///     Mmio,
> +    ///     MmioOwned,
>     /// };
>     ///
> -    /// fn do_writes(io: &Mmio) -> Result {
> +    /// fn do_writes(io: &MmioOwned) -> Result {
>     ///     // 32-bit write of value `1` at address `0x10`.
>     ///     io.try_write(0x10, 1u32)?;
>     ///
> @@ -609,7 +609,7 @@ fn try_write<T, L>(self, location: L, value: T) -> Result
>     /// use kernel::io::{
>     ///     register,
>     ///     Io,
> -    ///     Mmio,
> +    ///     MmioOwned,
>     /// };
>     ///
>     /// register! {
> @@ -625,7 +625,7 @@ fn try_write<T, L>(self, location: L, value: T) -> Result
>     ///     }
>     /// }
>     ///
> -    /// fn do_write_reg(io: &Mmio) -> Result {
> +    /// fn do_write_reg(io: &MmioOwned) -> Result {
>     ///
>     ///     io.try_write_reg(VERSION::new(1, 0))
>     /// }
> @@ -654,10 +654,10 @@ fn try_write_reg<T, L, V>(self, value: V) -> Result
>     /// ```no_run
>     /// use kernel::io::{
>     ///     Io,
> -    ///     Mmio,
> +    ///     MmioOwned,
>     /// };
>     ///
> -    /// fn do_update(io: &Mmio<0x1000>) -> Result {
> +    /// fn do_update(io: &MmioOwned<0x1000>) -> Result {
>     ///     io.try_update(0x10, |v: u32| {
>     ///         v + 1
>     ///     })
> @@ -691,10 +691,10 @@ fn try_update<T, L, F>(self, location: L, f: F) -> Result
>     /// ```no_run
>     /// use kernel::io::{
>     ///     Io,
> -    ///     Mmio,
> +    ///     MmioOwned,
>     /// };
>     ///
> -    /// fn do_reads(io: &Mmio<0x1000>) {
> +    /// fn do_reads(io: &MmioOwned<0x1000>) {
>     ///     // 32-bit read from address `0x10`.
>     ///     let v: u32 = io.read(0x10);
>     ///
> @@ -723,10 +723,10 @@ fn read<T, L>(self, location: L) -> T
>     /// ```no_run
>     /// use kernel::io::{
>     ///     Io,
> -    ///     Mmio,
> +    ///     MmioOwned,
>     /// };
>     ///
> -    /// fn do_writes(io: &Mmio<0x1000>) {
> +    /// fn do_writes(io: &MmioOwned<0x1000>) {
>     ///     // 32-bit write of value `1` at address `0x10`.
>     ///     io.write(0x10, 1u32);
>     ///
> @@ -757,7 +757,7 @@ fn write<T, L>(self, location: L, value: T)
>     /// use kernel::io::{
>     ///     register,
>     ///     Io,
> -    ///     Mmio,
> +    ///     MmioOwned,
>     /// };
>     ///
>     /// register! {
> @@ -773,7 +773,7 @@ fn write<T, L>(self, location: L, value: T)
>     ///     }
>     /// }
>     ///
> -    /// fn do_write_reg(io: &Mmio<0x1000>) {
> +    /// fn do_write_reg(io: &MmioOwned<0x1000>) {
>     ///     io.write_reg(VERSION::new(1, 0));
>     /// }
>     /// ```
> @@ -801,10 +801,10 @@ fn write_reg<T, L, V>(self, value: V)
>     /// ```no_run
>     /// use kernel::io::{
>     ///     Io,
> -    ///     Mmio,
> +    ///     MmioOwned,
>     /// };
>     ///
> -    /// fn do_update(io: &Mmio<0x1000>) {
> +    /// fn do_update(io: &MmioOwned<0x1000>) {
>     ///     io.update(0x10, |v: u32| {
>     ///         v + 1
>     ///     })
> @@ -847,19 +847,19 @@ unsafe fn io_write(self, value: $ty, address: usize) {
> }
> 
> // MMIO regions support 8, 16, and 32-bit accesses.
> -impl_mmio_io_capable!(Mmio, u8, readb, writeb);
> -impl_mmio_io_capable!(Mmio, u16, readw, writew);
> -impl_mmio_io_capable!(Mmio, u32, readl, writel);
> +impl_mmio_io_capable!(MmioOwned, u8, readb, writeb);
> +impl_mmio_io_capable!(MmioOwned, u16, readw, writew);
> +impl_mmio_io_capable!(MmioOwned, u32, readl, writel);
> // MMIO regions on 64-bit systems also support 64-bit accesses.
> impl_mmio_io_capable!(
> -    Mmio,
> +    MmioOwned,
>     #[cfg(CONFIG_64BIT)]
>     u64,
>     readq,
>     writeq
> );
> 
> -impl<'a, const SIZE: usize> Io for &'a Mmio<SIZE> {
> +impl<'a, const SIZE: usize> Io for &'a MmioOwned<SIZE> {
>     type Target = Region<SIZE>;
> 
>     /// Returns the base address of this mapping.
> @@ -875,27 +875,28 @@ fn maxsize(self) -> usize {
>     }
> }
> 
> -impl<const SIZE: usize> Mmio<SIZE> {
> -    /// Converts an `MmioRaw` into an `Mmio` instance, providing the accessors to the MMIO mapping.
> +impl<const SIZE: usize> MmioOwned<SIZE> {
> +    /// Converts an `MmioRaw` into an `MmioOwned` instance, providing the accessors to the MMIO
> +    /// mapping.
>     ///
>     /// # Safety
>     ///
>     /// Callers must ensure that `addr` is the start of a valid I/O mapped memory region of size
>     /// `maxsize`.
>     pub unsafe fn from_raw(raw: &MmioRaw<Region<SIZE>>) -> &Self {
> -        // SAFETY: `Mmio` is a transparent wrapper around `MmioRaw`.
> +        // SAFETY: `MmioOwned` is a transparent wrapper around `MmioRaw`.
>         unsafe { &*core::ptr::from_ref(raw).cast() }
>     }
> }
> 
> -/// [`Mmio`] wrapper using relaxed accessors.
> +/// [`MmioOwned`] wrapper using relaxed accessors.
> ///
> /// This type provides an implementation of [`Io`] that uses relaxed I/O MMIO operands instead of
> /// the regular ones.
> ///
> -/// See [`Mmio::relaxed`] for a usage example.
> +/// See [`MmioOwned::relaxed`] for a usage example.
> #[repr(transparent)]
> -pub struct RelaxedMmio<const SIZE: usize = 0>(Mmio<SIZE>);
> +pub struct RelaxedMmio<const SIZE: usize = 0>(MmioOwned<SIZE>);
> 
> impl<'a, const SIZE: usize> Io for &'a RelaxedMmio<SIZE> {
>     type Target = Region<SIZE>;
> @@ -911,7 +912,7 @@ fn maxsize(self) -> usize {
>     }
> }
> 
> -impl<const SIZE: usize> Mmio<SIZE> {
> +impl<const SIZE: usize> MmioOwned<SIZE> {
>     /// Returns a [`RelaxedMmio`] reference that performs relaxed I/O operations.
>     ///
>     /// Relaxed accessors do not provide ordering guarantees with respect to DMA or memory accesses
> @@ -922,19 +923,19 @@ impl<const SIZE: usize> Mmio<SIZE> {
>     /// ```no_run
>     /// use kernel::io::{
>     ///     Io,
> -    ///     Mmio,
> +    ///     MmioOwned,
>     ///     RelaxedMmio,
>     /// };
>     ///
> -    /// fn do_io(io: &Mmio<0x100>) {
> +    /// fn do_io(io: &MmioOwned<0x100>) {
>     ///     // The access is performed using `readl_relaxed` instead of `readl`.
>     ///     let v = io.relaxed().read32(0x10);
>     /// }
>     ///
>     /// ```
>     pub fn relaxed(&self) -> &RelaxedMmio<SIZE> {
> -        // SAFETY: `RelaxedMmio` is `#[repr(transparent)]` over `Mmio`, so `Mmio<SIZE>` and
> -        // `RelaxedMmio<SIZE>` have identical layout.
> +        // SAFETY: `RelaxedMmio` is `#[repr(transparent)]` over `MmioOwned`, so `MmioOwned<SIZE>`
> +        // and `RelaxedMmio<SIZE>` have identical layout.
>         unsafe { core::mem::transmute(self) }
>     }
> }
> diff --git a/rust/kernel/io/mem.rs b/rust/kernel/io/mem.rs
> index 9e15bc8fde78..8f6c257c5b8e 100644
> --- a/rust/kernel/io/mem.rs
> +++ b/rust/kernel/io/mem.rs
> @@ -16,7 +16,7 @@
>             Region,
>             Resource, //
>         },
> -        Mmio,
> +        MmioOwned,
>         MmioRaw, //
>     },
>     prelude::*,
> @@ -211,7 +211,7 @@ pub fn into_devres(self) -> Result<Devres<ExclusiveIoMem<'static, SIZE>>> {
> }
> 
> impl<const SIZE: usize> Deref for ExclusiveIoMem<'_, SIZE> {
> -    type Target = Mmio<SIZE>;
> +    type Target = MmioOwned<SIZE>;
> 
>     fn deref(&self) -> &Self::Target {
>         &self.iomem
> @@ -291,10 +291,10 @@ fn drop(&mut self) {
> }
> 
> impl<const SIZE: usize> Deref for IoMem<'_, SIZE> {
> -    type Target = Mmio<SIZE>;
> +    type Target = MmioOwned<SIZE>;
> 
>     fn deref(&self) -> &Self::Target {
>         // SAFETY: Safe as by the invariant of `IoMem`.
> -        unsafe { Mmio::from_raw(&self.io) }
> +        unsafe { MmioOwned::from_raw(&self.io) }
>     }
> }
> diff --git a/rust/kernel/io/poll.rs b/rust/kernel/io/poll.rs
> index 75d1b3e8596c..79828a8006b5 100644
> --- a/rust/kernel/io/poll.rs
> +++ b/rust/kernel/io/poll.rs
> @@ -47,14 +47,14 @@
> /// ```no_run
> /// use kernel::io::{
> ///     Io,
> -///     Mmio,
> +///     MmioOwned,
> ///     poll::read_poll_timeout, //
> /// };
> /// use kernel::time::Delta;
> ///
> /// const HW_READY: u16 = 0x01;
> ///
> -/// fn wait_for_hardware<const SIZE: usize>(io: &Mmio<SIZE>) -> Result {
> +/// fn wait_for_hardware<const SIZE: usize>(io: &MmioOwned<SIZE>) -> Result {
> ///     read_poll_timeout(
> ///         // The `op` closure reads the value of a specific status register.
> ///         || io.try_read16(0x1000),
> @@ -134,14 +134,14 @@ pub fn read_poll_timeout<Op, Cond, T>(
> /// ```no_run
> /// use kernel::io::{
> ///     Io,
> -///     Mmio,
> +///     MmioOwned,
> ///     poll::read_poll_timeout_atomic, //
> /// };
> /// use kernel::time::Delta;
> ///
> /// const HW_READY: u16 = 0x01;
> ///
> -/// fn wait_for_hardware<const SIZE: usize>(io: &Mmio<SIZE>) -> Result {
> +/// fn wait_for_hardware<const SIZE: usize>(io: &MmioOwned<SIZE>) -> Result {
> ///     read_poll_timeout_atomic(
> ///         // The `op` closure reads the value of a specific status register.
> ///         || io.try_read16(0x1000),
> diff --git a/rust/kernel/io/register.rs b/rust/kernel/io/register.rs
> index 1159e5168ef9..fd3bf6220f95 100644
> --- a/rust/kernel/io/register.rs
> +++ b/rust/kernel/io/register.rs
> @@ -58,7 +58,7 @@
> //!     },
> //!     num::Bounded,
> //! };
> -//! # use kernel::io::Mmio;
> +//! # use kernel::io::MmioOwned;
> //! # register! {
> //! #     pub BOOT_0(u32) @ 0x00000100 {
> //! #         15:8 vendor_id;
> @@ -66,7 +66,7 @@
> //! #         3:0 minor_revision;
> //! #     }
> //! # }
> -//! # fn test(io: &Mmio<0x1000>) {
> +//! # fn test(io: &MmioOwned<0x1000>) {
> //! # fn obtain_vendor_id() -> u8 { 0xff }
> //!
> //! // Read from the register's defined offset (0x100).
> @@ -446,7 +446,7 @@ fn into_io_op(self) -> (FixedRegisterLoc<T>, T) {
> ///         Io,
> ///     },
> /// };
> -/// # use kernel::io::Mmio;
> +/// # use kernel::io::MmioOwned;
> ///
> /// register! {
> ///     FIXED_REG(u32) @ 0x100 {
> @@ -455,7 +455,7 @@ fn into_io_op(self) -> (FixedRegisterLoc<T>, T) {
> ///     }
> /// }
> ///
> -/// # fn test(io: &Mmio<0x1000>) {
> +/// # fn test(io: &MmioOwned<0x1000>) {
> /// let val = io.read(FIXED_REG);
> ///
> /// // Write from an already-existing value.
> @@ -559,7 +559,7 @@ fn into_io_op(self) -> (FixedRegisterLoc<T>, T) {
> ///         Io,
> ///     },
> /// };
> -/// # use kernel::io::Mmio;
> +/// # use kernel::io::MmioOwned;
> ///
> /// // Type used to identify the base.
> /// pub struct CpuCtlBase;
> @@ -584,7 +584,7 @@ fn into_io_op(self) -> (FixedRegisterLoc<T>, T) {
> ///     }
> /// }
> ///
> -/// # fn test(io: Mmio<0x1000>) {
> +/// # fn test(io: MmioOwned<0x1000>) {
> /// // Read the status of `Cpu0`.
> /// let cpu0_started = io.read(CPU_CTL::of::<Cpu0>());
> ///
> @@ -601,7 +601,7 @@ fn into_io_op(self) -> (FixedRegisterLoc<T>, T) {
> ///     }
> /// }
> ///
> -/// # fn test2(io: Mmio<0x1000>) {
> +/// # fn test2(io: MmioOwned<0x1000>) {
> /// // Start the aliased `CPU0`, leaving its other fields untouched.
> /// io.update(CPU_CTL_ALIAS::of::<Cpu0>(), |r| r.with_alias_start(true));
> /// # }
> @@ -638,7 +638,7 @@ fn into_io_op(self) -> (FixedRegisterLoc<T>, T) {
> ///         Io,
> ///     },
> /// };
> -/// # use kernel::io::Mmio;
> +/// # use kernel::io::MmioOwned;
> /// # fn get_scratch_idx() -> usize {
> /// #   0x15
> /// # }
> @@ -651,7 +651,7 @@ fn into_io_op(self) -> (FixedRegisterLoc<T>, T) {
> ///     }
> /// }
> ///
> -/// # fn test(io: &Mmio<0x1000>)
> +/// # fn test(io: &MmioOwned<0x1000>)
> /// #     -> Result<(), Error>{
> /// // Read scratch register 0, i.e. I/O address `0x80`.
> /// let scratch_0 = io.read(SCRATCH::at(0)).value();
> @@ -724,7 +724,7 @@ fn into_io_op(self) -> (FixedRegisterLoc<T>, T) {
> ///         Io,
> ///     },
> /// };
> -/// # use kernel::io::Mmio;
> +/// # use kernel::io::MmioOwned;
> /// # fn get_scratch_idx() -> usize {
> /// #   0x15
> /// # }
> @@ -752,7 +752,7 @@ fn into_io_op(self) -> (FixedRegisterLoc<T>, T) {
> ///     }
> /// }
> ///
> -/// # fn test(io: &Mmio<0x1000>) -> Result<(), Error> {
> +/// # fn test(io: &MmioOwned<0x1000>) -> Result<(), Error> {
> /// // Read scratch register 0 of CPU0.
> /// let scratch = io.read(CPU_SCRATCH::of::<Cpu0>().at(0));
> ///
> @@ -794,7 +794,7 @@ fn into_io_op(self) -> (FixedRegisterLoc<T>, T) {
> ///     }
> /// }
> ///
> -/// # fn test2(io: &Mmio<0x1000>) -> Result<(), Error> {
> +/// # fn test2(io: &MmioOwned<0x1000>) -> Result<(), Error> {
> /// let cpu0_status = io.read(CPU_FIRMWARE_STATUS::of::<Cpu0>()).status();
> /// # Ok(())
> /// # }
> diff --git a/rust/kernel/pci/io.rs b/rust/kernel/pci/io.rs
> index 42f840d64a6f..e0acb62f58a2 100644
> --- a/rust/kernel/pci/io.rs
> +++ b/rust/kernel/pci/io.rs
> @@ -10,7 +10,7 @@
>     io::{
>         Io,
>         IoCapable,
> -        Mmio,
> +        MmioOwned,
>         MmioRaw,
>         Region, //
>     },
> @@ -242,11 +242,11 @@ fn drop(&mut self) {
> }
> 
> impl<const SIZE: usize> Deref for Bar<'_, SIZE> {
> -    type Target = Mmio<SIZE>;
> +    type Target = MmioOwned<SIZE>;
> 
>     fn deref(&self) -> &Self::Target {
>         // SAFETY: By the type invariant of `Self`, the MMIO range in `self.io` is properly mapped.
> -        unsafe { Mmio::from_raw(&self.io) }
> +        unsafe { MmioOwned::from_raw(&self.io) }
>     }
> }
> 
> 
> -- 
> 2.54.0
> 

Reviewed-by: Daniel Almeida <[email protected]>
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.