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