]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
arm: mach-k3: am62: Fixup thermal zone critical points
authorJoao Paulo Goncalves <joao.goncalves@toradex.com>
Thu, 8 Feb 2024 09:29:51 +0000 (10:29 +0100)
committerTom Rini <trini@konsulko.com>
Mon, 4 Mar 2024 18:41:04 +0000 (13:41 -0500)
Read the max temperature for the SoC temperature grade from the hardware
and change the critical trip nodes on each thermal zone of FDT at
runtime so they are correct with the hardware value for its grade.

Signed-off-by: Joao Paulo Goncalves <joao.goncalves@toradex.com>
Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
arch/arm/mach-k3/am625_fdt.c

index 970dd3447dec4b2d2c6d33551ec99e9427d5c574..3c46d1028fd05b707846479103e81b5348dc19d6 100644 (file)
@@ -38,11 +38,48 @@ static void fdt_fixup_pru_node_am625(void *blob, int has_pru)
                fdt_del_node_path(blob, "/bus@f0000/pruss@30040000");
 }
 
+static int fdt_fixup_trips_node(void *blob, int zoneoffset, int maxc)
+{
+       int node, trip;
+
+       node = fdt_subnode_offset(blob, zoneoffset, "trips");
+       if (node < 0)
+               return -1;
+
+       fdt_for_each_subnode(trip, blob, node) {
+               const char *type = fdt_getprop(blob, trip, "type", NULL);
+
+               if (!type || (strncmp(type, "critical", 8) != 0))
+                       continue;
+
+               if (fdt_setprop_u32(blob, trip, "temperature", 1000 * maxc) < 0)
+                       return -1;
+       }
+
+       return 0;
+}
+
+static void fdt_fixup_thermal_zone_nodes_am625(void *blob, int maxc)
+{
+       int node, zone;
+
+       node = fdt_path_offset(blob, "/thermal-zones");
+       if (node < 0)
+               return;
+
+       fdt_for_each_subnode(zone, blob, node) {
+               if (fdt_fixup_trips_node(blob, zone, maxc) < 0)
+                       printf("Failed to set temperature in %s critical trips\n",
+                              fdt_get_name(blob, zone, NULL));
+       }
+}
+
 int ft_system_setup(void *blob, struct bd_info *bd)
 {
        fdt_fixup_cores_nodes_am625(blob, k3_get_core_nr());
        fdt_fixup_gpu_nodes_am625(blob, k3_has_gpu());
        fdt_fixup_pru_node_am625(blob, k3_has_pru());
+       fdt_fixup_thermal_zone_nodes_am625(blob, k3_get_max_temp());
 
        return 0;
 }