Linux CCF、OPP、CPU Idle 与 Suspend¶
Common Clock Framework¶
CCF 把 Clock 表示为有父子关系的 clk_hw,Provider 注册 PLL/Mux/Divider/Gate,Consumer 通过 Device Tree Clock Specifier 获取。prepare/unprepare 可睡眠,enable/disable 用于不可睡眠的快速 Gate,驱动通常调用组合接口。
cru: clock-controller@10000000 {
compatible = "vendor,soc-cru";
reg = <0x0 0x10000000 0x0 0x10000>;
#clock-cells = <1>;
};
uart0: serial@11000000 {
compatible = "vendor,soc-uart";
clocks = <&cru CLK_UART0_BUS>, <&cru CLK_UART0_CORE>;
clock-names = "bus", "core";
};
Provider 的 recalc_rate 读取硬件得到实际频率,round_rate/determine_rate 选择可实现频率,set_rate 按安全顺序修改。共享父时钟 Rate 改变会影响多个 Consumer,CCF 需传播或阻止不兼容请求。
OPP 与 cpufreq¶
opp-table {
compatible = "operating-points-v2";
opp-800000000 { opp-hz = /bits/ 64 <800000000>; opp-microvolt = <800000>; };
opp-1600000000 { opp-hz = /bits/ 64 <1600000000>; opp-microvolt = <950000>; };
};
升频路径先请求 Regulator 到目标电压并等待 Settling,再改 PLL/Divider;降频相反。错误回退要恢复一致的电压频率组合。Governor 根据负载选择 OPP,Thermal Cooling Device 可限制最大状态。
CPU Idle¶
浅状态通常只执行 WFI,Clock 停止、唤醒快;深状态可能经 PSCI CPU_SUSPEND 关闭 Core/Cluster 电源,丢失本地状态并依赖 Firmware Resume Entry。每个 Idle State 描述 Entry/Exit Latency 和 Minimum Residency,Governor 只有在预计空闲足够长时才选择深状态。
Suspend-to-RAM¶
sequenceDiagram
participant K as Kernel
participant D as Device drivers
participant F as Firmware/PMU
K->>D: freeze and suspend devices
D->>D: stop DMA, arm wake sources
K->>K: offline secondary CPUs
save interrupt/time state
K->>F: PSCI SYSTEM_SUSPEND
F->>F: DDR self-refresh
isolate and power down
F-->>K: wake at resume entry
K->>K: restore CPU/GIC/time
K->>D: resume devices
Suspend 失败要区分“不进入”和“不能恢复”。前者查 Wakeup Source 持续 Pending、设备 Busy 和冻结失败;后者查 Resume Vector、DDR、Clock/Power/Isolation 与早期 Console。