[PATCH] measure-energy

Chris Wilson chris at chris-wilson.co.uk
Tue Mar 24 19:05:22 UTC 2020


---
 drivers/gpu/drm/i915/gt/selftest_rc6.c | 31 +++++++++++++++++++++++++-
 1 file changed, 30 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..bc561b2258cb 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 0;
+
+	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 = &gt->rc6;
 	intel_wakeref_t wakeref;
-	u64 res[2];
+	u64 res[2], E[2];
 	int err = 0;
 
 	/*
@@ -53,9 +69,12 @@ int live_rc6_manual(void *arg)
 	__intel_rc6_disable(rc6);
 	msleep(1); /* wakeup is not immediate, takes about 100us on icl */
 
+	E[0] = energy_uJ(rc6);
 	res[0] = rc6_residency(rc6);
 	msleep(250);
 	res[1] = rc6_residency(rc6);
+	E[1] = energy_uJ(rc6);
+	pr_err("disabled: %lluuJ\n", E[1] - E[0]);
 	if ((res[1] - res[0]) >> 10) {
 		pr_err("RC6 residency increased by %lldus while disabled for 250ms!\n",
 		       (res[1] - res[0]) >> 10);
@@ -66,9 +85,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("idle: %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 +101,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