[PATCH] measure-energy
Chris Wilson
chris at chris-wilson.co.uk
Tue Mar 24 18:59:08 UTC 2020
---
drivers/gpu/drm/i915/gt/selftest_rc6.c | 28 +++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/gt/selftest_rc6.c b/drivers/gpu/drm/i915/gt/selftest_rc6.c
index 95b165faeba7..f563e1ab0fbe 100644
--- a/drivers/gpu/drm/i915/gt/selftest_rc6.c
+++ b/drivers/gpu/drm/i915/gt/selftest_rc6.c
@@ -12,6 +12,22 @@
#include "selftests/i915_random.h"
+#define MCH_SECP_NRG_STTS _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x592c)
+
+static u64 energy_uJ(struct intel_rc6 *rc6)
+{
+ unsigned long long power;
+ u32 units;
+
+ if (rdmsrl_safe(MSR_RAPL_POWER_UNIT, &power))
+ return -ENODEV;
+
+ units = (power & 0x1f00) >> 8;
+ power = intel_uncore_read_fw(rc6_to_uncore(rc6), MCH_SECP_NRG_STTS);
+
+ return (1000000 * power) >> units; /* convert to uJ */
+}
+
static u64 rc6_residency(struct intel_rc6 *rc6)
{
u64 result;
@@ -32,7 +48,7 @@ int live_rc6_manual(void *arg)
struct intel_gt *gt = arg;
struct intel_rc6 *rc6 = >->rc6;
intel_wakeref_t wakeref;
- u64 res[2];
+ u64 res[2], E[2];
int err = 0;
/*
@@ -66,9 +82,13 @@ int live_rc6_manual(void *arg)
/* Manually enter RC6 */
intel_rc6_park(rc6);
+ E[0] = energy_uJ(rc6);
res[0] = rc6_residency(rc6);
msleep(100);
res[1] = rc6_residency(rc6);
+ E[1] = energy_uJ(rc6);
+
+ pr_err("%lluuJ\n", E[1] - E[0]);
if (res[1] == res[0]) {
pr_err("Did not enter RC6! RC6_STATE=%08x, RC6_CONTROL=%08x, residency=%lld\n",
@@ -78,6 +98,12 @@ int live_rc6_manual(void *arg)
err = -EINVAL;
}
+ if ((E[1] - E[0]) >> 10) {
+ pr_err("GPU consumed %llduJ while in RC6!\n", E[1] - E[0]);
+ err = -EINVAL;
+ goto out_unlock;
+ }
+
/* Restore what should have been the original state! */
intel_rc6_unpark(rc6);
--
2.20.1
More information about the Intel-gfx-trybot
mailing list