长时间的聆听者,首次呼叫者。
我一直在将功能从4.12 rc的上游代码反向移植到旧版Qualcomm SoC板的3.4基础内核(apq8064,我知道这很可笑)。
到目前为止,除cpufreq以外,我几乎在所有核心api上都取得了成功,通过创造性的垫片和风琴胶带解决了任何兼容性问题。
请记住,我仍在使用旧版平台驱动程序和时钟,没有dt或通用时钟框架。
我的问题始于将结构cpufreq_frequency_table包含在struct cpufreq_policy中,这是api中从percpu转向per-policy的一部分。在3.13中,由于特殊情况,注册平台的freq_table变得更加困难,因为不再使用cpufreq_frequency_table_get_attr。
在我的情况下,cpufreq_driver的init是通用的,并且依赖于我平台的缩放驱动程序(acpuclock-krait)来注册freq_table,这对于较旧的api很好,但是与每个策略设置不兼容。在上游,因此我需要驱动程序手动初始化policy-> freq_table,而我使用了cpu和代表平台代码中表的35个数组。同样,在选择表格时,它也考虑了6个不同的speedbin / pvs值。我正在考虑要么从中删除“ cpu”参数,然后使用cpumask_copy,甚至可能将两个驱动程序组合为一个并将时钟驱动程序作为探针,但是,是的,到目前为止,对于我来说,这是一个谜。这是我的表注册的片段,如果有人能想到可入侵的东西,我将永远感激不已...
ifdef CONFIG_CPU_FREQ_MSM
static struct cpufreq_frequency_table.freq_table[NR_CPUS][35];
extern int console_batt_stat;
static void __init cpufreq_table_init(void)
{
int cpu;
int freq_cnt = 0;
for_each_possible_cpu(cpu) {
int i;
/* Construct the freq_table tables from acpu_freq_tbl. */
for (i = 0, freq_cnt = 0; drv.acpu_freq_tbl[i].speed.khz != 0
&& freq_cnt < ARRAY_SIZE(*freq_table)-1; i++) {
if (drv.acpu_freq_tbl[i].use_for_scaling) {
freq_table[cpu][freq_cnt].index = freq_cnt;
freq_table[cpu][freq_cnt].frequency
= drv.acpu_freq_tbl[i].speed.khz;
freq_cnt++;
}
}
/* freq_table not big enough to store all usable freqs. */
BUG_ON(drv.acpu_freq_tbl[i].speed.khz != 0);
freq_table[cpu][freq_cnt].index = freq_cnt;
freq_table[cpu][freq_cnt].frequency = CPUFREQ_TABLE_END;
/* Register table with CPUFreq. */
cpufreq_frequency_table_get_attr(freq_table[cpu], cpu);
}
dev_info(drv.dev, "CPU Frequencies Supported: %d\n", freq_cnt);
}
最佳答案
更新!!!在合并所有核心更改之前,我想更新初始注册,并且可以肯定的是,我已经这样做了。以前,有问题的数组引用了一个如下所示的percpu虚拟数组:freq_table [NR_CPUS] [35],要求将cpu参数列为表的一部分。我在这里进行了一些更改,使我可以进行percpu设置以及特定于平台的频率管理(cpufreq不需要查看),但是具有一个代表“索引”的虚拟表,cpufreq确实需要查看。提交在这里,下一个固定的明显错误:https://github.com/robcore/machinex/commit/59d7e5307104c2396a2e4c2a5e0b07f950dea10f
关于c - 为旧版cpufreq_driver重写cpufreq_frequency_table初始化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44220857/