drm/i915/selftests: Only query RAPL for integrated power measurements
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
This commit is contained in:
parent
f44b733e86
commit
a36a47490d
@ -34,6 +34,7 @@ int live_rc6_manual(void *arg)
|
||||
struct intel_rc6 *rc6 = >->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! */
|
||||
|
@ -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))
|
||||
|
@ -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;
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user