igt-dev.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] tests/intel/xe_pat: add helper funtion to read PAT table
@ 2025-11-13  7:05 Xin Wang
  2025-11-13  7:57 ` ✗ Xe.CI.BAT: failure for " Patchwork
                   ` (13 more replies)
  0 siblings, 14 replies; 29+ messages in thread
From: Xin Wang @ 2025-11-13  7:05 UTC (permalink / raw)
  To: igt-dev; +Cc: Xin Wang, Matthew Auld

Added a helper function to read and parse PAT entries from the
debugfs file, including decoding of PAT fields and reserved entry
info.

Updates the pat_index_all test to utilize the parsed PAT table for
more accurate detection of hardware-reserved PAT indices on Gen20+
devices, and prints detailed PAT entry information for debugging.

CC: Matthew Auld <matthew.auld@intel.com>
Signed-off-by: Xin Wang <x.wang@intel.com>
---
 tests/intel/xe_pat.c | 118 ++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 116 insertions(+), 2 deletions(-)

diff --git a/tests/intel/xe_pat.c b/tests/intel/xe_pat.c
index 59dfb6b11..36d429c97 100644
--- a/tests/intel/xe_pat.c
+++ b/tests/intel/xe_pat.c
@@ -77,6 +77,96 @@ static void userptr_coh_none(int fd)
 	xe_vm_destroy(fd, vm);
 }
 
