From: Xin Wang <x.wang@intel.com>
To: intel-xe@lists.freedesktop.org
Cc: shuicheng.lin@intel.com, alex.zuo@intel.com,
Xin Wang <x.wang@intel.com>,
Matt Roper <matthew.d.roper@intel.com>
Subject: [PATCH v6 1/2] drm/xe: Refactor PAT dump to use shared helpers
Date: Fri, 5 Dec 2025 07:02:19 +0000 [thread overview]
Message-ID: <20251205070220.27859-1-x.wang@intel.com> (raw)
In-Reply-To: <20251203225355.24972-1-x.wang@intel.com>
Move the PAT entry formatting into shared helper functions to ensure
consistency and enable code reuse.
This preparation is necessary for a follow-up patch that introduces a
software-based PAT dump, which is required for debugging on VFs where
hardware access is limited.
V2: (Matt)
- Xe3p XPC doesn’t define COMP_EN; omit it to match bspec and avoid
confusion.
Suggested-by: Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: Xin Wang <x.wang@intel.com>
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
---
drivers/gpu/drm/xe/xe_pat.c | 108 +++++++++++++++++++++---------------
1 file changed, 64 insertions(+), 44 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_pat.c b/drivers/gpu/drm/xe/xe_pat.c
index 717425dd0475..beff250c7fa0 100644
--- a/drivers/gpu/drm/xe/xe_pat.c
+++ b/drivers/gpu/drm/xe/xe_pat.c
@@ -50,8 +50,37 @@
#define XELP_PAT_WC REG_FIELD_PREP(XELP_MEM_TYPE_MASK, 1)
#define XELP_PAT_UC REG_FIELD_PREP(XELP_MEM_TYPE_MASK, 0)
+#define PAT_LABEL_LEN 20
+
static const char *XELP_MEM_TYPE_STR_MAP[] = { "UC", "WC", "WT", "WB" };
+static void xe_pat_index_label(char *label, size_t len, int index)
+{
+ snprintf(label, len, "PAT[%2d] ", index);
+}
+
+static void xelp_pat_entry_dump(struct drm_printer *p, int index, u32 pat)
+{
+ u8 mem_type = REG_FIELD_GET(XELP_MEM_TYPE_MASK, pat);
+
+ drm_printf(p, "PAT[%2d] = %s (%#8x)\n", index,
+ XELP_MEM_TYPE_STR_MAP[mem_type], pat);
+}
+
+static void xehpc_pat_entry_dump(struct drm_printer *p, int index, u32 pat)
+{
+ drm_printf(p, "PAT[%2d] = [ %u, %u ] (%#8x)\n", index,
+ REG_FIELD_GET(XELP_MEM_TYPE_MASK, pat),
+ REG_FIELD_GET(XEHPC_CLOS_LEVEL_MASK, pat), pat);
+}
+
+static void xelpg_pat_entry_dump(struct drm_printer *p, int index, u32 pat)
+{
+ drm_printf(p, "PAT[%2d] = [ %u, %u ] (%#8x)\n", index,
+ REG_FIELD_GET(XELPG_L4_POLICY_MASK, pat),
+ REG_FIELD_GET(XELPG_INDEX_COH_MODE_MASK, pat), pat);
+}
+
struct xe_pat_ops {
void (*program_graphics)(struct xe_gt *gt, const struct xe_pat_table_entry table[],
int n_entries);
@@ -249,10 +278,8 @@ static int xelp_dump(struct xe_gt *gt, struct drm_printer *p)
for (i = 0; i < xe->pat.n_entries; i++) {
u32 pat = xe_mmio_read32(>->mmio, XE_REG(_PAT_INDEX(i)));
- u8 mem_type = REG_FIELD_GET(XELP_MEM_TYPE_MASK, pat);
- drm_printf(p, "PAT[%2d] = %s (%#8x)\n", i,
- XELP_MEM_TYPE_STR_MAP[mem_type], pat);
+ xelp_pat_entry_dump(p, i, pat);
}
return 0;
@@ -276,12 +303,8 @@ static int xehp_dump(struct xe_gt *gt, struct drm_printer *p)
for (i = 0; i < xe->pat.n_entries; i++) {
u32 pat = xe_gt_mcr_unicast_read_any(gt, XE_REG_MCR(_PAT_INDEX(i)));
- u8 mem_type;
- mem_type = REG_FIELD_GET(XELP_MEM_TYPE_MASK, pat);
-
- drm_printf(p, "PAT[%2d] = %s (%#8x)\n", i,
- XELP_MEM_TYPE_STR_MAP[mem_type], pat);
+ xelp_pat_entry_dump(p, i, pat);
}
return 0;
@@ -306,9 +329,7 @@ static int xehpc_dump(struct xe_gt *gt, struct drm_printer *p)
for (i = 0; i < xe->pat.n_entries; i++) {
u32 pat = xe_gt_mcr_unicast_read_any(gt, XE_REG_MCR(_PAT_INDEX(i)));
- drm_printf(p, "PAT[%2d] = [ %u, %u ] (%#8x)\n", i,
- REG_FIELD_GET(XELP_MEM_TYPE_MASK, pat),
- REG_FIELD_GET(XEHPC_CLOS_LEVEL_MASK, pat), pat);
+ xehpc_pat_entry_dump(p, i, pat);
}
return 0;
@@ -338,9 +359,7 @@ static int xelpg_dump(struct xe_gt *gt, struct drm_printer *p)
else
pat = xe_gt_mcr_unicast_read_any(gt, XE_REG_MCR(_PAT_INDEX(i)));
- drm_printf(p, "PAT[%2d] = [ %u, %u ] (%#8x)\n", i,
- REG_FIELD_GET(XELPG_L4_POLICY_MASK, pat),
- REG_FIELD_GET(XELPG_INDEX_COH_MODE_MASK, pat), pat);
+ xelpg_pat_entry_dump(p, i, pat);
}
return 0;
@@ -356,11 +375,35 @@ static const struct xe_pat_ops xelpg_pat_ops = {
.dump = xelpg_dump,
};
+static void xe2_pat_entry_dump(struct drm_printer *p, const char *label, u32 pat, bool rsvd)
+{
+ drm_printf(p, "%s= [ %u, %u, %u, %u, %u, %u ] (%#8x)%s\n", label,
+ !!(pat & XE2_NO_PROMOTE),
+ !!(pat & XE2_COMP_EN),
+ REG_FIELD_GET(XE2_L3_CLOS, pat),
+ REG_FIELD_GET(XE2_L3_POLICY, pat),
+ REG_FIELD_GET(XE2_L4_POLICY, pat),
+ REG_FIELD_GET(XE2_COH_MODE, pat),
+ pat, rsvd ? " *" : "");
+}
+
+static void xe3p_xpc_pat_entry_dump(struct drm_printer *p, const char *label, u32 pat, bool rsvd)
+{
+ drm_printf(p, "%s= [ %u, %u, %u, %u, %u ] (%#8x)%s\n", label,
+ !!(pat & XE2_NO_PROMOTE),
+ REG_FIELD_GET(XE2_L3_CLOS, pat),
+ REG_FIELD_GET(XE2_L3_POLICY, pat),
+ REG_FIELD_GET(XE2_L4_POLICY, pat),
+ REG_FIELD_GET(XE2_COH_MODE, pat),
+ pat, rsvd ? " *" : "");
+}
+
static int xe2_dump(struct xe_gt *gt, struct drm_printer *p)
{
struct xe_device *xe = gt_to_xe(gt);
u32 pat;
int i;
+ char label[PAT_LABEL_LEN];
CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
if (!fw_ref.domains)
@@ -374,14 +417,8 @@ static int xe2_dump(struct xe_gt *gt, struct drm_printer *p)
else
pat = xe_gt_mcr_unicast_read_any(gt, XE_REG_MCR(_PAT_INDEX(i)));
- drm_printf(p, "PAT[%2d] = [ %u, %u, %u, %u, %u, %u ] (%#8x)%s\n", i,
- !!(pat & XE2_NO_PROMOTE),
- !!(pat & XE2_COMP_EN),
- REG_FIELD_GET(XE2_L3_CLOS, pat),
- REG_FIELD_GET(XE2_L3_POLICY, pat),
- REG_FIELD_GET(XE2_L4_POLICY, pat),
- REG_FIELD_GET(XE2_COH_MODE, pat),
- pat, xe->pat.table[i].valid ? "" : " *");
+ xe_pat_index_label(label, sizeof(label), i);
+ xe2_pat_entry_dump(p, label, pat, !xe->pat.table[i].valid);
}
/*
@@ -394,14 +431,7 @@ static int xe2_dump(struct xe_gt *gt, struct drm_printer *p)
pat = xe_gt_mcr_unicast_read_any(gt, XE_REG_MCR(_PAT_PTA));
drm_printf(p, "Page Table Access:\n");
- drm_printf(p, "PTA_MODE= [ %u, %u, %u, %u, %u, %u ] (%#8x)\n",
- !!(pat & XE2_NO_PROMOTE),
- !!(pat & XE2_COMP_EN),
- REG_FIELD_GET(XE2_L3_CLOS, pat),
- REG_FIELD_GET(XE2_L3_POLICY, pat),
- REG_FIELD_GET(XE2_L4_POLICY, pat),
- REG_FIELD_GET(XE2_COH_MODE, pat),
- pat);
+ xe2_pat_entry_dump(p, "PTA_MODE", pat, false);
return 0;
}
@@ -417,6 +447,7 @@ static int xe3p_xpc_dump(struct xe_gt *gt, struct drm_printer *p)
struct xe_device *xe = gt_to_xe(gt);
u32 pat;
int i;
+ char label[PAT_LABEL_LEN];
CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
if (!fw_ref.domains)
@@ -427,13 +458,8 @@ static int xe3p_xpc_dump(struct xe_gt *gt, struct drm_printer *p)
for (i = 0; i < xe->pat.n_entries; i++) {
pat = xe_gt_mcr_unicast_read_any(gt, XE_REG_MCR(_PAT_INDEX(i)));
- drm_printf(p, "PAT[%2d] = [ %u, %u, %u, %u, %u ] (%#8x)%s\n", i,
- !!(pat & XE2_NO_PROMOTE),
- REG_FIELD_GET(XE2_L3_CLOS, pat),
- REG_FIELD_GET(XE2_L3_POLICY, pat),
- REG_FIELD_GET(XE2_L4_POLICY, pat),
- REG_FIELD_GET(XE2_COH_MODE, pat),
- pat, xe->pat.table[i].valid ? "" : " *");
+ xe_pat_index_label(label, sizeof(label), i);
+ xe3p_xpc_pat_entry_dump(p, label, pat, !xe->pat.table[i].valid);
}
/*
@@ -443,13 +469,7 @@ static int xe3p_xpc_dump(struct xe_gt *gt, struct drm_printer *p)
pat = xe_gt_mcr_unicast_read_any(gt, XE_REG_MCR(_PAT_PTA));
drm_printf(p, "Page Table Access:\n");
- drm_printf(p, "PTA_MODE= [ %u, %u, %u, %u, %u ] (%#8x)\n",
- !!(pat & XE2_NO_PROMOTE),
- REG_FIELD_GET(XE2_L3_CLOS, pat),
- REG_FIELD_GET(XE2_L3_POLICY, pat),
- REG_FIELD_GET(XE2_L4_POLICY, pat),
- REG_FIELD_GET(XE2_COH_MODE, pat),
- pat);
+ xe3p_xpc_pat_entry_dump(p, "PTA_MODE", pat, false);
return 0;
}
--
2.43.0
next prev parent reply other threads:[~2025-12-05 7:02 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-17 23:01 [PATCH v4] drm/xe: expose PAT software table via debugfs Xin Wang
2025-11-17 23:09 ` ✓ CI.KUnit: success for drm/xe: expose PAT software table via debugfs (rev4) Patchwork
2025-11-17 23:47 ` ✓ Xe.CI.BAT: " Patchwork
2025-11-18 1:15 ` ✓ Xe.CI.Full: " Patchwork
2025-12-03 0:05 ` [PATCH v4] drm/xe: expose PAT software table via debugfs Matt Roper
2025-12-03 0:13 ` Wang, X
2025-12-03 22:53 ` [PATCH v5 1/2] drm/xe: Refactor PAT dump to use shared helpers Xin Wang
2025-12-03 22:53 ` [PATCH v5 2/2] drm/xe: expose PAT software config to debugfs Xin Wang
2025-12-03 23:11 ` Matt Roper
2025-12-04 4:30 ` Wang, X
2025-12-04 18:22 ` Matt Roper
2025-12-04 19:02 ` Wang, X
2025-12-05 7:06 ` [PATCH v6 " Xin Wang
2025-12-03 23:02 ` [PATCH v5 1/2] drm/xe: Refactor PAT dump to use shared helpers Matt Roper
2025-12-05 7:02 ` Xin Wang [this message]
2025-12-05 7:02 ` [PATCH v6 2/2] drm/xe: expose PAT software config to debugfs Xin Wang
2025-12-05 16:09 ` Matt Roper
2025-12-03 23:01 ` ✓ CI.KUnit: success for drm/xe: expose PAT software table via debugfs (rev5) Patchwork
2025-12-04 0:17 ` ✓ Xe.CI.BAT: " Patchwork
2025-12-04 0:53 ` ✗ Xe.CI.Full: failure " Patchwork
2025-12-05 7:10 ` ✓ CI.KUnit: success for drm/xe: expose PAT software table via debugfs (rev7) Patchwork
2025-12-05 8:27 ` ✓ Xe.CI.BAT: " Patchwork
2025-12-05 8:33 ` ✓ CI.KUnit: success for drm/xe: expose PAT software table via debugfs (rev8) Patchwork
2025-12-05 9:25 ` ✓ Xe.CI.Full: success for drm/xe: expose PAT software table via debugfs (rev7) Patchwork
2025-12-05 9:35 ` ✓ Xe.CI.BAT: success for drm/xe: expose PAT software table via debugfs (rev8) Patchwork
2025-12-05 10:36 ` ✓ Xe.CI.Full: " Patchwork
2025-12-05 16:18 ` Matt Roper
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=20251205070220.27859-1-x.wang@intel.com \
--to=x.wang@intel.com \
--cc=alex.zuo@intel.com \
--cc=intel-xe@lists.freedesktop.org \
--cc=matthew.d.roper@intel.com \
--cc=shuicheng.lin@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox