lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <847aca40-2ded-8e37-72bf-c38ccbdc28e5@linaro.org>
Date:   Fri, 2 Jul 2021 15:51:08 +0200
From:   Daniel Lezcano <daniel.lezcano@...aro.org>
To:     Rob Herring <robh@...nel.org>, Arnd Bergmann <arnd@...db.de>
Cc:     Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
        Greg Kroah-Hartman <gregkh@...uxfoundation.org>
Subject: [RFD] DTPM hierarchy description via DT


Hi,

recently a new framework based on top of the powercap framework was
introduced to limit the power of some devices when they are capable of
that. Based on the approximate power numbers from the energy model, it
allows to have a rough estimation of the power consumption and set the
power limit [1].

This framework describes via a hierarchy the constraints relationship
between all those devices and it is SoC specific.

The problem is how to describe this hierarchy.

The hierarchy could be like:

soc


   |


   |-- package


   |      |


   |      |-- cluster0


   |      |      |


   |      |      |-- cpu0


   |      |      |


   |      |      |-- cpu1


   |      |      |


   |      |      |-- cpu2


   |      |      |


   |      |      `-- cpu3


   |      |


   |      |-- cluster1


   |      |      |


   |      |      |-- cpu4


   |      |      |


   |      |      `-- cpu5


   |      |


   |      `-- gpu


   |


   |-- memory


   |      |


   |      |-- bank0


   |      |


   |      `-- bank1


   |


   |-- multimedia


   |      |


   |      |-- camera


   |      |


   |      `-- dsp


   |


   |-- modem


   |


   `-- screen




We are far from this description yet but it is for illustration purpose.

All the nodes of the tree do not necessarily reflect real devices, for
example, 'package' or 'multimedia' are not described in the DT.

What we want is to build this hierarchy which is SoC dependent.

A first proposal was made to create those nodes in configfs but because
it results in creating a node in sysfs also the approach is not valid [2]

It was suggested to use the devicetree to describe such hierarchy. There
are several possibilities but the nodes not describing real hardware
above is difficult to describe. Also, the hierarchy should not be over
complexified.

On the other hand most of the devices are already described, so it is a
question of tightening them together.

There are different possibilities to describe this hierarchy:

1. Create the hierarchy in the DT:

	power-zones {

		package {

			big {
				powerzone = <&cpu_b0 POWERZONE_DVFS>,
					<&cpu_b1 POWERZONE_DVFS>;
			};

			little {
				powerzone = <&cpu_l0 POWERZONE_DVFS>,
					<&cpu_l1 POWERZONE_DVFS>,
					<&cpu_l2 POWERZONE_DVFS>,
					<&cpu_l3 POWERZONE_DVFS>;
			};

			gpu {
				powerzone = <&gpu POWERZONE_DVFS>;
			};
		};
	};

2. Let the kernel build the hierarchy but add a property in the
different nodes:

https://git.linaro.org/people/daniel.lezcano/linux.git/commit/?h=powercap/dtpm-dts-1.0&id=05943f5a1cf33df36dbe423fd4b549a9aa244da1

And from there the kernel does for_each_node_with_property(). The kernel
has to know "cpu-pd0" and "cpu-pd1". That implies a per soc
initialization code:

https://git.linaro.org/people/daniel.lezcano/linux.git/commit/?h=powercap/dtpm-dts-1.0&id=7525abb234695d07a0094b2f511d5fe8bea0a979

https://git.linaro.org/people/daniel.lezcano/linux.git/commit/?h=powercap/dtpm-dts-1.0&id=70e1deb642a939d14dd9b0391d8219cf21a03253


3. An intermediate description between 1. and 2.

The nodes have a property which is a phandle to the parent node. But if
the parent node does not exists, create an empty and point to it.

package {
	powerzone;
	powerzone-parent = <&soc>;
};

cluster0 {
	powerzone-parent = <&package>;
};

	...

		cpu_l0: cpu@0 {
			device_type = "cpu";
			compatible = "arm,cortex-a53";
			reg = <0x0 0x0>;
			enable-method = "psci";
			capacity-dmips-mhz = <485>;
			clocks = <&cru ARMCLKL>;
			#cooling-cells = <2>; /* min followed by max */
			dynamic-power-coefficient = <100>;
			cpu-idle-states = <&CPU_SLEEP &CLUSTER_SLEEP>;
			powerzone-parent = <&cluster0>;
		};

	...

I implemented 1. and 2. but before going forward and writing the yaml
bindings which are time consuming, it would be preferable we agree on
something instead of having to drop the code again and again.

Thanks for your comments


[1] https://lwn.net/Articles/839318/
[2] https://www.spinics.net/lists/kernel/msg3891770.html

-- 
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