| ======================= |
| 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. |