[PATCH 5/8] drm/xe: Add basic GPU frequency tracer implementation

S Sebinraj s.sebinraj at intel.com
Tue Aug 19 06:34:14 UTC 2025


Add the foundation for GPU frequency tracing with:

- Data structures for per-GT and per-device tracking
- Parameter validation for monitoring intervals
- Basic initialization function for device setup
- Memory allocation using DRM managed resources

This commit provides the core infrastructure without the actual
monitoring logic, establishing the foundation for subsequent
functionality.

Signed-off-by: S Sebinraj <s.sebinraj at intel.com>
---
 drivers/gpu/drm/xe/xe_gpufreqtracer.c | 112 ++++++++++++++++++++++++++
 1 file changed, 112 insertions(+)
 create mode 100644 drivers/gpu/drm/xe/xe_gpufreqtracer.c

diff --git a/drivers/gpu/drm/xe/xe_gpufreqtracer.c b/drivers/gpu/drm/xe/xe_gpufreqtracer.c
new file mode 100644
index 000000000000..3e4c1375aebd
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_gpufreqtracer.c
@@ -0,0 +1,112 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+
+#include "xe_gpufreqtracer.h"
+
+#include <linux/workqueue.h>
+#include <linux/slab.h>
+#include <linux/jiffies.h>
+#include <linux/kernel.h>
+#include <linux/moduleparam.h>
+#include <linux/types.h>
+#include <linux/container_of.h>
+#include <linux/gfp.h>
+#include <linux/atomic.h>
+#include <drm/drm_managed.h>
+#include <drm/drm_drv.h>
+
+#include "xe_device.h"
+#include "xe_gt.h"
+#include "xe_gt_types.h"
+#include "xe_guc_pc.h"
+#include "xe_module.h"
+#include "xe_force_wake.h"
+#include "xe_pm.h"
+
+/* GPU frequency monitoring interval constants (in milliseconds) */
+#define XE_GPUFREQ_MONITORING_MIN_INTERVAL_MS	100
+#define XE_GPUFREQ_MONITORING_MAX_INTERVAL_MS	10000
+#define XE_GPUFREQ_MONITORING_DEFAULT_INTERVAL_MS	5000
+
+#define CREATE_TRACE_POINTS
+#include "xe_gpufreqtracer_trace.h"
+
+/**
+ * struct xe_gpufreqtracer_gt_data - Per-GT frequency monitoring data
+ * @gt: Reference to the GT
+ * @delayed_work: Delayed work for periodic monitoring
+ * @last_frequency: Last reported frequency to avoid duplicate reports
+ * @monitoring_active: Whether monitoring is currently active
+ */
+struct xe_gpufreqtracer_gt_data {
+	struct xe_gt *gt;
+	struct delayed_work delayed_work;
+	u32 last_frequency;
+	atomic_t monitoring_active;
+};
+
+/**
+ * struct xe_gpufreqtracer_data - Per-device frequency tracer data
+ * @xe: Reference to the XE device
+ * @gt_data: Array of per-GT monitoring data
+ */
+struct xe_gpufreqtracer_data {
+	struct xe_device *xe;
+	struct xe_gpufreqtracer_gt_data *gt_data;
+};
+
+
+/**
+ * xe_gpufreqtracer_validate_params - Validate GPU frequency monitoring parameters
+ *
+ * Validates and corrects the GPU frequency monitoring interval parameter.
+ * If the parameter is out of range, it will be reset to the default value.
+ */
+static void xe_gpufreqtracer_validate_params(void)
+{
+	if (xe_modparam.gpufreq_monitoring_interval_ms < XE_GPUFREQ_MONITORING_MIN_INTERVAL_MS ||
+	    xe_modparam.gpufreq_monitoring_interval_ms > XE_GPUFREQ_MONITORING_MAX_INTERVAL_MS) {
+		pr_warn("xe: gpufreq_monitoring_interval_ms %u out of range [%u, %u], using default %u ms\n",
+			xe_modparam.gpufreq_monitoring_interval_ms,
+			XE_GPUFREQ_MONITORING_MIN_INTERVAL_MS,
+			XE_GPUFREQ_MONITORING_MAX_INTERVAL_MS,
+			XE_GPUFREQ_MONITORING_DEFAULT_INTERVAL_MS);
+		xe_modparam.gpufreq_monitoring_interval_ms =
+			XE_GPUFREQ_MONITORING_DEFAULT_INTERVAL_MS;
+	}
+}
+
+/**
+ * xe_gpufreqtracer_init - Initialize GPU frequency tracer for a device
+ * @xe: The XE device
+ *
+ * Sets up the frequency tracer infrastructure for all GTs in the device.
+ *
+ * Return: 0 on success, negative error code on failure
+ */
+int xe_gpufreqtracer_init(struct xe_device *xe)
+{
+	struct xe_gpufreqtracer_data *tracer_data;
+
+	/* Validate module parameters first */
+	xe_gpufreqtracer_validate_params();
+
+	tracer_data = drmm_kzalloc(&xe->drm, sizeof(*tracer_data), GFP_KERNEL);
+	if (!tracer_data)
+		return -ENOMEM;
+
+	tracer_data->xe = xe;
+
+	/* Allocate GT data array based on actual GT count */
+	tracer_data->gt_data = drmm_kcalloc(&xe->drm, xe->info.gt_count,
+				       sizeof(*tracer_data->gt_data),
+				       GFP_KERNEL);
+	if (!tracer_data->gt_data)
+		return -ENOMEM;
+
+	xe->gpufreqtracer_data = tracer_data;
+
+	return 0;
+}
-- 
2.34.1



More information about the Intel-xe mailing list