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 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.