← Documents Documentation/admin-guide/pm/cpufreq_drivers.rst GitHub 원문 ↗

Linux 6.18.37 · Administration / Power Management

Legacy CPU Performance Scaling Drivers

AMD PowerNow!, nForce2와 PCC CPUFreq driver의 역사적 동작과 제약을 설명합니다.

Source pathDocumentation/admin-guide/pm/cpufreq_drivers.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

운영 요약

cpufreq_drivers.rst:1-274

이 문서는 legacy driver 기록입니다. PowerNow는 세대와 BIOS table, nForce2는 FSB 하한, PCC는 firmware 주도 연속 frequency와 P-state 비호환성을 중심으로 읽어야 합니다.

관점핵심
성격원래 공백과 들여쓰기를 보존한 legacy driver 문서 모음
AMD`powernow-k6`, `powernow-k7`, `powernow-k8`
nForce2PCI/AGP와 독립된 CPU FSB 변경
PCCOSPM과 platform firmware 사이의 clocking control
통신Shared memory, `PCCH()`, `PCCP()`, doorbell
명령Get Average Frequency, Set Desired Frequency
정책Governor는 OSPM, 실제 성능 제공은 firmware가 담당
제약P-state가 없으므로 `cpufreq_stats`와 맞지 않음

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 .. SPDX-License-Identifier: GPL-2.0
2
3 =======================================================
4 Legacy Documentation of CPU Performance Scaling Drivers
5 =======================================================
6
7 Included below are historic documents describing assorted
8 :doc:`CPU performance scaling <cpufreq>` drivers. They are reproduced verbatim,
9 with the original white space formatting and indentation preserved, except for
10 the added leading space character in every line of text.
11
12
13 AMD PowerNow! Drivers
14 =====================
15
16 ::
17
18 PowerNow! and Cool'n'Quiet are AMD names for frequency
19 management capabilities in AMD processors. As the hardware
20 implementation changes in new generations of the processors,
21 there is a different cpu-freq driver for each generation.
22
23 Note that the driver's will not load on the "wrong" hardware,
24 so it is safe to try each driver in turn when in doubt as to
25 which is the correct driver.
26
27 Note that the functionality to change frequency (and voltage)
28 is not available in all processors. The drivers will refuse
29 to load on processors without this capability. The capability
30 is detected with the cpuid instruction.
31
32 The drivers use BIOS supplied tables to obtain frequency and
33 voltage information appropriate for a particular platform.
34 Frequency transitions will be unavailable if the BIOS does
35 not supply these tables.
36
37 6th Generation: powernow-k6
38
39 7th Generation: powernow-k7: Athlon, Duron, Geode.
40
41 8th Generation: powernow-k8: Athlon, Athlon 64, Opteron, Sempron.
42 Documentation on this functionality in 8th generation processors
43 is available in the "BIOS and Kernel Developer's Guide", publication
44 26094, in chapter 9, available for download from www.amd.com.
45
46 BIOS supplied data, for powernow-k7 and for powernow-k8, may be
47 from either the PSB table or from ACPI objects. The ACPI support
48 is only available if the kernel config sets CONFIG_ACPI_PROCESSOR.
49 The powernow-k8 driver will attempt to use ACPI if so configured,
50 and fall back to PST if that fails.
51 The powernow-k7 driver will try to use the PSB support first, and
52 fall back to ACPI if the PSB support fails. A module parameter,
53 acpi_force, is provided to force ACPI support to be used instead
54 of PSB support.
55
56
57 ``cpufreq-nforce2``
58 ===================
59
60 ::
61
62 The cpufreq-nforce2 driver changes the FSB on nVidia nForce2 platforms.
63
64 This works better than on other platforms, because the FSB of the CPU
65 can be controlled independently from the PCI/AGP clock.
66
67 The module has two options:
68
69 fid: multiplier * 10 (for example 8.5 = 85)
70 min_fsb: minimum FSB
71
72 If not set, fid is calculated from the current CPU speed and the FSB.
73 min_fsb defaults to FSB at boot time - 50 MHz.
74
75 IMPORTANT: The available range is limited downwards!
76 Also the minimum available FSB can differ, for systems
77 booting with 200 MHz, 150 should always work.
78
79
80 ``pcc-cpufreq``
81 ===============
82
83 ::
84
85 /*
86 * pcc-cpufreq.txt - PCC interface documentation
87 *
88 * Copyright (C) 2009 Red Hat, Matthew Garrett <mjg@redhat.com>
89 * Copyright (C) 2009 Hewlett-Packard Development Company, L.P.
90 * Nagananda Chumbalkar <nagananda.chumbalkar@hp.com>
91 */
92
93
94 Processor Clocking Control Driver
95 ---------------------------------
96
97 Contents:
98 ---------
99 1. Introduction
100 1.1 PCC interface
101 1.1.1 Get Average Frequency
102 1.1.2 Set Desired Frequency
103 1.2 Platforms affected
104 2. Driver and /sys details
105 2.1 scaling_available_frequencies
106 2.2 cpuinfo_transition_latency
107 2.3 cpuinfo_cur_freq
108 2.4 related_cpus
109 3. Caveats
110
111 1. Introduction:
112 ----------------
113 Processor Clocking Control (PCC) is an interface between the platform
114 firmware and OSPM. It is a mechanism for coordinating processor
115 performance (ie: frequency) between the platform firmware and the OS.
116
117 The PCC driver (pcc-cpufreq) allows OSPM to take advantage of the PCC
118 interface.
119
120 OS utilizes the PCC interface to inform platform firmware what frequency the
121 OS wants for a logical processor. The platform firmware attempts to achieve
122 the requested frequency. If the request for the target frequency could not be
123 satisfied by platform firmware, then it usually means that power budget
124 conditions are in place, and "power capping" is taking place.
125
126 1.1 PCC interface:
127 ------------------
128 The complete PCC specification is available here:
129 https://acpica.org/sites/acpica/files/Processor-Clocking-Control-v1p0.pdf
130
131 PCC relies on a shared memory region that provides a channel for communication
132 between the OS and platform firmware. PCC also implements a "doorbell" that
133 is used by the OS to inform the platform firmware that a command has been
134 sent.
135
136 The ACPI PCCH() method is used to discover the location of the PCC shared
137 memory region. The shared memory region header contains the "command" and
138 "status" interface. PCCH() also contains details on how to access the platform
139 doorbell.
140
141 The following commands are supported by the PCC interface:
142 * Get Average Frequency
143 * Set Desired Frequency
144
145 The ACPI PCCP() method is implemented for each logical processor and is
146 used to discover the offsets for the input and output buffers in the shared
147 memory region.
148
149 When PCC mode is enabled, the platform will not expose processor performance
150 or throttle states (_PSS, _TSS and related ACPI objects) to OSPM. Therefore,
151 the native P-state driver (such as acpi-cpufreq for Intel, powernow-k8 for
152 AMD) will not load.
153
154 However, OSPM remains in control of policy. The governor (eg: "ondemand")
155 computes the required performance for each processor based on server workload.
156 The PCC driver fills in the command interface, and the input buffer and
157 communicates the request to the platform firmware. The platform firmware is
158 responsible for delivering the requested performance.
159
160 Each PCC command is "global" in scope and can affect all the logical CPUs in
161 the system. Therefore, PCC is capable of performing "group" updates. With PCC
162 the OS is capable of getting/setting the frequency of all the logical CPUs in
163 the system with a single call to the BIOS.
164
165 1.1.1 Get Average Frequency:
166 ----------------------------
167 This command is used by the OSPM to query the running frequency of the
168 processor since the last time this command was completed. The output buffer
169 indicates the average unhalted frequency of the logical processor expressed as
170 a percentage of the nominal (ie: maximum) CPU frequency. The output buffer
171 also signifies if the CPU frequency is limited by a power budget condition.
172
173 1.1.2 Set Desired Frequency:
174 ----------------------------
175 This command is used by the OSPM to communicate to the platform firmware the
176 desired frequency for a logical processor. The output buffer is currently
177 ignored by OSPM. The next invocation of "Get Average Frequency" will inform
178 OSPM if the desired frequency was achieved or not.
179
180 1.2 Platforms affected:
181 -----------------------
182 The PCC driver will load on any system where the platform firmware:
183 * supports the PCC interface, and the associated PCCH() and PCCP() methods
184 * assumes responsibility for managing the hardware clocking controls in order
185 to deliver the requested processor performance
186
187 Currently, certain HP ProLiant platforms implement the PCC interface. On those
188 platforms PCC is the "default" choice.
189
190 However, it is possible to disable this interface via a BIOS setting. In
191 such an instance, as is also the case on platforms where the PCC interface
192 is not implemented, the PCC driver will fail to load silently.
193
194 2. Driver and /sys details:
195 ---------------------------
196 When the driver loads, it merely prints the lowest and the highest CPU
197 frequencies supported by the platform firmware.
198
199 The PCC driver loads with a message such as:
200 pcc-cpufreq: (v1.00.00) driver loaded with frequency limits: 1600 MHz, 2933
201 MHz
202
203 This means that the OPSM can request the CPU to run at any frequency in
204 between the limits (1600 MHz, and 2933 MHz) specified in the message.
205
206 Internally, there is no need for the driver to convert the "target" frequency
207 to a corresponding P-state.
208
209 The VERSION number for the driver will be of the format v.xy.ab.
210 eg: 1.00.02
211 ----- --
212 | |
213 | -- this will increase with bug fixes/enhancements to the driver
214 |-- this is the version of the PCC specification the driver adheres to
215
216
217 The following is a brief discussion on some of the fields exported via the
218 /sys filesystem and how their values are affected by the PCC driver:
219
220 2.1 scaling_available_frequencies:
221 ----------------------------------
222 scaling_available_frequencies is not created in /sys. No intermediate
223 frequencies need to be listed because the BIOS will try to achieve any
224 frequency, within limits, requested by the governor. A frequency does not have
225 to be strictly associated with a P-state.
226
227 2.2 cpuinfo_transition_latency:
228 -------------------------------
229 The cpuinfo_transition_latency field is 0. The PCC specification does
230 not include a field to expose this value currently.
231
232 2.3 cpuinfo_cur_freq:
233 ---------------------
234 A) Often cpuinfo_cur_freq will show a value different than what is declared
235 in the scaling_available_frequencies or scaling_cur_freq, or scaling_max_freq.
236 This is due to "turbo boost" available on recent Intel processors. If certain
237 conditions are met the BIOS can achieve a slightly higher speed than requested
238 by OSPM. An example:
239
240 scaling_cur_freq : 2933000
241 cpuinfo_cur_freq : 3196000
242
243 B) There is a round-off error associated with the cpuinfo_cur_freq value.
244 Since the driver obtains the current frequency as a "percentage" (%) of the
245 nominal frequency from the BIOS, sometimes, the values displayed by
246 scaling_cur_freq and cpuinfo_cur_freq may not match. An example:
247
248 scaling_cur_freq : 1600000
249 cpuinfo_cur_freq : 1583000
250
251 In this example, the nominal frequency is 2933 MHz. The driver obtains the
252 current frequency, cpuinfo_cur_freq, as 54% of the nominal frequency:
253
254 54% of 2933 MHz = 1583 MHz
255
256 Nominal frequency is the maximum frequency of the processor, and it usually
257 corresponds to the frequency of the P0 P-state.
258
259 2.4 related_cpus:
260 -----------------
261 The related_cpus field is identical to affected_cpus.
262
263 affected_cpus : 4
264 related_cpus : 4
265
266 Currently, the PCC driver does not evaluate _PSD. The platforms that support
267 PCC do not implement SW_ALL. So OSPM doesn't need to perform any coordination
268 to ensure that the same frequency is requested of all dependent CPUs.
269
270 3. Caveats:
271 -----------
272 The "cpufreq_stats" module in its present form cannot be loaded and
273 expected to work with the PCC driver. Since the "cpufreq_stats" module
274 provides information wrt each P-state, it is not applicable to the PCC driver.
275

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

