|
| 1 | +.. SPDX-License-Identifier: GPL-2.0 |
| 2 | +
|
| 3 | +Kernel driver amd_energy |
| 4 | +========================== |
| 5 | + |
| 6 | +Supported chips: |
| 7 | + |
| 8 | +* AMD Family 17h Processors |
| 9 | + |
| 10 | + Prefix: 'amd_energy' |
| 11 | + |
| 12 | + Addresses used: RAPL MSRs |
| 13 | + |
| 14 | + Datasheets: |
| 15 | + |
| 16 | + - Processor Programming Reference (PPR) for AMD Family 17h Model 01h, Revision B1 Processors |
| 17 | + |
| 18 | + https://developer.amd.com/wp-content/resources/55570-B1_PUB.zip |
| 19 | + |
| 20 | + - Preliminary Processor Programming Reference (PPR) for AMD Family 17h Model 31h, Revision B0 Processors |
| 21 | + |
| 22 | + https://developer.amd.com/wp-content/resources/56176_ppr_Family_17h_Model_71h_B0_pub_Rev_3.06.zip |
| 23 | + |
| 24 | +Author: Naveen Krishna Chatradhi < [email protected]> |
| 25 | + |
| 26 | +Description |
| 27 | +----------- |
| 28 | + |
| 29 | +The Energy driver exposes the energy counters that are |
| 30 | +reported via the Running Average Power Limit (RAPL) |
| 31 | +Model-specific Registers (MSRs) via the hardware monitor |
| 32 | +(HWMON) sysfs interface. |
| 33 | + |
| 34 | +1. Power, Energy and Time Units |
| 35 | + MSR_RAPL_POWER_UNIT/ C001_0299: |
| 36 | + shared with all cores in the socket |
| 37 | + |
| 38 | +2. Energy consumed by each Core |
| 39 | + MSR_CORE_ENERGY_STATUS/ C001_029A: |
| 40 | + 32-bitRO, Accumulator, core-level power reporting |
| 41 | + |
| 42 | +3. Energy consumed by Socket |
| 43 | + MSR_PACKAGE_ENERGY_STATUS/ C001_029B: |
| 44 | + 32-bitRO, Accumulator, socket-level power reporting, |
| 45 | + shared with all cores in socket |
| 46 | + |
| 47 | +These registers are updated every 1ms and cleared on |
| 48 | +reset of the system. |
| 49 | + |
| 50 | +Note: If SMT is enabled, Linux enumerates all threads as cpus. |
| 51 | +Since, the energy status registers are accessed at core level, |
| 52 | +reading those registers from the sibling threads would result |
| 53 | +in duplicate values. Hence, energy counter entries are not |
| 54 | +populated for the siblings. |
| 55 | + |
| 56 | +Energy Caluclation |
| 57 | +------------------ |
| 58 | + |
| 59 | +Energy information (in Joules) is based on the multiplier, |
| 60 | +1/2^ESU; where ESU is an unsigned integer read from |
| 61 | +MSR_RAPL_POWER_UNIT register. Default value is 10000b, |
| 62 | +indicating energy status unit is 15.3 micro-Joules increment. |
| 63 | + |
| 64 | +Reported values are scaled as per the formula |
| 65 | + |
| 66 | +scaled value = ((1/2^ESU) * (Raw value) * 1000000UL) in uJoules |
| 67 | + |
| 68 | +Users calculate power for a given domain by calculating |
| 69 | + dEnergy/dTime for that domain. |
| 70 | + |
| 71 | +Energy accumulation |
| 72 | +-------------------------- |
| 73 | + |
| 74 | +Current, Socket energy status register is 32bit, assuming a 240W |
| 75 | +2P system, the register would wrap around in |
| 76 | + |
| 77 | + 2^32*15.3 e-6/240 * 2 = 547.60833024 secs to wrap(~9 mins) |
| 78 | + |
| 79 | +The Core energy register may wrap around after several days. |
| 80 | + |
| 81 | +To improve the wrap around time, a kernel thread is implemented |
| 82 | +to accumulate the socket energy counters and one core energy counter |
| 83 | +per run to a respective 64-bit counter. The kernel thread starts |
| 84 | +running during probe, wakes up every 100secs and stops running |
| 85 | +when driver is removed. |
| 86 | + |
| 87 | +A socket and core energy read would return the current register |
| 88 | +value added to the respective energy accumulator. |
| 89 | + |
| 90 | +Sysfs attributes |
| 91 | +---------------- |
| 92 | + |
| 93 | +=============== ======== ===================================== |
| 94 | +Attribute Label Description |
| 95 | +=============== ======== ===================================== |
| 96 | + |
| 97 | +* For index N between [1] and [nr_cpus] |
| 98 | + |
| 99 | +=============== ======== ====================================== |
| 100 | +energy[N]_input EcoreX Core Energy X = [0] to [nr_cpus - 1] |
| 101 | + Measured input core energy |
| 102 | +=============== ======== ====================================== |
| 103 | + |
| 104 | +* For N between [nr_cpus] and [nr_cpus + nr_socks] |
| 105 | + |
| 106 | +=============== ======== ====================================== |
| 107 | +energy[N]_input EsocketX Socket Energy X = [0] to [nr_socks -1] |
| 108 | + Measured input socket energy |
| 109 | +=============== ======== ====================================== |
0 commit comments