mirror of https://gitee.com/openkylin/linux.git
108 lines
3.9 KiB
ReStructuredText
108 lines
3.9 KiB
ReStructuredText
|
=======================
|
||
|
CPU cooling APIs How To
|
||
|
=======================
|
||
|
|
||
|
Written by Amit Daniel Kachhap <amit.kachhap@linaro.org>
|
||
|
|
||
|
Updated: 6 Jan 2015
|
||
|
|
||
|
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
|
||
|
--------------------------------------------
|
||
|
|
||
|
::
|
||
|
|
||
|
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.
|
||
|
|
||
|
::
|
||
|
|
||
|
struct thermal_cooling_device
|
||
|
*of_cpufreq_cooling_register(struct cpufreq_policy *policy)
|
||
|
|
||
|
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.
|
||
|
|
||
|
policy:
|
||
|
CPUFreq policy.
|
||
|
|
||
|
|
||
|
::
|
||
|
|
||
|
void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev)
|
||
|
|
||
|
This interface function unregisters the "thermal-cpufreq-%x" cooling device.
|
||
|
|
||
|
cdev: Cooling device pointer which has to be unregistered.
|
||
|
|
||
|
2. Power models
|
||
|
===============
|
||
|
|
||
|
The power API registration functions provide a simple power model for
|
||
|
CPUs. The current power is calculated as dynamic power (static power isn't
|
||
|
supported currently). This power model requires that the operating-points of
|
||
|
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.
|