123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- .. SPDX-License-Identifier: GPL-2.0
- Kernel driver amd_energy
- ==========================
- Supported chips:
- * AMD Family 17h Processors
- Prefix: 'amd_energy'
- Addresses used: RAPL MSRs
- Datasheets:
- - Processor Programming Reference (PPR) for AMD Family 17h Model 01h, Revision B1 Processors
- https://developer.amd.com/wp-content/resources/55570-B1_PUB.zip
- - Preliminary Processor Programming Reference (PPR) for AMD Family 17h Model 31h, Revision B0 Processors
- https://developer.amd.com/wp-content/resources/56176_ppr_Family_17h_Model_71h_B0_pub_Rev_3.06.zip
- Author: Naveen Krishna Chatradhi <nchatrad@amd.com>
- Description
- -----------
- The Energy driver exposes the energy counters that are
- reported via the Running Average Power Limit (RAPL)
- Model-specific Registers (MSRs) via the hardware monitor
- (HWMON) sysfs interface.
- 1. Power, Energy and Time Units
- MSR_RAPL_POWER_UNIT/ C001_0299:
- shared with all cores in the socket
- 2. Energy consumed by each Core
- MSR_CORE_ENERGY_STATUS/ C001_029A:
- 32-bitRO, Accumulator, core-level power reporting
- 3. Energy consumed by Socket
- MSR_PACKAGE_ENERGY_STATUS/ C001_029B:
- 32-bitRO, Accumulator, socket-level power reporting,
- shared with all cores in socket
- These registers are updated every 1ms and cleared on
- reset of the system.
- Note: If SMT is enabled, Linux enumerates all threads as cpus.
- Since, the energy status registers are accessed at core level,
- reading those registers from the sibling threads would result
- in duplicate values. Hence, energy counter entries are not
- populated for the siblings.
- Energy Caluclation
- ------------------
- Energy information (in Joules) is based on the multiplier,
- 1/2^ESU; where ESU is an unsigned integer read from
- MSR_RAPL_POWER_UNIT register. Default value is 10000b,
- indicating energy status unit is 15.3 micro-Joules increment.
- Reported values are scaled as per the formula
- scaled value = ((1/2^ESU) * (Raw value) * 1000000UL) in uJoules
- Users calculate power for a given domain by calculating
- dEnergy/dTime for that domain.
- Energy accumulation
- --------------------------
- Current, Socket energy status register is 32bit, assuming a 240W
- 2P system, the register would wrap around in
- 2^32*15.3 e-6/240 * 2 = 547.60833024 secs to wrap(~9 mins)
- The Core energy register may wrap around after several days.
- To improve the wrap around time, a kernel thread is implemented
- to accumulate the socket energy counters and one core energy counter
- per run to a respective 64-bit counter. The kernel thread starts
- running during probe, wakes up every 100secs and stops running
- when driver is removed.
- Frequency of the accumulator thread is set during the probe
- based on the chosen energy unit resolution. For example
- A. fine grain (1.625 micro J)
- B. course grain (0.125 milli J)
- A socket and core energy read would return the current register
- value added to the respective energy accumulator.
- Sysfs attributes
- ----------------
- =============== ======== =====================================
- Attribute Label Description
- =============== ======== =====================================
- * For index N between [1] and [nr_cpus]
- =============== ======== ======================================
- energy[N]_input EcoreX Core Energy X = [0] to [nr_cpus - 1]
- Measured input core energy
- =============== ======== ======================================
- * For N between [nr_cpus] and [nr_cpus + nr_socks]
- =============== ======== ======================================
- energy[N]_input EsocketX Socket Energy X = [0] to [nr_socks -1]
- Measured input socket energy
- =============== ======== ======================================
|