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

From: Francesco Dolcini francesco.dolcini@toradex.com
This series adds support to dynamically fixup the DT the critical thermal trip point of TI AM62 depending on the SoC temperature grade.
Joao Paulo Goncalves (2): arm: mach-k3: am62: Get soc max temperature by grade arm: mach-k3: am62: Fixup thermal zone critical points
arch/arm/mach-k3/am625_fdt.c | 37 +++++++++++++++++++ arch/arm/mach-k3/include/mach/am62_hardware.h | 17 +++++++++ 2 files changed, 54 insertions(+)

From: Joao Paulo Goncalves joao.goncalves@toradex.com
AM62x SoC is available in multiple temperature grade: - Commercial: 0° to 95° C - Industrial: -40° to 105° C - Automotive: -40° to 125° C
Add a new function that returns the am62 max temperature value accordingly to its temperature grade in Celsius.
Signed-off-by: Joao Paulo Goncalves joao.goncalves@toradex.com Signed-off-by: Francesco Dolcini francesco.dolcini@toradex.com --- arch/arm/mach-k3/include/mach/am62_hardware.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
diff --git a/arch/arm/mach-k3/include/mach/am62_hardware.h b/arch/arm/mach-k3/include/mach/am62_hardware.h index 54380f36e161..9c4c6c542b63 100644 --- a/arch/arm/mach-k3/include/mach/am62_hardware.h +++ b/arch/arm/mach-k3/include/mach/am62_hardware.h @@ -42,6 +42,10 @@
#define JTAG_DEV_FEATURE_NO_PRU 0x4
+#define JTAG_DEV_TEMP_COMMERCIAL 0x3 +#define JTAG_DEV_TEMP_INDUSTRIAL 0x4 +#define JTAG_DEV_TEMP_AUTOMOTIVE 0x5 + #define CTRLMMR_MAIN_DEVSTAT (WKUP_CTRL_MMR0_BASE + 0x30) #define MAIN_DEVSTAT_PRIMARY_BOOTMODE_MASK GENMASK(6, 3) #define MAIN_DEVSTAT_PRIMARY_BOOTMODE_SHIFT 3 @@ -102,6 +106,19 @@ static inline int k3_get_temp_grade(void) return (full_devid & JTAG_DEV_TEMP_MASK) >> JTAG_DEV_TEMP_SHIFT; }
+static inline int k3_get_max_temp(void) +{ + switch (k3_get_temp_grade()) { + case JTAG_DEV_TEMP_INDUSTRIAL: + return 105; + case JTAG_DEV_TEMP_AUTOMOTIVE: + return 125; + case JTAG_DEV_TEMP_COMMERCIAL: + default: + return 95; + } +} + static inline int k3_has_pru(void) { u32 full_devid = readl(CTRLMMR_WKUP_JTAG_DEVICE_ID);

On Thu, Feb 08, 2024 at 10:29:50AM +0100, Francesco Dolcini wrote:
From: Joao Paulo Goncalves joao.goncalves@toradex.com
AM62x SoC is available in multiple temperature grade:
- Commercial: 0° to 95° C
- Industrial: -40° to 105° C
- Automotive: -40° to 125° C
Add a new function that returns the am62 max temperature value accordingly to its temperature grade in Celsius.
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!

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(+)
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; }

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!
participants (2)
-
Francesco Dolcini
-
Tom Rini