全志平臺他Tina系統linux4.9開啟調頻策略cpufreq後編譯錯誤問題
阿新 • • 發佈:2018-12-10
【適用範圍】
全志平臺他Tina系統linux4.9,Tina3.0.1-Tina3.0.3,再往後的版本應該修復了這個問題,此處以R331為例
【問題現象】
選中CPU Power Management 下的 CPU Frequency scaling和改目錄下的CPU驅動SUNXI CPUFreq support
編譯時報錯:
drivers/built-in.o: In function `sunxi_cpufreq_set_vf': /home/chenkunyao/workspace/tina2.0/atina/lichee/linux-4.9/drivers/cpufreq/sunxi-cpufreq.c:279: undefined reference to `arisc_dvfs_cfg_vf_table' make[5]: *** [vmlinux] Error 1 make[5]: Leaving directory `/home/chenkunyao/workspace/tina2.0/atina/lichee/linux-4.9' make[4]: *** [/home/chenkunyao/workspace/tina2.0/atina/out/bassoon-perf1/compile_dir/target/linux-bassoon-perf1/linux-4.9.56/.image] Error 2 make[4]: Leaving directory `/home/chenkunyao/workspace/tina2.0/atina/target/allwinner/bassoon-perf1' make[3]: *** [install] Error 2 make[3]: Leaving directory `/home/chenkunyao/workspace/tina2.0/atina/target/allwinner' make[2]: *** [target/allwinner/install] Error 2 make[2]: Leaving directory `/home/chenkunyao/workspace/tina2.0/atina' make[1]: *** [/home/chenkunyao/workspace/tina2.0/atina/out/bassoon-perf1/staging_dir/target/stamp/.target_install] Error 2 make[1]: Leaving directory `/home/chenkunyao/workspace/tina2.0/atina' make: *** [world] 錯誤 2 #### make failed to build some targets (14:35 (mm:ss)) ####
【問題原因】
沒打patch,cpufreq介面沒開
【解決方法】
linux4.9目錄下打上patch:
From XXXXXXXXXXXXXXXXX Mon Sep 17 00:00:00 2001
From: [email protected]
Date: Thu, 30 Aug 2018 09:45:55 +0800
Subject: [PATCH 89/92] sun8iw8p1: boobam_std: support dvfs
Change-Id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Signed-off-by: XXXXXX <[email protected] >
---
arch/arm/boot/dts/sun8iw8p1.dtsi | 74 ++++++++++++++++++++++++++++++++++++++++
drivers/cpufreq/sunxi-cpufreq.c | 9 ++---
2 files changed, 79 insertions(+), 4 deletions(-)
diff --git a/arch/arm/boot/dts/sun8iw8p1.dtsi b/arch/arm/boot/dts/sun8iw8p1.dtsi
index fa53820..3e1a09a 100644
--- a/arch/arm/boot/dts/sun8iw8p1.dtsi
+++ b/arch/arm/boot/dts/sun8iw8p1.dtsi
@@ -37,6 +37,7 @@
};
cpus {
+ enable-method = "allwinner,sun8iw8p1";
#address-cells = <1>;
#size-cells = <0>;
@@ -44,10 +45,83 @@
device_type = "cpu";
compatible = "arm,cortex-a7";
reg = <0x0>;
+ enable-method = "psci";
+ clocks = <&clk_pll_cpu>;
+ clock-latency = <2000000>;
+ clock-frequency = <1008000000>;
+ operating-points-v2 = <&cpu_opp_l_table0>;
+ /*cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0 &SYS_SLEEP_0>;*/
};
};
+ opp_dvfs_table:opp_dvfs_table {
+ cluster_num = <1>;
+ opp_table_count = <1>;
+
+ cpu_opp_l_table0: opp_l_table0 {
+ compatible = "allwinner,opp_l_table0";
+ opp_count = <8>;
+ opp-shared;
+
+ opp00 {
+ opp-hz = /bits/ 64 <60000000>;
+ opp-microvolt = <1040000>;
+ axi-bus-divide-ratio = <3>;
+ clock-latency-ns = <2000000>;
+ };
+
+ opp01 {
+ opp-hz = /bits/ 64 <480000000>;
+ opp-microvolt = <1040000>;
+ axi-bus-divide-ratio = <3>;
+ clock-latency-ns = <2000000>;
+ };
+
+ opp02 {
+ opp-hz = /bits/ 64 <648000000>;
+ opp-microvolt = <1040000>;
+ axi-bus-divide-ratio = <3>;
+ clock-latency-ns = <2000000>;
+ };
+
+ opp03 {
+ opp-hz = /bits/ 64 <720000000>;
+ opp-microvolt = <1100000>;
+ axi-bus-divide-ratio = <3>;
+ clock-latency-ns = <2000000>;
+ };
+
+ opp04 {
+ opp-hz = /bits/ 64 <816000000>;
+ opp-microvolt = <1100000>;
+ axi-bus-divide-ratio = <3>;
+ clock-latency-ns = <2000000>;
+ };
+
+ opp05 {
+ opp-hz = /bits/ 64 <912000000>;
+ opp-microvolt = <1200000>;
+ axi-bus-divide-ratio = <3>;
+ clock-latency-ns = <2000000>;
+ };
+
+ opp06 {
+ opp-hz = /bits/ 64 <1080000000>;
+ opp-microvolt = <1200000>;
+ axi-bus-divide-ratio = <3>;
+ clock-latency-ns = <2000000>;
+ };
+
+ opp07 {
+ opp-hz = /bits/ 64 <1200000000>;
+ opp-microvolt = <1320000>;
+ axi-bus-divide-ratio = <3>;
+ clock-latency-ns = <2000000>;
+ };
+ };
+ };
+
[email protected] {
device_type = "memory";
reg = <0x00000000 0x40000000 0x00000000 0x4000000>; /* 64M*/
diff --git a/drivers/cpufreq/sunxi-cpufreq.c b/drivers/cpufreq/sunxi-cpufreq.c
index ff74e07..f0480a2 100644
--- a/drivers/cpufreq/sunxi-cpufreq.c
+++ b/drivers/cpufreq/sunxi-cpufreq.c
@@ -188,8 +188,9 @@ static int sunxi_set_cpufreq_and_voltage(struct cpufreq_policy *policy,
struct device *cpu_dev;
cpu_dev = get_cpu_device(policy->cpu);
-
-
+#if defined(CONFIG_ARCH_SUN8IW8P1)
+ freq *= 1000;
+#endif
return dev_pm_opp_set_rate(cpu_dev, freq);
}
#endif
@@ -275,9 +276,9 @@ static int sunxi_cpufreq_set_vf(struct cpufreq_frequency_table *table,
memcpy((void *)kvir, (void *)cpufreq_dvfs_table,
num * sizeof(struct cpufreq_frequency_table));
__dma_flush_area((void *)kvir, num * sizeof(struct cpufreq_frequency_table));
-
+#ifndef CONFIG_ARCH_SUN8IW8P1
arisc_dvfs_cfg_vf_table(0, num, virt_to_phys(kvir));
-
+#endif
kfree(kvir);
kvir = NULL;
--
1.9.1
make kernel_menuconfig下的配置如下:
選中CPU Power Management 下的 CPU Frequency scaling
選中幾個需要的調頻策略,如:
userspace 根據使用者的選擇調節
往下拉把 CPU驅動SUNXI CPUFreq support選上。
重新編譯即可。
燒錄後檢視cpufreq節點:
cd /sys/devices/system/cpu/cpu0/cpufreq
檢視當前cpu頻率的辦法
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq