요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
.. SPDX-License-Identifier: GPL-2.0
=======================================================
Legacy Documentation of CPU Performance Scaling Drivers
=======================================================
Included below are historic documents describing assorted
:doc:`CPU performance scaling <cpufreq>` drivers. They are reproduced verbatim,
with the original white space formatting and indentation preserved, except for
the added leading space character in every line of text.
AMD PowerNow! Drivers
=====================
::
PowerNow! and Cool'n'Quiet are AMD names for frequency
management capabilities in AMD processors. As the hardware
implementation changes in new generations of the processors,
there is a different cpu-freq driver for each generation.
Note that the driver's will not load on the "wrong" hardware,
so it is safe to try each driver in turn when in doubt as to
which is the correct driver.
Note that the functionality to change frequency (and voltage)
is not available in all processors. The drivers will refuse
to load on processors without this capability. The capability
is detected with the cpuid instruction.
The drivers use BIOS supplied tables to obtain frequency and
voltage information appropriate for a particular platform.
Frequency transitions will be unavailable if the BIOS does
not supply these tables.
6th Generation: powernow-k6
7th Generation: powernow-k7: Athlon, Duron, Geode.
8th Generation: powernow-k8: Athlon, Athlon 64, Opteron, Sempron.
Documentation on this functionality in 8th generation processors
is available in the "BIOS and Kernel Developer's Guide", publication
26094, in chapter 9, available for download from www.amd.com.
BIOS supplied data, for powernow-k7 and for powernow-k8, may be
from either the PSB table or from ACPI objects. The ACPI support
is only available if the kernel config sets CONFIG_ACPI_PROCESSOR.
The powernow-k8 driver will attempt to use ACPI if so configured,
and fall back to PST if that fails.
The powernow-k7 driver will try to use the PSB support first, and
fall back to ACPI if the PSB support fails. A module parameter,
acpi_force, is provided to force ACPI support to be used instead
of PSB support.
``cpufreq-nforce2``
===================
::
The cpufreq-nforce2 driver changes the FSB on nVidia nForce2 platforms.
This works better than on other platforms, because the FSB of the CPU
can be controlled independently from the PCI/AGP clock.
The module has two options:
fid: multiplier * 10 (for example 8.5 = 85)
min_fsb: minimum FSB
If not set, fid is calculated from the current CPU speed and the FSB.
min_fsb defaults to FSB at boot time - 50 MHz.
IMPORTANT: The available range is limited downwards!
Also the minimum available FSB can differ, for systems
booting with 200 MHz, 150 should always work.
``pcc-cpufreq``
===============
::
/*
* pcc-cpufreq.txt - PCC interface documentation
*
* Copyright (C) 2009 Red Hat, Matthew Garrett <mjg@redhat.com>
* Copyright (C) 2009 Hewlett-Packard Development Company, L.P.
* Nagananda Chumbalkar <nagananda.chumbalkar@hp.com>
*/
Processor Clocking Control Driver
---------------------------------
Contents:
---------
1. Introduction
1.1 PCC interface
1.1.1 Get Average Frequency
1.1.2 Set Desired Frequency
1.2 Platforms affected
2. Driver and /sys details
2.1 scaling_available_frequencies
2.2 cpuinfo_transition_latency
2.3 cpuinfo_cur_freq
2.4 related_cpus
3. Caveats
1. Introduction:
----------------
Processor Clocking Control (PCC) is an interface between the platform
firmware and OSPM. It is a mechanism for coordinating processor
performance (ie: frequency) between the platform firmware and the OS.
The PCC driver (pcc-cpufreq) allows OSPM to take advantage of the PCC
interface.
OS utilizes the PCC interface to inform platform firmware what frequency the
OS wants for a logical processor. The platform firmware attempts to achieve
the requested frequency. If the request for the target frequency could not be
satisfied by platform firmware, then it usually means that power budget
conditions are in place, and "power capping" is taking place.
1.1 PCC interface:
------------------
The complete PCC specification is available here:
https://acpica.org/sites/acpica/files/Processor-Clocking-Control-v1p0.pdf
PCC relies on a shared memory region that provides a channel for communication
between the OS and platform firmware. PCC also implements a "doorbell" that
is used by the OS to inform the platform firmware that a command has been
sent.
The ACPI PCCH() method is used to discover the location of the PCC shared
memory region. The shared memory region header contains the "command" and
"status" interface. PCCH() also contains details on how to access the platform
doorbell.
The following commands are supported by the PCC interface:
* Get Average Frequency
* Set Desired Frequency
The ACPI PCCP() method is implemented for each logical processor and is
used to discover the offsets for the input and output buffers in the shared
memory region.
When PCC mode is enabled, the platform will not expose processor performance
or throttle states (_PSS, _TSS and related ACPI objects) to OSPM. Therefore,
the native P-state driver (such as acpi-cpufreq for Intel, powernow-k8 for
AMD) will not load.
However, OSPM remains in control of policy. The governor (eg: "ondemand")
computes the required performance for each processor based on server workload.
The PCC driver fills in the command interface, and the input buffer and
communicates the request to the platform firmware. The platform firmware is
responsible for delivering the requested performance.
Each PCC command is "global" in scope and can affect all the logical CPUs in
the system. Therefore, PCC is capable of performing "group" updates. With PCC
the OS is capable of getting/setting the frequency of all the logical CPUs in
the system with a single call to the BIOS.
1.1.1 Get Average Frequency:
----------------------------
This command is used by the OSPM to query the running frequency of the
processor since the last time this command was completed. The output buffer
indicates the average unhalted frequency of the logical processor expressed as
a percentage of the nominal (ie: maximum) CPU frequency. The output buffer
also signifies if the CPU frequency is limited by a power budget condition.
1.1.2 Set Desired Frequency:
----------------------------
This command is used by the OSPM to communicate to the platform firmware the
desired frequency for a logical processor. The output buffer is currently
ignored by OSPM. The next invocation of "Get Average Frequency" will inform
OSPM if the desired frequency was achieved or not.
1.2 Platforms affected:
-----------------------
The PCC driver will load on any system where the platform firmware:
* supports the PCC interface, and the associated PCCH() and PCCP() methods
* assumes responsibility for managing the hardware clocking controls in order
to deliver the requested processor performance
Currently, certain HP ProLiant platforms implement the PCC interface. On those
platforms PCC is the "default" choice.
However, it is possible to disable this interface via a BIOS setting. In
such an instance, as is also the case on platforms where the PCC interface
is not implemented, the PCC driver will fail to load silently.
2. Driver and /sys details:
---------------------------
When the driver loads, it merely prints the lowest and the highest CPU
frequencies supported by the platform firmware.
The PCC driver loads with a message such as:
pcc-cpufreq: (v1.00.00) driver loaded with frequency limits: 1600 MHz, 2933
MHz
This means that the OPSM can request the CPU to run at any frequency in
between the limits (1600 MHz, and 2933 MHz) specified in the message.
Internally, there is no need for the driver to convert the "target" frequency
to a corresponding P-state.
The VERSION number for the driver will be of the format v.xy.ab.
eg: 1.00.02
----- --
| |
| -- this will increase with bug fixes/enhancements to the driver
|-- this is the version of the PCC specification the driver adheres to
The following is a brief discussion on some of the fields exported via the
/sys filesystem and how their values are affected by the PCC driver:
2.1 scaling_available_frequencies:
----------------------------------
scaling_available_frequencies is not created in /sys. No intermediate
frequencies need to be listed because the BIOS will try to achieve any
frequency, within limits, requested by the governor. A frequency does not have
to be strictly associated with a P-state.
2.2 cpuinfo_transition_latency:
-------------------------------
The cpuinfo_transition_latency field is 0. The PCC specification does
not include a field to expose this value currently.
2.3 cpuinfo_cur_freq:
---------------------
A) Often cpuinfo_cur_freq will show a value different than what is declared
in the scaling_available_frequencies or scaling_cur_freq, or scaling_max_freq.
This is due to "turbo boost" available on recent Intel processors. If certain
conditions are met the BIOS can achieve a slightly higher speed than requested
by OSPM. An example:
scaling_cur_freq : 2933000
cpuinfo_cur_freq : 3196000
B) There is a round-off error associated with the cpuinfo_cur_freq value.
Since the driver obtains the current frequency as a "percentage" (%) of the
nominal frequency from the BIOS, sometimes, the values displayed by
scaling_cur_freq and cpuinfo_cur_freq may not match. An example:
scaling_cur_freq : 1600000
cpuinfo_cur_freq : 1583000
In this example, the nominal frequency is 2933 MHz. The driver obtains the
current frequency, cpuinfo_cur_freq, as 54% of the nominal frequency:
54% of 2933 MHz = 1583 MHz
Nominal frequency is the maximum frequency of the processor, and it usually
corresponds to the frequency of the P0 P-state.
2.4 related_cpus:
-----------------
The related_cpus field is identical to affected_cpus.
affected_cpus : 4
related_cpus : 4
Currently, the PCC driver does not evaluate _PSD. The platforms that support
PCC do not implement SW_ALL. So OSPM doesn't need to perform any coordination
to ensure that the same frequency is requested of all dependent CPUs.
3. Caveats:
-----------
The "cpufreq_stats" module in its present form cannot be loaded and
expected to work with the PCC driver. Since the "cpufreq_stats" module
provides information wrt each P-state, it is not applicable to the PCC driver.
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
Legacy 문서 모음
1-11이 문서는 `SPDX-License-Identifier: GPL-2.0`을 따릅니다. 아래 내용은 여러 CPU performance scaling driver를 설명하던 역사적 문서를 모은 것입니다.
원문은 모든 text line 앞에 공백 하나를 더한 것 외에는 원래 whitespace 형식과 들여쓰기를 그대로 재현합니다. 따라서 오래된 명칭과 당시 동작 설명도 역사적 맥락으로 읽어야 합니다.
AMD PowerNow! driver
12-55PowerNow!와 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-164Processor 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 Frequency | Logical processor의 원하는 frequency를 firmware에 전달 |
적용 platform
180-193PCC 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-218Driver가 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
원문의 `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 field | PCC 동작 |
|---|---|
| `scaling_available_frequencies` | 생성하지 않음; 한계 안의 임의 frequency 요청 가능 |
| `cpuinfo_transition_latency` | PCC 사양에 값이 없어 `0` |
| `cpuinfo_cur_freq` | Nominal 대비 firmware 백분율로 계산 |
| `related_cpus` | `affected_cpus`와 동일 |
운영 요약
cpufreq_drivers.rst:1-274이 문서는 legacy driver 기록입니다. PowerNow는 세대와 BIOS table, nForce2는 FSB 하한, PCC는 firmware 주도 연속 frequency와 P-state 비호환성을 중심으로 읽어야 합니다.