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 TPMI default settings into TPMI interface driver

TPMI-specific RAPL defaults differ from those used by MSR and MMIO
interfaces. Keeping them in RAPL common driver introduces unnecessary
complexity.

Move the TPMI defaults into the TPMI interface driver. This change
includes the following updates:

1. Add a TPMI-local struct rapl_defaults instance and assign it to
priv->defaults during TPMI probe.
2. Move rapl_check_unit_tpmi() and related unit-field definitions from
the common driver into the TPMI driver.
3. In rapl_check_unit_tpmi(), replace the generic get_rid() usage with
direct access to the TPMI package ID, since the function is now
interface-specific.

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>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Link: https://patch.msgid.link/20260212233044.329790-10-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
22e729c5 d7ca7d14

+47 -45
-45
drivers/powercap/intel_rapl_common.c
··· 108 108 #define PACKAGE_PLN_INT_SAVED BIT(0) 109 109 #define MAX_PRIM_NAME 32 110 110 111 - /* TPMI Unit register has different layout */ 112 - #define TPMI_POWER_UNIT_OFFSET POWER_UNIT_OFFSET 113 - #define TPMI_POWER_UNIT_MASK POWER_UNIT_MASK 114 - #define TPMI_ENERGY_UNIT_OFFSET 0x06 115 - #define TPMI_ENERGY_UNIT_MASK GENMASK_ULL(10, 6) 116 - #define TPMI_TIME_UNIT_OFFSET 0x0C 117 - #define TPMI_TIME_UNIT_MASK GENMASK_ULL(15, 12) 118 - 119 111 #define RAPL_EVENT_MASK GENMASK(7, 0) 120 112 121 113 enum unit_type { ··· 214 222 container_of(_zone, struct rapl_domain, power_zone) 215 223 216 224 static const struct rapl_defaults *defaults_msr; 217 - static const struct rapl_defaults defaults_tpmi; 218 225 219 226 static const struct rapl_defaults *get_defaults(struct rapl_package *rp) 220 227 { ··· 770 779 rp->priv->rpi = (void *)rpi_msr; 771 780 break; 772 781 case RAPL_IF_TPMI: 773 - rp->priv->defaults = &defaults_tpmi; 774 782 rp->priv->rpi = (void *)rpi_tpmi; 775 783 break; 776 784 default: ··· 1137 1147 */ 1138 1148 return (value) ? value * rd->time_unit : rd->time_unit; 1139 1149 } 1140 - 1141 - static int rapl_check_unit_tpmi(struct rapl_domain *rd) 1142 - { 1143 - struct reg_action ra; 1144 - u32 value; 1145 - 1146 - ra.reg = rd->regs[RAPL_DOMAIN_REG_UNIT]; 1147 - ra.mask = ~0; 1148 - if (rd->rp->priv->read_raw(get_rid(rd->rp), &ra, false)) { 1149 - pr_err("Failed to read power unit REG 0x%llx on %s:%s, exit.\n", 1150 - ra.reg.val, rd->rp->name, rd->name); 1151 - return -ENODEV; 1152 - } 1153 - 1154 - value = (ra.value & TPMI_ENERGY_UNIT_MASK) >> TPMI_ENERGY_UNIT_OFFSET; 1155 - rd->energy_unit = (ENERGY_UNIT_SCALE * MICROJOULE_PER_JOULE) >> value; 1156 - 1157 - value = (ra.value & TPMI_POWER_UNIT_MASK) >> TPMI_POWER_UNIT_OFFSET; 1158 - rd->power_unit = MICROWATT_PER_WATT >> value; 1159 - 1160 - value = (ra.value & TPMI_TIME_UNIT_MASK) >> TPMI_TIME_UNIT_OFFSET; 1161 - rd->time_unit = USEC_PER_SEC >> value; 1162 - 1163 - pr_debug("Core CPU %s:%s energy=%dpJ, time=%dus, power=%duW\n", 1164 - rd->rp->name, rd->name, rd->energy_unit, rd->time_unit, rd->power_unit); 1165 - 1166 - return 0; 1167 - } 1168 - 1169 - static const struct rapl_defaults defaults_tpmi = { 1170 - .check_unit = rapl_check_unit_tpmi, 1171 - /* Reuse existing logic, ignore the PL_CLAMP failures and enable all Power Limits */ 1172 - .set_floor_freq = rapl_default_set_floor_freq, 1173 - .compute_time_window = rapl_default_compute_time_window, 1174 - }; 1175 1150 1176 1151 static const struct rapl_defaults rapl_defaults_core = { 1177 1152 .floor_freq_reg_addr = 0,
+47
drivers/powercap/intel_rapl_tpmi.c
··· 9 9 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 10 10 11 11 #include <linux/auxiliary_bus.h> 12 + #include <linux/bits.h> 12 13 #include <linux/intel_rapl.h> 13 14 #include <linux/intel_tpmi.h> 14 15 #include <linux/intel_vsec.h> 15 16 #include <linux/io.h> 16 17 #include <linux/module.h> 17 18 #include <linux/slab.h> 19 + #include <linux/units.h> 18 20 19 21 #define TPMI_RAPL_MAJOR_VERSION 0 20 22 #define TPMI_RAPL_MINOR_VERSION 1 ··· 252 250 return 0; 253 251 } 254 252 253 + /* TPMI Unit register has different layout */ 254 + #define TPMI_ENERGY_UNIT_SCALE 1000 255 + #define TPMI_POWER_UNIT_OFFSET 0x00 256 + #define TPMI_POWER_UNIT_MASK GENMASK(3, 0) 257 + #define TPMI_ENERGY_UNIT_OFFSET 0x06 258 + #define TPMI_ENERGY_UNIT_MASK GENMASK_ULL(10, 6) 259 + #define TPMI_TIME_UNIT_OFFSET 0x0C 260 + #define TPMI_TIME_UNIT_MASK GENMASK_ULL(15, 12) 261 + 262 + static int rapl_check_unit_tpmi(struct rapl_domain *rd) 263 + { 264 + struct reg_action ra; 265 + u32 value; 266 + 267 + ra.reg = rd->regs[RAPL_DOMAIN_REG_UNIT]; 268 + ra.mask = ~0; 269 + if (tpmi_rapl_read_raw(rd->rp->id, &ra, false)) { 270 + pr_err("Failed to read power unit REG 0x%llx on %s:%s, exit.\n", 271 + ra.reg.val, rd->rp->name, rd->name); 272 + return -ENODEV; 273 + } 274 + 275 + value = (ra.value & TPMI_ENERGY_UNIT_MASK) >> TPMI_ENERGY_UNIT_OFFSET; 276 + rd->energy_unit = (TPMI_ENERGY_UNIT_SCALE * MICROJOULE_PER_JOULE) >> value; 277 + 278 + value = (ra.value & TPMI_POWER_UNIT_MASK) >> TPMI_POWER_UNIT_OFFSET; 279 + rd->power_unit = MICROWATT_PER_WATT >> value; 280 + 281 + value = (ra.value & TPMI_TIME_UNIT_MASK) >> TPMI_TIME_UNIT_OFFSET; 282 + rd->time_unit = USEC_PER_SEC >> value; 283 + 284 + pr_debug("Core CPU %s:%s energy=%dpJ, time=%dus, power=%duW\n", 285 + rd->rp->name, rd->name, rd->energy_unit, rd->time_unit, rd->power_unit); 286 + 287 + return 0; 288 + } 289 + 290 + static const struct rapl_defaults defaults_tpmi = { 291 + .check_unit = rapl_check_unit_tpmi, 292 + /* Reuse existing logic, ignore the PL_CLAMP failures and enable all Power Limits */ 293 + .set_floor_freq = rapl_default_set_floor_freq, 294 + .compute_time_window = rapl_default_compute_time_window, 295 + }; 296 + 255 297 static int intel_rapl_tpmi_probe(struct auxiliary_device *auxdev, 256 298 const struct auxiliary_device_id *id) 257 299 { ··· 343 297 trp->priv.read_raw = tpmi_rapl_read_raw; 344 298 trp->priv.write_raw = tpmi_rapl_write_raw; 345 299 trp->priv.control_type = tpmi_control_type; 300 + trp->priv.defaults = &defaults_tpmi; 346 301 347 302 /* RAPL TPMI I/F is per physical package */ 348 303 trp->rp = rapl_find_package_domain(info->package_id, &trp->priv, false);