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/[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]/

Reply via email to