[PATCH v3 00/19] rust: I/O type generalization and projection

Gary Guo posted 19 patches 2 weeks, 2 days ago
There is a newer version of this series
drivers/gpu/nova-core/gsp.rs      |   40 +-
drivers/gpu/nova-core/gsp/cmdq.rs |   66 +-
drivers/gpu/nova-core/gsp/fw.rs   |   82 +-
rust/helpers/io.c                 |   13 +
rust/kernel/devres.rs             |   24 +-
rust/kernel/dma.rs                |  264 ++++---
rust/kernel/io.rs                 | 1559 +++++++++++++++++++++++++++++--------
rust/kernel/io/mem.rs             |   29 +-
rust/kernel/io/poll.rs            |    6 +-
rust/kernel/io/register.rs        |   45 +-
rust/kernel/pci.rs                |    1 -
rust/kernel/pci/io.rs             |  162 ++--
rust/kernel/ptr.rs                |   12 +
rust/kernel/types.rs              |    9 +
samples/rust/rust_dma.rs          |   11 +-
15 files changed, 1666 insertions(+), 657 deletions(-)
[PATCH v3 00/19] rust: I/O type generalization and projection
Posted by Gary Guo 2 weeks, 2 days ago
This series present a major rework of I/O types, as a summary:

- Make I/O regions typed. The existing untyped region still exists
  with a dynamically sized `Region` type.

- Create I/O view types to represent subregion of a full I/O region mapped.
  A projection macro is added to allow safely create such subviews.

- Split I/O traits, make I/O views play a central role, avoid
  duplicate monomorphization and less `unsafe` code.

- Add a `SysMem` backend, and make `Coherent` implement `Io`.

- Add copying methods (memcpy_{from,to}io and friends).

This series generalize `Mmio` type from just an untyped region to typed
representations (so `MmioRaw<T>` is `__iomem *T`). This allows us to remove
the `IoKnownSize` trait; the information is sourced from just the pointer
from the `KnownSize` trait instead.

Building on top of that, `Mmio` and `ConfigSpace` have been converted to
typed views of I/O regions rather than just a big chunk of untyped I/O
memory. These changes made it possible to implement `Io` trait for
`Coherent<T>`.

Shared system memory, `SysMem` is also added to the series, given it
similarity in implementation compared to `Coherent`. In fact, the series
use `SysMem` to implement `Coherent`'s I/O methods.

Built on these generalization, this series add `io_project!()`.
`io_project!()` performs a safe way to project a bigger view to a small
subviews, and some Nova code has been converted in this series to
demonstrate cleanups possible with this addition.

New `io_read!()`, `io_write!()` has been added that supersedes
`dma_read!()`, `dma_write!()` macro. Although, they work for primitives
only (to be exact, types that the backend is `IoCapable` of).
One feature that was lost from the old `dma_read!()` and `dma_write!()`
series was the ability to read/write a large structs. However, the
semantics was unclear to begin with, as there was no guarantee about their
atomicity even for structs that were small enough to fit in u32.

For completeness, I've also included the support for copying methods,
although this does not need to be taken together and can become a follow
up.

The last commit in the series is included for reference only, as a
demonstration on how you can use all of this to implement `iosys_map` using
`Either` type. It automatically gains all the methods via `Io` trait and
can be projected with the macros.

---
Changes in v3:
- This version presents a major rework from the last version, mostly inspired
  by discussions that happen during RustWeek. Notably, the new individual
  view types are now the central piece of `Io` traits rather than an ad-hoc
  addon using the `View` type. They also benefit from type-erasure; the
  original type of `Mmio` or `Coherent` doesn't matter anymore for subviews.
  This removes the need of specifying generics on types that take
  `CoherentView` on Nova code, which is something that I'm not fully happy
  with in the last version.
- Add `SysMem` backend and use it for `Coherent` (Laura Nao).
- Add examples to copying methods and read_val/write_val (Andreas).
- Add a reference patch on `Either` implementation.
- Link to v2: https://patch.msgid.link/20260421-io_projection-v2-0-4c251c692ef4@garyguo.net

Changes in v2:
- Rebased on projection syntax rework
- Added a new patch to forbid use of untyped I/O accessors and register
  macros on typed I/O structs (Alex).
- Fixed a few safety comments (Andreas).
- Added a new patch that implements copying methods (see above).
- Link to v1: https://lore.kernel.org/rust-for-linux/20260323153807.1360705-1-gary@kernel.org/

