重写传统cpufreq_driver的cpufreq_frequency_table初始化

重写传统cpufreq_driver的cpufreq_frequency_table初始化

问题描述:

长时间侦听器,第一次调用者。重写传统cpufreq_driver的cpufreq_frequency_table初始化

我已经从上游代码向4.12-rc-无论是旧版Qualcomm SoC板(apq8064,我认识的荒谬事业)的3.4-base内核反向移植功能。

到目前为止,我几乎在每一个核心api上都取得了成功,除了cpufreq之外,任何兼容性问题都可以通过创意垫片和ducttape解决。

请记住,我仍在使用传统的平台驱动程序和时钟,没有dt或常见的时钟帧工作。

我的问题始于将cpufreq_frequency_table添加到struct cpufreq_policy中,作为从percpu到api中每个策略的一部分。在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,甚至可能将两个驱动程序合并为一个,并将时钟驱动程序作为探测器,但是,迄今为止init对我来说是一个谜。这里是我的表登记的片段,如果有人能想出破解的,我会永远感激......

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 dummy数组:freq_table [NR_CPUS] [35],它要求将cpu参数列为表的一部分。我在这里做了一些改变,允许我设置percpu和特定于平台的freq管理(cpufreq不需要查看),但是有一个代表“cpufreq”需要查看的“索引”的虚拟表。承诺在这里,下一个修复明显的错误:https://github.com/robcore/machinex/commit/59d7e5307104c2396a2e4c2a5e0b07f950dea10f