arm64: dts: marvell: Enable AP806 thermal throttling with CPUfreq
authorMiquel Raynal <miquel.raynal@bootlin.com>
Tue, 21 May 2019 14:25:04 +0000 (16:25 +0200)
committerGregory CLEMENT <gregory.clement@bootlin.com>
Mon, 3 Jun 2019 14:41:30 +0000 (16:41 +0200)
Avoid critical temperatures in the AP806 by adding the relevant trip
points/cooling-maps using CPUfreq as cooling device.

So far, when the temperature reaches 100°C in the thermal IP of the
AP806 (close enough from the 2/4 cores) an overheat interrupt is
raised. The thermal core then shutdowns the system to avoid damaging
the hardware.

Adding CPUfreq as a cooling device could help avoiding such very
critical situation. For that, we enable thermal throttling by
defining, for each CPU, two trip points with the corresponding cooling
'intensity'. CPU0 and CPU1 are in the same cluster and are driven by
the same clock. Same applies for CPU2 and CPU3, if available. So
changing the frequency of one will also change the frequency of the
other one, hence the use of two cooling devices per core.

The heat map is as follow:
- Below 85°C: the cluster runs at the highest frequency
  (e.g: 1200MHz).
- Between 85°C and 95°C: there are two trip points at half
  (e.g: 600MHz) and a third (e.g: 400MHz) of the highest frequency.
- Above 95°C the cluster runs at a quarter of the highest frequency
  (e.g: 300MHz).
- At 100°C the platform is shutdown.

Suggested-by: Omri Itach <omrii@marvell.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
arch/arm64/boot/dts/marvell/armada-ap806-dual.dtsi
arch/arm64/boot/dts/marvell/armada-ap806-quad.dtsi
arch/arm64/boot/dts/marvell/armada-ap806.dtsi

index 861fd21922c430945fb656a307d2b321620ae132..9024a2d9db070d59c0c3fa497b5af5de81b4f6db 100644 (file)
                        compatible = "arm,cortex-a72";
                        reg = <0x000>;
                        enable-method = "psci";
+                       #cooling-cells = <2>;
                };
                cpu1: cpu@1 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a72";
                        reg = <0x001>;
                        enable-method = "psci";
+                       #cooling-cells = <2>;
                };
        };
 };
index 2baafe12ebd41699c116036ca82082efb539667d..ea13ae78f50d3a3faade97c54825d01d24007794 100644 (file)
                        compatible = "arm,cortex-a72";
                        reg = <0x000>;
                        enable-method = "psci";
+                       #cooling-cells = <2>;
                };
                cpu1: cpu@1 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a72";
                        reg = <0x001>;
                        enable-method = "psci";
+                       #cooling-cells = <2>;
                };
                cpu2: cpu@100 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a72";
                        reg = <0x100>;
                        enable-method = "psci";
+                       #cooling-cells = <2>;
                };
                cpu3: cpu@101 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a72";
                        reg = <0x101>;
                        enable-method = "psci";
+                       #cooling-cells = <2>;
                };
        };
+
 };
index 9443d3963024d295bbfea433603d98f034679026..96228f93b2722af71107247c87dd7eefa6958c22 100644 (file)
         *
         * Only one thermal zone per AP/CP may trigger interrupts at a time, the
         * first one that will have a critical trip point will be chosen.
-        *
-        * The cooling maps are always empty as there are no cooling devices.
         */
        thermal-zones {
                ap_thermal_ic: ap-thermal-ic {
 
                        thermal-sensors = <&ap_thermal 1>;
 
-                       trips { };
-                       cooling-maps { };
+                       trips {
+                               cpu0_hot: cpu0-hot {
+                                       temperature = <85000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                               cpu0_emerg: cpu0-emerg {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                       };
+
+                       cooling-maps {
+                               map0_hot: map0-hot {
+                                       trip = <&cpu0_hot>;
+                                       cooling-device = <&cpu0 1 2>,
+                                               <&cpu1 1 2>;
+                               };
+                               map0_emerg: map0-ermerg {
+                                       trip = <&cpu0_emerg>;
+                                       cooling-device = <&cpu0 3 3>,
+                                               <&cpu1 3 3>;
+                               };
+                       };
                };
 
                ap_thermal_cpu1: ap-thermal-cpu1 {
 
                        thermal-sensors = <&ap_thermal 2>;
 
-                       trips { };
-                       cooling-maps { };
+                       trips {
+                               cpu1_hot: cpu1-hot {
+                                       temperature = <85000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                               cpu1_emerg: cpu1-emerg {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                       };
+
+                       cooling-maps {
+                               map1_hot: map1-hot {
+                                       trip = <&cpu1_hot>;
+                                       cooling-device = <&cpu0 1 2>,
+                                               <&cpu1 1 2>;
+                               };
+                               map1_emerg: map1-emerg {
+                                       trip = <&cpu1_emerg>;
+                                       cooling-device = <&cpu0 3 3>,
+                                               <&cpu1 3 3>;
+                               };
+                       };
                };
 
                ap_thermal_cpu2: ap-thermal-cpu2 {
 
                        thermal-sensors = <&ap_thermal 3>;
 
-                       trips { };
-                       cooling-maps { };
+                       trips {
+                               cpu2_hot: cpu2-hot {
+                                       temperature = <85000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                               cpu2_emerg: cpu2-emerg {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                       };
+
+                       cooling-maps {
+                               map2_hot: map2-hot {
+                                       trip = <&cpu2_hot>;
+                                       cooling-device = <&cpu2 1 2>,
+                                               <&cpu3 1 2>;
+                               };
+                               map2_emerg: map2-emerg {
+                                       trip = <&cpu2_emerg>;
+                                       cooling-device = <&cpu2 3 3>,
+                                               <&cpu3 3 3>;
+                               };
+                       };
                };
 
                ap_thermal_cpu3: ap-thermal-cpu3 {
 
                        thermal-sensors = <&ap_thermal 4>;
 
-                       trips { };
-                       cooling-maps { };
+                       trips {
+                               cpu3_hot: cpu3-hot {
+                                       temperature = <85000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                               cpu3_emerg: cpu3-emerg {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                       };
+
+                       cooling-maps {
+                               map3_hot: map3-bhot {
+                                       trip = <&cpu3_hot>;
+                                       cooling-device = <&cpu2 1 2>,
+                                               <&cpu3 1 2>;
+                               };
+                               map3_emerg: map3-emerg {
+                                       trip = <&cpu3_emerg>;
+                                       cooling-device = <&cpu2 3 3>,
+                                               <&cpu3 3 3>;
+                               };
+                       };
                };
        };
 };