[PATCH v4 00/16] rust: io: support register projections and remove relative registers

Gary Guo posted 16 patches 3 weeks, 3 days ago
MAINTAINERS                                        |   1 +
drivers/gpu/drm/tyr/driver.rs                      |   1 +
drivers/gpu/drm/tyr/fw.rs                          |   5 +-
drivers/gpu/drm/tyr/regs.rs                        |  45 +-
drivers/gpu/nova-core/driver.rs                    |   1 +
drivers/gpu/nova-core/falcon.rs                    | 161 ++---
drivers/gpu/nova-core/falcon/fsp.rs                |  63 +-
drivers/gpu/nova-core/falcon/gsp.rs                |  51 +-
drivers/gpu/nova-core/falcon/hal/ga102.rs          |  59 +-
drivers/gpu/nova-core/falcon/hal/tu102.rs          |   9 +-
drivers/gpu/nova-core/falcon/sec2.rs               |  37 +-
drivers/gpu/nova-core/fb/hal/gb100.rs              |  59 +-
drivers/gpu/nova-core/fb/regs.rs                   |  31 +-
drivers/gpu/nova-core/firmware/fwsec/bootloader.rs |  18 +-
drivers/gpu/nova-core/gsp/hal/tu102.rs             |   7 +-
drivers/gpu/nova-core/gsp/regs.rs                  |   9 +-
drivers/gpu/nova-core/regs.rs                      | 115 ++--
drivers/gpu/nova-core/vbios.rs                     |  11 +-
rust/kernel/bitfield.rs                            |   9 +
rust/kernel/device_id.rs                           |   3 +-
rust/kernel/io.rs                                  | 181 +++--
rust/kernel/io/register.rs                         | 759 +++++----------------
rust/kernel/lib.rs                                 |   1 +
rust/kernel/mem.rs                                 | 231 +++++++
rust/kernel/sync/atomic.rs                         |   4 +-
rust/macros/io/mod.rs                              |   3 +
rust/macros/io/register.rs                         | 296 ++++++++
rust/macros/lib.rs                                 |   9 +
samples/rust/rust_driver_pci.rs                    |   4 +
29 files changed, 1230 insertions(+), 953 deletions(-)
[PATCH v4 00/16] rust: io: support register projections and remove relative registers
Posted by Gary Guo 3 weeks, 3 days ago
Currently registers work for all untyped I/O regions, which is not ideal.
It allows registers defined for device A to work for another device B and
there is no safeguarding at all.

Change this by requiring a base type for registers. `register!` can still
define registers on untyped `Region`s, although users would need to do so
explicitly and supply a concrete type.

This change makes it possible to use projection for relative registers;
relative registers can be implemented by defining new types for the I/O
subregions and just define registers for these subregion types like normal
registers.

This actually results in more ergnomic code for users of relative registers
(currently only nova-core), because non-array registers can be written to
with

    #[...]
    struct Subregion(...);

    register! {
        base: MyBase;
        SUBREGION: Subregion @ ...;
    }

    register! {
        base: Subregion;
        REG(u32) @ .. { .. }
    }

    let subregion = io_project!(bar, build: SUBREGION);
    subregion.read(REG)
    subregion.write_reg(reg)

instead of

    struct SubregionType;
    struct Subregion;
    impl RegisterBase<SubregionType> for Subregion {
        const BASE: usize = ...;
    }

    register! {
        REG(u32) @ Subregion + .. { .. }
    }

    bar.read(REG::of::<Subregion>())
    bar.write(WithBase::of::<Subregion>(), reg)

This also allows a lot more code sharing between I/O projection and
`register!` macro.

The expressiveness power of Rust declarative macros is becoming limiting,
so it is converted to a proc macro before new features being added to it.

Signed-off-by: Gary Guo <gary@garyguo.net>
---
Changes in v4:
- Rebase on 7.3-rc1.
- Many typo fixes. (Alex)
- Tweaks to `transmute` and `AsRepr`. See changelogs inline in patches.
- Link to v3: https://patch.msgid.link/20260819-typed_register-v3-0-3699a75fadf1@garyguo.net

Changes in v3:
- Convert the `register!` macro to syn.
- Add check to ensure register and alias share the same base. (Alex)
- Split transmute functionalities to `kernel::mem`. (Alex)
- Remove some stray trait bound in nova code. (Alex)
- Link to v2: https://patch.msgid.link/20260805-typed_register-v2-0-c3ca142220a0@garyguo.net

