18c2ecf20Sopenharmony_ci=======================
28c2ecf20Sopenharmony_ciIntel Powerclamp Driver
38c2ecf20Sopenharmony_ci=======================
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ciBy:
68c2ecf20Sopenharmony_ci  - Arjan van de Ven <arjan@linux.intel.com>
78c2ecf20Sopenharmony_ci  - Jacob Pan <jacob.jun.pan@linux.intel.com>
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci.. Contents:
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci	(*) Introduction
128c2ecf20Sopenharmony_ci	    - Goals and Objectives
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci	(*) Theory of Operation
158c2ecf20Sopenharmony_ci	    - Idle Injection
168c2ecf20Sopenharmony_ci	    - Calibration
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci	(*) Performance Analysis
198c2ecf20Sopenharmony_ci	    - Effectiveness and Limitations
208c2ecf20Sopenharmony_ci	    - Power vs Performance
218c2ecf20Sopenharmony_ci	    - Scalability
228c2ecf20Sopenharmony_ci	    - Calibration
238c2ecf20Sopenharmony_ci	    - Comparison with Alternative Techniques
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci	(*) Usage and Interfaces
268c2ecf20Sopenharmony_ci	    - Generic Thermal Layer (sysfs)
278c2ecf20Sopenharmony_ci	    - Kernel APIs (TBD)
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ciINTRODUCTION
308c2ecf20Sopenharmony_ci============
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ciConsider the situation where a system’s power consumption must be
338c2ecf20Sopenharmony_cireduced at runtime, due to power budget, thermal constraint, or noise
348c2ecf20Sopenharmony_cilevel, and where active cooling is not preferred. Software managed
358c2ecf20Sopenharmony_cipassive power reduction must be performed to prevent the hardware
368c2ecf20Sopenharmony_ciactions that are designed for catastrophic scenarios.
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ciCurrently, P-states, T-states (clock modulation), and CPU offlining
398c2ecf20Sopenharmony_ciare used for CPU throttling.
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ciOn Intel CPUs, C-states provide effective power reduction, but so far
428c2ecf20Sopenharmony_cithey’re only used opportunistically, based on workload. With the
438c2ecf20Sopenharmony_cidevelopment of intel_powerclamp driver, the method of synchronizing
448c2ecf20Sopenharmony_ciidle injection across all online CPU threads was introduced. The goal
458c2ecf20Sopenharmony_ciis to achieve forced and controllable C-state residency.
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ciTest/Analysis has been made in the areas of power, performance,
488c2ecf20Sopenharmony_ciscalability, and user experience. In many cases, clear advantage is
498c2ecf20Sopenharmony_cishown over taking the CPU offline or modulating the CPU clock.
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ciTHEORY OF OPERATION
538c2ecf20Sopenharmony_ci===================
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ciIdle Injection
568c2ecf20Sopenharmony_ci--------------
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ciOn modern Intel processors (Nehalem or later), package level C-state
598c2ecf20Sopenharmony_ciresidency is available in MSRs, thus also available to the kernel.
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ciThese MSRs are::
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci      #define MSR_PKG_C2_RESIDENCY      0x60D
648c2ecf20Sopenharmony_ci      #define MSR_PKG_C3_RESIDENCY      0x3F8
658c2ecf20Sopenharmony_ci      #define MSR_PKG_C6_RESIDENCY      0x3F9
668c2ecf20Sopenharmony_ci      #define MSR_PKG_C7_RESIDENCY      0x3FA
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ciIf the kernel can also inject idle time to the system, then a
698c2ecf20Sopenharmony_ciclosed-loop control system can be established that manages package
708c2ecf20Sopenharmony_cilevel C-state. The intel_powerclamp driver is conceived as such a
718c2ecf20Sopenharmony_cicontrol system, where the target set point is a user-selected idle
728c2ecf20Sopenharmony_ciratio (based on power reduction), and the error is the difference
738c2ecf20Sopenharmony_cibetween the actual package level C-state residency ratio and the target idle
748c2ecf20Sopenharmony_ciratio.
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ciInjection is controlled by high priority kernel threads, spawned for
778c2ecf20Sopenharmony_cieach online CPU.
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ciThese kernel threads, with SCHED_FIFO class, are created to perform
808c2ecf20Sopenharmony_ciclamping actions of controlled duty ratio and duration. Each per-CPU
818c2ecf20Sopenharmony_cithread synchronizes its idle time and duration, based on the rounding
828c2ecf20Sopenharmony_ciof jiffies, so accumulated errors can be prevented to avoid a jittery
838c2ecf20Sopenharmony_cieffect. Threads are also bound to the CPU such that they cannot be
848c2ecf20Sopenharmony_cimigrated, unless the CPU is taken offline. In this case, threads
858c2ecf20Sopenharmony_cibelong to the offlined CPUs will be terminated immediately.
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ciRunning as SCHED_FIFO and relatively high priority, also allows such
888c2ecf20Sopenharmony_cischeme to work for both preemptable and non-preemptable kernels.
898c2ecf20Sopenharmony_ciAlignment of idle time around jiffies ensures scalability for HZ
908c2ecf20Sopenharmony_civalues. This effect can be better visualized using a Perf timechart.
918c2ecf20Sopenharmony_ciThe following diagram shows the behavior of kernel thread
928c2ecf20Sopenharmony_cikidle_inject/cpu. During idle injection, it runs monitor/mwait idle
938c2ecf20Sopenharmony_cifor a given "duration", then relinquishes the CPU to other tasks,
948c2ecf20Sopenharmony_ciuntil the next time interval.
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ciThe NOHZ schedule tick is disabled during idle time, but interrupts
978c2ecf20Sopenharmony_ciare not masked. Tests show that the extra wakeups from scheduler tick
988c2ecf20Sopenharmony_cihave a dramatic impact on the effectiveness of the powerclamp driver
998c2ecf20Sopenharmony_cion large scale systems (Westmere system with 80 processors).
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci::
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ci  CPU0
1048c2ecf20Sopenharmony_ci		    ____________          ____________
1058c2ecf20Sopenharmony_ci  kidle_inject/0   |   sleep    |  mwait |  sleep     |
1068c2ecf20Sopenharmony_ci	  _________|            |________|            |_______
1078c2ecf20Sopenharmony_ci				 duration
1088c2ecf20Sopenharmony_ci  CPU1
1098c2ecf20Sopenharmony_ci		    ____________          ____________
1108c2ecf20Sopenharmony_ci  kidle_inject/1   |   sleep    |  mwait |  sleep     |
1118c2ecf20Sopenharmony_ci	  _________|            |________|            |_______
1128c2ecf20Sopenharmony_ci				^
1138c2ecf20Sopenharmony_ci				|
1148c2ecf20Sopenharmony_ci				|
1158c2ecf20Sopenharmony_ci				roundup(jiffies, interval)
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ciOnly one CPU is allowed to collect statistics and update global
1188c2ecf20Sopenharmony_cicontrol parameters. This CPU is referred to as the controlling CPU in
1198c2ecf20Sopenharmony_cithis document. The controlling CPU is elected at runtime, with a
1208c2ecf20Sopenharmony_cipolicy that favors BSP, taking into account the possibility of a CPU
1218c2ecf20Sopenharmony_cihot-plug.
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ciIn terms of dynamics of the idle control system, package level idle
1248c2ecf20Sopenharmony_citime is considered largely as a non-causal system where its behavior
1258c2ecf20Sopenharmony_cicannot be based on the past or current input. Therefore, the
1268c2ecf20Sopenharmony_ciintel_powerclamp driver attempts to enforce the desired idle time
1278c2ecf20Sopenharmony_ciinstantly as given input (target idle ratio). After injection,
1288c2ecf20Sopenharmony_cipowerclamp monitors the actual idle for a given time window and adjust
1298c2ecf20Sopenharmony_cithe next injection accordingly to avoid over/under correction.
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ciWhen used in a causal control system, such as a temperature control,
1328c2ecf20Sopenharmony_ciit is up to the user of this driver to implement algorithms where
1338c2ecf20Sopenharmony_cipast samples and outputs are included in the feedback. For example, a
1348c2ecf20Sopenharmony_ciPID-based thermal controller can use the powerclamp driver to
1358c2ecf20Sopenharmony_cimaintain a desired target temperature, based on integral and
1368c2ecf20Sopenharmony_ciderivative gains of the past samples.
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ciCalibration
1418c2ecf20Sopenharmony_ci-----------
1428c2ecf20Sopenharmony_ciDuring scalability testing, it is observed that synchronized actions
1438c2ecf20Sopenharmony_ciamong CPUs become challenging as the number of cores grows. This is
1448c2ecf20Sopenharmony_cialso true for the ability of a system to enter package level C-states.
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ciTo make sure the intel_powerclamp driver scales well, online
1478c2ecf20Sopenharmony_cicalibration is implemented. The goals for doing such a calibration
1488c2ecf20Sopenharmony_ciare:
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_cia) determine the effective range of idle injection ratio
1518c2ecf20Sopenharmony_cib) determine the amount of compensation needed at each target ratio
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ciCompensation to each target ratio consists of two parts:
1548c2ecf20Sopenharmony_ci
1558c2ecf20Sopenharmony_ci	a) steady state error compensation
1568c2ecf20Sopenharmony_ci	This is to offset the error occurring when the system can
1578c2ecf20Sopenharmony_ci	enter idle without extra wakeups (such as external interrupts).
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci	b) dynamic error compensation
1608c2ecf20Sopenharmony_ci	When an excessive amount of wakeups occurs during idle, an
1618c2ecf20Sopenharmony_ci	additional idle ratio can be added to quiet interrupts, by
1628c2ecf20Sopenharmony_ci	slowing down CPU activities.
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_ciA debugfs file is provided for the user to examine compensation
1658c2ecf20Sopenharmony_ciprogress and results, such as on a Westmere system::
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_ci  [jacob@nex01 ~]$ cat
1688c2ecf20Sopenharmony_ci  /sys/kernel/debug/intel_powerclamp/powerclamp_calib
1698c2ecf20Sopenharmony_ci  controlling cpu: 0
1708c2ecf20Sopenharmony_ci  pct confidence steady dynamic (compensation)
1718c2ecf20Sopenharmony_ci  0       0       0       0
1728c2ecf20Sopenharmony_ci  1       1       0       0
1738c2ecf20Sopenharmony_ci  2       1       1       0
1748c2ecf20Sopenharmony_ci  3       3       1       0
1758c2ecf20Sopenharmony_ci  4       3       1       0
1768c2ecf20Sopenharmony_ci  5       3       1       0
1778c2ecf20Sopenharmony_ci  6       3       1       0
1788c2ecf20Sopenharmony_ci  7       3       1       0
1798c2ecf20Sopenharmony_ci  8       3       1       0
1808c2ecf20Sopenharmony_ci  ...
1818c2ecf20Sopenharmony_ci  30      3       2       0
1828c2ecf20Sopenharmony_ci  31      3       2       0
1838c2ecf20Sopenharmony_ci  32      3       1       0
1848c2ecf20Sopenharmony_ci  33      3       2       0
1858c2ecf20Sopenharmony_ci  34      3       1       0
1868c2ecf20Sopenharmony_ci  35      3       2       0
1878c2ecf20Sopenharmony_ci  36      3       1       0
1888c2ecf20Sopenharmony_ci  37      3       2       0
1898c2ecf20Sopenharmony_ci  38      3       1       0
1908c2ecf20Sopenharmony_ci  39      3       2       0
1918c2ecf20Sopenharmony_ci  40      3       3       0
1928c2ecf20Sopenharmony_ci  41      3       1       0
1938c2ecf20Sopenharmony_ci  42      3       2       0
1948c2ecf20Sopenharmony_ci  43      3       1       0
1958c2ecf20Sopenharmony_ci  44      3       1       0
1968c2ecf20Sopenharmony_ci  45      3       2       0
1978c2ecf20Sopenharmony_ci  46      3       3       0
1988c2ecf20Sopenharmony_ci  47      3       0       0
1998c2ecf20Sopenharmony_ci  48      3       2       0
2008c2ecf20Sopenharmony_ci  49      3       3       0
2018c2ecf20Sopenharmony_ci
2028c2ecf20Sopenharmony_ciCalibration occurs during runtime. No offline method is available.
2038c2ecf20Sopenharmony_ciSteady state compensation is used only when confidence levels of all
2048c2ecf20Sopenharmony_ciadjacent ratios have reached satisfactory level. A confidence level
2058c2ecf20Sopenharmony_ciis accumulated based on clean data collected at runtime. Data
2068c2ecf20Sopenharmony_cicollected during a period without extra interrupts is considered
2078c2ecf20Sopenharmony_ciclean.
2088c2ecf20Sopenharmony_ci
2098c2ecf20Sopenharmony_ciTo compensate for excessive amounts of wakeup during idle, additional
2108c2ecf20Sopenharmony_ciidle time is injected when such a condition is detected. Currently,
2118c2ecf20Sopenharmony_ciwe have a simple algorithm to double the injection ratio. A possible
2128c2ecf20Sopenharmony_cienhancement might be to throttle the offending IRQ, such as delaying
2138c2ecf20Sopenharmony_ciEOI for level triggered interrupts. But it is a challenge to be
2148c2ecf20Sopenharmony_cinon-intrusive to the scheduler or the IRQ core code.
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_ci
2178c2ecf20Sopenharmony_ciCPU Online/Offline
2188c2ecf20Sopenharmony_ci------------------
2198c2ecf20Sopenharmony_ciPer-CPU kernel threads are started/stopped upon receiving
2208c2ecf20Sopenharmony_cinotifications of CPU hotplug activities. The intel_powerclamp driver
2218c2ecf20Sopenharmony_cikeeps track of clamping kernel threads, even after they are migrated
2228c2ecf20Sopenharmony_cito other CPUs, after a CPU offline event.
2238c2ecf20Sopenharmony_ci
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ciPerformance Analysis
2268c2ecf20Sopenharmony_ci====================
2278c2ecf20Sopenharmony_ciThis section describes the general performance data collected on
2288c2ecf20Sopenharmony_cimultiple systems, including Westmere (80P) and Ivy Bridge (4P, 8P).
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_ciEffectiveness and Limitations
2318c2ecf20Sopenharmony_ci-----------------------------
2328c2ecf20Sopenharmony_ciThe maximum range that idle injection is allowed is capped at 50
2338c2ecf20Sopenharmony_cipercent. As mentioned earlier, since interrupts are allowed during
2348c2ecf20Sopenharmony_ciforced idle time, excessive interrupts could result in less
2358c2ecf20Sopenharmony_cieffectiveness. The extreme case would be doing a ping -f to generated
2368c2ecf20Sopenharmony_ciflooded network interrupts without much CPU acknowledgement. In this
2378c2ecf20Sopenharmony_cicase, little can be done from the idle injection threads. In most
2388c2ecf20Sopenharmony_cinormal cases, such as scp a large file, applications can be throttled
2398c2ecf20Sopenharmony_ciby the powerclamp driver, since slowing down the CPU also slows down
2408c2ecf20Sopenharmony_cinetwork protocol processing, which in turn reduces interrupts.
2418c2ecf20Sopenharmony_ci
2428c2ecf20Sopenharmony_ciWhen control parameters change at runtime by the controlling CPU, it
2438c2ecf20Sopenharmony_cimay take an additional period for the rest of the CPUs to catch up
2448c2ecf20Sopenharmony_ciwith the changes. During this time, idle injection is out of sync,
2458c2ecf20Sopenharmony_cithus not able to enter package C- states at the expected ratio. But
2468c2ecf20Sopenharmony_cithis effect is minor, in that in most cases change to the target
2478c2ecf20Sopenharmony_ciratio is updated much less frequently than the idle injection
2488c2ecf20Sopenharmony_cifrequency.
2498c2ecf20Sopenharmony_ci
2508c2ecf20Sopenharmony_ciScalability
2518c2ecf20Sopenharmony_ci-----------
2528c2ecf20Sopenharmony_ciTests also show a minor, but measurable, difference between the 4P/8P
2538c2ecf20Sopenharmony_ciIvy Bridge system and the 80P Westmere server under 50% idle ratio.
2548c2ecf20Sopenharmony_ciMore compensation is needed on Westmere for the same amount of
2558c2ecf20Sopenharmony_citarget idle ratio. The compensation also increases as the idle ratio
2568c2ecf20Sopenharmony_cigets larger. The above reason constitutes the need for the
2578c2ecf20Sopenharmony_cicalibration code.
2588c2ecf20Sopenharmony_ci
2598c2ecf20Sopenharmony_ciOn the IVB 8P system, compared to an offline CPU, powerclamp can
2608c2ecf20Sopenharmony_ciachieve up to 40% better performance per watt. (measured by a spin
2618c2ecf20Sopenharmony_cicounter summed over per CPU counting threads spawned for all running
2628c2ecf20Sopenharmony_ciCPUs).
2638c2ecf20Sopenharmony_ci
2648c2ecf20Sopenharmony_ciUsage and Interfaces
2658c2ecf20Sopenharmony_ci====================
2668c2ecf20Sopenharmony_ciThe powerclamp driver is registered to the generic thermal layer as a
2678c2ecf20Sopenharmony_cicooling device. Currently, it’s not bound to any thermal zones::
2688c2ecf20Sopenharmony_ci
2698c2ecf20Sopenharmony_ci  jacob@chromoly:/sys/class/thermal/cooling_device14$ grep . *
2708c2ecf20Sopenharmony_ci  cur_state:0
2718c2ecf20Sopenharmony_ci  max_state:50
2728c2ecf20Sopenharmony_ci  type:intel_powerclamp
2738c2ecf20Sopenharmony_ci
2748c2ecf20Sopenharmony_cicur_state allows user to set the desired idle percentage. Writing 0 to
2758c2ecf20Sopenharmony_cicur_state will stop idle injection. Writing a value between 1 and
2768c2ecf20Sopenharmony_cimax_state will start the idle injection. Reading cur_state returns the
2778c2ecf20Sopenharmony_ciactual and current idle percentage. This may not be the same value
2788c2ecf20Sopenharmony_ciset by the user in that current idle percentage depends on workload
2798c2ecf20Sopenharmony_ciand includes natural idle. When idle injection is disabled, reading
2808c2ecf20Sopenharmony_cicur_state returns value -1 instead of 0 which is to avoid confusing
2818c2ecf20Sopenharmony_ci100% busy state with the disabled state.
2828c2ecf20Sopenharmony_ci
2838c2ecf20Sopenharmony_ciExample usage:
2848c2ecf20Sopenharmony_ci- To inject 25% idle time::
2858c2ecf20Sopenharmony_ci
2868c2ecf20Sopenharmony_ci	$ sudo sh -c "echo 25 > /sys/class/thermal/cooling_device80/cur_state
2878c2ecf20Sopenharmony_ci
2888c2ecf20Sopenharmony_ciIf the system is not busy and has more than 25% idle time already,
2898c2ecf20Sopenharmony_cithen the powerclamp driver will not start idle injection. Using Top
2908c2ecf20Sopenharmony_ciwill not show idle injection kernel threads.
2918c2ecf20Sopenharmony_ci
2928c2ecf20Sopenharmony_ciIf the system is busy (spin test below) and has less than 25% natural
2938c2ecf20Sopenharmony_ciidle time, powerclamp kernel threads will do idle injection. Forced
2948c2ecf20Sopenharmony_ciidle time is accounted as normal idle in that common code path is
2958c2ecf20Sopenharmony_citaken as the idle task.
2968c2ecf20Sopenharmony_ci
2978c2ecf20Sopenharmony_ciIn this example, 24.1% idle is shown. This helps the system admin or
2988c2ecf20Sopenharmony_ciuser determine the cause of slowdown, when a powerclamp driver is in action::
2998c2ecf20Sopenharmony_ci
3008c2ecf20Sopenharmony_ci
3018c2ecf20Sopenharmony_ci  Tasks: 197 total,   1 running, 196 sleeping,   0 stopped,   0 zombie
3028c2ecf20Sopenharmony_ci  Cpu(s): 71.2%us,  4.7%sy,  0.0%ni, 24.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
3038c2ecf20Sopenharmony_ci  Mem:   3943228k total,  1689632k used,  2253596k free,    74960k buffers
3048c2ecf20Sopenharmony_ci  Swap:  4087804k total,        0k used,  4087804k free,   945336k cached
3058c2ecf20Sopenharmony_ci
3068c2ecf20Sopenharmony_ci    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
3078c2ecf20Sopenharmony_ci   3352 jacob     20   0  262m  644  428 S  286  0.0   0:17.16 spin
3088c2ecf20Sopenharmony_ci   3341 root     -51   0     0    0    0 D   25  0.0   0:01.62 kidle_inject/0
3098c2ecf20Sopenharmony_ci   3344 root     -51   0     0    0    0 D   25  0.0   0:01.60 kidle_inject/3
3108c2ecf20Sopenharmony_ci   3342 root     -51   0     0    0    0 D   25  0.0   0:01.61 kidle_inject/1
3118c2ecf20Sopenharmony_ci   3343 root     -51   0     0    0    0 D   25  0.0   0:01.60 kidle_inject/2
3128c2ecf20Sopenharmony_ci   2935 jacob     20   0  696m 125m  35m S    5  3.3   0:31.11 firefox
3138c2ecf20Sopenharmony_ci   1546 root      20   0  158m  20m 6640 S    3  0.5   0:26.97 Xorg
3148c2ecf20Sopenharmony_ci   2100 jacob     20   0 1223m  88m  30m S    3  2.3   0:23.68 compiz
3158c2ecf20Sopenharmony_ci
3168c2ecf20Sopenharmony_ciTests have shown that by using the powerclamp driver as a cooling
3178c2ecf20Sopenharmony_cidevice, a PID based userspace thermal controller can manage to
3188c2ecf20Sopenharmony_cicontrol CPU temperature effectively, when no other thermal influence
3198c2ecf20Sopenharmony_ciis added. For example, a UltraBook user can compile the kernel under
3208c2ecf20Sopenharmony_cicertain temperature (below most active trip points).
321