To: Danilo Krummrich <dakr@kernel.org>
To: Alice Ryhl <aliceryhl@google.com>
To: Daniel Almeida <daniel.almeida@collabora.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: "Rafael J. Wysocki" <rafael@kernel.org>
To: Miguel Ojeda <ojeda@kernel.org>
To: Boqun Feng <boqun@kernel.org>
To: Gary Guo <gary@garyguo.net>
To: Björn Roy Baron <bjorn3_gh@protonmail.com>
To: Benno Lossin <lossin@kernel.org>
To: Andreas Hindborg <a.hindborg@kernel.org>
To: Trevor Gross <tmgross@umich.edu>
To: Bjorn Helgaas <bhelgaas@google.com>
To: Krzysztof Wilczyński <kwilczynski@kernel.org>
To: Abdiel Janulgue <abdiel.janulgue@gmail.com>
To: Robin Murphy <robin.murphy@arm.com>
To: Alexandre Courbot <acourbot@nvidia.com>
To: David Airlie <airlied@gmail.com>
To: Simona Vetter <simona@ffwll.ch>
Cc: driver-core@lists.linux.dev
Cc: rust-for-linux@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: linux-pci@vger.kernel.org
Cc: nova-gpu@lists.linux.dev
Cc: dri-devel@lists.freedesktop.org

---
Gary Guo (18):
      rust: io: add dynamically-sized `Region` type
      rust: io: add missing safety requirement in `IoCapable` methods
      rust: io: restrict untyped IO access and `register!` to `Region`
      rust: io: implement `Io` on reference types instead
      rust: io: generalize `MmioRaw` to pointer to arbitrary type
      rust: io: rename `Mmio` to `MmioOwned`
      rust: io: implement `Mmio` as view type
      rust: pci: io: make `ConfigSpace` a view
      rust: io: use view types instead of addresses for `Io`
      rust: io: remove `MmioOwned`
      rust: io: move `Io` methods to extension trait
      rust: io: add projection macro and methods
      rust: io: implement a view type for `Coherent`
      rust: io: add `read_val` and `write_val` function on `Io`
      gpu: nova-core: use I/O projection for cleaner encapsulation
      rust: dma: drop `dma_read!` and `dma_write!` API
      rust: io: add copying methods
      rust: io: implement `Io` for `Either`

Laura Nao (1):
      rust: io: add I/O backend for system memory with volatile access

 drivers/gpu/nova-core/gsp.rs      |   40 +-
 drivers/gpu/nova-core/gsp/cmdq.rs |   66 +-
 drivers/gpu/nova-core/gsp/fw.rs   |   82 +-
 rust/helpers/io.c                 |   13 +
 rust/kernel/devres.rs             |   24 +-
 rust/kernel/dma.rs                |  264 ++++---
 rust/kernel/io.rs                 | 1559 +++++++++++++++++++++++++++++--------
 rust/kernel/io/mem.rs             |   29 +-
 rust/kernel/io/poll.rs            |    6 +-
 rust/kernel/io/register.rs        |   45 +-
 rust/kernel/pci.rs                |    1 -
 rust/kernel/pci/io.rs             |  162 ++--
 rust/kernel/ptr.rs                |   12 +
 rust/kernel/types.rs              |    9 +
 samples/rust/rust_dma.rs          |   11 +-
 15 files changed, 1666 insertions(+), 657 deletions(-)
---
base-commit: ea8a803d3ef1bc668d777516e00c3bb478d17c23
change-id: 20260421-io_projection-16e7dc5ba7e4

Best regards,
--  
Gary Guo <gary@garyguo.net>

Re: [PATCH v3 00/19] rust: I/O type generalization and projection
Posted by Gary Guo 2 weeks, 1 day ago
On Mon Jun 8, 2026 at 8:58 PM BST, Gary Guo wrote:
> This series present a major rework of I/O types, as a summary:
>
> - Make I/O regions typed. The existing untyped region still exists
>   with a dynamically sized `Region` type.
>
> - Create I/O view types to represent subregion of a full I/O region mapped.
>   A projection macro is added to allow safely create such subviews.
>
> - Split I/O traits, make I/O views play a central role, avoid
>   duplicate monomorphization and less `unsafe` code.
>
> - Add a `SysMem` backend, and make `Coherent` implement `Io`.
>
> - Add copying methods (memcpy_{from,to}io and friends).
>
> This series generalize `Mmio` type from just an untyped region to typed
> representations (so `MmioRaw<T>` is `__iomem *T`). This allows us to remove
> the `IoKnownSize` trait; the information is sourced from just the pointer
> from the `KnownSize` trait instead.
>
> Building on top of that, `Mmio` and `ConfigSpace` have been converted to
> typed views of I/O regions rather than just a big chunk of untyped I/O
> memory. These changes made it possible to implement `Io` trait for
> `Coherent<T>`.
>
> Shared system memory, `SysMem` is also added to the series, given it
> similarity in implementation compared to `Coherent`. In fact, the series
> use `SysMem` to implement `Coherent`'s I/O methods.
>
> Built on these generalization, this series add `io_project!()`.
> `io_project!()` performs a safe way to project a bigger view to a small
> subviews, and some Nova code has been converted in this series to
> demonstrate cleanups possible with this addition.
>
> New `io_read!()`, `io_write!()` has been added that supersedes
> `dma_read!()`, `dma_write!()` macro. Although, they work for primitives
> only (to be exact, types that the backend is `IoCapable` of).
> One feature that was lost from the old `dma_read!()` and `dma_write!()`
> series was the ability to read/write a large structs. However, the
> semantics was unclear to begin with, as there was no guarantee about their
> atomicity even for structs that were small enough to fit in u32.
>
> For completeness, I've also included the support for copying methods,
> although this does not need to be taken together and can become a follow
> up.
>
> The last commit in the series is included for reference only, as a
> demonstration on how you can use all of this to implement `iosys_map` using
> `Either` type. It automatically gains all the methods via `Io` trait and
> can be projected with the macros.

