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/[email protected]/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
