2017-05-27 1 views
0

écouteur de longue durée, appelant pour la première fois. J'ai remonté les fonctionnalités du code en amont aussi récent que 4.12-rc-quel que soit un noyau 3.4-base pour une vieille carte SoC Qualcomm (apq8064, entreprise ridicule que je connais). Jusqu'ici j'ai réussi dans presque toutes les API de base, avec des problèmes de compatibilité résolus par des shims créatifs et ducttape, à l'exception de cpufreq. Gardez à l'esprit que je suis toujours en train d'utiliser des pilotes de plate-forme hérités et de faire des pointages, de ne pas utiliser de base de données ou d'horloge commune.Réécriture de l'initialisation cpufreq_frequency_table pour l'ancien pilote cpufreq

Mon problème commence par l'inclusion de stuct cpufreq_frequency_table dans struct cpufreq_policy, dans le cadre du passage de percpu à per-policy dans l'API. En 3.13, enregistrer freq_table d'une plate-forme devient plus difficile pour les cas uniques, car l'utilisation de cpufreq_frequency_table_get_attr n'est plus une option. Dans mon cas, l'init de cpufreq_driver est générique, et repose sur le pilote de mise à l'échelle de ma plateforme (acpuclock-krait) pour enregistrer la table freq_table, ce qui est bien pour l'ancienne API, mais devient incompatible avec l'installation par politique. L'amont donc je demande au pilote d'initialiser manuellement la politique-> freq_table et le mien utilise à la fois un cpu, et un tableau de 35 représentant les tables dans le code de la plate-forme. De même, il prend en compte les 6 valeurs différentes de speedbin/pvs lors du choix d'une table. J'envisage soit d'abandonner le paramètre "cpu" et d'utiliser cpumask_copy, et peut-être même de combiner les deux pilotes en un et de faire de l'horloge une sonde, mais oui, jusqu'ici init est un mystère pour moi. Voici l'extrait de mon inscription de table, si quelqu'un peut penser à quelque chose abrégeable, je serais éternellement reconnaissant ...

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); 
} 

Répondre

0

MISE A JOUR !!! Je voulais mettre à jour l'enregistrement initial avant de fusionner tous les changements de base, et je suis assez certain que je l'ai fait. Auparavant, le tableau en question faisait référence à un tableau fictif de percpu ressemblant à ceci: freq_table [NR_CPUS] [35] qui nécessitait que le paramètre cpu soit répertorié comme faisant partie de la table. J'ai fait quelques changements ici qui me permettent une installation de percpu ET la gestion de freq spécifique à la plate-forme (que cpufreq n'a pas besoin de voir), mais avec une table fictive représentant l '"index" que cpufreq doit voir. Commit est ici, la prochaine a fixé des erreurs évidentes: https://github.com/robcore/machinex/commit/59d7e5307104c2396a2e4c2a5e0b07f950dea10f