]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915/selftests: Show the full scaling curve on failure
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 21 Apr 2020 12:46:36 +0000 (13:46 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 21 Apr 2020 15:24:34 +0000 (16:24 +0100)
If we detect that the RPS end points do not scale perfectly, take the
time to measure all the in between values as well. We are aborting the
test, so we might as well spend the available time gathering critical
debug information instead.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200421124636.22554-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/selftest_rps.c

index e0a791eac75230a5ebac2ef59a76132df90526ec..395265121e43a94c7cf6fb29a7f947b3eafdb2dd 100644 (file)
@@ -484,11 +484,31 @@ int live_rps_frequency_cs(void *arg)
                if (!scaled_within(max.freq * min.count,
                                   min.freq * max.count,
                                   2, 3)) {
+                       int f;
+
                        pr_err("%s: CS did not scale with frequency! scaled min:%llu, max:%llu\n",
                               engine->name,
                               max.freq * min.count,
                               min.freq * max.count);
                        show_pcu_config(rps);
+
+                       for (f = min.freq + 1; f <= rps->max_freq; f++) {
+                               int act = f;
+                               u64 count;
+
+                               count = measure_cs_frequency_at(rps, engine, &act);
+                               if (act < f)
+                                       break;
+
+                               pr_info("%s: %x:%uMHz: %lluKHz [%d%%]\n",
+                                       engine->name,
+                                       act, intel_gpu_freq(rps, act), count,
+                                       (int)DIV64_U64_ROUND_CLOSEST(100 * min.freq * count,
+                                                                    act * min.count));
+
+                               f = act; /* may skip ahead [pcu granularity] */
+                       }
+
                        err = -EINVAL;
                }
 
@@ -593,11 +613,31 @@ int live_rps_frequency_srm(void *arg)
                if (!scaled_within(max.freq * min.count,
                                   min.freq * max.count,
                                   1, 2)) {
+                       int f;
+
                        pr_err("%s: CS did not scale with frequency! scaled min:%llu, max:%llu\n",
                               engine->name,
                               max.freq * min.count,
                               min.freq * max.count);
                        show_pcu_config(rps);
+
+                       for (f = min.freq + 1; f <= rps->max_freq; f++) {
+                               int act = f;
+                               u64 count;
+
+                               count = measure_frequency_at(rps, cntr, &act);
+                               if (act < f)
+                                       break;
+
+                               pr_info("%s: %x:%uMHz: %lluKHz [%d%%]\n",
+                                       engine->name,
+                                       act, intel_gpu_freq(rps, act), count,
+                                       (int)DIV64_U64_ROUND_CLOSEST(100 * min.freq * count,
+                                                                    act * min.count));
+
+                               f = act; /* may skip ahead [pcu granularity] */
+                       }
+
                        err = -EINVAL;
                }