Sashiko points out a few issues. It repeatedly reported issues in multiple
places, but ultimately there're just 3 issues:

* `Region`'s alignment. Discussed on Zulip
  https://rust-for-linux.zulipchat.com/#narrow/channel/288089-General/topic/Generic.20I.2FO.20backends/with/601411822
  I'll just make this 4-byte aligned (and also check that size is multiple of
  4). Luckily none of the existing driver depends on 8-byte aligned regions.

* Missing `unsafe impl Send/Sync`. This is actually quite low severity (Sashiko
  reported high) given it doesn't break drivers today (otherwise I'd noted them
  during compilation test). But I'll fix add in the next spin.

* `copy_from_io_slice` can trigger memcpy between two `SysMem` regions which
  overlap. This can be fixed by either using `memmove`, or perhaps dropping
  `copy_from_io_slice` methods until users arise (this method was asked by
  Danilo, maybe Danilo has some use cases in mind?), and we can change it to
  `memmove` then. Anyhow copying methods can be delayed to its own patch series
  if there needs more discussion.

I'll leave the series on the list for a while before I send out a new version.
If you're reviewing you can assume the first two bullets points will be fixed.

Best,
Gary

>
> ---
> Changes in v3:
> - This version presents a major rework from the last version, mostly inspired
>   by discussions that happen during RustWeek. Notably, the new individual
>   view types are now the central piece of `Io` traits rather than an ad-hoc
>   addon using the `View` type. They also benefit from type-erasure; the
>   original type of `Mmio` or `Coherent` doesn't matter anymore for subviews.
>   This removes the need of specifying generics on types that take
>   `CoherentView` on Nova code, which is something that I'm not fully happy
>   with in the last version.
> - Add `SysMem` backend and use it for `Coherent` (Laura Nao).
> - Add examples to copying methods and read_val/write_val (Andreas).
> - Add a reference patch on `Either` implementation.
> - Link to v2: https://patch.msgid.link/20260421-io_projection-v2-0-4c251c692ef4@garyguo.net
>
> Changes in v2:
> - Rebased on projection syntax rework
> - Added a new patch to forbid use of untyped I/O accessors and register
>   macros on typed I/O structs (Alex).
> - Fixed a few safety comments (Andreas).
> - Added a new patch that implements copying methods (see above).
> - Link to v1: https://lore.kernel.org/rust-for-linux/20260323153807.1360705-1-gary@kernel.org/
Re: [PATCH v3 00/19] rust: I/O type generalization and projection
Posted by Danilo Krummrich 2 weeks, 2 days ago
On Mon Jun 8, 2026 at 9:58 PM CEST, Gary Guo wrote:
> This series present a major rework of I/O types, as a summary:
>
> - Make I/O regions typed. The existing untyped region still exists
>   with a dynamically sized `Region` type.
>
> - Create I/O view types to represent subregion of a full I/O region mapped.
>   A projection macro is added to allow safely create such subviews.
>
> - Split I/O traits, make I/O views play a central role, avoid
>   duplicate monomorphization and less `unsafe` code.
>
> - Add a `SysMem` backend, and make `Coherent` implement `Io`.
>
> - Add copying methods (memcpy_{from,to}io and friends).

Great work, Gary! I very much like how the implementation turns out overall
(will go over the details in the next days).

FYI, once ready I will merge this with a "Merge patch series" merge commit to
retain the cover letter as I did with the driver lifetime series previously.

Suggested-by: Danilo Krummrich <dakr@kernel.org>
Link: https://rust-for-linux.zulipchat.com/#narrow/channel/288089-General/topic/Generic.20I.2FO.20backends/near/571198078

(Either on the relevant patches or just the cover letter, both is fine with me.)