On Fri, Jan 11, 2019 at 09:16:53AM +0530, Viresh Kumar wrote: > On 10-01-19, 10:42, Matthias Kaehlcke wrote: > > Thanks for the pointer, there's always something new to learn! > > > > Ok, so the policy CPU and hence the CPU registered as cooling > > device may vary. I understand that this requires to list all possible > > cooling devices, > > I won't say that I changed DT because of a design issue with kernel, > rather the DT shall be complete by itself and that's why that change > was made. fair enough > And then we can have more things going on. For example with cpuidle > cooling, we can individually control each CPU (and force idle on that) > even if all CPUs are part of the same freq-domain. Each CPU shall > expose its capabilities. Just to gain a better understanding: is cpuidle cooling already available for arm64 (or is there a patch set)? I came across the relatively new idle injecting framework but it seems currently the only user is the Intel powerclamp driver. > > even though only one will be active at any given > > time. However I wonder if we could change this: > > I won't say it that way. I see it as all the CPUs are active during a > cooling state, i.e. they are all participating. agreed, I was referring to the CPU cooling device, which (without cpuidle injection) could be considered a single device per freq domain. > > For device tree based platform the above implies that cooling maps > > must include a list of all possible cooling devices of a frequency > > domain, even though only one of them will exist at any given time. > > > > For example: > > > > cooling-maps { > > map0 { > > trip = <&cpu_alert0>; > > cooling-device = <&CPU0 THERMAL_NO_LIMIT 4>, > > <&CPU1 THERMAL_NO_LIMIT 4>, > > <&CPU2 THERMAL_NO_LIMIT 4>, > > <&CPU3 THERMAL_NO_LIMIT 4>; > > }; > > map1 { > > trip = <&cpu_crit0>; > > cooling-device = <&CPU0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, > > <&CPU1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, > > <&CPU2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, > > <&CPU3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; > > This is the right thing to do hardware description wise, no matter > what the kernel does. Not sure I would call it a hardware description. I'd say we pretend the thermal configuration is a hardware description so the DT folks don't yell at us ;-) IMO a CPU cooling device is an abstraction, I think there is no such IP block on most systems. It seems with cpuidle injection CPUs can perform cooling actions individually, with that I agree that representing them as individual cooling devices in the DT makes sense. Without that a cooling device per freq domain would seem a resonable abstraction. One of the reasons I dislike the above list of cooling devices is that it is repeated for different thermal-zone/cooling-maps, but I guess we have to live with that, would be nice if the DT would allow to do something like this: thermal-zones { cooling_maps_fd0 : cooling-maps { map0 { trip = <&cpu_alert0>; cooling-device = <&CPU0 THERMAL_NO_LIMIT 4>, <&CPU1 THERMAL_NO_LIMIT 4>, <&CPU2 THERMAL_NO_LIMIT 4>, <&CPU3 THERMAL_NO_LIMIT 4>; }; map1 { trip = <&cpu_crit0>; cooling-device = <&CPU0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, <&CPU1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, <&CPU2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, <&CPU3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; }; cpu0-thermal { ... cooling-maps = @cooling_maps_fd0; ... }; cpu1-thermal { ... cooling-maps = @cooling_maps_fd0; ... }; ... }; Cheers Matthias