+#define BITS_TO(n)		(n >= sizeof(long) * 8 ? ~0 : (1UL << (n)) - 1)
+#define BITMASK(high, low)	(uint32_t)(BITS_TO(high+1) & ~BITS_TO(low))
+#define FIELD_GET(val, high, low)	(((val) & (BITMASK(high, low))) >> (low))
+#define FIELD_GET_BIT(val, n)		FIELD_GET(val, n, n)
+
+#define XE_NO_PROMOTE(val)	FIELD_GET_BIT(val, 10)
+#define XE_COMP_EN(val)		FIELD_GET_BIT(val, 9)
+#define XE_L3_CLOS(val)		FIELD_GET(val, 7, 6)
+#define XE_L3_POLICY(val)	FIELD_GET(val, 5, 4)
+#define XE_L4_POLICY(val)	FIELD_GET(val, 3, 2)
+#define XE_COH_MODE(val)	FIELD_GET(val, 1, 0)
+
+#define XE_PAT_MAX_ENTRIES 32
+
+struct xe_pat_table_entry {
+	uint32_t pat;
+	bool reserved;
+};
+
+/**
+ * xe_read_pat_table - Helper function to read PAT (Page Attribute Table) entries
+ * from a debugfs file
+ *
+ * @drm_fd: DRM device fd to use with igt_debugfs_open
+ * @debugfs_name: filename under device debugfs (e.g. "gt0/pat")
+ * @xe_pat_table: Pointer to an array where the read PAT entries will be stored
+ * @max_entries: Maximum number of PAT entries to read into the table
+ *
+ * Returns: The number of PAT entries successfully read, or a negative error
+ *          code on failure (-EINVAL if debugfs_name is NULL, -ENOENT or -errno otherwise)
+ */
+static int32_t xe_read_pat_table(int drm_fd, const char *debugfs_name,
+				 struct xe_pat_table_entry *xe_pat_table, uint8_t max_entries)
+{
+	char *line = NULL;
+	size_t len = 0;
+	ssize_t read;
+	int32_t parsed = 0;
+	int fd;
+	FILE *f = NULL;
+
+	if (!debugfs_name)
+		return -EINVAL;
+
+	fd = igt_debugfs_open(drm_fd, debugfs_name, O_RDONLY);
+	if (fd < 0)
+		return -ENOENT;
+	f = fdopen(fd, "r");
+	if (!f) {
+		close(fd);
+		return -errno;
+	}
+
+	while ((read = getline(&line, &len, f)) != -1) {
+		char *p, *s;
+		const char *patterns[] = {"]", "=", "[", ",", "]", "("};
+		bool found_all = true;
+		uint32_t hv = 0;
+
+		/* search the pattern: PAT[ 0] = [ 0, 0, 0, 0, 0 ]  (     0x0) */
+		if (strncmp(line, "PAT[", 4) != 0)
+			continue;
+
+		s = line + 4;
+		for (int i = 0; i < ARRAY_SIZE(patterns); i++) {
+			p = strchr(s, patterns[i][0]);
+			if (!p) {
+				found_all = false;
+				break;
+			}
+			s = p;
+		}
+
+		if (!found_all)
+			continue;
+
+		if (sscanf(s, "(%x", &hv) == 1) {
+			if (xe_pat_table && parsed < max_entries) {
+				xe_pat_table[parsed].pat = hv;
+				xe_pat_table[parsed++].reserved = strchr(s, '*') != NULL;
+			}
+		}
+	}
+
+	free(line);
+	fclose(f);
+
+	return parsed;
+}
+
 /**
  * SUBTEST: pat-index-all
  * Test category: functionality test
@@ -86,6 +176,7 @@ static void pat_index_all(int fd)
 {
 	uint16_t dev_id = intel_get_drm_devid(fd);
 	size_t size = xe_get_default_alignment(fd);
+	struct xe_pat_table_entry xe_pat_table[XE_PAT_MAX_ENTRIES] = {0};
 	uint32_t vm, bo;
 	uint8_t pat_index;
 
@@ -114,10 +205,33 @@ static void pat_index_all(int fd)
 
 	igt_assert(intel_get_max_pat_index(fd));
 
+	if (intel_gen(dev_id) >= 20) {
+		/* Read and decode the PAT entries from debugfs */
+		int32_t pat_entries = xe_read_pat_table(fd, "gt0/pat", xe_pat_table, XE_PAT_MAX_ENTRIES);
+		igt_assert(pat_entries > 0 && pat_entries <= XE_PAT_MAX_ENTRIES);
+
+		for (int i = 0; i < pat_entries; i++) {
+			uint32_t pat = xe_pat_table[i].pat;
+			igt_debug("PAT[%2d] = [ %u, %u, %u, %u, %u, %u]  (%#8x)%s\n", i,
+				  XE_NO_PROMOTE(pat),
+				  XE_COMP_EN(pat),
+				  XE_L3_CLOS(pat),
+				  XE_L3_POLICY(pat),
+				  XE_L4_POLICY(pat),
+				  XE_COH_MODE(pat),
+				  pat,
+				  xe_pat_table[i].reserved ? " *" : "");
+		}
+		igt_assert(pat_entries == intel_get_max_pat_index(fd) + 1);
+	}
+
 	for (pat_index = 0; pat_index <= intel_get_max_pat_index(fd);
 	     pat_index++) {
-		if (intel_get_device_info(dev_id)->graphics_ver >= 20 &&
-		    pat_index >= 16 && pat_index <= 19) { /* hw reserved */
+
+		bool hw_reserved = intel_gen(dev_id) >= 20 ?
+			      xe_pat_table[pat_index].reserved : false;
+
+		if (hw_reserved) {
 			igt_assert_eq(__xe_vm_bind(fd, vm, 0, bo, 0, 0x40000,
 						   size, DRM_XE_VM_BIND_OP_MAP, 0, NULL, 0, 0,
 						   pat_index, 0),
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread
* [PATCH v4 0/2] tests/intel/xe_pat: add helper funtion to read PAT table
@ 2025-12-11  7:31 Xin Wang
  0 siblings, 0 replies; 29+ messages in thread
From: Xin Wang @ 2025-12-11  7:31 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.zuo, Xin Wang



Xin Wang (2):
  lib/intel_pat: read Xe PAT config from debugfs
  tests/intel/xe_pat: sync with Xe PAT debugfs parser

 lib/intel_pat.c      | 113 ++++++++++++++++++++++++++++++++++---------
 lib/intel_pat.h      |  20 ++++++++
 lib/xe/xe_query.c    |   4 ++
 lib/xe/xe_query.h    |   4 ++
 tests/intel/xe_pat.c |  38 ++++++++++++++-
 5 files changed, 154 insertions(+), 25 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 29+ messages in thread

end of thread, other threads:[~2025-12-11  7:31 UTC | newest]

Thread overview: 29+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-13  7:05 [PATCH] tests/intel/xe_pat: add helper funtion to read PAT table Xin Wang
2025-11-13  7:57 ` ✗ Xe.CI.BAT: failure for " Patchwork
2025-11-13 14:33 ` ✓ Xe.CI.Full: success " Patchwork
2025-11-13 20:55 ` ✓ i915.CI.BAT: " Patchwork
2025-11-13 21:40 ` [PATCH] " Wang, X
2025-11-13 22:12 ` ✓ i915.CI.Full: success for " Patchwork
2025-12-06  1:12 ` [PATCH v2 1/2] lib/intel_pat: read Xe PAT config from debugfs Xin Wang
2025-12-06  1:12   ` [PATCH v2 2/2] tests/intel/xe_pat: sync with Xe PAT debugfs parser Xin Wang
2025-12-08 16:48     ` Matthew Auld
2025-12-10  5:24     ` [PATCH v3 " Xin Wang
2025-12-06 18:48   ` [PATCH v2 1/2] lib/intel_pat: read Xe PAT config from debugfs Lin, Shuicheng
2025-12-08 18:37     ` Wang, X
2025-12-08 23:27       ` Lin, Shuicheng
2025-12-09  9:36       ` Kamil Konieczny
2025-12-09 16:41         ` Wang, X
2025-12-08 19:25     ` Wang, X
2025-12-10  5:23   ` [PATCH v3 " Xin Wang
2025-12-11  7:27     ` [PATCH v4 0/2] tests/intel/xe_pat: add helper funtion to read PAT table Xin Wang
2025-12-11  7:27       ` [PATCH v4 1/2] lib/intel_pat: read Xe PAT config from debugfs Xin Wang
2025-12-11  7:27       ` [PATCH v4 2/2] tests/intel/xe_pat: sync with Xe PAT debugfs parser Xin Wang
2025-12-06  1:57 ` ✓ Xe.CI.BAT: success for tests/intel/xe_pat: add helper funtion to read PAT table (rev2) Patchwork
2025-12-06  2:05 ` ✓ i915.CI.BAT: " Patchwork
2025-12-06 13:36 ` ✗ Xe.CI.Full: failure " Patchwork
2025-12-07  4:24 ` ✗ i915.CI.Full: " Patchwork
2025-12-10  9:21 ` ✓ Xe.CI.BAT: success for tests/intel/xe_pat: add helper funtion to read PAT table (rev4) Patchwork
2025-12-10 11:05 ` ✓ i915.CI.BAT: " Patchwork
2025-12-10 12:32 ` ✗ Xe.CI.Full: failure " Patchwork
2025-12-10 12:55 ` ✓ i915.CI.Full: success " Patchwork
  -- strict thread matches above, loose matches on Subject: below --
2025-12-11  7:31 [PATCH v4 0/2] tests/intel/xe_pat: add helper funtion to read PAT table Xin Wang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).