From: Zhang Rui <rui.zhang@intel.com>
Subject: powercap: intel_rapl: add support for Sapphire Rapids
References: jsc#SLE-15288, jsc#ECO-2990
Patch-Mainline: v5.9-rc1
Git-commit: 2d798d9f5967a3f134b1c55acbbe026c032e3429
RAPL on SPR behaves similar to Haswell server, except that SPR uses
a fixed energy unit (1 Joule) for the PSYS RAPL domain.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: <trenn@suse.com>
---
drivers/powercap/intel_rapl.c | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
--- a/drivers/powercap/intel_rapl.c
+++ b/drivers/powercap/intel_rapl.c
@@ -35,6 +35,9 @@
#include <asm/cpu_device_id.h>
#include <asm/intel-family.h>
+/* Not backported to intel-family.h */
+#define INTEL_FAM6_SAPPHIRERAPIDS_X 0x8F
+
/* Local defines */
#define MSR_PLATFORM_POWER_LIMIT 0x0000065C
@@ -209,6 +212,7 @@ struct rapl_defaults {
u64 (*compute_time_window)(struct rapl_package *rp, u64 val,
bool to_raw);
unsigned int dram_domain_energy_unit;
+ unsigned int psys_domain_energy_unit;
};
static struct rapl_defaults *rapl_defaults;
@@ -1134,6 +1138,14 @@ static const struct rapl_defaults rapl_d
.compute_time_window = rapl_compute_time_window_atom,
};
+static const struct rapl_defaults rapl_defaults_spr_server = {
+ .check_unit = rapl_check_unit_core,
+ .set_floor_freq = set_floor_freq_default,
+ .compute_time_window = rapl_compute_time_window_core,
+ .dram_domain_energy_unit = 15300,
+ .psys_domain_energy_unit = 1000000000,
+};
+
#define RAPL_CPU(_model, _ops) { \
.vendor = X86_VENDOR_INTEL, \
.family = 6, \
@@ -1177,6 +1189,8 @@ static const struct x86_cpu_id rapl_ids[
X86_MATCH_INTEL_FAM6_MODEL(XEON_PHI_KNL, &rapl_defaults_hsw_server),
X86_MATCH_INTEL_FAM6_MODEL(XEON_PHI_KNM, &rapl_defaults_hsw_server),
+
+ X86_MATCH_INTEL_FAM6_MODEL(SAPPHIRERAPIDS_X, &rapl_defaults_spr_server),
{}
};
MODULE_DEVICE_TABLE(x86cpu, rapl_ids);
@@ -1304,7 +1318,11 @@ static int __init rapl_register_psys(voi
rd->rpl[1].prim_id = PL2_ENABLE;
rd->rpl[1].name = pl2_name;
rd->rp = rapl_find_package_domain(0);
-
+ rd->domain_energy_unit =
+ rapl_defaults->psys_domain_energy_unit;
+ if (rd->domain_energy_unit)
+ pr_info("Platform domain energy unit %dpj\n",
+ rd->domain_energy_unit);
power_zone = powercap_register_zone(&rd->power_zone, control_type,
"psys", NULL,
&zone_ops[RAPL_DOMAIN_PLATFORM],