Legacy 문서 모음

1-11

이 문서는 `SPDX-License-Identifier: GPL-2.0`을 따릅니다. 아래 내용은 여러 CPU performance scaling driver를 설명하던 역사적 문서를 모은 것입니다.

원문은 모든 text line 앞에 공백 하나를 더한 것 외에는 원래 whitespace 형식과 들여쓰기를 그대로 재현합니다. 따라서 오래된 명칭과 당시 동작 설명도 역사적 맥락으로 읽어야 합니다.

AMD PowerNow! driver

12-55

PowerNow!와 Cool'n'Quiet는 AMD processor의 frequency 관리 기능 이름입니다. Hardware 구현이 세대마다 달라 각 세대에 별도 CPUFreq driver가 있습니다.

Driver는 맞지 않는 hardware에서 load되지 않으므로 어느 driver가 맞는지 불확실하면 차례로 시도해도 안전합니다. 모든 processor가 frequency와 voltage 변경을 지원하는 것은 아니며, driver는 `cpuid` instruction으로 capability를 감지해 미지원 processor에서는 load를 거부합니다.

Platform에 맞는 frequency·voltage 정보는 BIOS 제공 table에서 얻습니다. BIOS가 table을 주지 않으면 frequency transition을 사용할 수 없습니다.

세대Driver와 processor
6세대`powernow-k6`
7세대`powernow-k7`: Athlon, Duron, Geode
8세대`powernow-k8`: Athlon, Athlon 64, Opteron, Sempron

