^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) # Copyright 2020 Linaro Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) %YAML 1.2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) ---
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) $id: http://devicetree.org/schemas/thermal/thermal-idle.yaml#
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) $schema: http://devicetree.org/meta-schemas/core.yaml#
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) title: Thermal idle cooling device binding
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) maintainers:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) - Daniel Lezcano <daniel.lezcano@linaro.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) description: |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) The thermal idle cooling device allows the system to passively
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) mitigate the temperature on the device by injecting idle cycles,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) forcing it to cool down.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) This binding describes the thermal idle node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) properties:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) $nodename:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) const: thermal-idle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) description: |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) A thermal-idle node describes the idle cooling device properties to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) cool down efficiently the attached thermal zone.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) '#cooling-cells':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) const: 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) description: |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) Must be 2, in order to specify minimum and maximum cooling state used in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) the cooling-maps reference. The first cell is the minimum cooling state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) and the second cell is the maximum cooling state requested.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) duration-us:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) description: |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) The idle duration in microsecond the device should cool down.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) exit-latency-us:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) description: |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) The exit latency constraint in microsecond for the injected idle state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) for the device. It is the latency constraint to apply when selecting an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) idle state from among all the present ones.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) required:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) - '#cooling-cells'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) additionalProperties: false
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) examples:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) - |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #include <dt-bindings/thermal/thermal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) // Example: Combining idle cooling device on big CPUs with cpufreq cooling device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) cpus {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #address-cells = <2>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #size-cells = <0>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) /* ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) cpu_b0: cpu@100 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) device_type = "cpu";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) compatible = "arm,cortex-a72";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) reg = <0x0 0x100>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) enable-method = "psci";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) capacity-dmips-mhz = <1024>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) dynamic-power-coefficient = <436>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #cooling-cells = <2>; /* min followed by max */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) cpu-idle-states = <&CPU_SLEEP &CLUSTER_SLEEP>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) thermal-idle {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #cooling-cells = <2>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) duration-us = <10000>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) exit-latency-us = <500>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) cpu_b1: cpu@101 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) device_type = "cpu";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) compatible = "arm,cortex-a72";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) reg = <0x0 0x101>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) enable-method = "psci";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) capacity-dmips-mhz = <1024>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) dynamic-power-coefficient = <436>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #cooling-cells = <2>; /* min followed by max */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) cpu-idle-states = <&CPU_SLEEP &CLUSTER_SLEEP>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) thermal-idle {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #cooling-cells = <2>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) duration-us = <10000>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) exit-latency-us = <500>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /* ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) /* ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) thermal_zones {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) cpu_thermal: cpu {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) polling-delay-passive = <100>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) polling-delay = <1000>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) /* ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) trips {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) cpu_alert0: cpu_alert0 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) temperature = <65000>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) hysteresis = <2000>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) type = "passive";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) cpu_alert1: cpu_alert1 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) temperature = <70000>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) hysteresis = <2000>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) type = "passive";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) cpu_alert2: cpu_alert2 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) temperature = <75000>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) hysteresis = <2000>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) type = "passive";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) cpu_crit: cpu_crit {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) temperature = <95000>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) hysteresis = <2000>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) type = "critical";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) cooling-maps {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) map0 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) trip = <&cpu_alert1>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) cooling-device = <&{/cpus/cpu@100/thermal-idle} 0 15 >,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) <&{/cpus/cpu@101/thermal-idle} 0 15>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) map1 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) trip = <&cpu_alert2>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) cooling-device =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) <&cpu_b0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) <&cpu_b1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) };