Skip to content

Commit 22e729c

Browse files
Kuppuswamy Sathyanarayananrafaeljw
authored andcommitted
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>
1 parent d7ca7d1 commit 22e729c

2 files changed

Lines changed: 47 additions & 45 deletions

File tree

drivers/powercap/intel_rapl_common.c

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,6 @@
108108
#define PACKAGE_PLN_INT_SAVED BIT(0)
109109
#define MAX_PRIM_NAME 32
110110

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-
119111
#define RAPL_EVENT_MASK GENMASK(7, 0)
120112

121113
enum unit_type {
@@ -222,7 +214,6 @@ static int get_pl_prim(struct rapl_domain *rd, int pl, enum pl_prims prim)
222214
container_of(_zone, struct rapl_domain, power_zone)
223215

224216
static const struct rapl_defaults *defaults_msr;
225-
static const struct rapl_defaults defaults_tpmi;
226217

227218
static const struct rapl_defaults *get_defaults(struct rapl_package *rp)
228219
{
@@ -779,7 +770,6 @@ static int rapl_config(struct rapl_package *rp)
779770
rp->priv->rpi = (void *)rpi_msr;
780771
break;
781772
case RAPL_IF_TPMI:
782-
rp->priv->defaults = &defaults_tpmi;
783773
rp->priv->rpi = (void *)rpi_tpmi;
784774
break;
785775
default:
@@ -1148,41 +1138,6 @@ static u64 rapl_compute_time_window_atom(struct rapl_domain *rd, u64 value,
11481138
return (value) ? value * rd->time_unit : rd->time_unit;
11491139
}
11501140

1151-
static int rapl_check_unit_tpmi(struct rapl_domain *rd)
1152-
{
1153-
struct reg_action ra;
1154-
u32 value;
1155-
1156-
ra.reg = rd->regs[RAPL_DOMAIN_REG_UNIT];
1157-
ra.mask = ~0;
1158-
if (rd->rp->priv->read_raw(get_rid(rd->rp), &ra, false)) {
1159-
pr_err("Failed to read power unit REG 0x%llx on %s:%s, exit.\n",
1160-
ra.reg.val, rd->rp->name, rd->name);
1161-
return -ENODEV;
1162-
}
1163-
1164-
value = (ra.value & TPMI_ENERGY_UNIT_MASK) >> TPMI_ENERGY_UNIT_OFFSET;
1165-
rd->energy_unit = (ENERGY_UNIT_SCALE * MICROJOULE_PER_JOULE) >> value;
1166-
1167-
value = (ra.value & TPMI_POWER_UNIT_MASK) >> TPMI_POWER_UNIT_OFFSET;
1168-
rd->power_unit = MICROWATT_PER_WATT >> value;
1169-
1170-
value = (ra.value & TPMI_TIME_UNIT_MASK) >> TPMI_TIME_UNIT_OFFSET;
1171-
rd->time_unit = USEC_PER_SEC >> value;
1172-
1173-
pr_debug("Core CPU %s:%s energy=%dpJ, time=%dus, power=%duW\n",
1174-
rd->rp->name, rd->name, rd->energy_unit, rd->time_unit, rd->power_unit);
1175-
1176-
return 0;
1177-
}
1178-
1179-
static const struct rapl_defaults defaults_tpmi = {
1180-
.check_unit = rapl_check_unit_tpmi,
1181-
/* Reuse existing logic, ignore the PL_CLAMP failures and enable all Power Limits */
1182-
.set_floor_freq = rapl_default_set_floor_freq,
1183-
.compute_time_window = rapl_default_compute_time_window,
1184-
};
1185-
11861141
static const struct rapl_defaults rapl_defaults_core = {
11871142
.floor_freq_reg_addr = 0,
11881143
.check_unit = rapl_default_check_unit,

drivers/powercap/intel_rapl_tpmi.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@
99
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
1010

1111
#include <linux/auxiliary_bus.h>
12+
#include <linux/bits.h>
1213
#include <linux/intel_rapl.h>
1314
#include <linux/intel_tpmi.h>
1415
#include <linux/intel_vsec.h>
1516
#include <linux/io.h>
1617
#include <linux/module.h>
1718
#include <linux/slab.h>
19+
#include <linux/units.h>
1820

1921
#define TPMI_RAPL_MAJOR_VERSION 0
2022
#define TPMI_RAPL_MINOR_VERSION 1
@@ -250,6 +252,50 @@ static int parse_one_domain(struct tpmi_rapl_package *trp, u32 offset)
250252
return 0;
251253
}
252254

255+
/* TPMI Unit register has different layout */
256+
#define TPMI_ENERGY_UNIT_SCALE 1000
257+
#define TPMI_POWER_UNIT_OFFSET 0x00
258+
#define TPMI_POWER_UNIT_MASK GENMASK(3, 0)
259+
#define TPMI_ENERGY_UNIT_OFFSET 0x06
260+
#define TPMI_ENERGY_UNIT_MASK GENMASK_ULL(10, 6)
261+
#define TPMI_TIME_UNIT_OFFSET 0x0C
262+
#define TPMI_TIME_UNIT_MASK GENMASK_ULL(15, 12)
263+
264+
static int rapl_check_unit_tpmi(struct rapl_domain *rd)
265+
{
266+
struct reg_action ra;
267+
u32 value;
268+
269+
ra.reg = rd->regs[RAPL_DOMAIN_REG_UNIT];
270+
ra.mask = ~0;
271+
if (tpmi_rapl_read_raw(rd->rp->id, &ra, false)) {
272+
pr_err("Failed to read power unit REG 0x%llx on %s:%s, exit.\n",
273+
ra.reg.val, rd->rp->name, rd->name);
274+
return -ENODEV;
275+
}
276+
277+
value = (ra.value & TPMI_ENERGY_UNIT_MASK) >> TPMI_ENERGY_UNIT_OFFSET;
278+
rd->energy_unit = (TPMI_ENERGY_UNIT_SCALE * MICROJOULE_PER_JOULE) >> value;
279+
280+
value = (ra.value & TPMI_POWER_UNIT_MASK) >> TPMI_POWER_UNIT_OFFSET;
281+
rd->power_unit = MICROWATT_PER_WATT >> value;
282+
283+
value = (ra.value & TPMI_TIME_UNIT_MASK) >> TPMI_TIME_UNIT_OFFSET;
284+
rd->time_unit = USEC_PER_SEC >> value;
285+
286+
pr_debug("Core CPU %s:%s energy=%dpJ, time=%dus, power=%duW\n",
287+
rd->rp->name, rd->name, rd->energy_unit, rd->time_unit, rd->power_unit);
288+
289+
return 0;
290+
}
291+
292+
static const struct rapl_defaults defaults_tpmi = {
293+
.check_unit = rapl_check_unit_tpmi,
294+
/* Reuse existing logic, ignore the PL_CLAMP failures and enable all Power Limits */
295+
.set_floor_freq = rapl_default_set_floor_freq,
296+
.compute_time_window = rapl_default_compute_time_window,
297+
};
298+
253299
static int intel_rapl_tpmi_probe(struct auxiliary_device *auxdev,
254300
const struct auxiliary_device_id *id)
255301
{
@@ -297,6 +343,7 @@ static int intel_rapl_tpmi_probe(struct auxiliary_device *auxdev,
297343
trp->priv.read_raw = tpmi_rapl_read_raw;
298344
trp->priv.write_raw = tpmi_rapl_write_raw;
299345
trp->priv.control_type = tpmi_control_type;
346+
trp->priv.defaults = &defaults_tpmi;
300347

301348
/* RAPL TPMI I/F is per physical package */
302349
trp->rp = rapl_find_package_domain(info->package_id, &trp->priv, false);

0 commit comments

Comments
 (0)