aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChakravarty, Souvik K <souvik.k.chakravarty@intel.com>2017-11-24 08:34:42 -0500
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>2017-11-27 06:39:11 -0500
commit0946a05fd220a24e7f3843011ef696578d02aa29 (patch)
tree9d96141b033173648ce05e8d433cc17ffcd30235
parent9c916549c0345a054431abdc4f2d9ba48e856f80 (diff)
platform/x86: intel_telemetry: Fix suspend stats
Suspend stats are not reported consistently due to a limitation in the PMC firmware. This limitation causes a delay in updating the s0ix counters and residencies in the telemetry log upon s0ix exit. As a consequence, reading these counters from the suspend-exit notifier may result in zero read. This patch fixes this issue by cross-verifying the s0ix residencies from the GCR TELEM registers in case the counters are not incremented in the telemetry log after suspend. This fixes https://bugzilla.kernel.org/show_bug.cgi?id=197833 Reported-and-tested-by: Rajneesh Bhardwaj <rajneesh.bhardwaj@intel.com> Signed-off-by: Souvik Kumar Chakravarty <souvik.k.chakravarty@intel.com> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
-rw-r--r--drivers/platform/x86/intel_telemetry_debugfs.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/platform/x86/intel_telemetry_debugfs.c b/drivers/platform/x86/intel_telemetry_debugfs.c
index 4249e8267bbc..5bc4f208cc8b 100644
--- a/drivers/platform/x86/intel_telemetry_debugfs.c
+++ b/drivers/platform/x86/intel_telemetry_debugfs.c
@@ -890,6 +890,31 @@ static int pm_suspend_exit_cb(void)
890 goto out; 890 goto out;
891 } 891 }
892 892
893 /*
894 * Due to some design limitations in the firmware, sometimes the
895 * counters do not get updated by the time we reach here. As a
896 * workaround, we try to see if this was a genuine case of sleep
897 * failure or not by cross-checking from PMC GCR registers directly.
898 */
899 if (suspend_shlw_ctr_exit == suspend_shlw_ctr_temp &&
900 suspend_deep_ctr_exit == suspend_deep_ctr_temp) {
901 ret = intel_pmc_gcr_read64(PMC_GCR_TELEM_SHLW_S0IX_REG,
902 &suspend_shlw_res_exit);
903 if (ret < 0)
904 goto out;
905
906 ret = intel_pmc_gcr_read64(PMC_GCR_TELEM_DEEP_S0IX_REG,
907 &suspend_deep_res_exit);
908 if (ret < 0)
909 goto out;
910
911 if (suspend_shlw_res_exit > suspend_shlw_res_temp)
912 suspend_shlw_ctr_exit++;
913
914 if (suspend_deep_res_exit > suspend_deep_res_temp)
915 suspend_deep_ctr_exit++;
916 }
917
893 suspend_shlw_ctr_exit -= suspend_shlw_ctr_temp; 918 suspend_shlw_ctr_exit -= suspend_shlw_ctr_temp;
894 suspend_deep_ctr_exit -= suspend_deep_ctr_temp; 919 suspend_deep_ctr_exit -= suspend_deep_ctr_temp;
895 suspend_shlw_res_exit -= suspend_shlw_res_temp; 920 suspend_shlw_res_exit -= suspend_shlw_res_temp;