drm/msm: Add param for userspace to query suspend count
authorRob Clark <robdclark@chromium.org>
Thu, 25 Mar 2021 01:23:53 +0000 (18:23 -0700)
committerRob Clark <robdclark@chromium.org>
Wed, 7 Apr 2021 18:05:43 +0000 (11:05 -0700)
Performance counts, and ALWAYS_ON counters used for capturing GPU
timestamps, lose their state across suspend/resume cycles.  Userspace
tooling for performance monitoring needs to be aware of this.  For
example, after a suspend userspace needs to recalibrate it's offset
between CPU and GPU time.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Acked-by: Jordan Crouse <jordan@cosmicpenguin.net>
Link: https://lore.kernel.org/r/20210325012358.1759770-3-robdclark@gmail.com
Signed-off-by: Rob Clark <robdclark@chromium.org>
drivers/gpu/drm/msm/adreno/adreno_gpu.c
drivers/gpu/drm/msm/msm_drv.c
drivers/gpu/drm/msm/msm_gpu.c
drivers/gpu/drm/msm/msm_gpu.h
include/uapi/drm/msm_drm.h

index 0f184c3dd9d9ecb293744e6a51c4d2dd53467f22..6a35a30dd2813b3a6e6faf4acced6e2ce88e6bfb 100644 (file)
@@ -273,6 +273,9 @@ int adreno_get_param(struct msm_gpu *gpu, uint32_t param, uint64_t *value)
        case MSM_PARAM_FAULTS:
                *value = gpu->global_faults;
                return 0;
+       case MSM_PARAM_SUSPENDS:
+               *value = gpu->suspend_count;
+               return 0;
        default:
                DBG("%s: invalid param: %u", gpu->name, param);
                return -EINVAL;
index 898e6d05de9a7aa4c317f87db36a4d19dcab83ca..09a968c4d27e50be51c36de0ee34c7828f439412 100644 (file)
@@ -39,6 +39,7 @@
  *           GEM object's debug name
  * - 1.5.0 - Add SUBMITQUERY_QUERY ioctl
  * - 1.6.0 - Syncobj support
+ * - 1.7.0 - Add MSM_PARAM_SUSPENDS to access suspend count
  */
 #define MSM_VERSION_MAJOR      1
 #define MSM_VERSION_MINOR      6
index ab7c167b062362a69c93286daa8bf05b617741ee..9dd1c58430abbb334cde56fa5d26e51d97d68f65 100644 (file)
@@ -251,6 +251,8 @@ int msm_gpu_pm_suspend(struct msm_gpu *gpu)
        if (ret)
                return ret;
 
+       gpu->suspend_count++;
+
        return 0;
 }
 
index d7cd02cd2109072adc999cb3b8db3a911258177f..18baf935e143fb597f0ab204d3733831fabe0d82 100644 (file)
@@ -152,6 +152,8 @@ struct msm_gpu {
                ktime_t time;
        } devfreq;
 
+       uint32_t suspend_count;
+
        struct msm_gpu_state *crashstate;
        /* True if the hardware supports expanded apriv (a650 and newer) */
        bool hw_apriv;
index a6c1f3eb26239251dd1a0af2b32df594b0df90c4..5596d7c37f9e6457a02314b4e98b4c865e2489a2 100644 (file)
@@ -76,6 +76,7 @@ struct drm_msm_timespec {
 #define MSM_PARAM_NR_RINGS   0x07
 #define MSM_PARAM_PP_PGTABLE 0x08  /* => 1 for per-process pagetables, else 0 */
 #define MSM_PARAM_FAULTS     0x09
+#define MSM_PARAM_SUSPENDS   0x0a
 
 struct drm_msm_param {
        __u32 pipe;           /* in, MSM_PIPE_x */