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