powercap: intel_rapl: add support for Sapphire Rapids
authorZhang Rui <rui.zhang@intel.com>
Mon, 29 Jun 2020 05:34:50 +0000 (13:34 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 30 Jun 2020 18:42:07 +0000 (20:42 +0200)
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>
drivers/powercap/intel_rapl_common.c

index 61a63a1..b739ce4 100644 (file)
@@ -93,6 +93,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;
 
@@ -533,12 +534,23 @@ static void rapl_init_domains(struct rapl_package *rp)
                for (j = 0; j < RAPL_DOMAIN_REG_MAX; j++)
                        rd->regs[j] = rp->priv->regs[i][j];
 
-               if (i == RAPL_DOMAIN_DRAM) {
+               switch (i) {
+               case RAPL_DOMAIN_DRAM:
                        rd->domain_energy_unit =
                            rapl_defaults->dram_domain_energy_unit;
                        if (rd->domain_energy_unit)
                                pr_info("DRAM domain energy unit %dpj\n",
                                        rd->domain_energy_unit);
+                       break;
+               case RAPL_DOMAIN_PLATFORM:
+                       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);
+                       break;
+               default:
+                       break;
                }
                rd++;
        }
@@ -919,6 +931,14 @@ static const struct rapl_defaults rapl_defaults_hsw_server = {
        .dram_domain_energy_unit = 15300,
 };
 
+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,
+};
+
 static const struct rapl_defaults rapl_defaults_byt = {
        .floor_freq_reg_addr = IOSF_CPU_POWER_BUDGET_CTL_BYT,
        .check_unit = rapl_check_unit_atom,
@@ -978,6 +998,7 @@ static const struct x86_cpu_id rapl_ids[] __initconst = {
        X86_MATCH_INTEL_FAM6_MODEL(COMETLAKE_L,         &rapl_defaults_core),
        X86_MATCH_INTEL_FAM6_MODEL(COMETLAKE,           &rapl_defaults_core),
        X86_MATCH_INTEL_FAM6_MODEL(TIGERLAKE_L,         &rapl_defaults_core),
+       X86_MATCH_INTEL_FAM6_MODEL(SAPPHIRERAPIDS_X,    &rapl_defaults_spr_server),
 
        X86_MATCH_INTEL_FAM6_MODEL(ATOM_SILVERMONT,     &rapl_defaults_byt),
        X86_MATCH_INTEL_FAM6_MODEL(ATOM_AIRMONT,        &rapl_defaults_cht),