diff mbox series

[v1,2/2] arm: mach-k3: am62: Fixup thermal zone critical points

Message ID 20240208092951.11769-3-francesco@dolcini.it
State Accepted
Commit cc801630b27c2f5187a58e1d7f42a15550bbf542
Delegated to: Tom Rini
Headers show
Series arm: mach-k3: am62: Fixup thermal zone critical points | expand

Commit Message

Francesco Dolcini Feb. 8, 2024, 9:29 a.m. UTC
From: Joao Paulo Goncalves <joao.goncalves@toradex.com>

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 | 37 ++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

Comments

Tom Rini March 4, 2024, 11:44 p.m. UTC | #1
On Thu, Feb 08, 2024 at 10:29:51AM +0100, Francesco Dolcini wrote:

> From: Joao Paulo Goncalves <joao.goncalves@toradex.com>
> 
> 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>

Applied to u-boot/next, thanks!
diff mbox series

Patch

diff --git a/arch/arm/mach-k3/am625_fdt.c b/arch/arm/mach-k3/am625_fdt.c
index 970dd3447dec..3c46d1028fd0 100644
--- a/arch/arm/mach-k3/am625_fdt.c
+++ b/arch/arm/mach-k3/am625_fdt.c
@@ -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;
 }