]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915/selftests: Only query RAPL for integrated power measurements
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 12 Apr 2021 09:05:09 +0000 (10:05 +0100)
committerMatthew Auld <matthew.auld@intel.com>
Tue, 20 Apr 2021 09:49:05 +0000 (10:49 +0100)
RAPL provides an on-package power measurements which does not encompass
discrete graphics, so let's avoid using the igfx masurements when testing
dgfx. Later we will abstract the simple librapl interface over hwmon so
that we can verify basic power consumption scenarios.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210412090526.30547-3-matthew.auld@intel.com
drivers/gpu/drm/i915/gt/selftest_rc6.c
drivers/gpu/drm/i915/gt/selftest_rps.c
drivers/gpu/drm/i915/selftests/librapl.c
drivers/gpu/drm/i915/selftests/librapl.h

index f097e420ac458c571e063f36dfa1e2ff32217bb7..710f825f6e5acc233636d6e5dffe984258878361 100644 (file)
@@ -34,6 +34,7 @@ int live_rc6_manual(void *arg)
        struct intel_rc6 *rc6 = &gt->rc6;
        u64 rc0_power, rc6_power;
        intel_wakeref_t wakeref;
+       bool has_power;
        ktime_t dt;
        u64 res[2];
        int err = 0;
@@ -50,6 +51,7 @@ int live_rc6_manual(void *arg)
        if (IS_VALLEYVIEW(gt->i915) || IS_CHERRYVIEW(gt->i915))
                return 0;
 
+       has_power = librapl_supported(gt->i915);
        wakeref = intel_runtime_pm_get(gt->uncore->rpm);
 
        /* Force RC6 off for starters */
@@ -71,11 +73,14 @@ int live_rc6_manual(void *arg)
                goto out_unlock;
        }
 
-       rc0_power = div64_u64(NSEC_PER_SEC * rc0_power, ktime_to_ns(dt));
-       if (!rc0_power) {
-               pr_err("No power measured while in RC0\n");
-               err = -EINVAL;
-               goto out_unlock;
+       if (has_power) {
+               rc0_power = div64_u64(NSEC_PER_SEC * rc0_power,
+                                     ktime_to_ns(dt));
+               if (!rc0_power) {
+                       pr_err("No power measured while in RC0\n");
+                       err = -EINVAL;
+                       goto out_unlock;
+               }
        }
 
        /* Manually enter RC6 */
@@ -97,13 +102,16 @@ int live_rc6_manual(void *arg)
                err = -EINVAL;
        }
 
-       rc6_power = div64_u64(NSEC_PER_SEC * rc6_power, ktime_to_ns(dt));
-       pr_info("GPU consumed %llduW in RC0 and %llduW in RC6\n",
-               rc0_power, rc6_power);
-       if (2 * rc6_power > rc0_power) {
-               pr_err("GPU leaked energy while in RC6!\n");
-               err = -EINVAL;
-               goto out_unlock;
+       if (has_power) {
+               rc6_power = div64_u64(NSEC_PER_SEC * rc6_power,
+                                     ktime_to_ns(dt));
+               pr_info("GPU consumed %llduW in RC0 and %llduW in RC6\n",
+                       rc0_power, rc6_power);
+               if (2 * rc6_power > rc0_power) {
+                       pr_err("GPU leaked energy while in RC6!\n");
+                       err = -EINVAL;
+                       goto out_unlock;
+               }
        }
 
        /* Restore what should have been the original state! */
index 967641fee42a9305802f4c8e6ef82c7108b11dcf..adf7fdbc00f75bda83c8c3fa1a0cffc4700c08d1 100644 (file)
@@ -1139,7 +1139,7 @@ int live_rps_power(void *arg)
        if (!intel_rps_is_enabled(rps) || INTEL_GEN(gt->i915) < 6)
                return 0;
 
-       if (!librapl_energy_uJ())
+       if (!librapl_supported(gt->i915))
                return 0;
 
        if (igt_spinner_init(&spin, gt))
index 58710ac3f9799b519d8ee16adce7a5ca15375d7e..eb03b5b28badc13d9b576167a0cd0adf007b0f62 100644 (file)
@@ -5,8 +5,18 @@
 
 #include <asm/msr.h>
 
+#include "i915_drv.h"
 #include "librapl.h"
 
+bool librapl_supported(const struct drm_i915_private *i915)
+{
+       /* Discrete cards require hwmon integration */
+       if (IS_DGFX(i915))
+               return false;
+
+       return librapl_energy_uJ();
+}
+
 u64 librapl_energy_uJ(void)
 {
        unsigned long long power;
index 887f3e91dd055d5f4cdeb91c0e605a906813e66f..e3b24fad0a7aa7ef6f50128ceebecfb4dffe463e 100644 (file)
@@ -8,6 +8,10 @@
 
 #include <linux/types.h>
 
+struct drm_i915_private;
+
+bool librapl_supported(const struct drm_i915_private *i915);
+
 u64 librapl_energy_uJ(void);
 
 #endif /* SELFTEST_LIBRAPL_H */