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/[email protected]
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/[email protected]/
To: Danilo Krummrich <[email protected]>
To: Alice Ryhl <[email protected]>
To: Daniel Almeida <[email protected]>
To: Greg Kroah-Hartman <[email protected]>
To: "Rafael J. Wysocki" <[email protected]>
To: Miguel Ojeda <[email protected]>
To: Boqun Feng <[email protected]>
To: Gary Guo <[email protected]>
To: Björn Roy Baron <[email protected]>
To: Benno Lossin <[email protected]>
To: Andreas Hindborg <[email protected]>
To: Trevor Gross <[email protected]>
To: Bjorn Helgaas <[email protected]>
To: Krzysztof Wilczyński <[email protected]>
To: Abdiel Janulgue <[email protected]>
To: Robin Murphy <[email protected]>
To: Alexandre Courbot <[email protected]>
To: David Airlie <[email protected]>
To: Simona Vetter <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
---
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 <[email protected]>