Changes in v2:
- Extract type conversion from `register!` to `Io`
- Redesign the API to be centered around regsiter projections.
  * Support register projections in `io_project!`
  * Support adding register definition without defining bitfield
  * Subregions is thus unified with other registers.
- Store projected subregions in `Falcon` for nova.
- Link to v1: https://patch.msgid.link/20260721-typed_register-v1-0-452d72b60262@garyguo.net

---
Gary Guo (16):
      rust: io: register: reimplement as proc macro
      rust: mem: add `transmute` with deferred size check
      rust: mem: add `AsRepr` and `AsReprMut`
      rust: io: perform conversions using `AsRepr`
      rust: io: support register projections
      rust: io: register: allow explicit base type specification
      gpu: nova-core: specify base type for registers
      drm/tyr: specify base type for registers
      samples: rust: pci: specify base type for registers
      rust: io: register: make register have a typed base
      rust: io: register: support fixed offset register without bitfield
      gpu: nova-core: use projection for PFALCON and PFALCON2 registers
      gpu: nova-core: convert hshub0 from relative register to projection
      rust: io: register: remove relative registers
      rust: io: register: remove `Register` trait and cleanup macro
      rust: io: register: unify handling of register with/without bitfields

 MAINTAINERS                                        |   1 +
 drivers/gpu/drm/tyr/driver.rs                      |   1 +
 drivers/gpu/drm/tyr/fw.rs                          |   5 +-
 drivers/gpu/drm/tyr/regs.rs                        |  45 +-
 drivers/gpu/nova-core/driver.rs                    |   1 +
 drivers/gpu/nova-core/falcon.rs                    | 161 ++---
 drivers/gpu/nova-core/falcon/fsp.rs                |  63 +-
 drivers/gpu/nova-core/falcon/gsp.rs                |  51 +-
 drivers/gpu/nova-core/falcon/hal/ga102.rs          |  59 +-
 drivers/gpu/nova-core/falcon/hal/tu102.rs          |   9 +-
 drivers/gpu/nova-core/falcon/sec2.rs               |  37 +-
 drivers/gpu/nova-core/fb/hal/gb100.rs              |  59 +-
 drivers/gpu/nova-core/fb/regs.rs                   |  31 +-
 drivers/gpu/nova-core/firmware/fwsec/bootloader.rs |  18 +-
 drivers/gpu/nova-core/gsp/hal/tu102.rs             |   7 +-
 drivers/gpu/nova-core/gsp/regs.rs                  |   9 +-
 drivers/gpu/nova-core/regs.rs                      | 115 ++--
 drivers/gpu/nova-core/vbios.rs                     |  11 +-
 rust/kernel/bitfield.rs                            |   9 +
 rust/kernel/device_id.rs                           |   3 +-
 rust/kernel/io.rs                                  | 181 +++--
 rust/kernel/io/register.rs                         | 759 +++++----------------
 rust/kernel/lib.rs                                 |   1 +
 rust/kernel/mem.rs                                 | 231 +++++++
 rust/kernel/sync/atomic.rs                         |   4 +-
 rust/macros/io/mod.rs                              |   3 +
 rust/macros/io/register.rs                         | 296 ++++++++
 rust/macros/lib.rs                                 |   9 +
 samples/rust/rust_driver_pci.rs                    |   4 +
 29 files changed, 1230 insertions(+), 953 deletions(-)
---
base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
change-id: 20260721-typed_register-176eab3abee7

Best regards,
--  
Gary Guo <gary@garyguo.net>
Re: [PATCH v4 00/16] rust: io: support register projections and remove relative registers
Posted by Danilo Krummrich 3 weeks, 1 day ago
On Tue, 01 Sep 2026 17:50:24 +0100, Gary Guo wrote:
> [PATCH v4 00/16] rust: io: support register projections and remove relative registers

Applied, thanks!

  Branch: topic/rust-io
  Tree:   git://git.kernel.org/pub/scm/linux/kernel/git/driver-core/driver-core.git

[1/16] rust: io: register: reimplement as proc macro
      commit: 63b2578517df

      [ Fix typo in module-level doc comment and fix ArrayDef syntax
        description to match the actual macro syntax. - Danilo ]

[2/16] rust: mem: add `transmute` with deferred size check
      commit: 82591c20bcb3

      [ Fix doc heading to use plural "Examples" and add missing closing code
        block delimiter. - Danilo ]

[3/16] rust: mem: add `AsRepr` and `AsReprMut`
      commit: 968f30ade612

      [ Fix grammar in from_repr_unchecked() documentation and rephrase
        confusing safety comment. - Danilo ]

[4/16] rust: io: perform conversions using `AsRepr`
      commit: 1e707b76716a
