mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
powercap: intel_rapl: Move TPMI primitives to TPMI driver
TPMI-specific RAPL primitives differ from those used by MSR and MMIO
interfaces. Keeping them in the common RAPL driver requires
interface-specific handling logic and makes the common layer
unnecessarily complex.
Move the TPMI primitive definitions and associated bitmasks into the
TPMI interface driver. This change includes:
1. Move TPMI-specific bitmask definitions from intel_rapl_common.c to
intel_rapl_tpmi.c.
2. Add TPMI-local struct rapl_primitive_info instance and assign it to
priv->rpi during TPMI probe.
3. Remove the RAPL TPMI related definitions from 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-5-sathyanarayanan.kuppuswamy@linux.intel.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
committed by
Rafael J. Wysocki
parent
04bcbed4cd
commit
b874996a7c
@@ -79,15 +79,6 @@
|
||||
#define PSYS_TIME_WINDOW1_MASK GENMASK_ULL(25, 19)
|
||||
#define PSYS_TIME_WINDOW2_MASK GENMASK_ULL(57, 51)
|
||||
|
||||
/* bitmasks for RAPL TPMI, used by primitive access functions */
|
||||
#define TPMI_POWER_LIMIT_MASK GENMASK_ULL(17, 0)
|
||||
#define TPMI_POWER_LIMIT_ENABLE BIT_ULL(62)
|
||||
#define TPMI_TIME_WINDOW_MASK GENMASK_ULL(24, 18)
|
||||
#define TPMI_INFO_SPEC_MASK GENMASK_ULL(17, 0)
|
||||
#define TPMI_INFO_MIN_MASK GENMASK_ULL(35, 18)
|
||||
#define TPMI_INFO_MAX_MASK GENMASK_ULL(53, 36)
|
||||
#define TPMI_INFO_MAX_TIME_WIN_MASK GENMASK_ULL(60, 54)
|
||||
|
||||
/* Non HW constants */
|
||||
#define RAPL_PRIMITIVE_DUMMY BIT(2)
|
||||
|
||||
@@ -665,45 +656,6 @@ static struct rapl_primitive_info rpi_msr[NR_RAPL_PRIMITIVES] = {
|
||||
51, RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0),
|
||||
};
|
||||
|
||||
/* RAPL primitives for TPMI I/F */
|
||||
static struct rapl_primitive_info rpi_tpmi[NR_RAPL_PRIMITIVES] = {
|
||||
/* name, mask, shift, msr index, unit divisor */
|
||||
[POWER_LIMIT1] = PRIMITIVE_INFO_INIT(POWER_LIMIT1, TPMI_POWER_LIMIT_MASK, 0,
|
||||
RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0),
|
||||
[POWER_LIMIT2] = PRIMITIVE_INFO_INIT(POWER_LIMIT2, TPMI_POWER_LIMIT_MASK, 0,
|
||||
RAPL_DOMAIN_REG_PL2, POWER_UNIT, 0),
|
||||
[POWER_LIMIT4] = PRIMITIVE_INFO_INIT(POWER_LIMIT4, TPMI_POWER_LIMIT_MASK, 0,
|
||||
RAPL_DOMAIN_REG_PL4, POWER_UNIT, 0),
|
||||
[ENERGY_COUNTER] = PRIMITIVE_INFO_INIT(ENERGY_COUNTER, ENERGY_STATUS_MASK, 0,
|
||||
RAPL_DOMAIN_REG_STATUS, ENERGY_UNIT, 0),
|
||||
[PL1_LOCK] = PRIMITIVE_INFO_INIT(PL1_LOCK, POWER_HIGH_LOCK, 63,
|
||||
RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0),
|
||||
[PL2_LOCK] = PRIMITIVE_INFO_INIT(PL2_LOCK, POWER_HIGH_LOCK, 63,
|
||||
RAPL_DOMAIN_REG_PL2, ARBITRARY_UNIT, 0),
|
||||
[PL4_LOCK] = PRIMITIVE_INFO_INIT(PL4_LOCK, POWER_HIGH_LOCK, 63,
|
||||
RAPL_DOMAIN_REG_PL4, ARBITRARY_UNIT, 0),
|
||||
[PL1_ENABLE] = PRIMITIVE_INFO_INIT(PL1_ENABLE, TPMI_POWER_LIMIT_ENABLE, 62,
|
||||
RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0),
|
||||
[PL2_ENABLE] = PRIMITIVE_INFO_INIT(PL2_ENABLE, TPMI_POWER_LIMIT_ENABLE, 62,
|
||||
RAPL_DOMAIN_REG_PL2, ARBITRARY_UNIT, 0),
|
||||
[PL4_ENABLE] = PRIMITIVE_INFO_INIT(PL4_ENABLE, TPMI_POWER_LIMIT_ENABLE, 62,
|
||||
RAPL_DOMAIN_REG_PL4, ARBITRARY_UNIT, 0),
|
||||
[TIME_WINDOW1] = PRIMITIVE_INFO_INIT(TIME_WINDOW1, TPMI_TIME_WINDOW_MASK, 18,
|
||||
RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0),
|
||||
[TIME_WINDOW2] = PRIMITIVE_INFO_INIT(TIME_WINDOW2, TPMI_TIME_WINDOW_MASK, 18,
|
||||
RAPL_DOMAIN_REG_PL2, TIME_UNIT, 0),
|
||||
[THERMAL_SPEC_POWER] = PRIMITIVE_INFO_INIT(THERMAL_SPEC_POWER, TPMI_INFO_SPEC_MASK, 0,
|
||||
RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0),
|
||||
[MAX_POWER] = PRIMITIVE_INFO_INIT(MAX_POWER, TPMI_INFO_MAX_MASK, 36,
|
||||
RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0),
|
||||
[MIN_POWER] = PRIMITIVE_INFO_INIT(MIN_POWER, TPMI_INFO_MIN_MASK, 18,
|
||||
RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0),
|
||||
[MAX_TIME_WINDOW] = PRIMITIVE_INFO_INIT(MAX_TIME_WINDOW, TPMI_INFO_MAX_TIME_WIN_MASK,
|
||||
54, RAPL_DOMAIN_REG_INFO, TIME_UNIT, 0),
|
||||
[THROTTLED_TIME] = PRIMITIVE_INFO_INIT(THROTTLED_TIME, PERF_STATUS_THROTTLE_TIME_MASK,
|
||||
0, RAPL_DOMAIN_REG_PERF, TIME_UNIT, 0),
|
||||
};
|
||||
|
||||
static struct rapl_primitive_info *get_rpi(struct rapl_package *rp, int prim)
|
||||
{
|
||||
struct rapl_primitive_info *rpi = rp->priv->rpi;
|
||||
@@ -722,9 +674,6 @@ static int rapl_config(struct rapl_package *rp)
|
||||
case RAPL_IF_MSR:
|
||||
rp->priv->rpi = rpi_msr;
|
||||
break;
|
||||
case RAPL_IF_TPMI:
|
||||
rp->priv->rpi = rpi_tpmi;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -62,6 +62,58 @@ static DEFINE_MUTEX(tpmi_rapl_lock);
|
||||
|
||||
static struct powercap_control_type *tpmi_control_type;
|
||||
|
||||
/* bitmasks for RAPL TPMI, used by primitive access functions */
|
||||
#define TPMI_POWER_LIMIT_MASK GENMASK_ULL(17, 0)
|
||||
#define TPMI_POWER_LIMIT_ENABLE BIT_ULL(62)
|
||||
#define TPMI_POWER_HIGH_LOCK BIT_ULL(63)
|
||||
#define TPMI_TIME_WINDOW_MASK GENMASK_ULL(24, 18)
|
||||
#define TPMI_INFO_SPEC_MASK GENMASK_ULL(17, 0)
|
||||
#define TPMI_INFO_MIN_MASK GENMASK_ULL(35, 18)
|
||||
#define TPMI_INFO_MAX_MASK GENMASK_ULL(53, 36)
|
||||
#define TPMI_INFO_MAX_TIME_WIN_MASK GENMASK_ULL(60, 54)
|
||||
#define TPMI_ENERGY_STATUS_MASK GENMASK(31, 0)
|
||||
#define TPMI_PERF_STATUS_THROTTLE_TIME_MASK GENMASK(31, 0)
|
||||
|
||||
/* RAPL primitives for TPMI I/F */
|
||||
static struct rapl_primitive_info rpi_tpmi[NR_RAPL_PRIMITIVES] = {
|
||||
/* name, mask, shift, msr index, unit divisor */
|
||||
[POWER_LIMIT1] = PRIMITIVE_INFO_INIT(POWER_LIMIT1, TPMI_POWER_LIMIT_MASK, 0,
|
||||
RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0),
|
||||
[POWER_LIMIT2] = PRIMITIVE_INFO_INIT(POWER_LIMIT2, TPMI_POWER_LIMIT_MASK, 0,
|
||||
RAPL_DOMAIN_REG_PL2, POWER_UNIT, 0),
|
||||
[POWER_LIMIT4] = PRIMITIVE_INFO_INIT(POWER_LIMIT4, TPMI_POWER_LIMIT_MASK, 0,
|
||||
RAPL_DOMAIN_REG_PL4, POWER_UNIT, 0),
|
||||
[ENERGY_COUNTER] = PRIMITIVE_INFO_INIT(ENERGY_COUNTER, TPMI_ENERGY_STATUS_MASK, 0,
|
||||
RAPL_DOMAIN_REG_STATUS, ENERGY_UNIT, 0),
|
||||
[PL1_LOCK] = PRIMITIVE_INFO_INIT(PL1_LOCK, TPMI_POWER_HIGH_LOCK, 63,
|
||||
RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0),
|
||||
[PL2_LOCK] = PRIMITIVE_INFO_INIT(PL2_LOCK, TPMI_POWER_HIGH_LOCK, 63,
|
||||
RAPL_DOMAIN_REG_PL2, ARBITRARY_UNIT, 0),
|
||||
[PL4_LOCK] = PRIMITIVE_INFO_INIT(PL4_LOCK, TPMI_POWER_HIGH_LOCK, 63,
|
||||
RAPL_DOMAIN_REG_PL4, ARBITRARY_UNIT, 0),
|
||||
[PL1_ENABLE] = PRIMITIVE_INFO_INIT(PL1_ENABLE, TPMI_POWER_LIMIT_ENABLE, 62,
|
||||
RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0),
|
||||
[PL2_ENABLE] = PRIMITIVE_INFO_INIT(PL2_ENABLE, TPMI_POWER_LIMIT_ENABLE, 62,
|
||||
RAPL_DOMAIN_REG_PL2, ARBITRARY_UNIT, 0),
|
||||
[PL4_ENABLE] = PRIMITIVE_INFO_INIT(PL4_ENABLE, TPMI_POWER_LIMIT_ENABLE, 62,
|
||||
RAPL_DOMAIN_REG_PL4, ARBITRARY_UNIT, 0),
|
||||
[TIME_WINDOW1] = PRIMITIVE_INFO_INIT(TIME_WINDOW1, TPMI_TIME_WINDOW_MASK, 18,
|
||||
RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0),
|
||||
[TIME_WINDOW2] = PRIMITIVE_INFO_INIT(TIME_WINDOW2, TPMI_TIME_WINDOW_MASK, 18,
|
||||
RAPL_DOMAIN_REG_PL2, TIME_UNIT, 0),
|
||||
[THERMAL_SPEC_POWER] = PRIMITIVE_INFO_INIT(THERMAL_SPEC_POWER, TPMI_INFO_SPEC_MASK, 0,
|
||||
RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0),
|
||||
[MAX_POWER] = PRIMITIVE_INFO_INIT(MAX_POWER, TPMI_INFO_MAX_MASK, 36,
|
||||
RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0),
|
||||
[MIN_POWER] = PRIMITIVE_INFO_INIT(MIN_POWER, TPMI_INFO_MIN_MASK, 18,
|
||||
RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0),
|
||||
[MAX_TIME_WINDOW] = PRIMITIVE_INFO_INIT(MAX_TIME_WINDOW, TPMI_INFO_MAX_TIME_WIN_MASK,
|
||||
54, RAPL_DOMAIN_REG_INFO, TIME_UNIT, 0),
|
||||
[THROTTLED_TIME] = PRIMITIVE_INFO_INIT(THROTTLED_TIME,
|
||||
TPMI_PERF_STATUS_THROTTLE_TIME_MASK,
|
||||
0, RAPL_DOMAIN_REG_PERF, TIME_UNIT, 0),
|
||||
};
|
||||
|
||||
static int tpmi_rapl_read_raw(int id, struct reg_action *ra, bool atomic)
|
||||
{
|
||||
if (!ra->reg.mmio)
|
||||
@@ -344,6 +396,7 @@ static int intel_rapl_tpmi_probe(struct auxiliary_device *auxdev,
|
||||
trp->priv.write_raw = tpmi_rapl_write_raw;
|
||||
trp->priv.control_type = tpmi_control_type;
|
||||
trp->priv.defaults = &defaults_tpmi;
|
||||
trp->priv.rpi = rpi_tpmi;
|
||||
|
||||
/* RAPL TPMI I/F is per physical package */
|
||||
trp->rp = rapl_find_package_domain(info->package_id, &trp->priv, false);
|
||||
|
||||
Reference in New Issue
Block a user