]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
arm: mach-k3: am62p: Fixup thermal zone critical points
authorAparna Patra <a-patra@ti.com>
Wed, 8 Jan 2025 04:49:37 +0000 (10:19 +0530)
committerTom Rini <trini@konsulko.com>
Tue, 14 Jan 2025 21:50:07 +0000 (15:50 -0600)
Read the max temperature for the SoC temperature grade from the hardware
and modify 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: Aparna Patra <a-patra@ti.com>
Reviewed-by: Bryan Brattlof <bb@ti.com>
arch/arm/mach-k3/am62px/am62p5_fdt.c
arch/arm/mach-k3/include/mach/am62p_hardware.h

index e88760ea51dd9f513fba6561d60eb025e825dfec..96194cebcd7b0da08c30a2c516cc7e745182567f 100644 (file)
@@ -38,11 +38,48 @@ static void fdt_fixup_canfd_nodes_am62p(void *blob, bool has_canfd)
        }
 }
 
+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_am62p(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_wdt_nodes_am62p(blob, k3_get_core_nr());
        fdt_fixup_video_codec_nodes_am62p(blob, k3_has_video_codec());
        fdt_fixup_canfd_nodes_am62p(blob, k3_has_canfd());
+       fdt_fixup_thermal_zone_nodes_am62p(blob, k3_get_max_temp());
        fdt_fixup_reserved(blob, "tfa", CONFIG_K3_ATF_LOAD_ADDR, 0x80000);
        fdt_fixup_reserved(blob, "optee", CONFIG_K3_OPTEE_LOAD_ADDR, 0x1800000);
 
index 339562722d5dee385394a34b3389e61965d4f46e..2f1c8517e64cf00d18e876b00f660735d87b1107 100644 (file)
 #define JTAG_DEV_CANFD_SHIFT                   15
 #define JTAG_DEV_VIDEO_CODEC_MASK                      BIT(14)
 #define JTAG_DEV_VIDEO_CODEC_SHIFT                     14
+#define JTAG_DEV_TEMP_MASK                     GENMASK(5, 3)
+#define JTAG_DEV_TEMP_SHIFT                    3
+
+#define JTAG_DEV_TEMP_AUTOMOTIVE        0x5
+#define JTAG_DEV_TEMP_EXTENDED_VALUE    105
+#define JTAG_DEV_TEMP_AUTOMOTIVE_VALUE  125
 
 #define CTRLMMR_MAIN_DEVSTAT                   (WKUP_CTRL_MMR0_BASE + 0x30)
 #define MAIN_DEVSTAT_PRIMARY_BOOTMODE_MASK     GENMASK(6, 3)
@@ -101,6 +107,17 @@ static inline int k3_has_canfd(void)
        return (dev_id & JTAG_DEV_CANFD_MASK) >> JTAG_DEV_CANFD_SHIFT;
 }
 
+static inline int k3_get_max_temp(void)
+{
+       u32 dev_id = readl(CTRLMMR_WKUP_JTAG_DEVICE_ID);
+       u32 dev_temp = (dev_id & JTAG_DEV_TEMP_MASK) >> JTAG_DEV_TEMP_SHIFT;
+
+       if (dev_temp == JTAG_DEV_TEMP_AUTOMOTIVE)
+               return JTAG_DEV_TEMP_AUTOMOTIVE_VALUE;
+       else
+               return JTAG_DEV_TEMP_EXTENDED_VALUE;
+}
+
 #if defined(CONFIG_SYS_K3_SPL_ATF) && !defined(__ASSEMBLY__)
 
 static const u32 put_device_ids[] = {};