[5/16] rust: io: support register projections
      commit: 34b6dc471749
[6/16] rust: io: register: allow explicit base type specification
      commit: 70a122d5a342

      [ Remove unnecessary #[allow(unused)] from the 'base' field. - Danilo ]

[7/16] gpu: nova-core: specify base type for registers
      commit: a07fa2c979c1
[8/16] drm/tyr: specify base type for registers
      commit: 573228e75c33
[9/16] samples: rust: pci: specify base type for registers
      commit: 54b04b9fc0ea
[10/16] rust: io: register: make register have a typed base
      commit: 35c21468c294
[11/16] rust: io: register: support fixed offset register without bitfield
      commit: ddeaaa3a0fbb
[12/16] gpu: nova-core: use projection for PFALCON and PFALCON2 registers
      commit: 6d5f14077811
[13/16] gpu: nova-core: convert hshub0 from relative register to projection
      commit: 4a7a27bd1947

      [ Split nested import into kernel vertical style. - Danilo ]

[14/16] rust: io: register: remove relative registers
      commit: b6af037d9499
[15/16] rust: io: register: remove `Register` trait and cleanup macro
      commit: dfec6f41d053
[16/16] rust: io: register: unify handling of register with/without bitfields
      commit: 35423e8fd718

The patches are in the topic/rust-io topic branch and will be merged into the
corresponding target branch soon.
Re: [PATCH v4 00/16] rust: io: support register projections and remove relative registers
Posted by Danilo Krummrich 2 weeks, 5 days ago
On Thu Sep 3, 2026 at 9:22 PM CEST, Danilo Krummrich wrote:
> On Tue, 01 Sep 2026 17:50:24 +0100, Gary Guo wrote:
>> [PATCH v4 00/16] rust: io: support register projections and remove relative registers
>
> Applied, thanks!
>
>   Branch: topic/rust-io
>   Tree:   git://git.kernel.org/pub/scm/linux/kernel/git/driver-core/driver-core.git
>
> [1/16] rust: io: register: reimplement as proc macro
>       commit: 63b2578517df
>
>       [ Fix typo in module-level doc comment and fix ArrayDef syntax
>         description to match the actual macro syntax. - Danilo ]
>
> [2/16] rust: mem: add `transmute` with deferred size check
>       commit: 82591c20bcb3
>
>       [ Fix doc heading to use plural "Examples" and add missing closing code
>         block delimiter. - Danilo ]
>
> [3/16] rust: mem: add `AsRepr` and `AsReprMut`
>       commit: 968f30ade612
>
>       [ Fix grammar in from_repr_unchecked() documentation and rephrase
>         confusing safety comment. - Danilo ]
>
> [4/16] rust: io: perform conversions using `AsRepr`
>       commit: 1e707b76716a
> [5/16] rust: io: support register projections
>       commit: 34b6dc471749
> [6/16] rust: io: register: allow explicit base type specification
>       commit: 70a122d5a342
>
>       [ Remove unnecessary #[allow(unused)] from the 'base' field. - Danilo ]
>
> [7/16] gpu: nova-core: specify base type for registers
>       commit: a07fa2c979c1
> [8/16] drm/tyr: specify base type for registers
>       commit: 573228e75c33
> [9/16] samples: rust: pci: specify base type for registers
>       commit: 54b04b9fc0ea
> [10/16] rust: io: register: make register have a typed base
>       commit: 35c21468c294
> [11/16] rust: io: register: support fixed offset register without bitfield
>       commit: ddeaaa3a0fbb
> [12/16] gpu: nova-core: use projection for PFALCON and PFALCON2 registers
>       commit: 6d5f14077811
> [13/16] gpu: nova-core: convert hshub0 from relative register to projection
>       commit: 4a7a27bd1947
>
>       [ Split nested import into kernel vertical style. - Danilo ]
>
> [14/16] rust: io: register: remove relative registers
>       commit: b6af037d9499
> [15/16] rust: io: register: remove `Register` trait and cleanup macro
>       commit: dfec6f41d053
> [16/16] rust: io: register: unify handling of register with/without bitfields
>       commit: 35423e8fd718
>
> The patches are in the topic/rust-io topic branch and will be merged into the
> corresponding target branch soon.

Merged into driver-core-next and drm-rust-next, thanks!
Re: [PATCH v4 00/16] rust: io: support register projections and remove relative registers
Posted by Danilo Krummrich 3 weeks, 1 day ago
On Thu Sep 3, 2026 at 9:22 PM CEST, Danilo Krummrich wrote:
> On Tue, 01 Sep 2026 17:50:24 +0100, Gary Guo wrote:
>> [PATCH v4 00/16] rust: io: support register projections and remove relative registers
>
> Applied, thanks!
>
>   Branch: topic/rust-io
>   Tree:   git://git.kernel.org/pub/scm/linux/kernel/git/driver-core/driver-core.git

I've pushed this to a topic branch, so 0-day can already do its thing.

> [1/16] rust: io: register: reimplement as proc macro
>       commit: 63b2578517df
>
>       [ Fix typo in module-level doc comment and fix ArrayDef syntax
>         description to match the actual macro syntax. - Danilo ]
>
> [2/16] rust: mem: add `transmute` with deferred size check
>       commit: 82591c20bcb3
>
>       [ Fix doc heading to use plural "Examples" and add missing closing code
>         block delimiter. - Danilo ]
>
> [3/16] rust: mem: add `AsRepr` and `AsReprMut`
>       commit: 968f30ade612
>
>       [ Fix grammar in from_repr_unchecked() documentation and rephrase
>         confusing safety comment. - Danilo ]

Miguel, Boqun: Please let me know if you are fine with the two
rust/kernel/mem.rs patches.

Thanks,
Danilo

>
> [4/16] rust: io: perform conversions using `AsRepr`
>       commit: 1e707b76716a
> [5/16] rust: io: support register projections
>       commit: 34b6dc471749
> [6/16] rust: io: register: allow explicit base type specification
>       commit: 70a122d5a342
>
>       [ Remove unnecessary #[allow(unused)] from the 'base' field. - Danilo ]
>
> [7/16] gpu: nova-core: specify base type for registers
>       commit: a07fa2c979c1
> [8/16] drm/tyr: specify base type for registers
>       commit: 573228e75c33
> [9/16] samples: rust: pci: specify base type for registers
>       commit: 54b04b9fc0ea
> [10/16] rust: io: register: make register have a typed base
>       commit: 35c21468c294
> [11/16] rust: io: register: support fixed offset register without bitfield
>       commit: ddeaaa3a0fbb
> [12/16] gpu: nova-core: use projection for PFALCON and PFALCON2 registers
>       commit: 6d5f14077811
> [13/16] gpu: nova-core: convert hshub0 from relative register to projection
>       commit: 4a7a27bd1947
>
>       [ Split nested import into kernel vertical style. - Danilo ]
>
> [14/16] rust: io: register: remove relative registers
>       commit: b6af037d9499
> [15/16] rust: io: register: remove `Register` trait and cleanup macro
>       commit: dfec6f41d053
> [16/16] rust: io: register: unify handling of register with/without bitfields
>       commit: 35423e8fd718
>
> The patches are in the topic/rust-io topic branch and will be merged into the
> corresponding target branch soon.
Re: [PATCH v4 00/16] rust: io: support register projections and remove relative registers
Posted by Miguel Ojeda 2 weeks, 6 days ago
On Thu, Sep 3, 2026 at 9:27 PM Danilo Krummrich <dakr@kernel.org> wrote:
>
> Miguel, Boqun: Please let me know if you are fine with the two
> rust/kernel/mem.rs patches.

I see you fixed a few nits -- I pointed a few others in a couple replies.

Acked-by: Miguel Ojeda <ojeda@kernel.org>

It is nice to get a slice of the future of the standard library a bit sooner :)

Thanks!

Cheers,
Miguel
Re: [PATCH v4 00/16] rust: io: support register projections and remove relative registers
Posted by Danilo Krummrich 2 weeks, 5 days ago
On Sat Sep 5, 2026 at 9:24 PM CEST, Miguel Ojeda wrote:
> I see you fixed a few nits -- I pointed a few others in a couple replies.

All fixed up, thanks!
Re: [PATCH v4 00/16] rust: io: support register projections and remove relative registers
Posted by Alexandre Courbot 3 weeks, 1 day ago
On Wed Sep 2, 2026 at 1:50 AM JST, Gary Guo wrote:
> Currently registers work for all untyped I/O regions, which is not ideal.
> It allows registers defined for device A to work for another device B and
> there is no safeguarding at all.
>
> Change this by requiring a base type for registers. `register!` can still
> define registers on untyped `Region`s, although users would need to do so
> explicitly and supply a concrete type.

Thanks, this has come together really nicely imho.

I did a quick patch-by-patch build and tested the top of the series with
Nova, which happily booted. Thus for all patches except patch 8 which I
couldn't test, feel free to add my

Tested-by: Alexandre Courbot <acourbot@nvidia.com>