[PATCH v2 00/16] rust: io: support register projections and remove relative registers
From: Gary Guo
Date: Wed Aug 05 2026 - 12:43:46 EST
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.
Signed-off-by: Gary Guo <gary@xxxxxxxxxxx>
---
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@xxxxxxxxxxx
---
Gary Guo (16):
rust: io: add static `cast()` method for views
rust: io: add `IoRepr` trait
rust: io: support register projections
rust: io: register: handle one register at a time
rust: io: register extract offset computation to helper rules
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
drivers/gpu/drm/tyr/driver.rs | 1 +
drivers/gpu/drm/tyr/regs.rs | 43 +-
drivers/gpu/nova-core/driver.rs | 1 +
drivers/gpu/nova-core/falcon.rs | 157 ++---
drivers/gpu/nova-core/falcon/fsp.rs | 63 +-
drivers/gpu/nova-core/falcon/gsp.rs | 51 +-
drivers/gpu/nova-core/falcon/hal/ga102.rs | 62 +-
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 | 29 +-
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 | 114 +--
drivers/gpu/nova-core/vbios.rs | 11 +-
rust/kernel/bitfield.rs | 5 +
rust/kernel/io.rs | 295 ++++++--
rust/kernel/io/register.rs | 774 ++++++---------------
samples/rust/rust_driver_pci.rs | 4 +
20 files changed, 828 insertions(+), 921 deletions(-)
---
base-commit: 1701fda2f58e345c050f4309971bdc07cd6146ba
change-id: 20260721-typed_register-176eab3abee7
Best regards,
--
Gary Guo <gary@xxxxxxxxxxx>