From: Sk Anirban <sk.anirban@intel.com>
To: intel-xe@lists.freedesktop.org
Cc: anshuman.gupta@intel.com, badal.nilawar@intel.com,
riana.tauro@intel.com, karthik.poosa@intel.com,
raag.jadav@intel.com, soham.purkait@intel.com,
mallesh.koujalagi@intel.com, vinay.belgaumkar@intel.com,
matthew.brost@intel.com, rodrigo.vivi@intel.com,
Sk Anirban <sk.anirban@intel.com>
Subject: [PATCH] drm/xe/debugfs: Expose per-engine idle status
Date: Thu, 16 Jul 2026 20:36:43 +0530 [thread overview]
Message-ID: <20260716150642.597692-2-sk.anirban@intel.com> (raw)
Introduce a "hw_engine_msg_idle" debugfs that iterates over all
hardware engines and dumps their idle state: whether the engine
pipe is idle or busy, whether C6 entry is allowed, and (where available)
the forcewake request status.
Signed-off-by: Sk Anirban <sk.anirban@intel.com>
---
drivers/gpu/drm/xe/regs/xe_gt_regs.h | 27 +++++++++++
drivers/gpu/drm/xe/xe_gt_debugfs.c | 69 ++++++++++++++++++++++++++++
2 files changed, 96 insertions(+)
diff --git a/drivers/gpu/drm/xe/regs/xe_gt_regs.h b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
index 08251c7a1a4b..accf3012bad2 100644
--- a/drivers/gpu/drm/xe/regs/xe_gt_regs.h
+++ b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
@@ -196,6 +196,33 @@
#define MSC_MSAA_REODER_BUF_BYPASS_DISABLE REG_BIT(14)
#define FAST_CLEAR_VALIGN_FIX REG_BIT(13)
+#define MSG_IDLE_CS XE_REG(0x8000)
+#define MSG_IDLE_VCS0 XE_REG(0x8004)
+#define MSG_IDLE_VCS1 XE_REG(0x8008)
+#define MSG_IDLE_VCS2 XE_REG(0x80C0)
+#define MSG_IDLE_VCS3 XE_REG(0x80C4)
+#define MSG_IDLE_VCS4 XE_REG(0x80C8)
+#define MSG_IDLE_VCS5 XE_REG(0x80CC)
+#define MSG_IDLE_VCS6 XE_REG(0x80D0)
+#define MSG_IDLE_VCS7 XE_REG(0x80D4)
+#define MSG_IDLE_VECS0 XE_REG(0x8010)
+#define MSG_IDLE_VECS1 XE_REG(0x80D8)
+#define MSG_IDLE_VECS2 XE_REG(0x80DC)
+#define MSG_IDLE_VECS3 XE_REG(0x80E0)
+#define MSG_IDLE_BCS0 XE_REG(0x800C)
+#define MSG_IDLE_BCS1 XE_REG(0x8680)
+#define MSG_IDLE_BCS2 XE_REG(0x8684)
+#define MSG_IDLE_BCS3 XE_REG(0x8688)
+#define MSG_IDLE_BCS4 XE_REG(0x868C)
+#define MSG_IDLE_BCS5 XE_REG(0x8690)
+#define MSG_IDLE_BCS6 XE_REG(0x8694)
+#define MSG_IDLE_BCS7 XE_REG(0x8698)
+#define MSG_IDLE_BCS8 XE_REG(0x869C)
+#define MSG_IDLE_GSCCS0 XE_REG(0xA62C)
+#define MSG_IDLE_INDICATION REG_BIT(0)
+#define MSG_IDLE_C6_ALLOWED REG_BIT(1)
+#define MSG_IDLE_FW_STATUS REG_GENMASK(13, 9)
+
#define XE2LPM_CCCHKNREG1 XE_REG(0x82a8)
#define VF_PREEMPTION XE_REG(0x83a4, XE_REG_OPTION_MASKED)
diff --git a/drivers/gpu/drm/xe/xe_gt_debugfs.c b/drivers/gpu/drm/xe/xe_gt_debugfs.c
index c38bcacb27e4..a2fc2aadb866 100644
--- a/drivers/gpu/drm/xe/xe_gt_debugfs.c
+++ b/drivers/gpu/drm/xe/xe_gt_debugfs.c
@@ -10,6 +10,7 @@
#include <drm/drm_debugfs.h>
#include <drm/drm_managed.h>
+#include "regs/xe_gt_regs.h"
#include "xe_device.h"
#include "xe_force_wake.h"
#include "xe_gt.h"
@@ -22,6 +23,7 @@
#include "xe_guc_hwconfig.h"
#include "xe_hw_engine.h"
#include "xe_lrc.h"
+#include "xe_mmio.h"
#include "xe_mocs.h"
#include "xe_pat.h"
#include "xe_pm.h"
@@ -124,6 +126,72 @@ static int hw_engines(struct xe_gt *gt, struct drm_printer *p)
return 0;
}
+static int hw_engine_msg_idle(struct xe_gt *gt, struct drm_printer *p)
+{
+ static const struct {
+ struct xe_reg reg;
+ bool has_fw;
+ } msg_idle_reg[XE_NUM_HW_ENGINES] = {
+ [XE_HW_ENGINE_RCS0] = { MSG_IDLE_CS, true },
+ [XE_HW_ENGINE_BCS0] = { MSG_IDLE_BCS0, true },
+ [XE_HW_ENGINE_BCS1] = { MSG_IDLE_BCS1, false },
+ [XE_HW_ENGINE_BCS2] = { MSG_IDLE_BCS2, false },
+ [XE_HW_ENGINE_BCS3] = { MSG_IDLE_BCS3, false },
+ [XE_HW_ENGINE_BCS4] = { MSG_IDLE_BCS4, false },
+ [XE_HW_ENGINE_BCS5] = { MSG_IDLE_BCS5, false },
+ [XE_HW_ENGINE_BCS6] = { MSG_IDLE_BCS6, false },
+ [XE_HW_ENGINE_BCS7] = { MSG_IDLE_BCS7, false },
+ [XE_HW_ENGINE_BCS8] = { MSG_IDLE_BCS8, false },
+ [XE_HW_ENGINE_VCS0] = { MSG_IDLE_VCS0, true },
+ [XE_HW_ENGINE_VCS1] = { MSG_IDLE_VCS1, true },
+ [XE_HW_ENGINE_VCS2] = { MSG_IDLE_VCS2, true },
+ [XE_HW_ENGINE_VCS3] = { MSG_IDLE_VCS3, true },
+ [XE_HW_ENGINE_VCS4] = { MSG_IDLE_VCS4, true },
+ [XE_HW_ENGINE_VCS5] = { MSG_IDLE_VCS5, true },
+ [XE_HW_ENGINE_VCS6] = { MSG_IDLE_VCS6, true },
+ [XE_HW_ENGINE_VCS7] = { MSG_IDLE_VCS7, true },
+ [XE_HW_ENGINE_VECS0] = { MSG_IDLE_VECS0, true },
+ [XE_HW_ENGINE_VECS1] = { MSG_IDLE_VECS1, true },
+ [XE_HW_ENGINE_VECS2] = { MSG_IDLE_VECS2, true },
+ [XE_HW_ENGINE_VECS3] = { MSG_IDLE_VECS3, true },
+ [XE_HW_ENGINE_CCS0] = { MSG_IDLE_CS, true },
+ [XE_HW_ENGINE_CCS1] = { MSG_IDLE_CS, true },
+ [XE_HW_ENGINE_CCS2] = { MSG_IDLE_CS, true },
+ [XE_HW_ENGINE_CCS3] = { MSG_IDLE_CS, true },
+ [XE_HW_ENGINE_GSCCS0] = { MSG_IDLE_GSCCS0, false },
+ };
+ struct xe_hw_engine *hwe;
+ enum xe_hw_engine_id id;
+
+ CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FORCEWAKE_ALL);
+ if (!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FORCEWAKE_ALL)) {
+ drm_printf(p, "ERROR: Could not acquire forcewake\n");
+ return -ETIMEDOUT;
+ }
+
+ for_each_hw_engine(hwe, gt, id) {
+ struct xe_reg reg = msg_idle_reg[id].reg;
+ u32 val;
+
+ if (!reg.addr)
+ continue;
+
+ val = xe_mmio_read32(>->mmio, reg);
+
+ if (msg_idle_reg[id].has_fw)
+ drm_printf(p, "%s:\tpipe %s, C6 %s, fw_req 0x%02x\n", hwe->name,
+ val & MSG_IDLE_INDICATION ? "idle" : "busy",
+ val & MSG_IDLE_C6_ALLOWED ? "allowed" : "not allowed",
+ REG_FIELD_GET(MSG_IDLE_FW_STATUS, val));
+ else
+ drm_printf(p, "%s:\tpipe %s, C6 %s\n", hwe->name,
+ val & MSG_IDLE_INDICATION ? "idle" : "busy",
+ val & MSG_IDLE_C6_ALLOWED ? "allowed" : "not allowed");
+ }
+
+ return 0;
+}
+
static int steering(struct xe_gt *gt, struct drm_printer *p)
{
xe_gt_mcr_steering_dump(gt, p);
@@ -242,6 +310,7 @@ static const struct drm_info_list vf_safe_debugfs_list[] = {
/* everything else should be added here */
static const struct drm_info_list pf_only_debugfs_list[] = {
{ "hw_engines", .show = xe_gt_debugfs_show_with_rpm, .data = hw_engines },
+ { "hw_engine_msg_idle", .show = xe_gt_debugfs_show_with_rpm, .data = hw_engine_msg_idle },
{ "mocs", .show = xe_gt_debugfs_show_with_rpm, .data = xe_mocs_dump },
{ "pat", .show = xe_gt_debugfs_show_with_rpm, .data = xe_pat_dump },
{ "powergate_info", .show = xe_gt_debugfs_show_with_rpm, .data = xe_gt_idle_pg_print },
--
2.43.0
next reply other threads:[~2026-07-16 15:15 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-16 15:06 Sk Anirban [this message]
2026-07-16 15:21 ` ✓ CI.KUnit: success for drm/xe/debugfs: Expose per-engine idle status (rev2) Patchwork
2026-07-16 16:06 ` ✓ Xe.CI.BAT: " Patchwork
2026-07-16 18:58 ` ✗ Xe.CI.FULL: failure " Patchwork
-- strict thread matches above, loose matches on Subject: below --
2026-07-23 19:43 [PATCH] drm/xe/debugfs: Expose per-engine idle status Sk Anirban
2026-08-28 23:30 ` Belgaumkar, Vinay
2026-09-01 15:12 ` Anirban, Sk
2026-09-01 21:26 ` Belgaumkar, Vinay
2026-06-09 19:51 Sk Anirban
2026-06-17 8:29 ` Purkait, Soham
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260716150642.597692-2-sk.anirban@intel.com \
--to=sk.anirban@intel.com \
--cc=anshuman.gupta@intel.com \
--cc=badal.nilawar@intel.com \
--cc=intel-xe@lists.freedesktop.org \
--cc=karthik.poosa@intel.com \
--cc=mallesh.koujalagi@intel.com \
--cc=matthew.brost@intel.com \
--cc=raag.jadav@intel.com \
--cc=riana.tauro@intel.com \
--cc=rodrigo.vivi@intel.com \
--cc=soham.purkait@intel.com \
--cc=vinay.belgaumkar@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.