• Daniel Lezcano's avatar
    thermal/drivers/cpu_cooling: Introduce the cpu idle cooling driver · 01907da6
    Daniel Lezcano authored
    The cpu idle cooling driver performs synchronized idle injection across all
    cpus belonging to the same cluster and offers a new method to cool down a SoC.
    
    Each cluster has its own idle cooling device, each core has its own idle
    injection thread, each idle injection thread uses play_idle to enter idle.  In
    order to reach the deepest idle state, each cooling device has the idle
    injection threads synchronized together.
    
    It has some similarity with the intel power clamp driver but it is actually
    designed to work on the ARM architecture via the DT with a mathematical proof
    with the power model which comes with the Documentation.
    
    The idle injection cycle is fixed while the running cycle is variable. That
    allows to have control on the device reactivity for the user experience. At
    the mitigation point the idle threads are unparked, they play idle the
    specified amount of time and they schedule themselves. The last thread sets
    the next idle injection deadline and when the timer expires it wakes up all
    the threads which in turn play idle again. Meanwhile the running cycle is
    changed by set_cur_state.  When the mitigation ends, the threads are parked.
    The algorithm is self adaptive, so there is no need to handle hotplugging.
    
    If we take an example of the balanced point, we can use the DT for the hi6220.
    
    The sustainable power for the SoC is 3326mW to mitigate at 75°C. Eight cores
    running at full blast at the maximum OPP consumes 5280mW. The first value is
    given in the DT, the second is calculated from the OPP with the formula:
    
       Pdyn = Cdyn x Voltage^2 x Frequency
    
    As the SoC vendors don't want to share the static leakage values, we assume
    it is zero, so the Prun = Pdyn + Pstatic = Pdyn + 0 = Pdyn.
    
    In order to reduce the power to 3326mW, we have to apply a ratio to the
    running time.
    
    ratio = (Prun - Ptarget) / Ptarget = (5280 - 3326) / 3326 = 0,5874
    
    We know the idle cycle which is fixed, let's assume 10ms. However from this
    duration we have to substract the wake up latency for the cluster idle state.
    In our case, it is 1.5ms. So for a 10ms latency for idle, we are really idle
    8.5ms.
    
    As we know the idle duration and the ratio, we can compute the running cycle.
    
       running_cycle = 8.5 / 0.5874 = 14.47ms
    
    So for 8.5ms of idle, we have 14.47ms of running cycle, and that brings the
    SoC to the balanced trip point of 75°C.
    
    The driver has been tested on the hi6220 and it appears the temperature
    stabilizes at 75°C with an idle injection time of 10ms (8.5ms real) and
    running cycle of 14ms as expected by the theory above.
    Signed-off-by: default avatarKevin Wangtao <kevin.wangtao@linaro.org>
    Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
    01907da6
Name
Last commit
Last update
..
accessibility Loading commit data...
acpi Loading commit data...
amba Loading commit data...
android Loading commit data...
ata Loading commit data...
atm Loading commit data...
auxdisplay Loading commit data...
base Loading commit data...
bcma Loading commit data...
block Loading commit data...
bluetooth Loading commit data...
bus Loading commit data...
cdrom Loading commit data...
char Loading commit data...
clk Loading commit data...
clocksource Loading commit data...
connector Loading commit data...
counter Loading commit data...
cpufreq Loading commit data...
cpuidle Loading commit data...
crypto Loading commit data...
dax Loading commit data...
dca Loading commit data...
devfreq Loading commit data...
dio Loading commit data...
dma Loading commit data...
dma-buf Loading commit data...
edac Loading commit data...
eisa Loading commit data...
extcon Loading commit data...
firewire Loading commit data...
firmware Loading commit data...
fpga Loading commit data...
fsi Loading commit data...
gnss Loading commit data...
gpio Loading commit data...
gpu Loading commit data...
hid Loading commit data...
hsi Loading commit data...
hv Loading commit data...
hwmon Loading commit data...
hwspinlock Loading commit data...
hwtracing Loading commit data...
i2c Loading commit data...
i3c Loading commit data...
ide Loading commit data...
idle Loading commit data...
iio Loading commit data...
infiniband Loading commit data...
input Loading commit data...
interconnect Loading commit data...
iommu Loading commit data...
ipack Loading commit data...
irqchip Loading commit data...
isdn Loading commit data...
leds Loading commit data...
lightnvm Loading commit data...
macintosh Loading commit data...
mailbox Loading commit data...
mcb Loading commit data...
md Loading commit data...
media Loading commit data...
memory Loading commit data...
memstick Loading commit data...
message Loading commit data...
mfd Loading commit data...
misc Loading commit data...
mmc Loading commit data...
mtd Loading commit data...
mux Loading commit data...
net Loading commit data...
nfc Loading commit data...
ntb Loading commit data...
nubus Loading commit data...
nvdimm Loading commit data...
nvme Loading commit data...
nvmem Loading commit data...
of Loading commit data...
opp Loading commit data...
oprofile Loading commit data...
parisc Loading commit data...
parport Loading commit data...
pci Loading commit data...
pcmcia Loading commit data...
perf Loading commit data...
phy Loading commit data...
pinctrl Loading commit data...
platform Loading commit data...
pnp Loading commit data...
power Loading commit data...
powercap Loading commit data...
pps Loading commit data...
ps3 Loading commit data...
ptp Loading commit data...
pwm Loading commit data...
rapidio Loading commit data...
ras Loading commit data...
regulator Loading commit data...
remoteproc Loading commit data...
reset Loading commit data...
rpmsg Loading commit data...
rtc Loading commit data...
s390 Loading commit data...
sbus Loading commit data...
scsi Loading commit data...
sfi Loading commit data...
sh Loading commit data...
siox Loading commit data...
slimbus Loading commit data...
sn Loading commit data...
soc Loading commit data...
soundwire Loading commit data...
spi Loading commit data...
spmi Loading commit data...
ssb Loading commit data...
staging Loading commit data...
target Loading commit data...
tc Loading commit data...
tee Loading commit data...
thermal Loading commit data...
thunderbolt Loading commit data...
tty Loading commit data...
uio Loading commit data...
usb Loading commit data...
uwb Loading commit data...
vfio Loading commit data...
vhost Loading commit data...
video Loading commit data...
virt Loading commit data...
virtio Loading commit data...
visorbus Loading commit data...
vlynq Loading commit data...
vme Loading commit data...
w1 Loading commit data...
watchdog Loading commit data...
xen Loading commit data...
zorro Loading commit data...
Kconfig Loading commit data...
Makefile Loading commit data...