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>
        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;
 
  *           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
 
        if (ret)
                return ret;
 
+       gpu->suspend_count++;
+
        return 0;
 }
 
 
                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;
 
 #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 */