Re: [PATCH v4 0/2] cpufreq: spacemit: Add cpufreq support for K1 SoC

From: Aurelien Jarno

Date: Sun Jun 28 2026 - 13:08:26 EST


Hi Shuwei,

On 2026-06-26 16:10, Shuwei Wu wrote:
> This series enables CPU DVFS for the SpacemiT K1 SoC using the generic
> cpufreq-dt driver.
>
> K1 has two CPU clock clusters. The two clusters have separate CPU clocks,
> so they are represented as two cpufreq policies: policy0 for CPUs 0-3 and
> policy4 for CPUs 4-7.
>
> The CPU voltage rail is shared between the clusters. To model this with two
> policies, the OPP entries describe voltage ranges instead of a single fixed
> voltage, so the shared regulator can keep the rail within a range acceptable
> for the active OPP constraints.
>
> Tested on Banana Pi BPI-F3:
>
> ~ # cat /sys/devices/system/cpu/online
> 0-7
>
> ~ # ls /sys/devices/system/cpu/cpufreq/
> policy0 policy4
>
> ~ # cat /sys/devices/system/cpu/cpufreq/policy0/scaling_driver
> cpufreq-dt
> ~ # cat /sys/devices/system/cpu/cpufreq/policy0/affected_cpus
> 0 1 2 3
>
> ~ # cat /sys/devices/system/cpu/cpufreq/policy4/scaling_driver
> cpufreq-dt
> ~ # cat /sys/devices/system/cpu/cpufreq/policy4/affected_cpus
> 4 5 6 7
>
> Both policies expose the same OPP frequencies:
>
> ~ # cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies
> 614400 819000 1000000 1228800 1600000
>
> ~ # cat /sys/devices/system/cpu/cpufreq/policy4/scaling_available_frequencies
> 614400 819000 1000000 1228800 1600000
>
> For each policy, scaling_setspeed was set to each supported OPP and the
> workload was pinned to one CPU covered by that policy with taskset.
> CPU0 was used for policy0, and CPU4 was used for policy4. The clock rates below
> are from /sys/kernel/debug/clk/clk_summary.
>
> policy0 / CPU0:
> ----------------------------------------------------------
> Frequency | cpu_c0_core_clk | Real (s) | User (s)
> (kHz) | (Hz) | |
> -------------+-------------------+------------+-----------
> 1,600,000 | 1,600,000,000 | 1.81 | 1.80
> 1,228,800 | 1,228,800,000 | 2.37 | 2.37
> 1,000,000 | 1,000,000,000 | 2.89 | 2.89
> 819,000 | 819,200,000 | 3.56 | 3.55
> 614,400 | 614,400,000 | 4.71 | 4.71
> ----------------------------------------------------------
>
> policy4 / CPU4:
> ----------------------------------------------------------
> Frequency | cpu_c1_core_clk | Real (s) | User (s)
> (kHz) | (Hz) | |
> -------------+-------------------+------------+-----------
> 1,600,000 | 1,600,000,000 | 1.81 | 1.80
> 1,228,800 | 1,228,800,000 | 2.36 | 2.36
> 1,000,000 | 1,000,000,000 | 2.89 | 2.89
> 819,000 | 819,200,000 | 3.55 | 3.55
> 614,400 | 614,400,000 | 4.71 | 4.70
> ----------------------------------------------------------
>
> Signed-off-by: Shuwei Wu <shuwei.wu@xxxxxxxxxxx>
> ---
> Changes in v4:
> - Represent K1 as two cpufreq-dt policies, one per CPU clock cluster
> - Use OPP voltage ranges for the shared CPU supply
> - Link to v3: https://lore.kernel.org/r/20260612-shadow-deps-v3-0-2f3ba88611ff@xxxxxxxxxxx
>
> Changes in v3:
> - Add a K1-specific cpufreq driver for the shared-rail, dual-clock topology
> - Use one shared CPU OPP table and one cpufreq policy for all CPUs
> - Link to v2: https://lore.kernel.org/r/20260410-shadow-deps-v2-0-4e16b8c0f60e@xxxxxxxxxxx
>
> Changes in v2:
> - Move OPP tables to dedicated k1-opp.dtsi
> - Enable OPP only on BPI-F3 with cpu-supply present
> - Link to v1: https://lore.kernel.org/r/20260308-shadow-deps-v1-0-0ceb5c7c07eb@xxxxxxxxxxx
>
> ---
> Shuwei Wu (2):
> cpufreq: dt-platdev: Add SpacemiT K1 SoC to the allowlist
> riscv: dts: spacemit: Add cpu scaling for K1 SoC
>
> arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts | 35 +++++++-
> arch/riscv/boot/dts/spacemit/k1-opp.dtsi | 105 ++++++++++++++++++++++++
> arch/riscv/boot/dts/spacemit/k1.dtsi | 8 ++
> drivers/cpufreq/cpufreq-dt-platdev.c | 2 +
> 4 files changed, 149 insertions(+), 1 deletion(-)

Thanks for this new version. I have tested it successfully on a Banana
Pi BPI-F3. The CPU clock and voltages you have defined match the vendor
version. Therefore for both commits:

Tested-by: Aurelien Jarno <aurelien@xxxxxxxxxxx>
Reviewed-by: Aurelien Jarno <aurelien@xxxxxxxxxxx>

BTW, I have done a few additional research on the discussion we got on
an earlier version of this patchset. On all the SpacemiT K1 boards, the
output of buck1 and buck2 are connected together, so there is the
question about what do do with voltage of buck2. We discussed about
marking buck1 and buck2 as coupled through regulator-coupled-with.

It appears that buck1 and buck2 are configured in "Dual-Phase Mode" as
the bit BUCK_12_DUAL (bit 0) of register BUCK_LDO_CFG (reg 0x46) of the
P1 chip. I haven't found any code changing it in the kernel or U-Boot,
so I guess the value is configured as default in the MTP. The datasheet
is not clear about what controls the voltage in Dual-Phase Mode, but
given both U-Boot and kernel code (vendor or upstream) only change the
voltage of buck1, it makes sense that there is no need to change the
voltage of buck2 in that mode. And it also sounds logic given that the
P1 chip is aware of the coupling.

I therefore believe there is not need to mark buck1 and buck2 as
coupled, and that your patch is fully correct on that aspect.

Regards
Aurelien

--
Aurelien Jarno GPG: 4096R/1DDD8C9B
aurelien@xxxxxxxxxxx http://aurel32.net