长时间的听众,第一次打电话的人。
我一直在向后移植上游代码的特性,直到4.12-rc-无论是什么,对于一个更老的高通SoC主板(apq8064,我知道这是一项荒谬的任务)来说,都是3.4基础的内核。
到目前为止,我在几乎所有的核心api上都取得了成功,除了cpufreq之外,所有的兼容性问题都是通过创造性的垫片和ducttape来解决的。
请记住,我仍然在使用传统的平台驱动程序和时钟,没有dt或公共时钟框架。
我的问题始于将struct包含到struct中,作为cpufreq_policy中从percpu到per-policy的转变的一部分。在3.13中,注册平台的freq_table对于特殊情况变得更加困难,因为使用cpufreq_frequency_table_get_attr不再是一个选项。
在我的例子中,cpufreq_ driver的初始化是通用的,并且依赖于我的平台的缩放驱动程序(acpuclock-krait)来注册freq_table,这对于较旧的api来说很好,但是与每个策略的设置不兼容。上游的so i需要驱动程序手动初始化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);
}发布于 2017-05-28 06:28:52
更新!我想在合并所有核心更改之前更新初始注册,并且我非常确定我已经这样做了。以前,有问题的数组引用了一个看起来像这样的percpu虚拟数组: freq_tableNR_CPUS,它要求cpu参数作为表的一部分列出。我在这里做了一些更改,允许我进行percpu设置和特定于平台的freq管理( cpufreq不需要看到它),但使用了一个表示"index“的虚拟表,cpufreq确实需要看到它。Commit在这里,下一个修复了明显的错误:https://github.com/robcore/machinex/commit/59d7e5307104c2396a2e4c2a5e0b07f950dea10f
https://stackoverflow.com/questions/44220857
复制相似问题