1103285Sikob.. SPDX-License-Identifier: GPL-2.0 2113584Ssimokawa 3103285Sikob.. include:: ../disclaimer-zh_CN.rst 4103285Sikob 5103285Sikob:Original: Documentation/cpu-freq/cpu-drivers.rst 6103285Sikob 7103285Sikob:������: 8103285Sikob 9103285Sikob ��������� Yanteng Si <siyanteng@loongson.cn> 10103285Sikob 11103285Sikob:������: 12103285Sikob 13103285Sikob ��������� Tang Yizhou <tangyeechou@gmail.com> 14103285Sikob 15103285Sikob======================================= 16103285Sikob������������������������CPUFreq������������������������ 17103285Sikob======================================= 18103285Sikob 19103285Sikob������: 20103285Sikob 21103285Sikob 22103285Sikob - Dominik Brodowski <linux@brodo.de> 23103285Sikob - Rafael J. Wysocki <rafael.j.wysocki@intel.com> 24103285Sikob - Viresh Kumar <viresh.kumar@linaro.org> 25103285Sikob 26103285Sikob.. Contents 27103285Sikob 28103285Sikob 1. ������������ 29103285Sikob 1.1 ��������� 30103285Sikob 1.2 Per-CPU ��������� 31103285Sikob 1.3 ������ 32103285Sikob 1.4 target/target_index ��� setpolicy? 33103285Sikob 1.5 target/target_index 34103285Sikob 1.6 setpolicy 35103285Sikob 1.7 get_intermediate ��� target_intermediate 36103285Sikob 2. ��������������� 37103285Sikob 38103285Sikob 39103285Sikob 40103285Sikob1. ������������ 41103285Sikob=========== 42103285Sikob 43103285Sikob������������������������������������������CPU/������������������������������������������������CPU/���������������cpufreq 44103285Sikob��������������������������������������������������������� 45103285Sikob 46103285Sikob 47117067Ssimokawa1.1 ��������� 48117067Ssimokawa---------- 49117067Ssimokawa 50103285Sikob������������ __initcall level 7 (module_init())������������������������������������������������ 51103285Sikob������������������CPU������������������������������������������������cpufreq_register_driver()��� 52113584SsimokawaCPUfreq���������������������cpufreq_driver������������ 53103285Sikob 54103285Sikob���������cpufreq_driver������������������������? 55103285Sikob 56110072Ssimokawa .name - ������������������ 57103285Sikob 58103285Sikob .init - ������������per-policy��������������������������� 59103285Sikob 60116376Ssimokawa .verify - ������������"verification"������������������ 61116376Ssimokawa 62116376Ssimokawa .setpolicy ��� .fast_switch ��� .target ��� .target_index - ��������� 63116376Ssimokawa ��������� 64116376Ssimokawa 65116376Ssimokawa������������������ 66116376Ssimokawa 67120850Ssimokawa .flags - ���cpufreq������������������ 68103285Sikob 69108281Ssimokawa .driver_data - cpufreq������������������������������ 70109736Ssimokawa 71109736Ssimokawa .get_intermediate ��� target_intermediate - ���������������CPU������������������������ 72109736Ssimokawa ������������ 73120850Ssimokawa 74120850Ssimokawa .get - ������CPU������������������ 75103285Sikob 76110195Ssimokawa .bios_limit - ������HW/BIOS���CPU��������������������������� 77110269Ssimokawa 78110195Ssimokawa .exit - ������������per-policy������������������������������������CPU������������������CPU_POST_DEAD 79103285Sikob ������������������ 80103285Sikob 81103285Sikob .suspend - ������������per-policy������������������������������������������������������������������������������ 82103285Sikob ��������������� 83103285Sikob 84103285Sikob .resume - ������������per-policy��������������������������������������������������������������������������������� 85103285Sikob ��������� 86116978Ssimokawa 87103285Sikob .ready - ������������per-policy��������������������������������������������������������������������������� 88103285Sikob 89103285Sikob .attr - ������������NULL���������"struct freq_attr"��������������������������������������������� 90103285Sikob sysfs��� 91103285Sikob 92103285Sikob .boost_enabled - ������������������������������(boost)��������� 93103285Sikob 94103285Sikob .set_boost - ������������per-policy���������������������������������������/������������(boost)��������������� 95103285Sikob 96103285Sikob 97103285Sikob1.2 Per-CPU ��������� 98103285Sikob------------------ 99106543Ssimokawa 100103285Sikob������������������CPU���������������������������������������cpufreq������������������������������������CPU���cpufreq��� 101106543Ssimokawa���������������������������per-policy������������������cpufreq_driver.init���������������.init()���.exit()������ 102103285Sikob���������������������������������������������������������������������CPU������������������������������ ``struct cpufreq_policy 103105620Ssimokawa*policy`` ��������������������������������������� 104110072Ssimokawa 105103285Sikob������������������������������CPU���������CPUfreq��������������� 106103285Sikob 107103285Sikob������������������������������������������: 108103285Sikob 109103285Sikob+-----------------------------------+--------------------------------------+ 110103285Sikob|policy->cpuinfo.min_freq��� | ���CPU���������������������������������kHz��� | 111108642Ssimokawa|policy->cpuinfo.max_freq | | 112116978Ssimokawa| | | 113103285Sikob+-----------------------------------+--------------------------------------+ 114103285Sikob|policy->cpuinfo.transition_latency | CPU������������������������������������������������ | 115103285Sikob| | ������������������������������������������ | 116103285Sikob| | CPUFREQ_ETERNAL��� | 117103285Sikob| | | 118103285Sikob+-----------------------------------+--------------------------------------+ 119103285Sikob|policy->cur | ���CPU���������������������(���������) | 120103285Sikob| | | 121103285Sikob+-----------------------------------+--------------------------------------+ 122103285Sikob|policy->min, | ���������������CPU���"������������"��������� | 123114909Ssimokawa|policy->max, | ��������������������� | 124114909Ssimokawa|policy->policy and, if necessary, | cpufreq_driver.verify��������������� | 125114909Ssimokawa|policy->governor | ���������cpufreq_driver.setpolicy��� | 126114909Ssimokawa| | cpufreq_driver.target/target_index | 127106813Ssimokawa| | | 128103285Sikob+-----------------------------------+--------------------------------------+ 129103285Sikob|policy->cpus | ���policy������DVFS���������������������CPU | 130103285Sikob| | (���������CPU������"������/������"���)������ | 131103285Sikob| | ������(���������������������������CPU)������������ | 132103285Sikob| | ��������������� | 133103285Sikob| | | 134103285Sikob+-----------------------------------+--------------------------------------+ 135110072Ssimokawa 136103285Sikob������������������������������(cpuinfo.min[max]_freq, policy->min[max])��������������������������������������� 137106810Ssimokawa������������������������������������������������2������ 138110072Ssimokawa 139103285Sikob 140103285Sikob1.3 ������ 141110072Ssimokawa-------- 142110072Ssimokawa 143110072Ssimokawa���������������������������������������(���"policy,governor,min,max������")������������������������������������������ 144110193Ssimokawa������������������������������������������������������cpufreq_verify_within_limits(``struct cpufreq_policy 145120660Ssimokawa*policy``, ``unsigned int min_freq``, ``unsigned int max_freq``)��������������������������� 146103285Sikob������������������������������������������������������2������ 147110072Ssimokawa 148110072Ssimokawa������������������������������������������������������������������ policy->min ��� policy->max ������������������������ 149106810Ssimokawa���������������policy->max������������������������������������������������������policy->min��� 150103285Sikob 151106813Ssimokawa 152103285Sikob1.4 target ��� target_index ��� setpolicy ��� fast_switch? 153110072Ssimokawa------------------------------------------------------- 154110072Ssimokawa 155110072Ssimokawa���������cpufreq���������������������CPU������������������������������CPU��������������������������������������������������������� 156110582Ssimokawa������������->target()���->target_index()���->fast_switch()��������� 157110072Ssimokawa 158110072Ssimokawa���������������������������������������������������������������������������������CPU������������������������->setpolicy()��������� 159110072Ssimokawa 160110072Ssimokawa 161110072Ssimokawa1.5. target/target_index 162110193Ssimokawa------------------------ 163110582Ssimokawa 164110072Ssimokawatarget_index������������������������ ``struct cpufreq_policy * policy`` ��� ``unsigned int`` 165110072Ssimokawa������(������������������������)��� 166110072Ssimokawa 167110072Ssimokawa���������������������CPUfreq������������������������������������������������������freq_table[index].frequency��������� 168110072Ssimokawa 169110072Ssimokawa���������������������������������������������������������������(���policy->restore_freq)��������������������������������� 170110072Ssimokawa��������������� 171110072Ssimokawa 172110072Ssimokawa��������� 173103285Sikob---------- 174103285Sikobtarget������������������������``struct cpufreq_policy * policy``, unsigned int target_frequency, 175103285Sikobunsigned int relation. 176103285Sikob 177103285SikobCPUfreq������������������������������������������������������������������������������������������������������ 178103285Sikob 179103285Sikob- ������������"������������"��� 180103285Sikob- policy->min <= new_freq <= policy->max (���������������������!!!) 181103285Sikob- ������ relation==CPUFREQ_REL_L������������������������������������ target_freq ��� new_freq���("L������ 182103285Sikob ������������������������") 183103285Sikob- ������ relation==CPUFREQ_REL_H������������������������������������ target_freq ��� new_freq���("H������ 184103285Sikob ������������������������") 185103285Sikob 186103285Sikob������������������������������������������������ -- ���������2������ 187103285Sikob 188103285Sikob1.6. fast_switch 189103285Sikob---------------- 190120660Ssimokawa 191103285Sikob��������������������������������������������������������������������������������������������������������������������������������������������������� 192103285Sikob��������������������������������������������������������������������� 193103285Sikob 194103285Sikob������������������������������ ``struct cpufreq_policy *policy`` ��� ``unsigned int target_frequency``��� 195103285Sikob 196103285Sikob 197103285Sikob1.7 setpolicy 198103285Sikob------------- 199103285Sikob 200103285Sikobsetpolicy��������������������� ``struct cpufreq_policy * policy`` ������������������������������������������������������������ 201103285Sikob���������������������������policy->min������������������policy->max���������������������������policy->policy��� 202103285SikobCPUFREQ_POLICY_PERFORMANCE������������������������������������CPUFREQ_POLICY_POWERSAVE��������������������������������� 203120660Ssimokawa���������������drivers/cpufreq/longrun.c��������������������� 204120660Ssimokawa 205120660Ssimokawa1.8 get_intermediate ��� target_intermediate 206120660Ssimokawa-------------------------------------------- 207103285Sikob 208120660Ssimokawa��������������������� target_index() ��� CPUFREQ_ASYNC_NOTIFICATION ������������ 209103285Sikob 210120660Ssimokawaget_intermediate������������������������������������������������������������������target_intermediate()���������CPU��������� 211120660Ssimokawa������������������������������'index'������������������cpufreq��������������������������������������������� 212120660Ssimokawatarget_intermediate()���target_index()������������������ 213120660Ssimokawa 214120660Ssimokawa���������������������������������������������������������������������������������������������get_intermediate()������'0'��� 215120660Ssimokawa���������������������cpufreq���������������������->target_index()��� 216103285Sikob 217103285Sikob���������->target_index()���������������������������������������������������policy->restore_freq��� 218106790Ssimokawa������cpufreq������������������������������ 219103285Sikob 220103285Sikob 221103285Sikob2. ��������������������� 222103285Sikob================= 223103285Sikob 224108655Ssimokawa���������������������cpufreq������������������������������������������������������������������"���������"��������������������������������������������������� 225108655Ssimokawa���������������������������������"���������"������������struct cpufreq_frequency_table���������������������������"driver_data"��������� 226103285Sikob������������������������������"frequency"������������������������������������������������������������������������������������������������ 227103285Sikobcpufreq_frequency_table������������������������CPUFREQ_TABLE_END��������������������������������������������������������������� 228103285SikobCPUFREQ_ENTRY_INVALID������������������������������������������������������������������������������cpufreq������������DVFS������������������ 229120660Ssimokawa������������������������������������ 230103285Sikob 231103285Sikob���������policy->freq_table������������������������������������������������������������������cpufreq��������������������� 232103285Sikob 233103285Sikobcpufreq_frequency_table_verify()���������������������������������������policy->min���policy->max������������������������������ 234103285Sikob���������������������������->verify��������������������� 235103285Sikob 236103285Sikobcpufreq_frequency_table_target()������������->target������������������������������������������������������������������������������������������ 237103285Sikob���������CPU��������������������������������������� 238103285Sikob 239103285Sikob���������������������cpufreq_frequency_table��������������� 240103285Sikob 241103285Sikobcpufreq_for_each_entry(pos, table) - ��������������������������������� 242103285Sikob 243103285Sikobcpufreq_for_each_valid_entry(pos, table) - ���������������������������������������CPUFREQ_ENTRY_INVALID��������� 244103285Sikob������������"pos" -- ������ ``cpufreq_frequency_table *`` ���������������������������������"table" -- ������������������ 245103285Sikob��� ``cpufreq_frequency_table *`` ��� 246103285Sikob 247103285Sikob������:: 248103285Sikob 249103285Sikob struct cpufreq_frequency_table *pos, *driver_freq_table; 250103285Sikob 251103285Sikob cpufreq_for_each_entry(pos, driver_freq_table) { 252103285Sikob /* Do something with pos */ 253103285Sikob pos->frequency = ... 254103285Sikob } 255103285Sikob 256103285Sikob������������������driver_freq_table���������pos������������������������������������������������������������������������������������������ 257103285Sikobcpufreq_for_each_entry_idx() ��� cpufreq_for_each_valid_entry_idx() ��� 258103285Sikob