2012-08-16 19:41:40 +08:00
|
|
|
CPU cooling APIs How To
|
|
|
|
===================================
|
|
|
|
|
|
|
|
Written by Amit Daniel Kachhap <amit.kachhap@linaro.org>
|
|
|
|
|
2015-01-07 02:14:25 +08:00
|
|
|
Updated: 6 Jan 2015
|
2012-08-16 19:41:40 +08:00
|
|
|
|
|
|
|
Copyright (c) 2012 Samsung Electronics Co., Ltd(http://www.samsung.com)
|
|
|
|
|
|
|
|
0. Introduction
|
|
|
|
|
|
|
|
The generic cpu cooling(freq clipping) provides registration/unregistration APIs
|
|
|
|
to the caller. The binding of the cooling devices to the trip point is left for
|
|
|
|
the user. The registration APIs returns the cooling device pointer.
|
|
|
|
|
|
|
|
1. cpu cooling APIs
|
|
|
|
|
|
|
|
1.1 cpufreq registration/unregistration APIs
|
|
|
|
1.1.1 struct thermal_cooling_device *cpufreq_cooling_register(
|
|
|
|
struct cpumask *clip_cpus)
|
|
|
|
|
|
|
|
This interface function registers the cpufreq cooling device with the name
|
|
|
|
"thermal-cpufreq-%x". This api can support multiple instances of cpufreq
|
|
|
|
cooling devices.
|
|
|
|
|
|
|
|
clip_cpus: cpumask of cpus where the frequency constraints will happen.
|
|
|
|
|
2015-01-07 02:14:25 +08:00
|
|
|
1.1.2 struct thermal_cooling_device *of_cpufreq_cooling_register(
|
2017-12-05 13:32:45 +08:00
|
|
|
struct cpufreq_policy *policy)
|
2015-01-07 02:14:25 +08:00
|
|
|
|
|
|
|
This interface function registers the cpufreq cooling device with
|
|
|
|
the name "thermal-cpufreq-%x" linking it with a device tree node, in
|
|
|
|
order to bind it via the thermal DT code. This api can support multiple
|
|
|
|
instances of cpufreq cooling devices.
|
|
|
|
|
2017-12-05 13:32:45 +08:00
|
|
|
policy: CPUFreq policy.
|
2015-02-27 03:00:29 +08:00
|
|
|
|
2017-12-05 13:32:45 +08:00
|
|
|
1.1.3 void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev)
|
2012-08-16 19:41:40 +08:00
|
|
|
|
|
|
|
This interface function unregisters the "thermal-cpufreq-%x" cooling device.
|
|
|
|
|
|
|
|
cdev: Cooling device pointer which has to be unregistered.
|
2015-02-27 03:00:29 +08:00
|
|
|
|
|
|
|
2. Power models
|
|
|
|
|
|
|
|
The power API registration functions provide a simple power model for
|
2018-01-02 13:21:34 +08:00
|
|
|
CPUs. The current power is calculated as dynamic power (static power isn't
|
|
|
|
supported currently). This power model requires that the operating-points of
|
2015-02-27 03:00:29 +08:00
|
|
|
the CPUs are registered using the kernel's opp library and the
|
|
|
|
`cpufreq_frequency_table` is assigned to the `struct device` of the
|
|
|
|
cpu. If you are using CONFIG_CPUFREQ_DT then the
|
|
|
|
`cpufreq_frequency_table` should already be assigned to the cpu
|
|
|
|
device.
|
|
|
|
|
|
|
|
The dynamic power consumption of a processor depends on many factors.
|
|
|
|
For a given processor implementation the primary factors are:
|
|
|
|
|
|
|
|
- The time the processor spends running, consuming dynamic power, as
|
|
|
|
compared to the time in idle states where dynamic consumption is
|
|
|
|
negligible. Herein we refer to this as 'utilisation'.
|
|
|
|
- The voltage and frequency levels as a result of DVFS. The DVFS
|
|
|
|
level is a dominant factor governing power consumption.
|
|
|
|
- In running time the 'execution' behaviour (instruction types, memory
|
|
|
|
access patterns and so forth) causes, in most cases, a second order
|
|
|
|
variation. In pathological cases this variation can be significant,
|
|
|
|
but typically it is of a much lesser impact than the factors above.
|
|
|
|
|
|
|
|
A high level dynamic power consumption model may then be represented as:
|
|
|
|
|
|
|
|
Pdyn = f(run) * Voltage^2 * Frequency * Utilisation
|
|
|
|
|
|
|
|
f(run) here represents the described execution behaviour and its
|
|
|
|
result has a units of Watts/Hz/Volt^2 (this often expressed in
|
|
|
|
mW/MHz/uVolt^2)
|
|
|
|
|
|
|
|
The detailed behaviour for f(run) could be modelled on-line. However,
|
|
|
|
in practice, such an on-line model has dependencies on a number of
|
|
|
|
implementation specific processor support and characterisation
|
|
|
|
factors. Therefore, in initial implementation that contribution is
|
|
|
|
represented as a constant coefficient. This is a simplification
|
|
|
|
consistent with the relative contribution to overall power variation.
|
|
|
|
|
|
|
|
In this simplified representation our model becomes:
|
|
|
|
|
|
|
|
Pdyn = Capacitance * Voltage^2 * Frequency * Utilisation
|
|
|
|
|
|
|
|
Where `capacitance` is a constant that represents an indicative
|
|
|
|
running time dynamic power coefficient in fundamental units of
|
|
|
|
mW/MHz/uVolt^2. Typical values for mobile CPUs might lie in range
|
|
|
|
from 100 to 500. For reference, the approximate values for the SoC in
|
|
|
|
ARM's Juno Development Platform are 530 for the Cortex-A57 cluster and
|
|
|
|
140 for the Cortex-A53 cluster.
|