Blob Blame History Raw
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],