Skip to main content

CPUFREQ

介绍 K3 SoC CPUFREQ 的功能和使用方法。

模块介绍

CPUFREQ 子系统负责在 CPU 运行时通过动态调整 CPU 运行频率与电压,在确保性能需求的前提下,将功耗降至最低。

功能介绍

  1. cpufreq core: cpufreq framework 的核心模块,它主要实现三类功能:
    • 抽象调频调压的公共逻辑接口
    • 以 sysfs 的形式向用户空间提供统一的接口,以 notifier 的形式向其他 driver 提供频率变化的通知
    • 提供CPU频率和电压控制的驱动框架
  2. cpufreq governor: 负责调频调压的各种策略
  3. cpufreq driver: 负责平台相关调频调压机制的实现
  4. cpufreq stats: 负责调频信息和各频点运行事件统计,提供每个CPU的cpufreq有关的统计信息

源码结构介绍

CPU 调频平台驱动目录如下:

drivers/cpufreq/
├── cpufreq.c
├── cpufreq_conservative.c
├── cpufreq-dt.c
├── cpufreq-dt.h
├── cpufreq-dt-platdev.c
├── cpufreq_governor_attr_set.c
├── cpufreq_governor.c
├── cpufreq_governor.h
├── cpufreq_ondemand.c
├── cpufreq_ondemand.h
├── cpufreq_performance.c
├── cpufreq_powersave.c
├── cpufreq_stats.c
├── cpufreq_userspace.c
├── freq_table.c
├── spacemit-k3-cpufreq.c --> K3 平台驱动

关键特性

特性

特性特性说明
支持动态调频调压实时根据负载切换频率与电压
双 Cluster 独立调频X100 和 A100 Cluster 各自独立调频,互不影响
X100 最高频点 2.4 GHzX100 Cluster 最高 OPP 为 2.4 GHz

K3 CPU 拓扑结构

K3 SoC 采用 16 核异构设计,包含两个 CPU Cluster:

Cluster核心核心型号频率范围电压调节
X100 Clustercpu_0 ~ cpu_7Spacemit X100614.4 MHz ~ 2.4 GHz支持
A100 Clustercpu_8 ~ cpu_15Spacemit A100614.4 MHz ~ 2.0 GHz不支持

两个 Cluster 各自拥有独立的 OPP(Operating Performance Points)表和时钟源,可独立调频。

性能参数

X100 Cluster(cpu_0 ~ cpu_7)OPP 表

频率电压
2400000000 Hz1.00 V
2300000000 Hz0.88 V
2200000000 Hz0.88 V
2150000000 Hz0.88 V
2100000000 Hz0.88 V
2000000000 Hz0.88 V
1900000000 Hz0.88 V
1850000000 Hz0.88 V
1800000000 Hz0.88 V
1700000000 Hz0.88 V
1600000000 Hz0.88 V
1500000000 Hz0.85 V
1400000000 Hz0.85 V
1300000000 Hz0.85 V
1200000000 Hz0.85 V
1100000000 Hz0.85 V
1000000000 Hz0.80 V
819200000 Hz0.80 V
614400000 Hz0.80 V

A100 Cluster(cpu_8 ~ cpu_15)OPP 表

频率
2000000000 Hz
1900000000 Hz
1850000000 Hz
1800000000 Hz
1700000000 Hz
1600000000 Hz
1500000000 Hz
1400000000 Hz
1300000000 Hz
1200000000 Hz
1100000000 Hz
1000000000 Hz
819200000 Hz
614400000 Hz

测试方法

  1. 将策略修改成 userspace 模式

    echo userspace > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
  2. 查看所支持的频率列表

    cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies
  3. 设置 CPU 频率

    echo 1600000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed
  4. 查看频率是否设置成功

    cat /sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq
  5. 对 A100 Cluster 进行同样操作

    echo userspace > /sys/devices/system/cpu/cpufreq/policy8/scaling_governor
    cat /sys/devices/system/cpu/cpufreq/policy8/scaling_available_frequencies
    echo 1200000 > /sys/devices/system/cpu/cpufreq/policy8/scaling_setspeed
    cat /sys/devices/system/cpu/cpufreq/policy8/scaling_cur_freq

