237 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
Power Capping Framework
 | 
						||
==================================
 | 
						||
 | 
						||
The power capping framework provides a consistent interface between the kernel
 | 
						||
and the user space that allows power capping drivers to expose the settings to
 | 
						||
user space in a uniform way.
 | 
						||
 | 
						||
Terminology
 | 
						||
=========================
 | 
						||
The framework exposes power capping devices to user space via sysfs in the
 | 
						||
form of a tree of objects. The objects at the root level of the tree represent
 | 
						||
'control types', which correspond to different methods of power capping.  For
 | 
						||
example, the intel-rapl control type represents the Intel "Running Average
 | 
						||
Power Limit" (RAPL) technology, whereas the 'idle-injection' control type
 | 
						||
corresponds to the use of idle injection for controlling power.
 | 
						||
 | 
						||
Power zones represent different parts of the system, which can be controlled and
 | 
						||
monitored using the power capping method determined by the control type the
 | 
						||
given zone belongs to. They each contain attributes for monitoring power, as
 | 
						||
well as controls represented in the form of power constraints.  If the parts of
 | 
						||
the system represented by different power zones are hierarchical (that is, one
 | 
						||
bigger part consists of multiple smaller parts that each have their own power
 | 
						||
controls), those power zones may also be organized in a hierarchy with one
 | 
						||
parent power zone containing multiple subzones and so on to reflect the power
 | 
						||
control topology of the system.  In that case, it is possible to apply power
 | 
						||
capping to a set of devices together using the parent power zone and if more
 | 
						||
fine grained control is required, it can be applied through the subzones.
 | 
						||
 | 
						||
 | 
						||
Example sysfs interface tree:
 | 
						||
 | 
						||
/sys/devices/virtual/powercap
 | 
						||
