| ======================= |
| 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. |