[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <aEoWtviFl0vYATXe@x1>
Date: Wed, 11 Jun 2025 16:52:22 -0700
From: Drew Fustini <drew@...7.com>
To: Michal Wilczynski <m.wilczynski@...sung.com>
Cc: Uwe Kleine-König <ukleinek@...nel.org>,
Miguel Ojeda <ojeda@...nel.org>,
Alex Gaynor <alex.gaynor@...il.com>,
Boqun Feng <boqun.feng@...il.com>, Gary Guo <gary@...yguo.net>,
Björn Roy Baron <bjorn3_gh@...tonmail.com>,
Andreas Hindborg <a.hindborg@...nel.org>,
Alice Ryhl <aliceryhl@...gle.com>, Trevor Gross <tmgross@...ch.edu>,
Danilo Krummrich <dakr@...nel.org>, Guo Ren <guoren@...nel.org>,
Fu Wei <wefu@...hat.com>, Rob Herring <robh@...nel.org>,
Krzysztof Kozlowski <krzk+dt@...nel.org>,
Conor Dooley <conor+dt@...nel.org>,
Paul Walmsley <paul.walmsley@...ive.com>,
Palmer Dabbelt <palmer@...belt.com>,
Albert Ou <aou@...s.berkeley.edu>, Alexandre Ghiti <alex@...ti.fr>,
Marek Szyprowski <m.szyprowski@...sung.com>,
Benno Lossin <lossin@...nel.org>,
Michael Turquette <mturquette@...libre.com>,
Stephen Boyd <sboyd@...nel.org>, linux-kernel@...r.kernel.org,
linux-pwm@...r.kernel.org, rust-for-linux@...r.kernel.org,
linux-riscv@...ts.infradead.org, devicetree@...r.kernel.org,
linux-clk@...r.kernel.org
Subject: Re: [PATCH v2 0/7] Rust Abstractions for PWM subsystem with TH1520
PWM driver
On Wed, Jun 11, 2025 at 05:14:40PM +0200, Michal Wilczynski wrote:
>
>
> On 6/10/25 23:10, Drew Fustini wrote:
> > On Tue, Jun 10, 2025 at 02:52:48PM +0200, Michal Wilczynski wrote:
> >> This patch series introduces Rust support for the T-HEAD TH1520 PWM
> >> controller and demonstrates its use for fan control on the Sipeed Lichee
> >> Pi 4A board.
> >>
> >> The primary goal of this patch series is to introduce a basic set of
> >> Rust abstractions for the Linux PWM subsystem. As a first user and
> >> practical demonstration of these abstractions, the series also provides
> >> a functional PWM driver for the T-HEAD TH1520 SoC. This allows control
> >> of its PWM channels and ultimately enables temperature controlled fan
> >> support for the Lichee Pi 4A board. This work aims to explore the use of
> >> Rust for PWM drivers and lay a foundation for potential future
> >> Rust based PWM drivers.
> >>
> >> The core of this series is a new rust/kernel/pwm.rs module that provides
> >> abstractions for writing PWM chip provider drivers in Rust. This has
> >> been significantly reworked from v1 based on extensive feedback. The key
> >> features of the new abstraction layer include:
> >>
> >> - Ownership and Lifetime Management: The pwm::Chip wrapper is managed
> >> by ARef, correctly tying its lifetime to its embedded struct device
> >> reference counter. Chip registration is handled by a pwm::Registration
> >> RAII guard, which guarantees that pwmchip_add is always paired with
> >> pwmchip_remove, preventing resource leaks.
> >>
> >> - Modern and Safe API: The PwmOps trait is now based on the modern
> >> waveform API (round_waveform_tohw, write_waveform, etc.) as recommended
> >> by the subsystem maintainer. It is generic over a driver's
> >> hardware specific data structure, moving all unsafe serialization logic
> >> into the abstraction layer and allowing drivers to be written in 100%
> >> safe Rust.
> >>
> >> - Ergonomics: The API provides safe, idiomatic wrappers for other PWM
> >> types (State, Args, Device, etc.) and uses standard kernel error
> >> handling patterns.
> >>
> >> The series is structured as follows:
> >> - Rust PWM Abstractions: The new safe abstraction layer.
> >> - TH1520 PWM Driver: A new Rust driver for the TH1520 SoC, built on
> >> top of the new abstractions.
> >> - Clock Fix: A necessary fix to the TH1520 clock driver to ensure bus
> >> clocks remain enabled.
> >> - Device Tree Bindings & Nodes: The remaining patches add the necessary
> >> DT bindings and nodes for the TH1520 PWM controller, a thermal
> >> sensor, and the PWM fan configuration for the Lichee Pi 4A board.
> >>
> >> Testing:
> >> Tested on the TH1520 SoC. The fan works correctly. The duty/period
> >> calculaties are correct. Fan starts slow when the chip is not hot and
> >> gradually increases the speed when PVT reports higher temperatures.
> >>
> >> The patches are based on mainline, with some dependencies which are not
> >> merged yet - platform Io support [1] and math wrapper [2].
> >>
> >> Reference repository with all the patches together can be found on
> >> github [3].
> >
> > I'm trying to build your rust-next-pwm-working-fan-for-sending-v4 branch
> > but I get this error:
> >
> > $ make W=1 LLVM=1 ARCH=riscv -j16
> > CALL scripts/checksyscalls.sh
> > .pylintrc: warning: ignored by one of the .gitignore files
> > UPD include/generated/utsversion.h
> > CC init/version-timestamp.o
> > KSYMS .tmp_vmlinux0.kallsyms.S
> > AS .tmp_vmlinux0.kallsyms.o
> > LD .tmp_vmlinux1
> > ld.lld: error: undefined symbol: rust_build_error
> > referenced by pwm_th1520.4789668fc0b4e501-cgu.0
> > drivers/pwm/pwm_th1520.o:(<pwm_th1520::Th1520PwmDriverData as kernel::pwm::PwmOps>::get_state) in archive vmlinux.a
> > referenced by pwm_th1520.4789668fc0b4e501-cgu.0
> > drivers/pwm/pwm_th1520.o:(<pwm_th1520::Th1520PwmDriverData as kernel::pwm::PwmOps>::write_waveform) in archive vmlinux.a
> > referenced by pwm_th1520.4789668fc0b4e501-cgu.0
> > drivers/pwm/pwm_th1520.o:(<pwm_th1520::Th1520PwmDriverData as kernel::pwm::PwmOps>::write_waveform) in archive vmlinux.a
> > make[2]: *** [scripts/Makefile.vmlinux:91: vmlinux] Error 1
> > make[1]: *** [/home/pdp7/linux/Makefile:1241: vmlinux] Error 2
> > make: *** [Makefile:248: __sub-make] Error 2
>
> Hi,
>
> Thanks for testing !
> I can reproduce the issue with your config.
>
> The root of the problem was a failing compile time assertion
> (build_assert!) in the underlying Rust abstracions, I think IoMem since
> get_state and write_waveform functions are impacted. My development
> configuration was accidentally hiding this issue, but your configuration
> correctly exposed it.
>
> The kernel config option that is different on my setup is:
> CONFIG_RUST_BUILD_ASSERT_ALLOW=y
Thanks for the explanation. I wanted to see how far I could get so I
also have set CONFIG_RUST_BUILD_ASSERT_ALLOW=y for now.
I also enabled the pwm fan driver. However, there is a probe failure:
[ 1.250921] pwm-fan pwm-fan: Failed to configure PWM: -524
[ 1.256546] pwm-fan pwm-fan: probe with driver pwm-fan failed with error -524
This seems to be the result `set_pwm(ctx, initial_pwm)` failing.
It seems like the TH1520 PWM driver loaded okay:
# cat /sys/class/pwm/pwmchip0/npwm
6
# ls -l /sys/class/pwm/pwmchip0/device
lrwxrwxrwx 1 root root 0 Jun 12 07:37 /sys/class/pwm/pwmchip0/device -> ../../../ffec01c000.pwm
# ls -l /sys/class/pwm/pwmchip0/device/driver
lrwxrwxrwx 1 root root 0 Feb 28 2023 /sys/class/pwm/pwmchip0/device/driver -> ../../../../bus/platform/drivers/pwm-th1520
I'm using your mwilczy/rust-next-pwm-working-fan-for-sending-v4 branch:
7ec07c93dbac riscv: dts: thead: Add PWM fan and thermal control
c8a6138b2a13 riscv: dts: thead: Add PVT node
14e2f1bfd26b riscv: dts: thead: Add PWM controller node
afe06057030e dt-bindings: pwm: thead: Add T-HEAD TH1520 PWM controller
fe75d1ab60c9 clk: thead: Mark essential bus clocks as CLK_IGNORE_UNUSED
47dc6a551376 pwm: Add Rust driver for T-HEAD TH1520 SoC
9370bdd31cdc rust: Add basic PWM abstractions
f077d5bf0be8 Rust Abstractions for PWM subsystem with TH1520 PWM driver
f153d0d0221f rust: math: Add KernelMathExt trait with a mul_div helper
51c4a2e7d48a Fix for Device<Bound>
4847fa4f7ac8 rust: platform: allow ioremap of platform resources
929c56df82e5 rust: io: mem: add a generic iomem abstraction
09dfabb4677c rust: io: add resource abstraction
I uploaded the kconfig [1] and boot log [2]. Any ideas?
Thanks,
Drew
[1] https://gist.github.com/pdp7/58ca1f543898daeb281c013facb79aed
[2] https://gist.github.com/pdp7/e263b1b928a17d499f94fa5be7b3a7f8
Powered by blists - more mailing lists