Commit 3856b0f7 authored by Aravind Iddamsetty's avatar Aravind Iddamsetty Committed by Rodrigo Vivi
Browse files

drm/xe/pmu: Enable PMU interface



There are a set of engine group busyness counters provided by HW which are
perfect fit to be exposed via PMU perf events.

BSPEC: 46559, 46560, 46722, 46729, 52071, 71028

events can be listed using:
perf list
  xe_0000_03_00.0/any-engine-group-busy-gt0/         [Kernel PMU event]
  xe_0000_03_00.0/copy-group-busy-gt0/               [Kernel PMU event]
  xe_0000_03_00.0/interrupts/                        [Kernel PMU event]
  xe_0000_03_00.0/media-group-busy-gt0/              [Kernel PMU event]
  xe_0000_03_00.0/render-group-busy-gt0/             [Kernel PMU event]

and can be read using:

perf stat -e "xe_0000_8c_00.0/render-group-busy-gt0/" -I 1000
           time             counts unit events
     1.001139062                  0 ns  xe_0000_8c_00.0/render-group-busy-gt0/
     2.003294678                  0 ns  xe_0000_8c_00.0/render-group-busy-gt0/
     3.005199582                  0 ns  xe_0000_8c_00.0/render-group-busy-gt0/
     4.007076497                  0 ns  xe_0000_8c_00.0/render-group-busy-gt0/
     5.008553068                  0 ns  xe_0000_8c_00.0/render-group-busy-gt0/
     6.010531563              43520 ns  xe_0000_8c_00.0/render-group-busy-gt0/
     7.012468029              44800 ns  xe_0000_8c_00.0/render-group-busy-gt0/
     8.013463515                  0 ns  xe_0000_8c_00.0/render-group-busy-gt0/
     9.015300183                  0 ns  xe_0000_8c_00.0/render-group-busy-gt0/
    10.017233010                  0 ns  xe_0000_8c_00.0/render-group-busy-gt0/
    10.971934120                  0 ns  xe_0000_8c_00.0/render-group-busy-gt0/

The pmu base implementation is taken from i915.

v2:
Store last known value when device is awake return that while the GT is
suspended and then update the driver copy when read during awake.

v3:
1. drop init_samples, as storing counters before going to suspend should
be sufficient.
2. ported the "drm/i915/pmu: Make PMU sample array two-dimensional" and
dropped helpers to store and read samples.
3. use xe_device_mem_access_get_if_ongoing to check if device is active
before reading the OA registers.
4. dropped format attr as no longer needed
5. introduce xe_pmu_suspend to call engine_group_busyness_store
6. few other nits.

v4: minor nits.

v5: take forcewake when accessing the OAG registers

v6:
1. drop engine_busyness_sample_type
2. update UAPI documentation

v7:
1. update UAPI documentation
2. drop MEDIA_GT specific change for media busyness counter.

Co-developed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Co-developed-by: default avatarBommu Krishnaiah <krishnaiah.bommu@intel.com>
Signed-off-by: default avatarAravind Iddamsetty <aravind.iddamsetty@linux.intel.com>
Reviewed-by: default avatarAshutosh Dixit <ashutosh.dixit@intel.com>
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
parent cd853419
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -124,6 +124,8 @@ xe-y += xe_bb.o \
obj-$(CONFIG_DRM_XE) += xe.o
obj-$(CONFIG_DRM_XE_KUNIT_TEST) += tests/

xe-$(CONFIG_PERF_EVENTS) += xe_pmu.o

# header test
hdrtest_find_args := -not -path xe_rtp_helpers.h

+5 −0
Original line number Diff line number Diff line
@@ -294,6 +294,11 @@
#define   INVALIDATION_BROADCAST_MODE_DIS	REG_BIT(12)
#define   GLOBAL_INVALIDATION_MODE		REG_BIT(2)

#define XE_OAG_RC0_ANY_ENGINE_BUSY_FREE		XE_REG(0xdb80)
#define XE_OAG_ANY_MEDIA_FF_BUSY_FREE		XE_REG(0xdba0)
#define XE_OAG_BLT_BUSY_FREE			XE_REG(0xdbbc)
#define XE_OAG_RENDER_BUSY_FREE			XE_REG(0xdbdc)

#define SAMPLER_MODE				XE_REG_MCR(0xe18c, XE_REG_OPTION_MASKED)
#define   ENABLE_SMALLPL			REG_BIT(15)
#define   SC_DISABLE_POWER_OPTIMIZATION_EBB	REG_BIT(9)
+2 −0
Original line number Diff line number Diff line
@@ -304,6 +304,8 @@ int xe_device_probe(struct xe_device *xe)

	xe_debugfs_register(xe);

	xe_pmu_register(&xe->pmu);

	err = drmm_add_action_or_reset(&xe->drm, xe_device_sanitize, xe);
	if (err)
		return err;
+4 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
#include "xe_devcoredump_types.h"
#include "xe_gt_types.h"
#include "xe_platform_types.h"
#include "xe_pmu.h"
#include "xe_step_types.h"

struct xe_ggtt;
@@ -342,6 +343,9 @@ struct xe_device {
	 */
	struct task_struct *pm_callback_task;

	/** @pmu: performance monitoring unit */
	struct xe_pmu pmu;

	/* For pcode */
	struct mutex sb_lock;

+2 −0
Original line number Diff line number Diff line
@@ -652,6 +652,8 @@ int xe_gt_suspend(struct xe_gt *gt)
	if (err)
		goto err_msg;

	xe_pmu_suspend(gt);

	err = xe_uc_suspend(&gt->uc);
	if (err)
		goto err_force_wake;
Loading