??? intel-rapl
 | 
						||
    ??? intel-rapl:0
 | 
						||
    ?   ??? constraint_0_name
 | 
						||
    ?   ??? constraint_0_power_limit_uw
 | 
						||
    ?   ??? constraint_0_time_window_us
 | 
						||
    ?   ??? constraint_1_name
 | 
						||
    ?   ??? constraint_1_power_limit_uw
 | 
						||
    ?   ??? constraint_1_time_window_us
 | 
						||
    ?   ??? device -> ../../intel-rapl
 | 
						||
    ?   ??? energy_uj
 | 
						||
    ?   ??? intel-rapl:0:0
 | 
						||
    ?   ?   ??? constraint_0_name
 | 
						||
    ?   ?   ??? constraint_0_power_limit_uw
 | 
						||
    ?   ?   ??? constraint_0_time_window_us
 | 
						||
    ?   ?   ??? constraint_1_name
 | 
						||
    ?   ?   ??? constraint_1_power_limit_uw
 | 
						||
    ?   ?   ??? constraint_1_time_window_us
 | 
						||
    ?   ?   ??? device -> ../../intel-rapl:0
 | 
						||
    ?   ?   ??? energy_uj
 | 
						||
    ?   ?   ??? max_energy_range_uj
 | 
						||
    ?   ?   ??? name
 | 
						||
    ?   ?   ??? enabled
 | 
						||
    ?   ?   ??? power
 | 
						||
    ?   ?   ?   ??? async
 | 
						||
    ?   ?   ?   []
 | 
						||
    ?   ?   ??? subsystem -> ../../../../../../class/power_cap
 | 
						||
    ?   ?   ??? uevent
 | 
						||
    ?   ??? intel-rapl:0:1
 | 
						||
    ?   ?   ??? constraint_0_name
 | 
						||
    ?   ?   ??? constraint_0_power_limit_uw
 | 
						||
    ?   ?   ??? constraint_0_time_window_us
 | 
						||
    ?   ?   ??? constraint_1_name
 | 
						||
    ?   ?   ??? constraint_1_power_limit_uw
 | 
						||
    ?   ?   ??? constraint_1_time_window_us
 | 
						||
    ?   ?   ??? device -> ../../intel-rapl:0
 | 
						||
    ?   ?   ??? energy_uj
 | 
						||
    ?   ?   ??? max_energy_range_uj
 | 
						||
    ?   ?   ??? name
 | 
						||
    ?   ?   ??? enabled
 | 
						||
    ?   ?   ??? power
 | 
						||
    ?   ?   ?   ??? async
 | 
						||
    ?   ?   ?   []
 | 
						||
    ?   ?   ??? subsystem -> ../../../../../../class/power_cap
 | 
						||
    ?   ?   ??? uevent
 | 
						||
    ?   ??? max_energy_range_uj
 | 
						||
    ?   ??? max_power_range_uw
 | 
						||
    ?   ??? name
 | 
						||
    ?   ??? enabled
 | 
						||
    ?   ??? power
 | 
						||
    ?   ?   ??? async
 | 
						||
    ?   ?   []
 | 
						||
    ?   ??? subsystem -> ../../../../../class/power_cap
 | 
						||
    ?   ??? enabled
 | 
						||
    ?   ??? uevent
 | 
						||
    ??? intel-rapl:1
 | 
						||
    ?   ??? constraint_0_name
 | 
						||
    ?   ??? constraint_0_power_limit_uw
 | 
						||
    ?   ??? constraint_0_time_window_us
 | 
						||
    ?   ??? constraint_1_name
 | 
						||
    ?   ??? constraint_1_power_limit_uw
 | 
						||
    ?   ??? constraint_1_time_window_us
 | 
						||
    ?   ??? device -> ../../intel-rapl
 | 
						||
    ?   ??? energy_uj
 | 
						||
    ?   ??? intel-rapl:1:0
 | 
						||
    ?   ?   ??? constraint_0_name
 | 
						||
    ?   ?   ??? constraint_0_power_limit_uw
 | 
						||
    ?   ?   ??? constraint_0_time_window_us
 | 
						||
    ?   ?   ??? constraint_1_name
 | 
						||
    ?   ?   ??? constraint_1_power_limit_uw
 | 
						||
    ?   ?   ??? constraint_1_time_window_us
 | 
						||
    ?   ?   ??? device -> ../../intel-rapl:1
 | 
						||
    ?   ?   ??? energy_uj
 | 
						||
    ?   ?   ??? max_energy_range_uj
 | 
						||
    ?   ?   ??? name
 | 
						||
    ?   ?   ??? enabled
 | 
						||
    ?   ?   ??? power
 | 
						||
    ?   ?   ?   ??? async
 | 
						||
    ?   ?   ?   []
 | 
						||
    ?   ?   ??? subsystem -> ../../../../../../class/power_cap
 | 
						||
    ?   ?   ??? uevent
 | 
						||
    ?   ??? intel-rapl:1:1
 | 
						||
    ?   ?   ??? constraint_0_name
 | 
						||
    ?   ?   ??? constraint_0_power_limit_uw
 | 
						||
    ?   ?   ??? constraint_0_time_window_us
 | 
						||
    ?   ?   ??? constraint_1_name
 | 
						||
    ?   ?   ??? constraint_1_power_limit_uw
 | 
						||
    ?   ?   ??? constraint_1_time_window_us
 | 
						||
    ?   ?   ??? device -> ../../intel-rapl:1
 | 
						||
    ?   ?   ??? energy_uj
 | 
						||
    ?   ?   ??? max_energy_range_uj
 | 
						||
    ?   ?   ??? name
 | 
						||
    ?   ?   ??? enabled
 | 
						||
    ?   ?   ??? power
 | 
						||
    ?   ?   ?   ??? async
 | 
						||
    ?   ?   ?   []
 | 
						||
    ?   ?   ??? subsystem -> ../../../../../../class/power_cap
 | 
						||
    ?   ?   ??? uevent
 | 
						||
    ?   ??? max_energy_range_uj
 | 
						||
    ?   ??? max_power_range_uw
 | 
						||
    ?   ??? name
 | 
						||
    ?   ??? enabled
 | 
						||
    ?   ??? power
 | 
						||
    ?   ?   ??? async
 | 
						||
    ?   ?   []
 | 
						||
    ?   ??? subsystem -> ../../../../../class/power_cap
 | 
						||
    ?   ??? uevent
 | 
						||
    ??? power
 | 
						||
    ?   ??? async
 | 
						||
    ?   []
 | 
						||
    ??? subsystem -> ../../../../class/power_cap
 | 
						||
    ??? enabled
 | 
						||
    ??? uevent
 | 
						||
 | 
						||
The above example illustrates a case in which the Intel RAPL technology,
 | 
						||
available in Intel® IA-64 and IA-32 Processor Architectures, is used. There is one
 | 
						||
control type called intel-rapl which contains two power zones, intel-rapl:0 and
 | 
						||
intel-rapl:1, representing CPU packages.  Each of these power zones contains
 | 
						||
two subzones, intel-rapl:j:0 and intel-rapl:j:1 (j = 0, 1), representing the
 | 
						||
