Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

powercap: intel_rapl: Move MSR primitives to MSR driver

MSR-specific RAPL primitives differ from those used by TPMI and MMIO
interfaces. Keeping them in the common driver requires
interface-specific handling logic and makes the common layer
unnecessarily complex.

Move the MSR primitive definitions and associated bitmasks into the
MSR interface driver. This change includes:

1. Move MSR-specific bitmask definitions to RAPL MSR driver.
2. Add MSR-local struct rapl_primitive_info instance and assign it to
priv->rpi during MSR probe.
3. Remove the primitive assignment logic from rapl_config() in the
common driver.

No functional changes are intended.

Co-developed-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Link: https://patch.msgid.link/20260331211950.3329932-7-sathyanarayanan.kuppuswamy@linux.intel.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

authored by

Kuppuswamy Sathyanarayanan and committed by
Rafael J. Wysocki
b0ee5110 d7a718ff

+99 -105
-105
drivers/powercap/intel_rapl_common.c
··· 30 30 #include <asm/intel-family.h> 31 31 #include <asm/msr.h> 32 32 33 - /* bitmasks for RAPL MSRs, used by primitive access functions */ 34 33 #define ENERGY_STATUS_MASK GENMASK(31, 0) 35 - 36 - #define POWER_LIMIT1_MASK GENMASK(14, 0) 37 - #define POWER_LIMIT1_ENABLE BIT(15) 38 - #define POWER_LIMIT1_CLAMP BIT(16) 39 - 40 - #define POWER_LIMIT2_MASK GENMASK_ULL(46, 32) 41 - #define POWER_LIMIT2_ENABLE BIT_ULL(47) 42 - #define POWER_LIMIT2_CLAMP BIT_ULL(48) 43 - #define POWER_HIGH_LOCK BIT_ULL(63) 44 - #define POWER_LOW_LOCK BIT(31) 45 - 46 - #define POWER_LIMIT4_MASK GENMASK(12, 0) 47 - 48 - #define TIME_WINDOW1_MASK GENMASK_ULL(23, 17) 49 - #define TIME_WINDOW2_MASK GENMASK_ULL(55, 49) 50 34 51 35 #define POWER_UNIT_OFFSET 0x00 52 36 #define POWER_UNIT_MASK GENMASK(3, 0) ··· 40 56 41 57 #define TIME_UNIT_OFFSET 0x10 42 58 #define TIME_UNIT_MASK GENMASK(19, 16) 43 - 44 - #define POWER_INFO_MAX_MASK GENMASK_ULL(46, 32) 45 - #define POWER_INFO_MIN_MASK GENMASK_ULL(30, 16) 46 - #define POWER_INFO_MAX_TIME_WIN_MASK GENMASK_ULL(53, 48) 47 - #define POWER_INFO_THERMAL_SPEC_MASK GENMASK(14, 0) 48 - 49 - #define PERF_STATUS_THROTTLE_TIME_MASK GENMASK(31, 0) 50 - #define PP_POLICY_MASK GENMASK(4, 0) 51 - 52 - /* 53 - * SPR has different layout for Psys Domain PowerLimit registers. 54 - * There are 17 bits of PL1 and PL2 instead of 15 bits. 55 - * The Enable bits and TimeWindow bits are also shifted as a result. 56 - */ 57 - #define PSYS_POWER_LIMIT1_MASK GENMASK_ULL(16, 0) 58 - #define PSYS_POWER_LIMIT1_ENABLE BIT(17) 59 - 60 - #define PSYS_POWER_LIMIT2_MASK GENMASK_ULL(48, 32) 61 - #define PSYS_POWER_LIMIT2_ENABLE BIT_ULL(49) 62 - 63 - #define PSYS_TIME_WINDOW1_MASK GENMASK_ULL(25, 19) 64 - #define PSYS_TIME_WINDOW2_MASK GENMASK_ULL(57, 51) 65 59 66 60 /* Non HW constants */ 67 61 #define RAPL_PRIMITIVE_DUMMY BIT(2) ··· 560 598 return div64_u64(value, scale); 561 599 } 562 600 563 - /* RAPL primitives for MSR and MMIO I/F */ 564 - static struct rapl_primitive_info rpi_msr[NR_RAPL_PRIMITIVES] = { 565 - /* name, mask, shift, msr index, unit divisor */ 566 - [POWER_LIMIT1] = PRIMITIVE_INFO_INIT(POWER_LIMIT1, POWER_LIMIT1_MASK, 0, 567 - RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), 568 - [POWER_LIMIT2] = PRIMITIVE_INFO_INIT(POWER_LIMIT2, POWER_LIMIT2_MASK, 32, 569 - RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), 570 - [POWER_LIMIT4] = PRIMITIVE_INFO_INIT(POWER_LIMIT4, POWER_LIMIT4_MASK, 0, 571 - RAPL_DOMAIN_REG_PL4, POWER_UNIT, 0), 572 - [ENERGY_COUNTER] = PRIMITIVE_INFO_INIT(ENERGY_COUNTER, ENERGY_STATUS_MASK, 0, 573 - RAPL_DOMAIN_REG_STATUS, ENERGY_UNIT, 0), 574 - [FW_LOCK] = PRIMITIVE_INFO_INIT(FW_LOCK, POWER_LOW_LOCK, 31, 575 - RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), 576 - [FW_HIGH_LOCK] = PRIMITIVE_INFO_INIT(FW_LOCK, POWER_HIGH_LOCK, 63, 577 - RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), 578 - [PL1_ENABLE] = PRIMITIVE_INFO_INIT(PL1_ENABLE, POWER_LIMIT1_ENABLE, 15, 579 - RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), 580 - [PL1_CLAMP] = PRIMITIVE_INFO_INIT(PL1_CLAMP, POWER_LIMIT1_CLAMP, 16, 581 - RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), 582 - [PL2_ENABLE] = PRIMITIVE_INFO_INIT(PL2_ENABLE, POWER_LIMIT2_ENABLE, 47, 583 - RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), 584 - [PL2_CLAMP] = PRIMITIVE_INFO_INIT(PL2_CLAMP, POWER_LIMIT2_CLAMP, 48, 585 - RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), 586 - [TIME_WINDOW1] = PRIMITIVE_INFO_INIT(TIME_WINDOW1, TIME_WINDOW1_MASK, 17, 587 - RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), 588 - [TIME_WINDOW2] = PRIMITIVE_INFO_INIT(TIME_WINDOW2, TIME_WINDOW2_MASK, 49, 589 - RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), 590 - [THERMAL_SPEC_POWER] = PRIMITIVE_INFO_INIT(THERMAL_SPEC_POWER, 591 - POWER_INFO_THERMAL_SPEC_MASK, 0, 592 - RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), 593 - [MAX_POWER] = PRIMITIVE_INFO_INIT(MAX_POWER, POWER_INFO_MAX_MASK, 32, 594 - RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), 595 - [MIN_POWER] = PRIMITIVE_INFO_INIT(MIN_POWER, POWER_INFO_MIN_MASK, 16, 596 - RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), 597 - [MAX_TIME_WINDOW] = PRIMITIVE_INFO_INIT(MAX_TIME_WINDOW, 598 - POWER_INFO_MAX_TIME_WIN_MASK, 48, 599 - RAPL_DOMAIN_REG_INFO, TIME_UNIT, 0), 600 - [THROTTLED_TIME] = PRIMITIVE_INFO_INIT(THROTTLED_TIME, 601 - PERF_STATUS_THROTTLE_TIME_MASK, 0, 602 - RAPL_DOMAIN_REG_PERF, TIME_UNIT, 0), 603 - [PRIORITY_LEVEL] = PRIMITIVE_INFO_INIT(PRIORITY_LEVEL, PP_POLICY_MASK, 0, 604 - RAPL_DOMAIN_REG_POLICY, ARBITRARY_UNIT, 0), 605 - [PSYS_POWER_LIMIT1] = PRIMITIVE_INFO_INIT(PSYS_POWER_LIMIT1, PSYS_POWER_LIMIT1_MASK, 0, 606 - RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), 607 - [PSYS_POWER_LIMIT2] = PRIMITIVE_INFO_INIT(PSYS_POWER_LIMIT2, PSYS_POWER_LIMIT2_MASK, 608 - 32, RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), 609 - [PSYS_PL1_ENABLE] = PRIMITIVE_INFO_INIT(PSYS_PL1_ENABLE, PSYS_POWER_LIMIT1_ENABLE, 610 - 17, RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 611 - 0), 612 - [PSYS_PL2_ENABLE] = PRIMITIVE_INFO_INIT(PSYS_PL2_ENABLE, PSYS_POWER_LIMIT2_ENABLE, 613 - 49, RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 614 - 0), 615 - [PSYS_TIME_WINDOW1] = PRIMITIVE_INFO_INIT(PSYS_TIME_WINDOW1, PSYS_TIME_WINDOW1_MASK, 616 - 19, RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), 617 - [PSYS_TIME_WINDOW2] = PRIMITIVE_INFO_INIT(PSYS_TIME_WINDOW2, PSYS_TIME_WINDOW2_MASK, 618 - 51, RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), 619 - }; 620 - 621 601 static struct rapl_primitive_info *get_rpi(struct rapl_package *rp, int prim) 622 602 { 623 603 struct rapl_primitive_info *rpi = rp->priv->rpi; ··· 572 668 573 669 static int rapl_config(struct rapl_package *rp) 574 670 { 575 - switch (rp->priv->type) { 576 - /* MMIO I/F shares the same register layout as MSR registers */ 577 - case RAPL_IF_MSR: 578 - rp->priv->rpi = rpi_msr; 579 - break; 580 - default: 581 - return -EINVAL; 582 - } 583 - 584 671 /* defaults_msr can be NULL on unsupported platforms */ 585 672 if (!rp->priv->defaults || !rp->priv->rpi) 586 673 return -ENODEV;
+99
drivers/powercap/intel_rapl_msr.c
··· 44 44 #define TIME_UNIT_OFFSET 0x10 45 45 #define TIME_UNIT_MASK GENMASK(19, 16) 46 46 47 + /* bitmasks for RAPL MSRs, used by primitive access functions */ 48 + #define ENERGY_STATUS_MASK GENMASK(31, 0) 49 + 50 + #define POWER_LIMIT1_MASK GENMASK(14, 0) 51 + #define POWER_LIMIT1_ENABLE BIT(15) 52 + #define POWER_LIMIT1_CLAMP BIT(16) 53 + 54 + #define POWER_LIMIT2_MASK GENMASK_ULL(46, 32) 55 + #define POWER_LIMIT2_ENABLE BIT_ULL(47) 56 + #define POWER_LIMIT2_CLAMP BIT_ULL(48) 57 + #define POWER_HIGH_LOCK BIT_ULL(63) 58 + #define POWER_LOW_LOCK BIT(31) 59 + 60 + #define POWER_LIMIT4_MASK GENMASK(12, 0) 61 + 62 + #define TIME_WINDOW1_MASK GENMASK_ULL(23, 17) 63 + #define TIME_WINDOW2_MASK GENMASK_ULL(55, 49) 64 + 65 + #define POWER_INFO_MAX_MASK GENMASK_ULL(46, 32) 66 + #define POWER_INFO_MIN_MASK GENMASK_ULL(30, 16) 67 + #define POWER_INFO_MAX_TIME_WIN_MASK GENMASK_ULL(53, 48) 68 + #define POWER_INFO_THERMAL_SPEC_MASK GENMASK(14, 0) 69 + 70 + #define PERF_STATUS_THROTTLE_TIME_MASK GENMASK(31, 0) 71 + #define PP_POLICY_MASK GENMASK(4, 0) 72 + 73 + /* 74 + * SPR has different layout for Psys Domain PowerLimit registers. 75 + * There are 17 bits of PL1 and PL2 instead of 15 bits. 76 + * The Enable bits and TimeWindow bits are also shifted as a result. 77 + */ 78 + #define PSYS_POWER_LIMIT1_MASK GENMASK_ULL(16, 0) 79 + #define PSYS_POWER_LIMIT1_ENABLE BIT(17) 80 + 81 + #define PSYS_POWER_LIMIT2_MASK GENMASK_ULL(48, 32) 82 + #define PSYS_POWER_LIMIT2_ENABLE BIT_ULL(49) 83 + 84 + #define PSYS_TIME_WINDOW1_MASK GENMASK_ULL(25, 19) 85 + #define PSYS_TIME_WINDOW2_MASK GENMASK_ULL(57, 51) 86 + 47 87 /* Sideband MBI registers */ 48 88 #define IOSF_CPU_POWER_BUDGET_CTL_BYT 0x02 49 89 #define IOSF_CPU_POWER_BUDGET_CTL_TNG 0xDF ··· 308 268 return value ? value * rd->time_unit : rd->time_unit; 309 269 } 310 270 271 + /* RAPL primitives for MSR I/F */ 272 + static struct rapl_primitive_info rpi_msr[NR_RAPL_PRIMITIVES] = { 273 + /* name, mask, shift, msr index, unit divisor */ 274 + [POWER_LIMIT1] = PRIMITIVE_INFO_INIT(POWER_LIMIT1, POWER_LIMIT1_MASK, 0, 275 + RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), 276 + [POWER_LIMIT2] = PRIMITIVE_INFO_INIT(POWER_LIMIT2, POWER_LIMIT2_MASK, 32, 277 + RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), 278 + [POWER_LIMIT4] = PRIMITIVE_INFO_INIT(POWER_LIMIT4, POWER_LIMIT4_MASK, 0, 279 + RAPL_DOMAIN_REG_PL4, POWER_UNIT, 0), 280 + [ENERGY_COUNTER] = PRIMITIVE_INFO_INIT(ENERGY_COUNTER, ENERGY_STATUS_MASK, 0, 281 + RAPL_DOMAIN_REG_STATUS, ENERGY_UNIT, 0), 282 + [FW_LOCK] = PRIMITIVE_INFO_INIT(FW_LOCK, POWER_LOW_LOCK, 31, 283 + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), 284 + [FW_HIGH_LOCK] = PRIMITIVE_INFO_INIT(FW_LOCK, POWER_HIGH_LOCK, 63, 285 + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), 286 + [PL1_ENABLE] = PRIMITIVE_INFO_INIT(PL1_ENABLE, POWER_LIMIT1_ENABLE, 15, 287 + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), 288 + [PL1_CLAMP] = PRIMITIVE_INFO_INIT(PL1_CLAMP, POWER_LIMIT1_CLAMP, 16, 289 + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), 290 + [PL2_ENABLE] = PRIMITIVE_INFO_INIT(PL2_ENABLE, POWER_LIMIT2_ENABLE, 47, 291 + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), 292 + [PL2_CLAMP] = PRIMITIVE_INFO_INIT(PL2_CLAMP, POWER_LIMIT2_CLAMP, 48, 293 + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), 294 + [TIME_WINDOW1] = PRIMITIVE_INFO_INIT(TIME_WINDOW1, TIME_WINDOW1_MASK, 17, 295 + RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), 296 + [TIME_WINDOW2] = PRIMITIVE_INFO_INIT(TIME_WINDOW2, TIME_WINDOW2_MASK, 49, 297 + RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), 298 + [THERMAL_SPEC_POWER] = PRIMITIVE_INFO_INIT(THERMAL_SPEC_POWER, 299 + POWER_INFO_THERMAL_SPEC_MASK, 0, 300 + RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), 301 + [MAX_POWER] = PRIMITIVE_INFO_INIT(MAX_POWER, POWER_INFO_MAX_MASK, 32, 302 + RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), 303 + [MIN_POWER] = PRIMITIVE_INFO_INIT(MIN_POWER, POWER_INFO_MIN_MASK, 16, 304 + RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), 305 + [MAX_TIME_WINDOW] = PRIMITIVE_INFO_INIT(MAX_TIME_WINDOW, 306 + POWER_INFO_MAX_TIME_WIN_MASK, 48, 307 + RAPL_DOMAIN_REG_INFO, TIME_UNIT, 0), 308 + [THROTTLED_TIME] = PRIMITIVE_INFO_INIT(THROTTLED_TIME, 309 + PERF_STATUS_THROTTLE_TIME_MASK, 0, 310 + RAPL_DOMAIN_REG_PERF, TIME_UNIT, 0), 311 + [PRIORITY_LEVEL] = PRIMITIVE_INFO_INIT(PRIORITY_LEVEL, PP_POLICY_MASK, 0, 312 + RAPL_DOMAIN_REG_POLICY, ARBITRARY_UNIT, 0), 313 + [PSYS_POWER_LIMIT1] = PRIMITIVE_INFO_INIT(PSYS_POWER_LIMIT1, PSYS_POWER_LIMIT1_MASK, 0, 314 + RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), 315 + [PSYS_POWER_LIMIT2] = PRIMITIVE_INFO_INIT(PSYS_POWER_LIMIT2, PSYS_POWER_LIMIT2_MASK, 316 + 32, RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), 317 + [PSYS_PL1_ENABLE] = PRIMITIVE_INFO_INIT(PSYS_PL1_ENABLE, PSYS_POWER_LIMIT1_ENABLE, 318 + 17, RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 319 + 0), 320 + [PSYS_PL2_ENABLE] = PRIMITIVE_INFO_INIT(PSYS_PL2_ENABLE, PSYS_POWER_LIMIT2_ENABLE, 321 + 49, RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 322 + 0), 323 + [PSYS_TIME_WINDOW1] = PRIMITIVE_INFO_INIT(PSYS_TIME_WINDOW1, PSYS_TIME_WINDOW1_MASK, 324 + 19, RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), 325 + [PSYS_TIME_WINDOW2] = PRIMITIVE_INFO_INIT(PSYS_TIME_WINDOW2, PSYS_TIME_WINDOW2_MASK, 326 + 51, RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), 327 + }; 328 + 311 329 static const struct rapl_defaults rapl_defaults_core = { 312 330 .floor_freq_reg_addr = 0, 313 331 .check_unit = rapl_default_check_unit, ··· 516 418 rapl_msr_priv->read_raw = rapl_msr_read_raw; 517 419 rapl_msr_priv->write_raw = rapl_msr_write_raw; 518 420 rapl_msr_priv->defaults = (const struct rapl_defaults *)pdev->dev.platform_data; 421 + rapl_msr_priv->rpi = rpi_msr; 519 422 520 423 if (id) { 521 424 rapl_msr_priv->limits[RAPL_DOMAIN_PACKAGE] |= BIT(POWER_LIMIT4);