drm/i915/pmu: Add RC6 residency metrics
authorTvrtko Ursulin <tvrtko.ursulin@intel.com>
Tue, 21 Nov 2017 18:18:52 +0000 (18:18 +0000)
committerTvrtko Ursulin <tvrtko.ursulin@intel.com>
Wed, 22 Nov 2017 11:25:06 +0000 (11:25 +0000)
For clients like intel-gpu-overlay it is easier to read the
counters via the perf API than having to parse sysfs.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20171121181852.16128-9-tvrtko.ursulin@linux.intel.com
drivers/gpu/drm/i915/i915_pmu.c
include/uapi/drm/i915_drm.h

index fef389ebf92ca56b45da36bbd623f3df5eaf2129..1071935bfa67cf10c521da662084dd1fe2de9f2b 100644 (file)
@@ -361,6 +361,15 @@ static int i915_pmu_event_init(struct perf_event *event)
                        break;
                case I915_PMU_INTERRUPTS:
                        break;
+               case I915_PMU_RC6_RESIDENCY:
+                       if (!HAS_RC6(i915))
+                               ret = -ENODEV;
+                       break;
+               case I915_PMU_RC6p_RESIDENCY:
+               case I915_PMU_RC6pp_RESIDENCY:
+                       if (!HAS_RC6p(i915))
+                               ret = -ENODEV;
+                       break;
                default:
                        ret = -ENOENT;
                        break;
@@ -413,6 +422,24 @@ static u64 __i915_pmu_event_read(struct perf_event *event)
                case I915_PMU_INTERRUPTS:
                        val = count_interrupts(i915);
                        break;
+               case I915_PMU_RC6_RESIDENCY:
+                       intel_runtime_pm_get(i915);
+                       val = intel_rc6_residency_ns(i915,
+                                                    IS_VALLEYVIEW(i915) ?
+                                                    VLV_GT_RENDER_RC6 :
+                                                    GEN6_GT_GFX_RC6);
+                       intel_runtime_pm_put(i915);
+                       break;
+               case I915_PMU_RC6p_RESIDENCY:
+                       intel_runtime_pm_get(i915);
+                       val = intel_rc6_residency_ns(i915, GEN6_GT_GFX_RC6p);
+                       intel_runtime_pm_put(i915);
+                       break;
+               case I915_PMU_RC6pp_RESIDENCY:
+                       intel_runtime_pm_get(i915);
+                       val = intel_rc6_residency_ns(i915, GEN6_GT_GFX_RC6pp);
+                       intel_runtime_pm_put(i915);
+                       break;
                }
        }
 
@@ -677,6 +704,10 @@ static struct attribute *i915_pmu_events_attrs[] = {
 
        I915_EVENT_ATTR(interrupts, I915_PMU_INTERRUPTS),
 
+       I915_EVENT(rc6-residency,   I915_PMU_RC6_RESIDENCY,   "ns"),
+       I915_EVENT(rc6p-residency,  I915_PMU_RC6p_RESIDENCY,  "ns"),
+       I915_EVENT(rc6pp-residency, I915_PMU_RC6pp_RESIDENCY, "ns"),
+
        NULL,
 };
 
index d840ff0835205105e223c41b88813670492b7d33..915a6e85a855017e51dc90464179adfda54888ad 100644 (file)
@@ -141,7 +141,11 @@ enum drm_i915_pmu_engine_sample {
 
 #define I915_PMU_INTERRUPTS            __I915_PMU_OTHER(2)
 
-#define I915_PMU_LAST I915_PMU_INTERRUPTS
+#define I915_PMU_RC6_RESIDENCY         __I915_PMU_OTHER(3)
+#define I915_PMU_RC6p_RESIDENCY                __I915_PMU_OTHER(4)
+#define I915_PMU_RC6pp_RESIDENCY       __I915_PMU_OTHER(5)
+
+#define I915_PMU_LAST I915_PMU_RC6pp_RESIDENCY
 
 /* Each region is a minimum of 16k, and there are at most 255 of them.
  */