MLK-25003-2 iMX8M: Update thermal and PMU kernel nodes for dual/single cores
authorYe Li <ye.li@nxp.com>
Mon, 16 Nov 2020 08:00:27 +0000 (00:00 -0800)
committerYe Li <ye.li@nxp.com>
Thu, 29 Apr 2021 10:26:22 +0000 (03:26 -0700)
For dual core and single core iMX8M parts, the thermal node and PMU node
in kernel DTB also needs update to remove the refers to deleted core nodes.
Otherwise both driver will fail to work.

Signed-off-by: Ye Li <ye.li@nxp.com>
Reviewed-by: Peng Fan <peng.fan@nxp.com>
(cherry picked from commit 5434603dc85553f353a127594ca764c06e54de0a)
(cherry picked from commit 8f02b26d57512044e2615c2528415628883924f2)

arch/arm/mach-imx/imx8m/soc.c

index 550f78f..402f3f7 100644 (file)
@@ -908,6 +908,76 @@ int disable_dsp_nodes(void *blob)
        return disable_fdt_nodes(blob, nodes_path_8mp, ARRAY_SIZE(nodes_path_8mp));
 }
 
+static void disable_thermal_cpu_nodes(void *blob, u32 disabled_cores)
+{
+       const char *thermal_path[] = {
+               "/thermal-zones/cpu-thermal/cooling-maps/map0"
+       };
+
+       int nodeoff, cnt, i, ret, j;
+       u32 cooling_dev[12];
+
+       for (i = 0; i < ARRAY_SIZE(thermal_path); i++) {
+               nodeoff = fdt_path_offset(blob, thermal_path[i]);
+               if (nodeoff < 0)
+                       continue; /* Not found, skip it */
+
+               cnt = fdtdec_get_int_array_count(blob, nodeoff, "cooling-device", cooling_dev, 12);
+               if (cnt < 0)
+                       continue;
+
+               if (cnt != 12)
+                       printf("Warning: %s, cooling-device count %d\n", thermal_path[i], cnt);
+
+               for (j = 0; j < cnt; j++) {
+                       cooling_dev[j] = cpu_to_fdt32(cooling_dev[j]);
+               }
+
+               ret= fdt_setprop(blob, nodeoff, "cooling-device", &cooling_dev, sizeof(u32) * (12 - disabled_cores * 3));
+               if (ret < 0) {
+                       printf("Warning: %s, cooling-device setprop failed %d\n", thermal_path[i], ret);
+                       continue;
+               }
+
+               printf("Update node %s, cooling-device prop\n", thermal_path[i]);
+       }
+}
+
+static void disable_pmu_cpu_nodes(void *blob, u32 disabled_cores)
+{
+       const char *pmu_path[] = {
+               "/pmu"
+       };
+
+       int nodeoff, cnt, i, ret, j;
+       u32 irq_affinity[4];
+
+       for (i = 0; i < ARRAY_SIZE(pmu_path); i++) {
+               nodeoff = fdt_path_offset(blob, pmu_path[i]);
+               if (nodeoff < 0)
+                       continue; /* Not found, skip it */
+
+               cnt = fdtdec_get_int_array_count(blob, nodeoff, "interrupt-affinity", irq_affinity, 4);
+               if (cnt < 0)
+                       continue;
+
+               if (cnt != 4)
+                       printf("Warning: %s, interrupt-affinity count %d\n", pmu_path[i], cnt);
+
+               for (j = 0; j < cnt; j++) {
+                       irq_affinity[j] = cpu_to_fdt32(irq_affinity[j]);
+               }
+
+               ret= fdt_setprop(blob, nodeoff, "interrupt-affinity", &irq_affinity, sizeof(u32) * (4 - disabled_cores));
+               if (ret < 0) {
+                       printf("Warning: %s, interrupt-affinity setprop failed %d\n", pmu_path[i], ret);
+                       continue;
+               }
+
+               printf("Update node %s, interrupt-affinity prop\n", pmu_path[i]);
+       }
+}
+
 static int disable_cpu_nodes(void *blob, u32 disabled_cores)
 {
        static const char * const nodes_path[] = {
@@ -940,6 +1010,9 @@ static int disable_cpu_nodes(void *blob, u32 disabled_cores)
                }
        }
 
+       disable_thermal_cpu_nodes(blob, disabled_cores);
+       disable_pmu_cpu_nodes(blob, disabled_cores);
+
        return 0;
 }