tools/power/x86/intel-speed-select: Fix uncore memory frequency display
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Wed, 12 May 2021 10:17:32 +0000 (03:17 -0700)
committerHans de Goede <hdegoede@redhat.com>
Fri, 18 Jun 2021 13:29:23 +0000 (15:29 +0200)
The uncore memory frequency value from the mailbox command
CONFIG_TDP_GET_MEM_FREQ needs to be scaled based on the platform for
display. There is no single constant multiplier.

This change introduces CPU model specific memory frequency multiplier.

Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
tools/power/x86/intel-speed-select/isst-config.c
tools/power/x86/intel-speed-select/isst-core.c
tools/power/x86/intel-speed-select/isst-display.c
tools/power/x86/intel-speed-select/isst.h

index ab940c508ef0cbfd6bcbc5856f9ea627f5d898ee..d4f0a7872e49310b49c5cf1eec3b17942cb1b7fc 100644 (file)
@@ -106,6 +106,22 @@ int is_skx_based_platform(void)
        return 0;
 }
 
+int is_spr_platform(void)
+{
+       if (cpu_model == 0x8F)
+               return 1;
+
+       return 0;
+}
+
+int is_icx_platform(void)
+{
+       if (cpu_model == 0x6A || cpu_model == 0x6C)
+               return 1;
+
+       return 0;
+}
+
 static int update_cpu_model(void)
 {
        unsigned int ebx, ecx, edx;
index 6a26d5769984506f4ce4cf891a32dddf51912b65..4431c8a0d40aee8b8014f6d4f2469db1521c1f02 100644 (file)
@@ -201,6 +201,7 @@ void isst_get_uncore_mem_freq(int cpu, int config_index,
 {
        unsigned int resp;
        int ret;
+
        ret = isst_send_mbox_command(cpu, CONFIG_TDP, CONFIG_TDP_GET_MEM_FREQ,
                                     0, config_index, &resp);
        if (ret) {
@@ -209,6 +210,20 @@ void isst_get_uncore_mem_freq(int cpu, int config_index,
        }
 
        ctdp_level->mem_freq = resp & GENMASK(7, 0);
+       if (is_spr_platform()) {
+               ctdp_level->mem_freq *= 200;
+       } else if (is_icx_platform()) {
+               if (ctdp_level->mem_freq < 7) {
+                       ctdp_level->mem_freq = (12 - ctdp_level->mem_freq) * 133.33 * 2 * 10;
+                       ctdp_level->mem_freq /= 10;
+                       if (ctdp_level->mem_freq % 10 > 5)
+                               ctdp_level->mem_freq++;
+               } else {
+                       ctdp_level->mem_freq = 0;
+               }
+       } else {
+               ctdp_level->mem_freq = 0;
+       }
        debug_printf(
                "cpu:%d ctdp:%d CONFIG_TDP_GET_MEM_FREQ resp:%x uncore mem_freq:%d\n",
                cpu, config_index, resp, ctdp_level->mem_freq);
index 3bf1820c0da1184a2bcaf6df94c30c8725b6a95a..f97d8859ada728b53a12f2bc55558c648ff20dfc 100644 (file)
@@ -446,7 +446,7 @@ void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level,
                if (ctdp_level->mem_freq) {
                        snprintf(header, sizeof(header), "mem-frequency(MHz)");
                        snprintf(value, sizeof(value), "%d",
-                                ctdp_level->mem_freq * DISP_FREQ_MULTIPLIER);
+                                ctdp_level->mem_freq);
                        format_and_print(outf, level + 2, header, value);
                }
 
index 0cac6c54be8734a4ac5d271ebe9bd175b2066e94..1aa15d5ea57cefe63bcdbbd0766005769b09d4c5 100644 (file)
@@ -257,5 +257,7 @@ extern int get_cpufreq_base_freq(int cpu);
 extern int isst_read_pm_config(int cpu, int *cp_state, int *cp_cap);
 extern void isst_display_error_info_message(int error, char *msg, int arg_valid, int arg);
 extern int is_skx_based_platform(void);
+extern int is_spr_platform(void);
+extern int is_icx_platform(void);
 extern void isst_trl_display_information(int cpu, FILE *outf, unsigned long long trl);
 #endif