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
subregion_proj(bar).read(REG)
subregion_proj(bar).write_reg(reg)
instead of
bar.read(REG::of::<Subregion>())
bar.write(WithBase::of::<Subregion>(), reg)
Signed-off-by: Gary Guo <gary@garyguo.net>
---
Gary Guo (10):
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: add static `cast()` method for views
rust: io: add subregion method with compile-time check
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
drivers/gpu/drm/tyr/driver.rs | 1 +
drivers/gpu/drm/tyr/regs.rs | 42 ++
drivers/gpu/nova-core/driver.rs | 1 +
drivers/gpu/nova-core/falcon.rs | 158 +++---
drivers/gpu/nova-core/falcon/fsp.rs | 53 +-
drivers/gpu/nova-core/falcon/gsp.rs | 43 +-
drivers/gpu/nova-core/falcon/hal/ga102.rs | 39 +-
drivers/gpu/nova-core/falcon/hal/tu102.rs | 8 +-
drivers/gpu/nova-core/falcon/sec2.rs | 32 +-
drivers/gpu/nova-core/fb/hal/gb100.rs | 51 +-
drivers/gpu/nova-core/fb/regs.rs | 4 +
drivers/gpu/nova-core/firmware/fwsec/bootloader.rs | 11 +-
drivers/gpu/nova-core/gsp/regs.rs | 4 +
drivers/gpu/nova-core/regs.rs | 134 +++--
drivers/gpu/nova-core/vbios.rs | 11 +-
rust/kernel/io.rs | 67 +++
rust/kernel/io/register.rs | 539 +++------------------
samples/rust/rust_driver_pci.rs | 4 +
18 files changed, 461 insertions(+), 741 deletions(-)
---
base-commit: 3fe08b9796f36ef437ab9328e7dd1e5ff2d66603
change-id: 20260721-typed_register-176eab3abee7
Best regards,
--
Gary Guo <gary@garyguo.net>