8세대 기능은 AMD publication 26094 `BIOS and Kernel Developer's Guide` 9장에 설명되어 있습니다.

`powernow-k7`과 `powernow-k8`의 BIOS data는 PSB table 또는 ACPI object에서 올 수 있습니다. ACPI 지원에는 `CONFIG_ACPI_PROCESSOR` kernel config가 필요합니다.

대상검색 순서
`powernow-k8`ACPI를 먼저 시도하고 실패하면 PST로 fallback
`powernow-k7`PSB를 먼저 시도하고 실패하면 ACPI로 fallback
`acpi_force`K7에서 PSB 대신 ACPI 사용을 강제
ACPI 조건Kernel에 `CONFIG_ACPI_PROCESSOR` 설정 필요

cpufreq-nforce2

56-79

`cpufreq-nforce2` driver는 NVIDIA nForce2 platform의 FSB를 변경합니다. CPU FSB를 PCI/AGP clock과 독립적으로 제어할 수 있어 다른 platform보다 잘 동작합니다.

Module option의미
`fid`Multiplier x 10; 예: 8.5는 `85`
`min_fsb`최소 FSB
기본 `fid`현재 CPU speed와 FSB로 계산
기본 `min_fsb`Boot FSB - 50 MHz

`fid`를 지정하지 않으면 현재 CPU speed와 FSB로 계산하고, `min_fsb` 기본값은 boot FSB보다 50 MHz 낮습니다.