"core" and the "uncore" parts of the given CPU package, respectively.  All of
 | 
						||
the zones and subzones contain energy monitoring attributes (energy_uj,
 | 
						||
max_energy_range_uj) and constraint attributes (constraint_*) allowing controls
 | 
						||
to be applied (the constraints in the 'package' power zones apply to the whole
 | 
						||
CPU packages and the subzone constraints only apply to the respective parts of
 | 
						||
the given package individually). Since Intel RAPL doesn't provide instantaneous
 | 
						||
power value, there is no power_uw attribute.
 | 
						||
 | 
						||
In addition to that, each power zone contains a name attribute, allowing the
 | 
						||
part of the system represented by that zone to be identified.
 | 
						||
For example:
 | 
						||
 | 
						||
cat /sys/class/power_cap/intel-rapl/intel-rapl:0/name
 | 
						||
package-0
 | 
						||
 | 
						||
The Intel RAPL technology allows two constraints, short term and long term,
 | 
						||
with two different time windows to be applied to each power zone.  Thus for
 | 
						||
each zone there are 2 attributes representing the constraint names, 2 power
 | 
						||
limits and 2 attributes representing the sizes of the time windows. Such that,
 | 
						||
constraint_j_* attributes correspond to the jth constraint (j = 0,1).
 | 
						||
 | 
						||
For example:
 | 
						||
	constraint_0_name
 | 
						||
	constraint_0_power_limit_uw
 | 
						||
	constraint_0_time_window_us
 | 
						||
	constraint_1_name
 | 
						||
	constraint_1_power_limit_uw
 | 
						||
	constraint_1_time_window_us
 | 
						||
 | 
						||
Power Zone Attributes
 | 
						||
=================================
 | 
						||
Monitoring attributes
 | 
						||
----------------------
 | 
						||
 | 
						||
energy_uj (rw): Current energy counter in micro joules. Write "0" to reset.
 | 
						||
If the counter can not be reset, then this attribute is read only.
 | 
						||
 | 
						||
max_energy_range_uj (ro): Range of the above energy counter in micro-joules.
 | 
						||
 | 
						||
power_uw (ro): Current power in micro watts.
 | 
						||
 | 
						||
max_power_range_uw (ro): Range of the above power value in micro-watts.
 | 
						||
 | 
						||
name (ro): Name of this power zone.
 | 
						||
 | 
						||
It is possible that some domains have both power ranges and energy counter ranges;
 | 
						||
however, only one is mandatory.
 | 
						||
 | 
						||
Constraints
 | 
						||
----------------
 | 
						||
constraint_X_power_limit_uw (rw): Power limit in micro watts, which should be
 | 
						||
applicable for the time window specified by "constraint_X_time_window_us".
 | 
						||
 | 
						||
constraint_X_time_window_us (rw): Time window in micro seconds.
 | 
						||
 | 
						||
constraint_X_name (ro): An optional name of the constraint
 | 
						||
 | 
						||
constraint_X_max_power_uw(ro): Maximum allowed power in micro watts.
 | 
						||
 | 
						||
constraint_X_min_power_uw(ro): Minimum allowed power in micro watts.
 | 
						||
 | 
						||
constraint_X_max_time_window_us(ro): Maximum allowed time window in micro seconds.
 | 
						||
 | 
						||
constraint_X_min_time_window_us(ro): Minimum allowed time window in micro seconds.
 | 
						||
 | 
						||
Except power_limit_uw and time_window_us other fields are optional.
 | 
						||
 | 
						||
Common zone and control type attributes
 | 
						||
----------------------------------------
 | 
						||
enabled (rw): Enable/Disable controls at zone level or for all zones using
 | 
						||
a control type.
 | 
						||
 | 
						||
Power Cap Client Driver Interface
 | 
						||
==================================
 | 
						||
The API summary:
 | 
						||
 | 
						||
Call powercap_register_control_type() to register control type object.
 | 
						||
Call powercap_register_zone() to register a power zone (under a given
 | 
						||
control type), either as a top-level power zone or as a subzone of another
 | 
						||
power zone registered earlier.
 | 
						||
The number of constraints in a power zone and the corresponding callbacks have
 | 
						||
to be defined prior to calling powercap_register_zone() to register that zone.
 | 
						||
 | 
						||
To Free a power zone call powercap_unregister_zone().
 | 
						||
To free a control type object call powercap_unregister_control_type().
 | 
						||
Detailed API can be generated using kernel-doc on include/linux/powercap.h.
 |