]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
thermal: intel: int340x: processor: Move MMIO primitives to MMIO driver
authorKuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Tue, 31 Mar 2026 21:19:48 +0000 (14:19 -0700)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 1 Apr 2026 14:03:05 +0000 (16:03 +0200)
MMIO-specific primitives differ from those used by the TPMI interface.
The MSR and MMIO interfaces shared the same primitives in the common
driver, but MMIO does not require many MSR-specific entries (like PSYS).
Keeping these in the common driver does not add any value and requires
interface-specific handling logic that makes the common layer
unnecessarily complex.

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

 1. Add MMIO-local struct rapl_primitive_info instance without
    MSR-specific entries and assign it to priv->rpi during MMIO
    initialization.
 2. Remove the RAPL MMIO case 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-6-sathyanarayanan.kuppuswamy@linux.intel.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/powercap/intel_rapl_common.c
drivers/thermal/intel/int340x_thermal/processor_thermal_rapl.c

index 06912cb805f78b8aadfd77aa6b537ec6f5c93617..7c5e16598ba32a52e853566f5835c739a4b72a30 100644 (file)
@@ -670,7 +670,6 @@ static int rapl_config(struct rapl_package *rp)
 {
        switch (rp->priv->type) {
        /* MMIO I/F shares the same register layout as MSR registers */
-       case RAPL_IF_MMIO:
        case RAPL_IF_MSR:
                rp->priv->rpi = rpi_msr;
                break;
index 5dbeb0a43c8c085731ad974509c3760fe1069a00..f8b9745c1b8a276763596a1fea6ba2c3bd8d39df 100644 (file)
 
 static struct rapl_if_priv rapl_mmio_priv;
 
+/* bitmasks for RAPL MSRs, used by primitive access functions */
+#define MMIO_ENERGY_STATUS_MASK                        GENMASK(31, 0)
+
+#define MMIO_POWER_LIMIT1_MASK                 GENMASK(14, 0)
+#define MMIO_POWER_LIMIT1_ENABLE               BIT(15)
+#define MMIO_POWER_LIMIT1_CLAMP                        BIT(16)
+
+#define MMIO_POWER_LIMIT2_MASK                 GENMASK_ULL(46, 32)
+#define MMIO_POWER_LIMIT2_ENABLE               BIT_ULL(47)
+#define MMIO_POWER_LIMIT2_CLAMP                        BIT_ULL(48)
+
+#define MMIO_POWER_LOW_LOCK                    BIT(31)
+#define MMIO_POWER_HIGH_LOCK                   BIT_ULL(63)
+
+#define MMIO_POWER_LIMIT4_MASK                 GENMASK(12, 0)
+
+#define MMIO_TIME_WINDOW1_MASK                 GENMASK_ULL(23, 17)
+#define MMIO_TIME_WINDOW2_MASK                 GENMASK_ULL(55, 49)
+
+#define MMIO_POWER_INFO_MAX_MASK               GENMASK_ULL(46, 32)
+#define MMIO_POWER_INFO_MIN_MASK               GENMASK_ULL(30, 16)
+#define MMIO_POWER_INFO_MAX_TIME_WIN_MASK      GENMASK_ULL(53, 48)
+#define MMIO_POWER_INFO_THERMAL_SPEC_MASK      GENMASK(14, 0)
+
+#define MMIO_PERF_STATUS_THROTTLE_TIME_MASK    GENMASK(31, 0)
+#define MMIO_PP_POLICY_MASK                    GENMASK(4, 0)
+
+/* RAPL primitives for MMIO I/F */
+static struct rapl_primitive_info rpi_mmio[NR_RAPL_PRIMITIVES] = {
+       /* name, mask, shift, msr index, unit divisor */
+       [POWER_LIMIT1]          = PRIMITIVE_INFO_INIT(POWER_LIMIT1, MMIO_POWER_LIMIT1_MASK, 0,
+                                                     RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0),
+       [POWER_LIMIT2]          = PRIMITIVE_INFO_INIT(POWER_LIMIT2, MMIO_POWER_LIMIT2_MASK, 32,
+                                                     RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0),
+       [POWER_LIMIT4]          = PRIMITIVE_INFO_INIT(POWER_LIMIT4, MMIO_POWER_LIMIT4_MASK, 0,
+                                                     RAPL_DOMAIN_REG_PL4, POWER_UNIT, 0),
+       [ENERGY_COUNTER]        = PRIMITIVE_INFO_INIT(ENERGY_COUNTER, MMIO_ENERGY_STATUS_MASK, 0,
+                                                     RAPL_DOMAIN_REG_STATUS, ENERGY_UNIT, 0),
+       [FW_LOCK]               = PRIMITIVE_INFO_INIT(FW_LOCK, MMIO_POWER_LOW_LOCK, 31,
+                                                     RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0),
+       [FW_HIGH_LOCK]          = PRIMITIVE_INFO_INIT(FW_LOCK, MMIO_POWER_HIGH_LOCK, 63,
+                                                     RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0),
+       [PL1_ENABLE]            = PRIMITIVE_INFO_INIT(PL1_ENABLE, MMIO_POWER_LIMIT1_ENABLE, 15,
+                                                     RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0),
+       [PL1_CLAMP]             = PRIMITIVE_INFO_INIT(PL1_CLAMP, MMIO_POWER_LIMIT1_CLAMP, 16,
+                                                     RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0),
+       [PL2_ENABLE]            = PRIMITIVE_INFO_INIT(PL2_ENABLE, MMIO_POWER_LIMIT2_ENABLE, 47,
+                                                     RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0),
+       [PL2_CLAMP]             = PRIMITIVE_INFO_INIT(PL2_CLAMP, MMIO_POWER_LIMIT2_CLAMP, 48,
+                                                     RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0),
+       [TIME_WINDOW1]          = PRIMITIVE_INFO_INIT(TIME_WINDOW1, MMIO_TIME_WINDOW1_MASK, 17,
+                                                     RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0),
+       [TIME_WINDOW2]          = PRIMITIVE_INFO_INIT(TIME_WINDOW2, MMIO_TIME_WINDOW2_MASK, 49,
+                                                     RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0),
+       [THERMAL_SPEC_POWER]    = PRIMITIVE_INFO_INIT(THERMAL_SPEC_POWER,
+                                                     MMIO_POWER_INFO_THERMAL_SPEC_MASK, 0,
+                                                     RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0),
+       [MAX_POWER]             = PRIMITIVE_INFO_INIT(MAX_POWER, MMIO_POWER_INFO_MAX_MASK, 32,
+                                                     RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0),
+       [MIN_POWER]             = PRIMITIVE_INFO_INIT(MIN_POWER, MMIO_POWER_INFO_MIN_MASK, 16,
+                                                     RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0),
+       [MAX_TIME_WINDOW]       = PRIMITIVE_INFO_INIT(MAX_TIME_WINDOW,
+                                                     MMIO_POWER_INFO_MAX_TIME_WIN_MASK, 48,
+                                                     RAPL_DOMAIN_REG_INFO, TIME_UNIT, 0),
+       [THROTTLED_TIME]        = PRIMITIVE_INFO_INIT(THROTTLED_TIME,
+                                                     MMIO_PERF_STATUS_THROTTLE_TIME_MASK, 0,
+                                                     RAPL_DOMAIN_REG_PERF, TIME_UNIT, 0),
+       [PRIORITY_LEVEL]        = PRIMITIVE_INFO_INIT(PRIORITY_LEVEL, MMIO_PP_POLICY_MASK, 0,
+                                                     RAPL_DOMAIN_REG_POLICY, ARBITRARY_UNIT, 0),
+};
+
 static const struct rapl_mmio_regs rapl_mmio_default = {
        .reg_unit = 0x5938,
        .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
        rapl_mmio_priv.read_raw = rapl_mmio_read_raw;
        rapl_mmio_priv.write_raw = rapl_mmio_write_raw;
        rapl_mmio_priv.defaults = &rapl_defaults_mmio;
+       rapl_mmio_priv.rpi = rpi_mmio;
 
        rapl_mmio_priv.control_type = powercap_register_control_type(NULL, "intel-rapl-mmio", NULL);
        if (IS_ERR(rapl_mmio_priv.control_type)) {