가용 범위의 하한은 제한됩니다. 최소 FSB는 system마다 다르며, 200 MHz로 boot한 system은 150 MHz가 보통 동작합니다.

PCC 문서와 목차

80-110

`pcc-cpufreq` 문서는 Processor Clocking Control(PCC) interface를 설명합니다. 2009년 Red Hat의 Matthew Garrett과 Hewlett-Packard의 Nagananda Chumbalkar 저작권 고지를 포함합니다.

원 문서의 구성은 PCC interface, 두 command, 적용 platform, driver와 sysfs의 `scaling_available_frequencies`, `cpuinfo_transition_latency`, `cpuinfo_cur_freq`, `related_cpus`, 마지막 caveat 순서입니다.

PCC interface와 전역 command

111-164

Processor Clocking Control은 platform firmware와 OSPM 사이에서 processor performance, 즉 frequency를 조정하는 interface입니다. `pcc-cpufreq` driver가 OSPM에서 이를 사용할 수 있게 합니다.

OS는 logical processor에 원하는 frequency를 PCC로 알리고 firmware는 이를 달성하려 합니다. 목표를 만족하지 못하면 대개 power budget 조건 때문에 power capping 중이라는 뜻입니다.

전체 PCC 사양은 `https://acpica.org/sites/acpica/files/Processor-Clocking-Control-v1p0.pdf`에 있습니다. OS와 firmware는 shared memory region으로 통신하고 OS는 `doorbell`을 울려 command 전송을 알립니다.

ACPI `PCCH()` method는 shared memory 위치와 command/status header, platform doorbell 접근법을 찾습니다. Logical processor마다 구현된 `PCCP()`는 shared memory의 input/output buffer offset을 찾습니다.

