|
11 | 11 |
|
12 | 12 | static struct rapl_if_priv rapl_mmio_priv; |
13 | 13 |
|
| 14 | +/* bitmasks for RAPL MSRs, used by primitive access functions */ |
| 15 | +#define MMIO_ENERGY_STATUS_MASK GENMASK(31, 0) |
| 16 | + |
| 17 | +#define MMIO_POWER_LIMIT1_MASK GENMASK(14, 0) |
| 18 | +#define MMIO_POWER_LIMIT1_ENABLE BIT(15) |
| 19 | +#define MMIO_POWER_LIMIT1_CLAMP BIT(16) |
| 20 | + |
| 21 | +#define MMIO_POWER_LIMIT2_MASK GENMASK_ULL(46, 32) |
| 22 | +#define MMIO_POWER_LIMIT2_ENABLE BIT_ULL(47) |
| 23 | +#define MMIO_POWER_LIMIT2_CLAMP BIT_ULL(48) |
| 24 | + |
| 25 | +#define MMIO_POWER_LOW_LOCK BIT(31) |
| 26 | +#define MMIO_POWER_HIGH_LOCK BIT_ULL(63) |
| 27 | + |
| 28 | +#define MMIO_POWER_LIMIT4_MASK GENMASK(12, 0) |
| 29 | + |
| 30 | +#define MMIO_TIME_WINDOW1_MASK GENMASK_ULL(23, 17) |
| 31 | +#define MMIO_TIME_WINDOW2_MASK GENMASK_ULL(55, 49) |
| 32 | + |
| 33 | +#define MMIO_POWER_INFO_MAX_MASK GENMASK_ULL(46, 32) |
| 34 | +#define MMIO_POWER_INFO_MIN_MASK GENMASK_ULL(30, 16) |
| 35 | +#define MMIO_POWER_INFO_MAX_TIME_WIN_MASK GENMASK_ULL(53, 48) |
| 36 | +#define MMIO_POWER_INFO_THERMAL_SPEC_MASK GENMASK(14, 0) |
| 37 | + |
| 38 | +#define MMIO_PERF_STATUS_THROTTLE_TIME_MASK GENMASK(31, 0) |
| 39 | +#define MMIO_PP_POLICY_MASK GENMASK(4, 0) |
| 40 | + |
| 41 | +/* RAPL primitives for MMIO I/F */ |
| 42 | +static struct rapl_primitive_info rpi_mmio[NR_RAPL_PRIMITIVES] = { |
| 43 | + /* name, mask, shift, msr index, unit divisor */ |
| 44 | + [POWER_LIMIT1] = PRIMITIVE_INFO_INIT(POWER_LIMIT1, MMIO_POWER_LIMIT1_MASK, 0, |
| 45 | + RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), |
| 46 | + [POWER_LIMIT2] = PRIMITIVE_INFO_INIT(POWER_LIMIT2, MMIO_POWER_LIMIT2_MASK, 32, |
| 47 | + RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), |
| 48 | + [POWER_LIMIT4] = PRIMITIVE_INFO_INIT(POWER_LIMIT4, MMIO_POWER_LIMIT4_MASK, 0, |
| 49 | + RAPL_DOMAIN_REG_PL4, POWER_UNIT, 0), |
| 50 | + [ENERGY_COUNTER] = PRIMITIVE_INFO_INIT(ENERGY_COUNTER, MMIO_ENERGY_STATUS_MASK, 0, |
| 51 | + RAPL_DOMAIN_REG_STATUS, ENERGY_UNIT, 0), |
| 52 | + [FW_LOCK] = PRIMITIVE_INFO_INIT(FW_LOCK, MMIO_POWER_LOW_LOCK, 31, |
| 53 | + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), |
| 54 | + [FW_HIGH_LOCK] = PRIMITIVE_INFO_INIT(FW_LOCK, MMIO_POWER_HIGH_LOCK, 63, |
| 55 | + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), |
| 56 | + [PL1_ENABLE] = PRIMITIVE_INFO_INIT(PL1_ENABLE, MMIO_POWER_LIMIT1_ENABLE, 15, |
| 57 | + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), |
| 58 | + [PL1_CLAMP] = PRIMITIVE_INFO_INIT(PL1_CLAMP, MMIO_POWER_LIMIT1_CLAMP, 16, |
| 59 | + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), |
| 60 | + [PL2_ENABLE] = PRIMITIVE_INFO_INIT(PL2_ENABLE, MMIO_POWER_LIMIT2_ENABLE, 47, |
| 61 | + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), |
| 62 | + [PL2_CLAMP] = PRIMITIVE_INFO_INIT(PL2_CLAMP, MMIO_POWER_LIMIT2_CLAMP, 48, |
| 63 | + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), |
| 64 | + [TIME_WINDOW1] = PRIMITIVE_INFO_INIT(TIME_WINDOW1, MMIO_TIME_WINDOW1_MASK, 17, |
| 65 | + RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), |
| 66 | + [TIME_WINDOW2] = PRIMITIVE_INFO_INIT(TIME_WINDOW2, MMIO_TIME_WINDOW2_MASK, 49, |
| 67 | + RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), |
| 68 | + [THERMAL_SPEC_POWER] = PRIMITIVE_INFO_INIT(THERMAL_SPEC_POWER, |
| 69 | + MMIO_POWER_INFO_THERMAL_SPEC_MASK, 0, |
| 70 | + RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), |
| 71 | + [MAX_POWER] = PRIMITIVE_INFO_INIT(MAX_POWER, MMIO_POWER_INFO_MAX_MASK, 32, |
| 72 | + RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), |
| 73 | + [MIN_POWER] = PRIMITIVE_INFO_INIT(MIN_POWER, MMIO_POWER_INFO_MIN_MASK, 16, |
| 74 | + RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), |
| 75 | + [MAX_TIME_WINDOW] = PRIMITIVE_INFO_INIT(MAX_TIME_WINDOW, |
| 76 | + MMIO_POWER_INFO_MAX_TIME_WIN_MASK, 48, |
| 77 | + RAPL_DOMAIN_REG_INFO, TIME_UNIT, 0), |
| 78 | + [THROTTLED_TIME] = PRIMITIVE_INFO_INIT(THROTTLED_TIME, |
| 79 | + MMIO_PERF_STATUS_THROTTLE_TIME_MASK, 0, |
| 80 | + RAPL_DOMAIN_REG_PERF, TIME_UNIT, 0), |
| 81 | + [PRIORITY_LEVEL] = PRIMITIVE_INFO_INIT(PRIORITY_LEVEL, MMIO_PP_POLICY_MASK, 0, |
| 82 | + RAPL_DOMAIN_REG_POLICY, ARBITRARY_UNIT, 0), |
| 83 | +}; |
| 84 | + |
14 | 85 | static const struct rapl_mmio_regs rapl_mmio_default = { |
15 | 86 | .reg_unit = 0x5938, |
16 | 87 | .regs[RAPL_DOMAIN_PACKAGE] = { 0x59a0, 0x593c, 0x58f0, 0, 0x5930, 0x59b0}, |
@@ -75,6 +146,7 @@ int proc_thermal_rapl_add(struct pci_dev *pdev, struct proc_thermal_device *proc |
75 | 146 | rapl_mmio_priv.read_raw = rapl_mmio_read_raw; |
76 | 147 | rapl_mmio_priv.write_raw = rapl_mmio_write_raw; |
77 | 148 | rapl_mmio_priv.defaults = &rapl_defaults_mmio; |
| 149 | + rapl_mmio_priv.rpi = rpi_mmio; |
78 | 150 |
|
79 | 151 | rapl_mmio_priv.control_type = powercap_register_control_type(NULL, "intel-rapl-mmio", NULL); |
80 | 152 | if (IS_ERR(rapl_mmio_priv.control_type)) { |
|
0 commit comments