配置介绍

主要包括 驱动使能配置DTS 配置

CONFIG 配置

CPUFREQ 配置如下:

CONFIG_SPACEMIT_K3_CPUFREQ:

This adds the CPUFreq driver support for Spacemit K3 SoC
which are capable of changing the CPU's frequency dynamically.

Symbol: SPACEMIT_K3_CPUFREQ [=y]
Type : tristate
Defined at drivers/cpufreq/Kconfig:256
Prompt: CPU frequency scaling driver for Spacemit K1X
Depends on: CPU_FREQ [=y] && OF [=y] && COMMON_CLK [=y]
Location:
-> CPU Power Management
-> CPU Frequency scaling
-> CPU Frequency scaling (CPU_FREQ [=y])
-> CPU frequency scaling driver for Spacemit K1X (SPACEMIT_K3_CPUFREQ [=y])
Selects: CPUFREQ_DT [=y] && CPUFREQ_DT_PLATDEV [=y]

DTS 配置

完整 OPP 表位于 arch/riscv/boot/dts/spacemit/k3_opp_table.dtsi

该文件定义了两个 OPP 表:

  • clst_core_opp_table0_x100:X100 Cluster 的 OPP 表,包含 19 个频率档位(614.4 MHz ~ 2.4 GHz),配置了 opp-microvolt 电压参数
  • clst_core_opp_table0_a100:A100 Cluster 的 OPP 表,包含 14 个频率档位(614.4 MHz ~ 2.0 GHz),无电压参数

各 CPU 节点的时钟和 OPP 表绑定在 k3_opp_table.dtsi 中完成:

/* X100 Cluster: cpu_0 ~ cpu_7 */
&cpu_0 {
clst-supply = <&edcdc1>;
clocks = <&syscon_apmu CLK_APMU_CPU_C0_CORE>, <&syscon_apmu CLK_APMU_CPU_C1_CORE>;
clock-names = "cls0", "cls1";
operating-points-v2 = <&clst_core_opp_table0_x100>;
};

/* A100 Cluster: cpu_8 ~ cpu_15 */
&cpu_8 {
clocks = <&syscon_apmu CLK_APMU_CPU_C2_CORE>, <&syscon_apmu CLK_APMU_CPU_C3_CORE>;
clock-names = "cls0", "cls1";
operating-points-v2 = <&clst_core_opp_table0_a100>;
};

OPP 表中还配置了 PLL 时钟源,用于驱动在调频时切换 PLL:

opp_table0_x100 {
compatible = "operating-points-v2";
opp-shared;
clocks = <&pll CLK_PLL3>, <&pll CLK_PLL4>, <&pll CLK_PLL3_D1>, <&syscon_apmu CLK_APMU_CPU_C1_PLL_SRC>;
clock-names = "pll_clst0", "pll_clst1", "pll_src", "clt_pll_src";
...
};

Debug 介绍

sysfs

X100 Cluster 节点位于:/sys/devices/system/cpu/cpufreq/policy0/
A100 Cluster 节点位于:/sys/devices/system/cpu/cpufreq/policy8/

节点作用说明
affected_cpus, related_cpus查看该 policy 关联的 CPU 核心
scaling_governor当前生效的调频策略
scaling_available_frequencies查看系统支持的频率点
scaling_max_freq软件允许的最大频率限制
cpuinfo_cur_freqCPU 硬件实时频率
scaling_available_governors查看系统支持的策略
scaling_min_freq软件允许的最小频率限制
cpuinfo_max_freq硬件支持的最大频率
scaling_setspeeduserspace 模式下设置 CPU 频率的接口
cpuinfo_min_freq硬件支持的最小频率
scaling_cur_freq查看当前 CPU 运行频率
scaling_driver当前 CPU 调频驱动的名称

测试介绍

测试调频调压,可以按照上述 "测试方法" 循环测试设置不同频率的正确性。

FAQ