[PATCH v2 0/4] Add Rust abstractions for nvmem-provider
Link Mauve
linkmauve at linkmauve.fr
Wed Feb 4 15:04:57 AEDT 2026
Hi, this is my first foray in Rust in the kernel! I’m fairly used to
both Rust and the kernel, but not yet to both at the same time.
I wanted to try something simple before jumping to more advanced stuff
like DRM or V4L2 drivers, so I set on rewriting one of my old Wii
drivers in Rust.
I made sure there was no unsafe anywhere in the driver, and tried to
keep it to as few places as possible in the nvmem abstraction.
I’ve tested it on a Wii, using a downstream branch[1], plus the PowerPC
support patch[2], plus a terrible patch to make libcore not use integer
division on u64 or u128[3]. I’ve tested that the data I get out of this
driver result to the same data as the previous C driver.
Thanks for your time!
[1] https://github.com/Wii-Linux/wii-linux-ngx/commits/wii-mainline
[2] https://lore.kernel.org/rust-for-linux/20260204030507.8203-1-linkmauve@linkmauve.fr/T/
[3] https://linkmauve.fr/files/0001-XXX-Unimplement-core-fmt-on-u64-u128-and-Duration.patch
Changes since v1:
- Add Rust helpers to read and write as big endian.
- Set CONFIG_RUST=y in the Wii defconfig.
- Drop the patch to document nvmem-provider.h, this can go in a latter
series.
In the nvmem abstractions:
- Replace as pointer casts with .cast(), .cast_const() and .cast_mut().
- Replace NvmemConfig::set_*() with NvmemConfig::with_*() to allow the
builder pattern.
- Expose devm_nvmem_register() on Device instead of in NvmemConfig,
making it both more correct and more evident coming from C.
- Make it set priv, reg_read and reg_write, as those are managed by the
abstraction.
In the nintendo-otp driver:
- Add missing RUST depends
- Remove unnecessary reference to pdev in the driver.
- Simplify the loop using while let instead of break.
- Remove unnecessary Drop impl.
- Adapt to the NvmemConfig changes.
- Use c"" instead of c_str!().
- Correctly read and write as big endian.
- Keep a pinned reference to the iomem, otherwise the driver will crash
trying to access unmapped memory.
Link Mauve (4):
rust: io: Add big-endian read and write functions
rust: nvmem: Add an abstraction for nvmem providers
nvmem: Replace the Wii and Wii U OTP driver with a Rust one
powerpc: wii_defconfig: Enable Rust
arch/powerpc/configs/wii_defconfig | 1 +
drivers/nvmem/Kconfig | 1 +
drivers/nvmem/Makefile | 2 +-
drivers/nvmem/nintendo-otp.c | 122 ---------------------
drivers/nvmem/nintendo_otp.rs | 127 ++++++++++++++++++++++
rust/bindings/bindings_helper.h | 1 +
rust/helpers/io.c | 34 ++++++
rust/kernel/io.rs | 18 ++++
rust/kernel/lib.rs | 2 +
rust/kernel/nvmem.rs | 163 +++++++++++++++++++++++++++++
10 files changed, 348 insertions(+), 123 deletions(-)
delete mode 100644 drivers/nvmem/nintendo-otp.c
create mode 100644 drivers/nvmem/nintendo_otp.rs
create mode 100644 rust/kernel/nvmem.rs
--
2.52.0
More information about the Linuxppc-dev
mailing list