PCC mode에서는 platform이 `_PSS`, `_TSS`와 관련 ACPI object를 OSPM에 노출하지 않으므로 Intel의 `acpi-cpufreq`, AMD의 `powernow-k8` 같은 native P-state driver는 load되지 않습니다.

Policy는 여전히 OSPM이 제어합니다. `ondemand` 같은 governor가 workload에 따라 필요한 성능을 계산하면 PCC driver가 command interface와 input buffer를 채워 firmware에 요청하고, firmware가 실제 성능을 제공합니다.

각 PCC command는 global scope라 모든 logical CPU에 영향을 줄 수 있습니다. 따라서 한 번의 BIOS call로 system 전체 CPU의 frequency를 읽거나 설정하는 group update가 가능합니다.

평균 조회와 목표 설정

165-179

`Get Average Frequency`는 이전 command 완료 이후 processor의 평균 실행 frequency를 조회합니다. Output buffer는 nominal, 즉 최대 CPU frequency의 백분율로 평균 unhalted frequency를 나타내고 power budget 제한 여부도 표시합니다.

`Set Desired Frequency`는 logical processor의 원하는 frequency를 platform firmware에 전달합니다. 현재 OSPM은 이 command의 output buffer를 무시하며, 다음 `Get Average Frequency`에서 목표 달성 여부를 확인합니다.

Command동작
Get Average Frequency직전 완료 이후 평균 unhalted frequency와 power cap 상태 조회
Set Desired FrequencyLogical processor의 원하는 frequency를 firmware에 전달

적용 platform

180-193

PCC driver는 firmware가 PCC와 `PCCH()`/`PCCP()`를 지원하고, 요청한 processor performance를 제공하기 위해 hardware clock control 관리 책임을 맡는 system에서 load됩니다.

문서 시점에는 일부 HP ProLiant platform이 PCC를 구현하고 기본 선택으로 사용합니다. BIOS setting으로 PCC를 끌 수 있으며, interface가 없거나 꺼진 platform에서는 driver가 조용히 load 실패합니다.

Driver 범위와 version

194-218

Driver가 load되면 platform firmware가 지원하는 최저·최고 CPU frequency만 출력합니다. 다음 예시는 1600-2933 MHz 사이의 어떤 값이든 OSPM이 요청할 수 있음을 뜻하며 target frequency를 P-state로 변환할 필요가 없습니다.

pcc-cpufreq: (v1.00.00) driver loaded with frequency limits: 1600 MHz, 2933
MHz
PCC driver version 형식
부분의미
`xy`Driver가 따르는 PCC specification version
`ab`Driver bug fix 또는 enhancement마다 증가

원문의 `v.xy.ab` ASCII 연결선을 version 구성요소 표로 다시 나타냈습니다.

PCC frequency sysfs

219-258

`scaling_available_frequencies`는 만들지 않습니다. BIOS는 한계 안에서 governor가 요청하는 어떤 frequency든 시도하므로 중간 값을 열거할 필요가 없고 frequency가 P-state와 엄격히 연결될 필요도 없습니다.

`cpuinfo_transition_latency`는 `0`입니다. 당시 PCC specification에는 이 값을 노출하는 field가 없습니다.

`cpuinfo_cur_freq`는 turbo boost 때문에 `scaling_cur_freq`, `scaling_max_freq`나 가용 frequency보다 높을 수 있습니다. 조건이 맞으면 BIOS가 OSPM 요청보다 조금 높은 speed를 달성합니다.

scaling_cur_freq        : 2933000
cpuinfo_cur_freq        : 3196000

또한 BIOS가 현재 frequency를 nominal의 백분율로 돌려주므로 반올림 오차가 생길 수 있습니다. 다음 예에서 요청은 1600 MHz지만 현재 값은 1583 MHz입니다.

scaling_cur_freq        : 1600000
cpuinfo_cur_freq        : 1583000
54% of 2933 MHz = 1583 MHz

Nominal frequency는 processor의 최대 frequency이며 보통 P0 P-state frequency에 해당합니다.

Sysfs fieldPCC 동작
`scaling_available_frequencies`생성하지 않음; 한계 안의 임의 frequency 요청 가능
`cpuinfo_transition_latency`PCC 사양에 값이 없어 `0`
`cpuinfo_cur_freq`Nominal 대비 firmware 백분율로 계산
`related_cpus``affected_cpus`와 동일