| Message ID | 20260901-typed_register-v4-0-5552b1d59525@garyguo.net |
|---|---|
| Headers | show |
| Series | rust: io: support register projections and remove relative registers | expand |
> All registers use the same base type, which is `<Bar0 as IO>::Target`. Thus > add the base parameter to `register!` invocation. > > Reviewed-by: Alexandre Courbot <acourbot@nvidia.com> > Signed-off-by: Gary Guo <gary@garyguo.net> Sashiko has reviewed this patch and found no issues. It looks great!
> With the removal of relative registers, there are only two type of > registers left, fixed register and register arrays. There is not much > benefit in having a common super trait for them anymore, thus remove it, > and cleanup the macro rules associated with it. > > Signed-off-by: Gary Guo <gary@garyguo.net> Sashiko has reviewed this patch and found no issues. It looks great!
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>
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.
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.
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
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!
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!
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>