* [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
@ 2026-02-24 20:36 Stuart Summers
2026-02-24 20:46 ` ✓ CI.KUnit: success for " Patchwork
` (3 more replies)
0 siblings, 4 replies; 23+ messages in thread
From: Stuart Summers @ 2026-02-24 20:36 UTC (permalink / raw)
Cc: shuicheng.lin, matthew.d.roper, intel-xe, John Harrison,
Stuart Summers
From: John Harrison <John.C.Harrison@Intel.com>
GuC provides the ability to gather logs through a hardware interface
called NPK. For certain debugging scenarios this can be advantageous
over getting logs from memory (or in addition to).
Add a hook for this alternate debugging mode via a modparam similar
to what is used for GuC log level. This translates into a parameter
passed to GuC during load time.
Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
Signed-off-by: Stuart Summers <stuart.summers@intel.com>
---
drivers/gpu/drm/xe/xe_defaults.h | 1 +
drivers/gpu/drm/xe/xe_guc.c | 7 ++++++-
drivers/gpu/drm/xe/xe_module.c | 4 ++++
drivers/gpu/drm/xe/xe_module.h | 1 +
4 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/xe/xe_defaults.h b/drivers/gpu/drm/xe/xe_defaults.h
index 5d5d41d067c5..194500fb0ab2 100644
--- a/drivers/gpu/drm/xe/xe_defaults.h
+++ b/drivers/gpu/drm/xe/xe_defaults.h
@@ -12,6 +12,7 @@
#else
#define XE_DEFAULT_GUC_LOG_LEVEL 1
#endif
+#define XE_DEFAULT_GUC_LOG_TARGET 0
#define XE_DEFAULT_PROBE_DISPLAY true
#define XE_DEFAULT_VRAM_BAR_SIZE 0
diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c
index 54d2fc780127..10bf63c20a14 100644
--- a/drivers/gpu/drm/xe/xe_guc.c
+++ b/drivers/gpu/drm/xe/xe_guc.c
@@ -79,7 +79,12 @@ static u32 guc_ctl_debug_flags(struct xe_guc *guc)
if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
flags |= GUC_LOG_DISABLED;
else
- flags |= FIELD_PREP(GUC_LOG_VERBOSITY, GUC_LOG_LEVEL_TO_VERBOSITY(level));
+ flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
+ GUC_LOG_LEVEL_TO_VERBOSITY(level));
+
+ if (xe_modparam.guc_log_target)
+ flags |= FIELD_PREP(GUC_LOG_DESTINATION,
+ xe_modparam.guc_log_target);
return flags;
}
diff --git a/drivers/gpu/drm/xe/xe_module.c b/drivers/gpu/drm/xe/xe_module.c
index 903d3b433421..1a8127e508e4 100644
--- a/drivers/gpu/drm/xe/xe_module.c
+++ b/drivers/gpu/drm/xe/xe_module.c
@@ -23,6 +23,7 @@
struct xe_modparam xe_modparam = {
.probe_display = XE_DEFAULT_PROBE_DISPLAY,
.guc_log_level = XE_DEFAULT_GUC_LOG_LEVEL,
+ .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
.force_probe = XE_DEFAULT_FORCE_PROBE,
#ifdef CONFIG_PCI_IOV
.max_vfs = XE_DEFAULT_MAX_VFS,
@@ -51,6 +52,9 @@ module_param_named(guc_log_level, xe_modparam.guc_log_level, int, 0600);
MODULE_PARM_DESC(guc_log_level, "GuC firmware logging level (0=disable, 1=normal, 2..5=verbose-levels "
"[default=" __stringify(XE_DEFAULT_GUC_LOG_LEVEL) "])");
+module_param_named(guc_log_target, xe_modparam.guc_log_target, int, 0600);
+MODULE_PARM_DESC(guc_log_target, "GuC firmware logging target (0=memory [default], 1 = NPK, 2 = memory + NPK)");
+
module_param_named_unsafe(guc_firmware_path, xe_modparam.guc_firmware_path, charp, 0400);
MODULE_PARM_DESC(guc_firmware_path,
"GuC firmware path to use instead of the default one");
diff --git a/drivers/gpu/drm/xe/xe_module.h b/drivers/gpu/drm/xe/xe_module.h
index 79cb9639c0f3..bab43dbacaa0 100644
--- a/drivers/gpu/drm/xe/xe_module.h
+++ b/drivers/gpu/drm/xe/xe_module.h
@@ -14,6 +14,7 @@ struct xe_modparam {
bool probe_display;
int force_vram_bar_size;
int guc_log_level;
+ int guc_log_target;
char *guc_firmware_path;
char *huc_firmware_path;
char *gsc_firmware_path;
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread* ✓ CI.KUnit: success for drm/xe/guc: Add support for NPK as a GuC log target
2026-02-24 20:36 [PATCH] drm/xe/guc: Add support for NPK as a GuC log target Stuart Summers
@ 2026-02-24 20:46 ` Patchwork
2026-02-24 21:20 ` ✓ Xe.CI.BAT: " Patchwork
` (2 subsequent siblings)
3 siblings, 0 replies; 23+ messages in thread
From: Patchwork @ 2026-02-24 20:46 UTC (permalink / raw)
To: Stuart Summers; +Cc: intel-xe
== Series Details ==
Series: drm/xe/guc: Add support for NPK as a GuC log target
URL : https://patchwork.freedesktop.org/series/162087/
State : success
== Summary ==
+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[20:45:01] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[20:45:05] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[20:45:36] Starting KUnit Kernel (1/1)...
[20:45:36] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[20:45:36] ================== guc_buf (11 subtests) ===================
[20:45:36] [PASSED] test_smallest
[20:45:36] [PASSED] test_largest
[20:45:36] [PASSED] test_granular
[20:45:36] [PASSED] test_unique
[20:45:36] [PASSED] test_overlap
[20:45:36] [PASSED] test_reusable
[20:45:36] [PASSED] test_too_big
[20:45:36] [PASSED] test_flush
[20:45:36] [PASSED] test_lookup
[20:45:36] [PASSED] test_data
[20:45:36] [PASSED] test_class
[20:45:36] ===================== [PASSED] guc_buf =====================
[20:45:36] =================== guc_dbm (7 subtests) ===================
[20:45:36] [PASSED] test_empty
[20:45:36] [PASSED] test_default
[20:45:36] ======================== test_size ========================
[20:45:36] [PASSED] 4
[20:45:36] [PASSED] 8
[20:45:36] [PASSED] 32
[20:45:36] [PASSED] 256
[20:45:36] ==================== [PASSED] test_size ====================
[20:45:36] ======================= test_reuse ========================
[20:45:36] [PASSED] 4
[20:45:36] [PASSED] 8
[20:45:36] [PASSED] 32
[20:45:36] [PASSED] 256
[20:45:36] =================== [PASSED] test_reuse ====================
[20:45:36] =================== test_range_overlap ====================
[20:45:36] [PASSED] 4
[20:45:36] [PASSED] 8
[20:45:36] [PASSED] 32
[20:45:36] [PASSED] 256
[20:45:36] =============== [PASSED] test_range_overlap ================
[20:45:36] =================== test_range_compact ====================
[20:45:36] [PASSED] 4
[20:45:36] [PASSED] 8
[20:45:36] [PASSED] 32
[20:45:36] [PASSED] 256
[20:45:36] =============== [PASSED] test_range_compact ================
[20:45:36] ==================== test_range_spare =====================
[20:45:36] [PASSED] 4
[20:45:36] [PASSED] 8
[20:45:36] [PASSED] 32
[20:45:36] [PASSED] 256
[20:45:36] ================ [PASSED] test_range_spare =================
[20:45:36] ===================== [PASSED] guc_dbm =====================
[20:45:36] =================== guc_idm (6 subtests) ===================
[20:45:36] [PASSED] bad_init
[20:45:36] [PASSED] no_init
[20:45:36] [PASSED] init_fini
[20:45:36] [PASSED] check_used
[20:45:36] [PASSED] check_quota
[20:45:36] [PASSED] check_all
[20:45:36] ===================== [PASSED] guc_idm =====================
[20:45:36] ================== no_relay (3 subtests) ===================
[20:45:36] [PASSED] xe_drops_guc2pf_if_not_ready
[20:45:36] [PASSED] xe_drops_guc2vf_if_not_ready
[20:45:36] [PASSED] xe_rejects_send_if_not_ready
[20:45:36] ==================== [PASSED] no_relay =====================
[20:45:36] ================== pf_relay (14 subtests) ==================
[20:45:36] [PASSED] pf_rejects_guc2pf_too_short
[20:45:36] [PASSED] pf_rejects_guc2pf_too_long
[20:45:36] [PASSED] pf_rejects_guc2pf_no_payload
[20:45:36] [PASSED] pf_fails_no_payload
[20:45:36] [PASSED] pf_fails_bad_origin
[20:45:36] [PASSED] pf_fails_bad_type
[20:45:36] [PASSED] pf_txn_reports_error
[20:45:36] [PASSED] pf_txn_sends_pf2guc
[20:45:36] [PASSED] pf_sends_pf2guc
[20:45:36] [SKIPPED] pf_loopback_nop
[20:45:36] [SKIPPED] pf_loopback_echo
[20:45:36] [SKIPPED] pf_loopback_fail
[20:45:36] [SKIPPED] pf_loopback_busy
[20:45:36] [SKIPPED] pf_loopback_retry
[20:45:36] ==================== [PASSED] pf_relay =====================
[20:45:36] ================== vf_relay (3 subtests) ===================
[20:45:36] [PASSED] vf_rejects_guc2vf_too_short
[20:45:36] [PASSED] vf_rejects_guc2vf_too_long
[20:45:36] [PASSED] vf_rejects_guc2vf_no_payload
[20:45:36] ==================== [PASSED] vf_relay =====================
[20:45:36] ================ pf_gt_config (9 subtests) =================
[20:45:36] [PASSED] fair_contexts_1vf
[20:45:36] [PASSED] fair_doorbells_1vf
[20:45:36] [PASSED] fair_ggtt_1vf
[20:45:36] ====================== fair_vram_1vf ======================
[20:45:36] [PASSED] 3.50 GiB
[20:45:36] [PASSED] 11.5 GiB
[20:45:36] [PASSED] 15.5 GiB
[20:45:36] [PASSED] 31.5 GiB
[20:45:36] [PASSED] 63.5 GiB
[20:45:36] [PASSED] 13.9 GiB
[20:45:36] ================== [PASSED] fair_vram_1vf ==================
[20:45:36] ================ fair_vram_1vf_admin_only =================
[20:45:36] [PASSED] 3.50 GiB
[20:45:36] [PASSED] 11.5 GiB
[20:45:36] [PASSED] 15.5 GiB
[20:45:36] [PASSED] 31.5 GiB
[20:45:36] [PASSED] 63.5 GiB
[20:45:36] [PASSED] 13.9 GiB
[20:45:36] ============ [PASSED] fair_vram_1vf_admin_only =============
[20:45:36] ====================== fair_contexts ======================
[20:45:36] [PASSED] 1 VF
[20:45:36] [PASSED] 2 VFs
[20:45:36] [PASSED] 3 VFs
[20:45:36] [PASSED] 4 VFs
[20:45:36] [PASSED] 5 VFs
[20:45:36] [PASSED] 6 VFs
[20:45:36] [PASSED] 7 VFs
[20:45:36] [PASSED] 8 VFs
[20:45:36] [PASSED] 9 VFs
[20:45:36] [PASSED] 10 VFs
[20:45:36] [PASSED] 11 VFs
[20:45:36] [PASSED] 12 VFs
[20:45:36] [PASSED] 13 VFs
[20:45:36] [PASSED] 14 VFs
[20:45:36] [PASSED] 15 VFs
[20:45:36] [PASSED] 16 VFs
[20:45:36] [PASSED] 17 VFs
[20:45:36] [PASSED] 18 VFs
[20:45:36] [PASSED] 19 VFs
[20:45:36] [PASSED] 20 VFs
[20:45:36] [PASSED] 21 VFs
[20:45:36] [PASSED] 22 VFs
[20:45:36] [PASSED] 23 VFs
[20:45:36] [PASSED] 24 VFs
[20:45:36] [PASSED] 25 VFs
[20:45:36] [PASSED] 26 VFs
[20:45:36] [PASSED] 27 VFs
[20:45:36] [PASSED] 28 VFs
[20:45:36] [PASSED] 29 VFs
[20:45:36] [PASSED] 30 VFs
[20:45:36] [PASSED] 31 VFs
[20:45:36] [PASSED] 32 VFs
[20:45:36] [PASSED] 33 VFs
[20:45:36] [PASSED] 34 VFs
[20:45:36] [PASSED] 35 VFs
[20:45:36] [PASSED] 36 VFs
[20:45:36] [PASSED] 37 VFs
[20:45:36] [PASSED] 38 VFs
[20:45:36] [PASSED] 39 VFs
[20:45:36] [PASSED] 40 VFs
[20:45:36] [PASSED] 41 VFs
[20:45:36] [PASSED] 42 VFs
[20:45:36] [PASSED] 43 VFs
[20:45:36] [PASSED] 44 VFs
[20:45:36] [PASSED] 45 VFs
[20:45:36] [PASSED] 46 VFs
[20:45:36] [PASSED] 47 VFs
[20:45:36] [PASSED] 48 VFs
[20:45:36] [PASSED] 49 VFs
[20:45:36] [PASSED] 50 VFs
[20:45:36] [PASSED] 51 VFs
[20:45:36] [PASSED] 52 VFs
[20:45:36] [PASSED] 53 VFs
[20:45:36] [PASSED] 54 VFs
[20:45:36] [PASSED] 55 VFs
[20:45:36] [PASSED] 56 VFs
[20:45:36] [PASSED] 57 VFs
[20:45:36] [PASSED] 58 VFs
[20:45:36] [PASSED] 59 VFs
[20:45:36] [PASSED] 60 VFs
[20:45:36] [PASSED] 61 VFs
[20:45:36] [PASSED] 62 VFs
[20:45:36] [PASSED] 63 VFs
[20:45:36] ================== [PASSED] fair_contexts ==================
[20:45:36] ===================== fair_doorbells ======================
[20:45:36] [PASSED] 1 VF
[20:45:36] [PASSED] 2 VFs
[20:45:36] [PASSED] 3 VFs
[20:45:36] [PASSED] 4 VFs
[20:45:36] [PASSED] 5 VFs
[20:45:36] [PASSED] 6 VFs
[20:45:36] [PASSED] 7 VFs
[20:45:36] [PASSED] 8 VFs
[20:45:36] [PASSED] 9 VFs
[20:45:36] [PASSED] 10 VFs
[20:45:36] [PASSED] 11 VFs
[20:45:36] [PASSED] 12 VFs
[20:45:36] [PASSED] 13 VFs
[20:45:36] [PASSED] 14 VFs
[20:45:36] [PASSED] 15 VFs
[20:45:36] [PASSED] 16 VFs
[20:45:36] [PASSED] 17 VFs
[20:45:36] [PASSED] 18 VFs
[20:45:36] [PASSED] 19 VFs
[20:45:36] [PASSED] 20 VFs
[20:45:36] [PASSED] 21 VFs
[20:45:36] [PASSED] 22 VFs
[20:45:36] [PASSED] 23 VFs
[20:45:36] [PASSED] 24 VFs
[20:45:36] [PASSED] 25 VFs
[20:45:36] [PASSED] 26 VFs
[20:45:36] [PASSED] 27 VFs
[20:45:36] [PASSED] 28 VFs
[20:45:36] [PASSED] 29 VFs
[20:45:36] [PASSED] 30 VFs
[20:45:36] [PASSED] 31 VFs
[20:45:36] [PASSED] 32 VFs
[20:45:36] [PASSED] 33 VFs
[20:45:36] [PASSED] 34 VFs
[20:45:36] [PASSED] 35 VFs
[20:45:36] [PASSED] 36 VFs
[20:45:36] [PASSED] 37 VFs
[20:45:36] [PASSED] 38 VFs
[20:45:36] [PASSED] 39 VFs
[20:45:36] [PASSED] 40 VFs
[20:45:36] [PASSED] 41 VFs
[20:45:36] [PASSED] 42 VFs
[20:45:36] [PASSED] 43 VFs
[20:45:36] [PASSED] 44 VFs
[20:45:36] [PASSED] 45 VFs
[20:45:36] [PASSED] 46 VFs
[20:45:36] [PASSED] 47 VFs
[20:45:36] [PASSED] 48 VFs
[20:45:36] [PASSED] 49 VFs
[20:45:36] [PASSED] 50 VFs
[20:45:36] [PASSED] 51 VFs
[20:45:36] [PASSED] 52 VFs
[20:45:36] [PASSED] 53 VFs
[20:45:36] [PASSED] 54 VFs
[20:45:36] [PASSED] 55 VFs
[20:45:36] [PASSED] 56 VFs
[20:45:36] [PASSED] 57 VFs
[20:45:36] [PASSED] 58 VFs
[20:45:36] [PASSED] 59 VFs
[20:45:36] [PASSED] 60 VFs
[20:45:36] [PASSED] 61 VFs
[20:45:36] [PASSED] 62 VFs
[20:45:36] [PASSED] 63 VFs
[20:45:36] ================= [PASSED] fair_doorbells ==================
[20:45:36] ======================== fair_ggtt ========================
[20:45:36] [PASSED] 1 VF
[20:45:36] [PASSED] 2 VFs
[20:45:36] [PASSED] 3 VFs
[20:45:36] [PASSED] 4 VFs
[20:45:36] [PASSED] 5 VFs
[20:45:36] [PASSED] 6 VFs
[20:45:36] [PASSED] 7 VFs
[20:45:36] [PASSED] 8 VFs
[20:45:36] [PASSED] 9 VFs
[20:45:36] [PASSED] 10 VFs
[20:45:36] [PASSED] 11 VFs
[20:45:36] [PASSED] 12 VFs
[20:45:36] [PASSED] 13 VFs
[20:45:36] [PASSED] 14 VFs
[20:45:36] [PASSED] 15 VFs
[20:45:36] [PASSED] 16 VFs
[20:45:36] [PASSED] 17 VFs
[20:45:36] [PASSED] 18 VFs
[20:45:36] [PASSED] 19 VFs
[20:45:36] [PASSED] 20 VFs
[20:45:36] [PASSED] 21 VFs
[20:45:36] [PASSED] 22 VFs
[20:45:36] [PASSED] 23 VFs
[20:45:36] [PASSED] 24 VFs
[20:45:36] [PASSED] 25 VFs
[20:45:36] [PASSED] 26 VFs
[20:45:36] [PASSED] 27 VFs
[20:45:36] [PASSED] 28 VFs
[20:45:36] [PASSED] 29 VFs
[20:45:36] [PASSED] 30 VFs
[20:45:36] [PASSED] 31 VFs
[20:45:36] [PASSED] 32 VFs
[20:45:36] [PASSED] 33 VFs
[20:45:36] [PASSED] 34 VFs
[20:45:36] [PASSED] 35 VFs
[20:45:36] [PASSED] 36 VFs
[20:45:36] [PASSED] 37 VFs
[20:45:36] [PASSED] 38 VFs
[20:45:36] [PASSED] 39 VFs
[20:45:36] [PASSED] 40 VFs
[20:45:36] [PASSED] 41 VFs
[20:45:36] [PASSED] 42 VFs
[20:45:36] [PASSED] 43 VFs
[20:45:36] [PASSED] 44 VFs
[20:45:36] [PASSED] 45 VFs
[20:45:36] [PASSED] 46 VFs
[20:45:36] [PASSED] 47 VFs
[20:45:36] [PASSED] 48 VFs
[20:45:36] [PASSED] 49 VFs
[20:45:36] [PASSED] 50 VFs
[20:45:36] [PASSED] 51 VFs
[20:45:36] [PASSED] 52 VFs
[20:45:36] [PASSED] 53 VFs
[20:45:36] [PASSED] 54 VFs
[20:45:36] [PASSED] 55 VFs
[20:45:36] [PASSED] 56 VFs
[20:45:36] [PASSED] 57 VFs
[20:45:36] [PASSED] 58 VFs
[20:45:36] [PASSED] 59 VFs
[20:45:36] [PASSED] 60 VFs
[20:45:36] [PASSED] 61 VFs
[20:45:36] [PASSED] 62 VFs
[20:45:36] [PASSED] 63 VFs
[20:45:36] ==================== [PASSED] fair_ggtt ====================
[20:45:36] ======================== fair_vram ========================
[20:45:36] [PASSED] 1 VF
[20:45:36] [PASSED] 2 VFs
[20:45:36] [PASSED] 3 VFs
[20:45:36] [PASSED] 4 VFs
[20:45:36] [PASSED] 5 VFs
[20:45:36] [PASSED] 6 VFs
[20:45:36] [PASSED] 7 VFs
[20:45:36] [PASSED] 8 VFs
[20:45:36] [PASSED] 9 VFs
[20:45:36] [PASSED] 10 VFs
[20:45:36] [PASSED] 11 VFs
[20:45:36] [PASSED] 12 VFs
[20:45:36] [PASSED] 13 VFs
[20:45:36] [PASSED] 14 VFs
[20:45:36] [PASSED] 15 VFs
[20:45:36] [PASSED] 16 VFs
[20:45:36] [PASSED] 17 VFs
[20:45:36] [PASSED] 18 VFs
[20:45:36] [PASSED] 19 VFs
[20:45:36] [PASSED] 20 VFs
[20:45:36] [PASSED] 21 VFs
[20:45:36] [PASSED] 22 VFs
[20:45:36] [PASSED] 23 VFs
[20:45:36] [PASSED] 24 VFs
[20:45:36] [PASSED] 25 VFs
[20:45:36] [PASSED] 26 VFs
[20:45:36] [PASSED] 27 VFs
[20:45:36] [PASSED] 28 VFs
[20:45:36] [PASSED] 29 VFs
[20:45:36] [PASSED] 30 VFs
[20:45:36] [PASSED] 31 VFs
[20:45:36] [PASSED] 32 VFs
[20:45:36] [PASSED] 33 VFs
[20:45:36] [PASSED] 34 VFs
[20:45:36] [PASSED] 35 VFs
[20:45:36] [PASSED] 36 VFs
[20:45:36] [PASSED] 37 VFs
[20:45:36] [PASSED] 38 VFs
[20:45:36] [PASSED] 39 VFs
[20:45:36] [PASSED] 40 VFs
[20:45:36] [PASSED] 41 VFs
[20:45:36] [PASSED] 42 VFs
[20:45:36] [PASSED] 43 VFs
[20:45:36] [PASSED] 44 VFs
[20:45:36] [PASSED] 45 VFs
[20:45:36] [PASSED] 46 VFs
[20:45:36] [PASSED] 47 VFs
[20:45:36] [PASSED] 48 VFs
[20:45:36] [PASSED] 49 VFs
[20:45:36] [PASSED] 50 VFs
[20:45:36] [PASSED] 51 VFs
[20:45:36] [PASSED] 52 VFs
[20:45:36] [PASSED] 53 VFs
[20:45:36] [PASSED] 54 VFs
[20:45:36] [PASSED] 55 VFs
[20:45:36] [PASSED] 56 VFs
[20:45:36] [PASSED] 57 VFs
[20:45:36] [PASSED] 58 VFs
[20:45:36] [PASSED] 59 VFs
[20:45:36] [PASSED] 60 VFs
[20:45:36] [PASSED] 61 VFs
[20:45:36] [PASSED] 62 VFs
[20:45:36] [PASSED] 63 VFs
[20:45:36] ==================== [PASSED] fair_vram ====================
[20:45:36] ================== [PASSED] pf_gt_config ===================
[20:45:36] ===================== lmtt (1 subtest) =====================
[20:45:36] ======================== test_ops =========================
[20:45:36] [PASSED] 2-level
[20:45:36] [PASSED] multi-level
[20:45:36] ==================== [PASSED] test_ops =====================
[20:45:36] ====================== [PASSED] lmtt =======================
[20:45:36] ================= pf_service (11 subtests) =================
[20:45:36] [PASSED] pf_negotiate_any
[20:45:36] [PASSED] pf_negotiate_base_match
[20:45:36] [PASSED] pf_negotiate_base_newer
[20:45:36] [PASSED] pf_negotiate_base_next
[20:45:36] [SKIPPED] pf_negotiate_base_older
[20:45:36] [PASSED] pf_negotiate_base_prev
[20:45:36] [PASSED] pf_negotiate_latest_match
[20:45:36] [PASSED] pf_negotiate_latest_newer
[20:45:36] [PASSED] pf_negotiate_latest_next
[20:45:36] [SKIPPED] pf_negotiate_latest_older
[20:45:36] [SKIPPED] pf_negotiate_latest_prev
[20:45:36] =================== [PASSED] pf_service ====================
[20:45:36] ================= xe_guc_g2g (2 subtests) ==================
[20:45:36] ============== xe_live_guc_g2g_kunit_default ==============
[20:45:36] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[20:45:36] ============== xe_live_guc_g2g_kunit_allmem ===============
[20:45:36] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[20:45:36] =================== [SKIPPED] xe_guc_g2g ===================
[20:45:36] =================== xe_mocs (2 subtests) ===================
[20:45:36] ================ xe_live_mocs_kernel_kunit ================
[20:45:36] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[20:45:36] ================ xe_live_mocs_reset_kunit =================
[20:45:36] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[20:45:36] ==================== [SKIPPED] xe_mocs =====================
[20:45:36] ================= xe_migrate (2 subtests) ==================
[20:45:36] ================= xe_migrate_sanity_kunit =================
[20:45:36] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[20:45:36] ================== xe_validate_ccs_kunit ==================
[20:45:36] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[20:45:36] =================== [SKIPPED] xe_migrate ===================
[20:45:36] ================== xe_dma_buf (1 subtest) ==================
[20:45:36] ==================== xe_dma_buf_kunit =====================
[20:45:36] ================ [SKIPPED] xe_dma_buf_kunit ================
[20:45:36] =================== [SKIPPED] xe_dma_buf ===================
[20:45:36] ================= xe_bo_shrink (1 subtest) =================
[20:45:36] =================== xe_bo_shrink_kunit ====================
[20:45:36] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[20:45:36] ================== [SKIPPED] xe_bo_shrink ==================
[20:45:36] ==================== xe_bo (2 subtests) ====================
[20:45:36] ================== xe_ccs_migrate_kunit ===================
[20:45:36] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[20:45:36] ==================== xe_bo_evict_kunit ====================
[20:45:36] =============== [SKIPPED] xe_bo_evict_kunit ================
[20:45:36] ===================== [SKIPPED] xe_bo ======================
[20:45:36] ==================== args (13 subtests) ====================
[20:45:36] [PASSED] count_args_test
[20:45:36] [PASSED] call_args_example
[20:45:36] [PASSED] call_args_test
[20:45:36] [PASSED] drop_first_arg_example
[20:45:36] [PASSED] drop_first_arg_test
[20:45:36] [PASSED] first_arg_example
[20:45:36] [PASSED] first_arg_test
[20:45:36] [PASSED] last_arg_example
[20:45:36] [PASSED] last_arg_test
[20:45:36] [PASSED] pick_arg_example
[20:45:36] [PASSED] if_args_example
[20:45:36] [PASSED] if_args_test
[20:45:36] [PASSED] sep_comma_example
[20:45:36] ====================== [PASSED] args =======================
[20:45:36] =================== xe_pci (3 subtests) ====================
[20:45:36] ==================== check_graphics_ip ====================
[20:45:36] [PASSED] 12.00 Xe_LP
[20:45:36] [PASSED] 12.10 Xe_LP+
[20:45:36] [PASSED] 12.55 Xe_HPG
[20:45:36] [PASSED] 12.60 Xe_HPC
[20:45:36] [PASSED] 12.70 Xe_LPG
[20:45:36] [PASSED] 12.71 Xe_LPG
[20:45:36] [PASSED] 12.74 Xe_LPG+
[20:45:36] [PASSED] 20.01 Xe2_HPG
[20:45:36] [PASSED] 20.02 Xe2_HPG
[20:45:36] [PASSED] 20.04 Xe2_LPG
[20:45:36] [PASSED] 30.00 Xe3_LPG
[20:45:36] [PASSED] 30.01 Xe3_LPG
[20:45:36] [PASSED] 30.03 Xe3_LPG
[20:45:36] [PASSED] 30.04 Xe3_LPG
[20:45:36] [PASSED] 30.05 Xe3_LPG
[20:45:36] [PASSED] 35.10 Xe3p_LPG
[20:45:36] [PASSED] 35.11 Xe3p_XPC
[20:45:36] ================ [PASSED] check_graphics_ip ================
[20:45:36] ===================== check_media_ip ======================
[20:45:36] [PASSED] 12.00 Xe_M
[20:45:36] [PASSED] 12.55 Xe_HPM
[20:45:36] [PASSED] 13.00 Xe_LPM+
[20:45:36] [PASSED] 13.01 Xe2_HPM
[20:45:36] [PASSED] 20.00 Xe2_LPM
[20:45:36] [PASSED] 30.00 Xe3_LPM
[20:45:36] [PASSED] 30.02 Xe3_LPM
[20:45:36] [PASSED] 35.00 Xe3p_LPM
[20:45:36] [PASSED] 35.03 Xe3p_HPM
[20:45:36] ================= [PASSED] check_media_ip ==================
[20:45:36] =================== check_platform_desc ===================
[20:45:36] [PASSED] 0x9A60 (TIGERLAKE)
[20:45:36] [PASSED] 0x9A68 (TIGERLAKE)
[20:45:36] [PASSED] 0x9A70 (TIGERLAKE)
[20:45:36] [PASSED] 0x9A40 (TIGERLAKE)
[20:45:36] [PASSED] 0x9A49 (TIGERLAKE)
[20:45:36] [PASSED] 0x9A59 (TIGERLAKE)
[20:45:36] [PASSED] 0x9A78 (TIGERLAKE)
[20:45:36] [PASSED] 0x9AC0 (TIGERLAKE)
[20:45:36] [PASSED] 0x9AC9 (TIGERLAKE)
[20:45:36] [PASSED] 0x9AD9 (TIGERLAKE)
[20:45:36] [PASSED] 0x9AF8 (TIGERLAKE)
[20:45:36] [PASSED] 0x4C80 (ROCKETLAKE)
[20:45:36] [PASSED] 0x4C8A (ROCKETLAKE)
[20:45:36] [PASSED] 0x4C8B (ROCKETLAKE)
[20:45:36] [PASSED] 0x4C8C (ROCKETLAKE)
[20:45:36] [PASSED] 0x4C90 (ROCKETLAKE)
[20:45:36] [PASSED] 0x4C9A (ROCKETLAKE)
[20:45:36] [PASSED] 0x4680 (ALDERLAKE_S)
[20:45:36] [PASSED] 0x4682 (ALDERLAKE_S)
[20:45:36] [PASSED] 0x4688 (ALDERLAKE_S)
[20:45:36] [PASSED] 0x468A (ALDERLAKE_S)
[20:45:36] [PASSED] 0x468B (ALDERLAKE_S)
[20:45:36] [PASSED] 0x4690 (ALDERLAKE_S)
[20:45:36] [PASSED] 0x4692 (ALDERLAKE_S)
[20:45:36] [PASSED] 0x4693 (ALDERLAKE_S)
[20:45:36] [PASSED] 0x46A0 (ALDERLAKE_P)
[20:45:36] [PASSED] 0x46A1 (ALDERLAKE_P)
[20:45:36] [PASSED] 0x46A2 (ALDERLAKE_P)
[20:45:36] [PASSED] 0x46A3 (ALDERLAKE_P)
[20:45:36] [PASSED] 0x46A6 (ALDERLAKE_P)
[20:45:36] [PASSED] 0x46A8 (ALDERLAKE_P)
[20:45:36] [PASSED] 0x46AA (ALDERLAKE_P)
[20:45:36] [PASSED] 0x462A (ALDERLAKE_P)
[20:45:36] [PASSED] 0x4626 (ALDERLAKE_P)
[20:45:36] [PASSED] 0x4628 (ALDERLAKE_P)
[20:45:36] [PASSED] 0x46B0 (ALDERLAKE_P)
[20:45:36] [PASSED] 0x46B1 (ALDERLAKE_P)
[20:45:36] [PASSED] 0x46B2 (ALDERLAKE_P)
[20:45:36] [PASSED] 0x46B3 (ALDERLAKE_P)
[20:45:36] [PASSED] 0x46C0 (ALDERLAKE_P)
[20:45:36] [PASSED] 0x46C1 (ALDERLAKE_P)
[20:45:36] [PASSED] 0x46C2 (ALDERLAKE_P)
[20:45:36] [PASSED] 0x46C3 (ALDERLAKE_P)
[20:45:36] [PASSED] 0x46D0 (ALDERLAKE_N)
[20:45:36] [PASSED] 0x46D1 (ALDERLAKE_N)
[20:45:36] [PASSED] 0x46D2 (ALDERLAKE_N)
[20:45:36] [PASSED] 0x46D3 (ALDERLAKE_N)
[20:45:36] [PASSED] 0x46D4 (ALDERLAKE_N)
[20:45:36] [PASSED] 0xA721 (ALDERLAKE_P)
[20:45:36] [PASSED] 0xA7A1 (ALDERLAKE_P)
[20:45:36] [PASSED] 0xA7A9 (ALDERLAKE_P)
[20:45:36] [PASSED] 0xA7AC (ALDERLAKE_P)
[20:45:36] [PASSED] 0xA7AD (ALDERLAKE_P)
[20:45:36] [PASSED] 0xA720 (ALDERLAKE_P)
[20:45:36] [PASSED] 0xA7A0 (ALDERLAKE_P)
[20:45:36] [PASSED] 0xA7A8 (ALDERLAKE_P)
[20:45:36] [PASSED] 0xA7AA (ALDERLAKE_P)
[20:45:36] [PASSED] 0xA7AB (ALDERLAKE_P)
[20:45:36] [PASSED] 0xA780 (ALDERLAKE_S)
[20:45:36] [PASSED] 0xA781 (ALDERLAKE_S)
[20:45:36] [PASSED] 0xA782 (ALDERLAKE_S)
[20:45:36] [PASSED] 0xA783 (ALDERLAKE_S)
[20:45:36] [PASSED] 0xA788 (ALDERLAKE_S)
[20:45:36] [PASSED] 0xA789 (ALDERLAKE_S)
[20:45:36] [PASSED] 0xA78A (ALDERLAKE_S)
[20:45:36] [PASSED] 0xA78B (ALDERLAKE_S)
[20:45:36] [PASSED] 0x4905 (DG1)
[20:45:36] [PASSED] 0x4906 (DG1)
[20:45:36] [PASSED] 0x4907 (DG1)
[20:45:36] [PASSED] 0x4908 (DG1)
[20:45:36] [PASSED] 0x4909 (DG1)
[20:45:36] [PASSED] 0x56C0 (DG2)
[20:45:36] [PASSED] 0x56C2 (DG2)
[20:45:36] [PASSED] 0x56C1 (DG2)
[20:45:36] [PASSED] 0x7D51 (METEORLAKE)
[20:45:36] [PASSED] 0x7DD1 (METEORLAKE)
[20:45:36] [PASSED] 0x7D41 (METEORLAKE)
[20:45:36] [PASSED] 0x7D67 (METEORLAKE)
[20:45:36] [PASSED] 0xB640 (METEORLAKE)
[20:45:36] [PASSED] 0x56A0 (DG2)
[20:45:36] [PASSED] 0x56A1 (DG2)
[20:45:36] [PASSED] 0x56A2 (DG2)
[20:45:36] [PASSED] 0x56BE (DG2)
[20:45:36] [PASSED] 0x56BF (DG2)
[20:45:36] [PASSED] 0x5690 (DG2)
[20:45:36] [PASSED] 0x5691 (DG2)
[20:45:36] [PASSED] 0x5692 (DG2)
[20:45:36] [PASSED] 0x56A5 (DG2)
[20:45:36] [PASSED] 0x56A6 (DG2)
[20:45:36] [PASSED] 0x56B0 (DG2)
[20:45:36] [PASSED] 0x56B1 (DG2)
[20:45:36] [PASSED] 0x56BA (DG2)
[20:45:36] [PASSED] 0x56BB (DG2)
[20:45:36] [PASSED] 0x56BC (DG2)
[20:45:36] [PASSED] 0x56BD (DG2)
[20:45:36] [PASSED] 0x5693 (DG2)
[20:45:36] [PASSED] 0x5694 (DG2)
[20:45:36] [PASSED] 0x5695 (DG2)
[20:45:36] [PASSED] 0x56A3 (DG2)
[20:45:36] [PASSED] 0x56A4 (DG2)
[20:45:36] [PASSED] 0x56B2 (DG2)
[20:45:36] [PASSED] 0x56B3 (DG2)
[20:45:36] [PASSED] 0x5696 (DG2)
[20:45:36] [PASSED] 0x5697 (DG2)
[20:45:36] [PASSED] 0xB69 (PVC)
[20:45:36] [PASSED] 0xB6E (PVC)
[20:45:36] [PASSED] 0xBD4 (PVC)
[20:45:36] [PASSED] 0xBD5 (PVC)
[20:45:36] [PASSED] 0xBD6 (PVC)
[20:45:36] [PASSED] 0xBD7 (PVC)
[20:45:36] [PASSED] 0xBD8 (PVC)
[20:45:36] [PASSED] 0xBD9 (PVC)
[20:45:36] [PASSED] 0xBDA (PVC)
[20:45:36] [PASSED] 0xBDB (PVC)
[20:45:36] [PASSED] 0xBE0 (PVC)
[20:45:36] [PASSED] 0xBE1 (PVC)
[20:45:36] [PASSED] 0xBE5 (PVC)
[20:45:36] [PASSED] 0x7D40 (METEORLAKE)
[20:45:36] [PASSED] 0x7D45 (METEORLAKE)
[20:45:36] [PASSED] 0x7D55 (METEORLAKE)
[20:45:36] [PASSED] 0x7D60 (METEORLAKE)
[20:45:36] [PASSED] 0x7DD5 (METEORLAKE)
[20:45:36] [PASSED] 0x6420 (LUNARLAKE)
[20:45:36] [PASSED] 0x64A0 (LUNARLAKE)
[20:45:36] [PASSED] 0x64B0 (LUNARLAKE)
[20:45:36] [PASSED] 0xE202 (BATTLEMAGE)
[20:45:36] [PASSED] 0xE209 (BATTLEMAGE)
[20:45:36] [PASSED] 0xE20B (BATTLEMAGE)
[20:45:36] [PASSED] 0xE20C (BATTLEMAGE)
[20:45:36] [PASSED] 0xE20D (BATTLEMAGE)
[20:45:36] [PASSED] 0xE210 (BATTLEMAGE)
[20:45:36] [PASSED] 0xE211 (BATTLEMAGE)
[20:45:36] [PASSED] 0xE212 (BATTLEMAGE)
[20:45:36] [PASSED] 0xE216 (BATTLEMAGE)
[20:45:36] [PASSED] 0xE220 (BATTLEMAGE)
[20:45:36] [PASSED] 0xE221 (BATTLEMAGE)
[20:45:36] [PASSED] 0xE222 (BATTLEMAGE)
[20:45:36] [PASSED] 0xE223 (BATTLEMAGE)
[20:45:36] [PASSED] 0xB080 (PANTHERLAKE)
[20:45:36] [PASSED] 0xB081 (PANTHERLAKE)
[20:45:36] [PASSED] 0xB082 (PANTHERLAKE)
[20:45:36] [PASSED] 0xB083 (PANTHERLAKE)
[20:45:36] [PASSED] 0xB084 (PANTHERLAKE)
[20:45:36] [PASSED] 0xB085 (PANTHERLAKE)
[20:45:36] [PASSED] 0xB086 (PANTHERLAKE)
[20:45:36] [PASSED] 0xB087 (PANTHERLAKE)
[20:45:36] [PASSED] 0xB08F (PANTHERLAKE)
[20:45:36] [PASSED] 0xB090 (PANTHERLAKE)
[20:45:36] [PASSED] 0xB0A0 (PANTHERLAKE)
[20:45:36] [PASSED] 0xB0B0 (PANTHERLAKE)
[20:45:36] [PASSED] 0xFD80 (PANTHERLAKE)
[20:45:36] [PASSED] 0xFD81 (PANTHERLAKE)
[20:45:36] [PASSED] 0xD740 (NOVALAKE_S)
[20:45:36] [PASSED] 0xD741 (NOVALAKE_S)
[20:45:36] [PASSED] 0xD742 (NOVALAKE_S)
[20:45:36] [PASSED] 0xD743 (NOVALAKE_S)
[20:45:36] [PASSED] 0xD744 (NOVALAKE_S)
[20:45:36] [PASSED] 0xD745 (NOVALAKE_S)
[20:45:36] [PASSED] 0x674C (CRESCENTISLAND)
[20:45:36] [PASSED] 0xD750 (NOVALAKE_P)
[20:45:36] [PASSED] 0xD751 (NOVALAKE_P)
[20:45:36] [PASSED] 0xD752 (NOVALAKE_P)
[20:45:36] [PASSED] 0xD753 (NOVALAKE_P)
[20:45:36] [PASSED] 0xD754 (NOVALAKE_P)
[20:45:36] [PASSED] 0xD755 (NOVALAKE_P)
[20:45:36] [PASSED] 0xD756 (NOVALAKE_P)
[20:45:36] [PASSED] 0xD757 (NOVALAKE_P)
[20:45:36] [PASSED] 0xD75F (NOVALAKE_P)
[20:45:36] =============== [PASSED] check_platform_desc ===============
[20:45:36] ===================== [PASSED] xe_pci ======================
[20:45:36] =================== xe_rtp (2 subtests) ====================
[20:45:36] =============== xe_rtp_process_to_sr_tests ================
[20:45:36] [PASSED] coalesce-same-reg
[20:45:36] [PASSED] no-match-no-add
[20:45:36] [PASSED] match-or
[20:45:36] [PASSED] match-or-xfail
[20:45:36] [PASSED] no-match-no-add-multiple-rules
[20:45:36] [PASSED] two-regs-two-entries
[20:45:36] [PASSED] clr-one-set-other
[20:45:36] [PASSED] set-field
[20:45:36] [PASSED] conflict-duplicate
stty: 'standard input': Inappropriate ioctl for device
[20:45:36] [PASSED] conflict-not-disjoint
[20:45:36] [PASSED] conflict-reg-type
[20:45:36] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[20:45:36] ================== xe_rtp_process_tests ===================
[20:45:36] [PASSED] active1
[20:45:36] [PASSED] active2
[20:45:36] [PASSED] active-inactive
[20:45:36] [PASSED] inactive-active
[20:45:36] [PASSED] inactive-1st_or_active-inactive
[20:45:36] [PASSED] inactive-2nd_or_active-inactive
[20:45:36] [PASSED] inactive-last_or_active-inactive
[20:45:36] [PASSED] inactive-no_or_active-inactive
[20:45:36] ============== [PASSED] xe_rtp_process_tests ===============
[20:45:36] ===================== [PASSED] xe_rtp ======================
[20:45:36] ==================== xe_wa (1 subtest) =====================
[20:45:36] ======================== xe_wa_gt =========================
[20:45:36] [PASSED] TIGERLAKE B0
[20:45:36] [PASSED] DG1 A0
[20:45:36] [PASSED] DG1 B0
[20:45:36] [PASSED] ALDERLAKE_S A0
[20:45:36] [PASSED] ALDERLAKE_S B0
[20:45:36] [PASSED] ALDERLAKE_S C0
[20:45:36] [PASSED] ALDERLAKE_S D0
[20:45:36] [PASSED] ALDERLAKE_P A0
[20:45:36] [PASSED] ALDERLAKE_P B0
[20:45:36] [PASSED] ALDERLAKE_P C0
[20:45:36] [PASSED] ALDERLAKE_S RPLS D0
[20:45:36] [PASSED] ALDERLAKE_P RPLU E0
[20:45:36] [PASSED] DG2 G10 C0
[20:45:36] [PASSED] DG2 G11 B1
[20:45:36] [PASSED] DG2 G12 A1
[20:45:36] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[20:45:36] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[20:45:36] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[20:45:36] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[20:45:36] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[20:45:36] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[20:45:36] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[20:45:36] ==================== [PASSED] xe_wa_gt =====================
[20:45:36] ====================== [PASSED] xe_wa ======================
[20:45:36] ============================================================
[20:45:36] Testing complete. Ran 597 tests: passed: 579, skipped: 18
[20:45:36] Elapsed time: 35.451s total, 4.271s configuring, 30.511s building, 0.613s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[20:45:36] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[20:45:38] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[20:46:02] Starting KUnit Kernel (1/1)...
[20:46:02] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[20:46:02] ============ drm_test_pick_cmdline (2 subtests) ============
[20:46:02] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[20:46:02] =============== drm_test_pick_cmdline_named ===============
[20:46:02] [PASSED] NTSC
[20:46:02] [PASSED] NTSC-J
[20:46:02] [PASSED] PAL
[20:46:02] [PASSED] PAL-M
[20:46:02] =========== [PASSED] drm_test_pick_cmdline_named ===========
[20:46:02] ============== [PASSED] drm_test_pick_cmdline ==============
[20:46:02] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[20:46:02] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[20:46:02] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[20:46:02] =========== drm_validate_clone_mode (2 subtests) ===========
[20:46:02] ============== drm_test_check_in_clone_mode ===============
[20:46:02] [PASSED] in_clone_mode
[20:46:02] [PASSED] not_in_clone_mode
[20:46:02] ========== [PASSED] drm_test_check_in_clone_mode ===========
[20:46:02] =============== drm_test_check_valid_clones ===============
[20:46:02] [PASSED] not_in_clone_mode
[20:46:02] [PASSED] valid_clone
[20:46:02] [PASSED] invalid_clone
[20:46:02] =========== [PASSED] drm_test_check_valid_clones ===========
[20:46:02] ============= [PASSED] drm_validate_clone_mode =============
[20:46:02] ============= drm_validate_modeset (1 subtest) =============
[20:46:02] [PASSED] drm_test_check_connector_changed_modeset
[20:46:02] ============== [PASSED] drm_validate_modeset ===============
[20:46:02] ====== drm_test_bridge_get_current_state (2 subtests) ======
[20:46:02] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[20:46:02] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[20:46:02] ======== [PASSED] drm_test_bridge_get_current_state ========
[20:46:02] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[20:46:02] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[20:46:02] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[20:46:02] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[20:46:02] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[20:46:02] ============== drm_bridge_alloc (2 subtests) ===============
[20:46:02] [PASSED] drm_test_drm_bridge_alloc_basic
[20:46:02] [PASSED] drm_test_drm_bridge_alloc_get_put
[20:46:02] ================ [PASSED] drm_bridge_alloc =================
[20:46:02] ============= drm_cmdline_parser (40 subtests) =============
[20:46:02] [PASSED] drm_test_cmdline_force_d_only
[20:46:02] [PASSED] drm_test_cmdline_force_D_only_dvi
[20:46:02] [PASSED] drm_test_cmdline_force_D_only_hdmi
[20:46:02] [PASSED] drm_test_cmdline_force_D_only_not_digital
[20:46:02] [PASSED] drm_test_cmdline_force_e_only
[20:46:02] [PASSED] drm_test_cmdline_res
[20:46:02] [PASSED] drm_test_cmdline_res_vesa
[20:46:02] [PASSED] drm_test_cmdline_res_vesa_rblank
[20:46:02] [PASSED] drm_test_cmdline_res_rblank
[20:46:02] [PASSED] drm_test_cmdline_res_bpp
[20:46:02] [PASSED] drm_test_cmdline_res_refresh
[20:46:02] [PASSED] drm_test_cmdline_res_bpp_refresh
[20:46:02] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[20:46:02] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[20:46:02] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[20:46:02] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[20:46:02] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[20:46:02] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[20:46:02] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[20:46:02] [PASSED] drm_test_cmdline_res_margins_force_on
[20:46:02] [PASSED] drm_test_cmdline_res_vesa_margins
[20:46:02] [PASSED] drm_test_cmdline_name
[20:46:02] [PASSED] drm_test_cmdline_name_bpp
[20:46:02] [PASSED] drm_test_cmdline_name_option
[20:46:02] [PASSED] drm_test_cmdline_name_bpp_option
[20:46:02] [PASSED] drm_test_cmdline_rotate_0
[20:46:02] [PASSED] drm_test_cmdline_rotate_90
[20:46:02] [PASSED] drm_test_cmdline_rotate_180
[20:46:02] [PASSED] drm_test_cmdline_rotate_270
[20:46:02] [PASSED] drm_test_cmdline_hmirror
[20:46:02] [PASSED] drm_test_cmdline_vmirror
[20:46:02] [PASSED] drm_test_cmdline_margin_options
[20:46:02] [PASSED] drm_test_cmdline_multiple_options
[20:46:02] [PASSED] drm_test_cmdline_bpp_extra_and_option
[20:46:02] [PASSED] drm_test_cmdline_extra_and_option
[20:46:02] [PASSED] drm_test_cmdline_freestanding_options
[20:46:02] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[20:46:02] [PASSED] drm_test_cmdline_panel_orientation
[20:46:02] ================ drm_test_cmdline_invalid =================
[20:46:02] [PASSED] margin_only
[20:46:02] [PASSED] interlace_only
[20:46:02] [PASSED] res_missing_x
[20:46:02] [PASSED] res_missing_y
[20:46:02] [PASSED] res_bad_y
[20:46:02] [PASSED] res_missing_y_bpp
[20:46:02] [PASSED] res_bad_bpp
[20:46:02] [PASSED] res_bad_refresh
[20:46:02] [PASSED] res_bpp_refresh_force_on_off
[20:46:02] [PASSED] res_invalid_mode
[20:46:02] [PASSED] res_bpp_wrong_place_mode
[20:46:02] [PASSED] name_bpp_refresh
[20:46:02] [PASSED] name_refresh
[20:46:02] [PASSED] name_refresh_wrong_mode
[20:46:02] [PASSED] name_refresh_invalid_mode
[20:46:02] [PASSED] rotate_multiple
[20:46:02] [PASSED] rotate_invalid_val
[20:46:02] [PASSED] rotate_truncated
[20:46:02] [PASSED] invalid_option
[20:46:02] [PASSED] invalid_tv_option
[20:46:02] [PASSED] truncated_tv_option
[20:46:02] ============ [PASSED] drm_test_cmdline_invalid =============
[20:46:02] =============== drm_test_cmdline_tv_options ===============
[20:46:02] [PASSED] NTSC
[20:46:02] [PASSED] NTSC_443
[20:46:02] [PASSED] NTSC_J
[20:46:02] [PASSED] PAL
[20:46:02] [PASSED] PAL_M
[20:46:02] [PASSED] PAL_N
[20:46:02] [PASSED] SECAM
[20:46:02] [PASSED] MONO_525
[20:46:02] [PASSED] MONO_625
[20:46:02] =========== [PASSED] drm_test_cmdline_tv_options ===========
[20:46:02] =============== [PASSED] drm_cmdline_parser ================
[20:46:02] ========== drmm_connector_hdmi_init (20 subtests) ==========
[20:46:02] [PASSED] drm_test_connector_hdmi_init_valid
[20:46:02] [PASSED] drm_test_connector_hdmi_init_bpc_8
[20:46:02] [PASSED] drm_test_connector_hdmi_init_bpc_10
[20:46:02] [PASSED] drm_test_connector_hdmi_init_bpc_12
[20:46:02] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[20:46:02] [PASSED] drm_test_connector_hdmi_init_bpc_null
[20:46:02] [PASSED] drm_test_connector_hdmi_init_formats_empty
[20:46:02] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[20:46:02] === drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[20:46:02] [PASSED] supported_formats=0x9 yuv420_allowed=1
[20:46:02] [PASSED] supported_formats=0x9 yuv420_allowed=0
[20:46:02] [PASSED] supported_formats=0x3 yuv420_allowed=1
[20:46:02] [PASSED] supported_formats=0x3 yuv420_allowed=0
[20:46:02] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[20:46:02] [PASSED] drm_test_connector_hdmi_init_null_ddc
[20:46:02] [PASSED] drm_test_connector_hdmi_init_null_product
[20:46:02] [PASSED] drm_test_connector_hdmi_init_null_vendor
[20:46:02] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[20:46:02] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[20:46:02] [PASSED] drm_test_connector_hdmi_init_product_valid
[20:46:02] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[20:46:02] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[20:46:02] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[20:46:02] ========= drm_test_connector_hdmi_init_type_valid =========
[20:46:02] [PASSED] HDMI-A
[20:46:02] [PASSED] HDMI-B
[20:46:02] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[20:46:02] ======== drm_test_connector_hdmi_init_type_invalid ========
[20:46:02] [PASSED] Unknown
[20:46:02] [PASSED] VGA
[20:46:02] [PASSED] DVI-I
[20:46:02] [PASSED] DVI-D
[20:46:02] [PASSED] DVI-A
[20:46:02] [PASSED] Composite
[20:46:02] [PASSED] SVIDEO
[20:46:02] [PASSED] LVDS
[20:46:02] [PASSED] Component
[20:46:02] [PASSED] DIN
[20:46:02] [PASSED] DP
[20:46:02] [PASSED] TV
[20:46:02] [PASSED] eDP
[20:46:02] [PASSED] Virtual
[20:46:02] [PASSED] DSI
[20:46:02] [PASSED] DPI
[20:46:02] [PASSED] Writeback
[20:46:02] [PASSED] SPI
[20:46:02] [PASSED] USB
[20:46:02] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[20:46:02] ============ [PASSED] drmm_connector_hdmi_init =============
[20:46:02] ============= drmm_connector_init (3 subtests) =============
[20:46:02] [PASSED] drm_test_drmm_connector_init
[20:46:02] [PASSED] drm_test_drmm_connector_init_null_ddc
[20:46:02] ========= drm_test_drmm_connector_init_type_valid =========
[20:46:02] [PASSED] Unknown
[20:46:02] [PASSED] VGA
[20:46:02] [PASSED] DVI-I
[20:46:02] [PASSED] DVI-D
[20:46:02] [PASSED] DVI-A
[20:46:02] [PASSED] Composite
[20:46:02] [PASSED] SVIDEO
[20:46:02] [PASSED] LVDS
[20:46:02] [PASSED] Component
[20:46:02] [PASSED] DIN
[20:46:02] [PASSED] DP
[20:46:02] [PASSED] HDMI-A
[20:46:02] [PASSED] HDMI-B
[20:46:02] [PASSED] TV
[20:46:02] [PASSED] eDP
[20:46:02] [PASSED] Virtual
[20:46:02] [PASSED] DSI
[20:46:02] [PASSED] DPI
[20:46:02] [PASSED] Writeback
[20:46:02] [PASSED] SPI
[20:46:02] [PASSED] USB
[20:46:02] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[20:46:02] =============== [PASSED] drmm_connector_init ===============
[20:46:02] ========= drm_connector_dynamic_init (6 subtests) ==========
[20:46:02] [PASSED] drm_test_drm_connector_dynamic_init
[20:46:02] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[20:46:02] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[20:46:02] [PASSED] drm_test_drm_connector_dynamic_init_properties
[20:46:02] ===== drm_test_drm_connector_dynamic_init_type_valid ======
[20:46:02] [PASSED] Unknown
[20:46:02] [PASSED] VGA
[20:46:02] [PASSED] DVI-I
[20:46:02] [PASSED] DVI-D
[20:46:02] [PASSED] DVI-A
[20:46:02] [PASSED] Composite
[20:46:02] [PASSED] SVIDEO
[20:46:02] [PASSED] LVDS
[20:46:02] [PASSED] Component
[20:46:02] [PASSED] DIN
[20:46:02] [PASSED] DP
[20:46:02] [PASSED] HDMI-A
[20:46:02] [PASSED] HDMI-B
[20:46:02] [PASSED] TV
[20:46:02] [PASSED] eDP
[20:46:02] [PASSED] Virtual
[20:46:02] [PASSED] DSI
[20:46:02] [PASSED] DPI
[20:46:02] [PASSED] Writeback
[20:46:02] [PASSED] SPI
[20:46:02] [PASSED] USB
[20:46:02] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[20:46:02] ======== drm_test_drm_connector_dynamic_init_name =========
[20:46:02] [PASSED] Unknown
[20:46:02] [PASSED] VGA
[20:46:02] [PASSED] DVI-I
[20:46:02] [PASSED] DVI-D
[20:46:02] [PASSED] DVI-A
[20:46:02] [PASSED] Composite
[20:46:02] [PASSED] SVIDEO
[20:46:02] [PASSED] LVDS
[20:46:02] [PASSED] Component
[20:46:02] [PASSED] DIN
[20:46:02] [PASSED] DP
[20:46:02] [PASSED] HDMI-A
[20:46:02] [PASSED] HDMI-B
[20:46:02] [PASSED] TV
[20:46:02] [PASSED] eDP
[20:46:02] [PASSED] Virtual
[20:46:02] [PASSED] DSI
[20:46:02] [PASSED] DPI
[20:46:02] [PASSED] Writeback
[20:46:02] [PASSED] SPI
[20:46:02] [PASSED] USB
[20:46:02] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[20:46:02] =========== [PASSED] drm_connector_dynamic_init ============
[20:46:02] ==== drm_connector_dynamic_register_early (4 subtests) =====
[20:46:02] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[20:46:02] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[20:46:02] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[20:46:02] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[20:46:02] ====== [PASSED] drm_connector_dynamic_register_early =======
[20:46:02] ======= drm_connector_dynamic_register (7 subtests) ========
[20:46:02] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[20:46:02] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[20:46:02] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[20:46:02] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[20:46:02] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[20:46:02] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[20:46:02] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[20:46:02] ========= [PASSED] drm_connector_dynamic_register ==========
[20:46:02] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[20:46:02] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[20:46:02] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[20:46:02] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[20:46:02] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[20:46:02] ========== drm_test_get_tv_mode_from_name_valid ===========
[20:46:02] [PASSED] NTSC
[20:46:02] [PASSED] NTSC-443
[20:46:02] [PASSED] NTSC-J
[20:46:02] [PASSED] PAL
[20:46:02] [PASSED] PAL-M
[20:46:02] [PASSED] PAL-N
[20:46:02] [PASSED] SECAM
[20:46:02] [PASSED] Mono
[20:46:02] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[20:46:02] [PASSED] drm_test_get_tv_mode_from_name_truncated
[20:46:02] ============ [PASSED] drm_get_tv_mode_from_name ============
[20:46:02] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[20:46:02] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[20:46:02] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[20:46:02] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[20:46:02] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[20:46:02] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[20:46:02] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[20:46:02] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[20:46:02] [PASSED] VIC 96
[20:46:02] [PASSED] VIC 97
[20:46:02] [PASSED] VIC 101
[20:46:02] [PASSED] VIC 102
[20:46:02] [PASSED] VIC 106
[20:46:02] [PASSED] VIC 107
[20:46:02] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[20:46:02] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[20:46:02] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[20:46:02] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[20:46:02] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[20:46:02] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[20:46:02] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[20:46:02] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[20:46:02] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[20:46:02] [PASSED] Automatic
[20:46:02] [PASSED] Full
[20:46:02] [PASSED] Limited 16:235
[20:46:02] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[20:46:02] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[20:46:02] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[20:46:02] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[20:46:02] === drm_test_drm_hdmi_connector_get_output_format_name ====
[20:46:02] [PASSED] RGB
[20:46:02] [PASSED] YUV 4:2:0
[20:46:02] [PASSED] YUV 4:2:2
[20:46:02] [PASSED] YUV 4:4:4
[20:46:02] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[20:46:02] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[20:46:02] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[20:46:02] ============= drm_damage_helper (21 subtests) ==============
[20:46:02] [PASSED] drm_test_damage_iter_no_damage
[20:46:02] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[20:46:02] [PASSED] drm_test_damage_iter_no_damage_src_moved
[20:46:02] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[20:46:02] [PASSED] drm_test_damage_iter_no_damage_not_visible
[20:46:02] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[20:46:02] [PASSED] drm_test_damage_iter_no_damage_no_fb
[20:46:02] [PASSED] drm_test_damage_iter_simple_damage
[20:46:02] [PASSED] drm_test_damage_iter_single_damage
[20:46:02] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[20:46:02] [PASSED] drm_test_damage_iter_single_damage_outside_src
[20:46:02] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[20:46:02] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[20:46:02] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[20:46:02] [PASSED] drm_test_damage_iter_single_damage_src_moved
[20:46:02] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[20:46:02] [PASSED] drm_test_damage_iter_damage
[20:46:02] [PASSED] drm_test_damage_iter_damage_one_intersect
[20:46:02] [PASSED] drm_test_damage_iter_damage_one_outside
[20:46:02] [PASSED] drm_test_damage_iter_damage_src_moved
[20:46:02] [PASSED] drm_test_damage_iter_damage_not_visible
[20:46:02] ================ [PASSED] drm_damage_helper ================
[20:46:02] ============== drm_dp_mst_helper (3 subtests) ==============
[20:46:02] ============== drm_test_dp_mst_calc_pbn_mode ==============
[20:46:02] [PASSED] Clock 154000 BPP 30 DSC disabled
[20:46:02] [PASSED] Clock 234000 BPP 30 DSC disabled
[20:46:02] [PASSED] Clock 297000 BPP 24 DSC disabled
[20:46:02] [PASSED] Clock 332880 BPP 24 DSC enabled
[20:46:02] [PASSED] Clock 324540 BPP 24 DSC enabled
[20:46:02] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[20:46:02] ============== drm_test_dp_mst_calc_pbn_div ===============
[20:46:02] [PASSED] Link rate 2000000 lane count 4
[20:46:02] [PASSED] Link rate 2000000 lane count 2
[20:46:02] [PASSED] Link rate 2000000 lane count 1
[20:46:02] [PASSED] Link rate 1350000 lane count 4
[20:46:02] [PASSED] Link rate 1350000 lane count 2
[20:46:02] [PASSED] Link rate 1350000 lane count 1
[20:46:02] [PASSED] Link rate 1000000 lane count 4
[20:46:02] [PASSED] Link rate 1000000 lane count 2
[20:46:02] [PASSED] Link rate 1000000 lane count 1
[20:46:02] [PASSED] Link rate 810000 lane count 4
[20:46:02] [PASSED] Link rate 810000 lane count 2
[20:46:02] [PASSED] Link rate 810000 lane count 1
[20:46:02] [PASSED] Link rate 540000 lane count 4
[20:46:02] [PASSED] Link rate 540000 lane count 2
[20:46:02] [PASSED] Link rate 540000 lane count 1
[20:46:02] [PASSED] Link rate 270000 lane count 4
[20:46:02] [PASSED] Link rate 270000 lane count 2
[20:46:02] [PASSED] Link rate 270000 lane count 1
[20:46:02] [PASSED] Link rate 162000 lane count 4
[20:46:02] [PASSED] Link rate 162000 lane count 2
[20:46:02] [PASSED] Link rate 162000 lane count 1
[20:46:02] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[20:46:02] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[20:46:02] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[20:46:02] [PASSED] DP_POWER_UP_PHY with port number
[20:46:02] [PASSED] DP_POWER_DOWN_PHY with port number
[20:46:02] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[20:46:02] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[20:46:02] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[20:46:02] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[20:46:02] [PASSED] DP_QUERY_PAYLOAD with port number
[20:46:02] [PASSED] DP_QUERY_PAYLOAD with VCPI
[20:46:02] [PASSED] DP_REMOTE_DPCD_READ with port number
[20:46:02] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[20:46:02] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[20:46:02] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[20:46:02] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[20:46:02] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[20:46:02] [PASSED] DP_REMOTE_I2C_READ with port number
[20:46:02] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[20:46:02] [PASSED] DP_REMOTE_I2C_READ with transactions array
[20:46:02] [PASSED] DP_REMOTE_I2C_WRITE with port number
[20:46:02] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[20:46:02] [PASSED] DP_REMOTE_I2C_WRITE with data array
[20:46:02] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[20:46:02] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[20:46:02] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[20:46:02] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[20:46:02] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[20:46:02] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[20:46:02] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[20:46:02] ================ [PASSED] drm_dp_mst_helper ================
[20:46:02] ================== drm_exec (7 subtests) ===================
[20:46:02] [PASSED] sanitycheck
[20:46:02] [PASSED] test_lock
[20:46:02] [PASSED] test_lock_unlock
[20:46:02] [PASSED] test_duplicates
[20:46:02] [PASSED] test_prepare
[20:46:02] [PASSED] test_prepare_array
[20:46:02] [PASSED] test_multiple_loops
[20:46:02] ==================== [PASSED] drm_exec =====================
[20:46:02] =========== drm_format_helper_test (17 subtests) ===========
[20:46:02] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[20:46:02] [PASSED] single_pixel_source_buffer
[20:46:02] [PASSED] single_pixel_clip_rectangle
[20:46:02] [PASSED] well_known_colors
[20:46:02] [PASSED] destination_pitch
[20:46:02] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[20:46:02] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[20:46:02] [PASSED] single_pixel_source_buffer
[20:46:02] [PASSED] single_pixel_clip_rectangle
[20:46:02] [PASSED] well_known_colors
[20:46:02] [PASSED] destination_pitch
[20:46:02] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[20:46:02] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[20:46:02] [PASSED] single_pixel_source_buffer
[20:46:02] [PASSED] single_pixel_clip_rectangle
[20:46:02] [PASSED] well_known_colors
[20:46:02] [PASSED] destination_pitch
[20:46:02] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[20:46:02] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[20:46:02] [PASSED] single_pixel_source_buffer
[20:46:02] [PASSED] single_pixel_clip_rectangle
[20:46:02] [PASSED] well_known_colors
[20:46:02] [PASSED] destination_pitch
[20:46:02] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[20:46:02] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[20:46:02] [PASSED] single_pixel_source_buffer
[20:46:02] [PASSED] single_pixel_clip_rectangle
[20:46:02] [PASSED] well_known_colors
[20:46:02] [PASSED] destination_pitch
[20:46:02] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[20:46:02] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[20:46:02] [PASSED] single_pixel_source_buffer
[20:46:02] [PASSED] single_pixel_clip_rectangle
[20:46:02] [PASSED] well_known_colors
[20:46:02] [PASSED] destination_pitch
[20:46:02] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[20:46:02] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[20:46:02] [PASSED] single_pixel_source_buffer
[20:46:02] [PASSED] single_pixel_clip_rectangle
[20:46:02] [PASSED] well_known_colors
[20:46:02] [PASSED] destination_pitch
[20:46:02] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[20:46:02] ============= drm_test_fb_xrgb8888_to_bgr888 ==============
[20:46:02] [PASSED] single_pixel_source_buffer
[20:46:02] [PASSED] single_pixel_clip_rectangle
[20:46:02] [PASSED] well_known_colors
[20:46:02] [PASSED] destination_pitch
[20:46:02] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[20:46:02] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[20:46:02] [PASSED] single_pixel_source_buffer
[20:46:02] [PASSED] single_pixel_clip_rectangle
[20:46:02] [PASSED] well_known_colors
[20:46:02] [PASSED] destination_pitch
[20:46:02] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[20:46:02] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[20:46:02] [PASSED] single_pixel_source_buffer
[20:46:02] [PASSED] single_pixel_clip_rectangle
[20:46:02] [PASSED] well_known_colors
[20:46:02] [PASSED] destination_pitch
[20:46:02] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[20:46:02] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[20:46:02] [PASSED] single_pixel_source_buffer
[20:46:02] [PASSED] single_pixel_clip_rectangle
[20:46:02] [PASSED] well_known_colors
[20:46:02] [PASSED] destination_pitch
[20:46:02] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[20:46:02] ============== drm_test_fb_xrgb8888_to_mono ===============
[20:46:02] [PASSED] single_pixel_source_buffer
[20:46:02] [PASSED] single_pixel_clip_rectangle
[20:46:02] [PASSED] well_known_colors
[20:46:02] [PASSED] destination_pitch
[20:46:02] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[20:46:02] ==================== drm_test_fb_swab =====================
[20:46:02] [PASSED] single_pixel_source_buffer
[20:46:02] [PASSED] single_pixel_clip_rectangle
[20:46:02] [PASSED] well_known_colors
[20:46:02] [PASSED] destination_pitch
[20:46:02] ================ [PASSED] drm_test_fb_swab =================
[20:46:02] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[20:46:02] [PASSED] single_pixel_source_buffer
[20:46:02] [PASSED] single_pixel_clip_rectangle
[20:46:02] [PASSED] well_known_colors
[20:46:02] [PASSED] destination_pitch
[20:46:02] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[20:46:02] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[20:46:02] [PASSED] single_pixel_source_buffer
[20:46:02] [PASSED] single_pixel_clip_rectangle
[20:46:02] [PASSED] well_known_colors
[20:46:02] [PASSED] destination_pitch
[20:46:02] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[20:46:02] ================= drm_test_fb_clip_offset =================
[20:46:02] [PASSED] pass through
[20:46:02] [PASSED] horizontal offset
[20:46:02] [PASSED] vertical offset
[20:46:02] [PASSED] horizontal and vertical offset
[20:46:02] [PASSED] horizontal offset (custom pitch)
[20:46:02] [PASSED] vertical offset (custom pitch)
[20:46:02] [PASSED] horizontal and vertical offset (custom pitch)
[20:46:02] ============= [PASSED] drm_test_fb_clip_offset =============
[20:46:02] =================== drm_test_fb_memcpy ====================
[20:46:02] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[20:46:02] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[20:46:02] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[20:46:02] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[20:46:02] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[20:46:02] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[20:46:02] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[20:46:02] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[20:46:02] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[20:46:02] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[20:46:02] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[20:46:02] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[20:46:02] =============== [PASSED] drm_test_fb_memcpy ================
[20:46:02] ============= [PASSED] drm_format_helper_test ==============
[20:46:02] ================= drm_format (18 subtests) =================
[20:46:02] [PASSED] drm_test_format_block_width_invalid
[20:46:02] [PASSED] drm_test_format_block_width_one_plane
[20:46:02] [PASSED] drm_test_format_block_width_two_plane
[20:46:02] [PASSED] drm_test_format_block_width_three_plane
[20:46:02] [PASSED] drm_test_format_block_width_tiled
[20:46:02] [PASSED] drm_test_format_block_height_invalid
[20:46:02] [PASSED] drm_test_format_block_height_one_plane
[20:46:02] [PASSED] drm_test_format_block_height_two_plane
[20:46:02] [PASSED] drm_test_format_block_height_three_plane
[20:46:02] [PASSED] drm_test_format_block_height_tiled
[20:46:02] [PASSED] drm_test_format_min_pitch_invalid
[20:46:02] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[20:46:02] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[20:46:02] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[20:46:02] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[20:46:02] [PASSED] drm_test_format_min_pitch_two_plane
[20:46:02] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[20:46:02] [PASSED] drm_test_format_min_pitch_tiled
[20:46:02] =================== [PASSED] drm_format ====================
[20:46:02] ============== drm_framebuffer (10 subtests) ===============
[20:46:02] ========== drm_test_framebuffer_check_src_coords ==========
[20:46:02] [PASSED] Success: source fits into fb
[20:46:02] [PASSED] Fail: overflowing fb with x-axis coordinate
[20:46:02] [PASSED] Fail: overflowing fb with y-axis coordinate
[20:46:02] [PASSED] Fail: overflowing fb with source width
[20:46:02] [PASSED] Fail: overflowing fb with source height
[20:46:02] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[20:46:02] [PASSED] drm_test_framebuffer_cleanup
[20:46:02] =============== drm_test_framebuffer_create ===============
[20:46:02] [PASSED] ABGR8888 normal sizes
[20:46:02] [PASSED] ABGR8888 max sizes
[20:46:02] [PASSED] ABGR8888 pitch greater than min required
[20:46:02] [PASSED] ABGR8888 pitch less than min required
[20:46:02] [PASSED] ABGR8888 Invalid width
[20:46:02] [PASSED] ABGR8888 Invalid buffer handle
[20:46:02] [PASSED] No pixel format
[20:46:02] [PASSED] ABGR8888 Width 0
[20:46:02] [PASSED] ABGR8888 Height 0
[20:46:02] [PASSED] ABGR8888 Out of bound height * pitch combination
[20:46:02] [PASSED] ABGR8888 Large buffer offset
[20:46:02] [PASSED] ABGR8888 Buffer offset for inexistent plane
[20:46:02] [PASSED] ABGR8888 Invalid flag
[20:46:02] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[20:46:02] [PASSED] ABGR8888 Valid buffer modifier
[20:46:02] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[20:46:02] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[20:46:02] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[20:46:02] [PASSED] NV12 Normal sizes
[20:46:02] [PASSED] NV12 Max sizes
[20:46:02] [PASSED] NV12 Invalid pitch
[20:46:02] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[20:46:02] [PASSED] NV12 different modifier per-plane
[20:46:02] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[20:46:02] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[20:46:02] [PASSED] NV12 Modifier for inexistent plane
[20:46:02] [PASSED] NV12 Handle for inexistent plane
[20:46:02] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[20:46:02] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[20:46:02] [PASSED] YVU420 Normal sizes
[20:46:02] [PASSED] YVU420 Max sizes
[20:46:02] [PASSED] YVU420 Invalid pitch
[20:46:02] [PASSED] YVU420 Different pitches
[20:46:02] [PASSED] YVU420 Different buffer offsets/pitches
[20:46:02] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[20:46:02] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[20:46:02] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[20:46:02] [PASSED] YVU420 Valid modifier
[20:46:02] [PASSED] YVU420 Different modifiers per plane
[20:46:02] [PASSED] YVU420 Modifier for inexistent plane
[20:46:02] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[20:46:02] [PASSED] X0L2 Normal sizes
[20:46:02] [PASSED] X0L2 Max sizes
[20:46:02] [PASSED] X0L2 Invalid pitch
[20:46:02] [PASSED] X0L2 Pitch greater than minimum required
[20:46:02] [PASSED] X0L2 Handle for inexistent plane
[20:46:02] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[20:46:02] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[20:46:02] [PASSED] X0L2 Valid modifier
[20:46:02] [PASSED] X0L2 Modifier for inexistent plane
[20:46:02] =========== [PASSED] drm_test_framebuffer_create ===========
[20:46:02] [PASSED] drm_test_framebuffer_free
[20:46:02] [PASSED] drm_test_framebuffer_init
[20:46:02] [PASSED] drm_test_framebuffer_init_bad_format
[20:46:02] [PASSED] drm_test_framebuffer_init_dev_mismatch
[20:46:02] [PASSED] drm_test_framebuffer_lookup
[20:46:02] [PASSED] drm_test_framebuffer_lookup_inexistent
[20:46:02] [PASSED] drm_test_framebuffer_modifiers_not_supported
[20:46:02] ================= [PASSED] drm_framebuffer =================
[20:46:02] ================ drm_gem_shmem (8 subtests) ================
[20:46:02] [PASSED] drm_gem_shmem_test_obj_create
[20:46:02] [PASSED] drm_gem_shmem_test_obj_create_private
[20:46:02] [PASSED] drm_gem_shmem_test_pin_pages
[20:46:02] [PASSED] drm_gem_shmem_test_vmap
[20:46:02] [PASSED] drm_gem_shmem_test_get_sg_table
[20:46:02] [PASSED] drm_gem_shmem_test_get_pages_sgt
[20:46:02] [PASSED] drm_gem_shmem_test_madvise
[20:46:02] [PASSED] drm_gem_shmem_test_purge
[20:46:02] ================== [PASSED] drm_gem_shmem ==================
[20:46:02] === drm_atomic_helper_connector_hdmi_check (27 subtests) ===
[20:46:02] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[20:46:02] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[20:46:02] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[20:46:02] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[20:46:02] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[20:46:02] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[20:46:02] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 =======
[20:46:02] [PASSED] Automatic
[20:46:02] [PASSED] Full
[20:46:02] [PASSED] Limited 16:235
[20:46:02] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[20:46:02] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[20:46:02] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[20:46:02] [PASSED] drm_test_check_disable_connector
[20:46:02] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[20:46:02] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[20:46:02] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[20:46:02] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[20:46:02] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[20:46:02] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[20:46:02] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[20:46:02] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[20:46:02] [PASSED] drm_test_check_output_bpc_dvi
[20:46:02] [PASSED] drm_test_check_output_bpc_format_vic_1
[20:46:02] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[20:46:02] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[20:46:02] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[20:46:02] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[20:46:02] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[20:46:02] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[20:46:02] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[20:46:02] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[20:46:02] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[20:46:02] [PASSED] drm_test_check_broadcast_rgb_value
[20:46:02] [PASSED] drm_test_check_bpc_8_value
[20:46:02] [PASSED] drm_test_check_bpc_10_value
[20:46:02] [PASSED] drm_test_check_bpc_12_value
[20:46:02] [PASSED] drm_test_check_format_value
[20:46:02] [PASSED] drm_test_check_tmds_char_value
[20:46:02] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[20:46:02] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[20:46:02] [PASSED] drm_test_check_mode_valid
[20:46:02] [PASSED] drm_test_check_mode_valid_reject
[20:46:02] [PASSED] drm_test_check_mode_valid_reject_rate
[20:46:02] [PASSED] drm_test_check_mode_valid_reject_max_clock
[20:46:02] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[20:46:02] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) =
[20:46:02] [PASSED] drm_test_check_infoframes
[20:46:02] [PASSED] drm_test_check_reject_avi_infoframe
[20:46:02] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8
[20:46:02] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10
[20:46:02] [PASSED] drm_test_check_reject_audio_infoframe
[20:46:02] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes ===
[20:46:02] ================= drm_managed (2 subtests) =================
[20:46:02] [PASSED] drm_test_managed_release_action
[20:46:02] [PASSED] drm_test_managed_run_action
[20:46:02] =================== [PASSED] drm_managed ===================
[20:46:02] =================== drm_mm (6 subtests) ====================
[20:46:02] [PASSED] drm_test_mm_init
[20:46:02] [PASSED] drm_test_mm_debug
[20:46:02] [PASSED] drm_test_mm_align32
[20:46:02] [PASSED] drm_test_mm_align64
[20:46:02] [PASSED] drm_test_mm_lowest
[20:46:02] [PASSED] drm_test_mm_highest
[20:46:02] ===================== [PASSED] drm_mm ======================
[20:46:02] ============= drm_modes_analog_tv (5 subtests) =============
[20:46:02] [PASSED] drm_test_modes_analog_tv_mono_576i
[20:46:02] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[20:46:02] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[20:46:02] [PASSED] drm_test_modes_analog_tv_pal_576i
[20:46:02] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[20:46:02] =============== [PASSED] drm_modes_analog_tv ===============
[20:46:02] ============== drm_plane_helper (2 subtests) ===============
[20:46:02] =============== drm_test_check_plane_state ================
[20:46:02] [PASSED] clipping_simple
[20:46:02] [PASSED] clipping_rotate_reflect
[20:46:02] [PASSED] positioning_simple
[20:46:02] [PASSED] upscaling
[20:46:02] [PASSED] downscaling
[20:46:02] [PASSED] rounding1
[20:46:02] [PASSED] rounding2
[20:46:02] [PASSED] rounding3
[20:46:02] [PASSED] rounding4
[20:46:02] =========== [PASSED] drm_test_check_plane_state ============
[20:46:02] =========== drm_test_check_invalid_plane_state ============
[20:46:02] [PASSED] positioning_invalid
[20:46:02] [PASSED] upscaling_invalid
[20:46:02] [PASSED] downscaling_invalid
[20:46:02] ======= [PASSED] drm_test_check_invalid_plane_state ========
[20:46:02] ================ [PASSED] drm_plane_helper =================
[20:46:02] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[20:46:02] ====== drm_test_connector_helper_tv_get_modes_check =======
[20:46:02] [PASSED] None
[20:46:02] [PASSED] PAL
[20:46:02] [PASSED] NTSC
[20:46:02] [PASSED] Both, NTSC Default
[20:46:02] [PASSED] Both, PAL Default
[20:46:02] [PASSED] Both, NTSC Default, with PAL on command-line
[20:46:02] [PASSED] Both, PAL Default, with NTSC on command-line
[20:46:02] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[20:46:02] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[20:46:02] ================== drm_rect (9 subtests) ===================
[20:46:02] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[20:46:02] [PASSED] drm_test_rect_clip_scaled_not_clipped
[20:46:02] [PASSED] drm_test_rect_clip_scaled_clipped
[20:46:02] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[20:46:02] ================= drm_test_rect_intersect =================
[20:46:02] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[20:46:02] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[20:46:02] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[20:46:02] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[20:46:02] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[20:46:02] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[20:46:02] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[20:46:02] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[20:46:02] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[20:46:02] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[20:46:02] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[20:46:02] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[20:46:02] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[20:46:02] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[20:46:02] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[20:46:02] ============= [PASSED] drm_test_rect_intersect =============
[20:46:02] ================ drm_test_rect_calc_hscale ================
[20:46:02] [PASSED] normal use
[20:46:02] [PASSED] out of max range
[20:46:02] [PASSED] out of min range
[20:46:02] [PASSED] zero dst
[20:46:02] [PASSED] negative src
[20:46:02] [PASSED] negative dst
[20:46:02] ============ [PASSED] drm_test_rect_calc_hscale ============
[20:46:02] ================ drm_test_rect_calc_vscale ================
[20:46:02] [PASSED] normal use
[20:46:02] [PASSED] out of max range
[20:46:02] [PASSED] out of min range
[20:46:02] [PASSED] zero dst
[20:46:02] [PASSED] negative src
[20:46:02] [PASSED] negative dst
stty: 'standard input': Inappropriate ioctl for device
[20:46:02] ============ [PASSED] drm_test_rect_calc_vscale ============
[20:46:02] ================== drm_test_rect_rotate ===================
[20:46:02] [PASSED] reflect-x
[20:46:02] [PASSED] reflect-y
[20:46:02] [PASSED] rotate-0
[20:46:02] [PASSED] rotate-90
[20:46:02] [PASSED] rotate-180
[20:46:02] [PASSED] rotate-270
[20:46:02] ============== [PASSED] drm_test_rect_rotate ===============
[20:46:02] ================ drm_test_rect_rotate_inv =================
[20:46:02] [PASSED] reflect-x
[20:46:02] [PASSED] reflect-y
[20:46:02] [PASSED] rotate-0
[20:46:02] [PASSED] rotate-90
[20:46:02] [PASSED] rotate-180
[20:46:02] [PASSED] rotate-270
[20:46:02] ============ [PASSED] drm_test_rect_rotate_inv =============
[20:46:02] ==================== [PASSED] drm_rect =====================
[20:46:02] ============ drm_sysfb_modeset_test (1 subtest) ============
[20:46:02] ============ drm_test_sysfb_build_fourcc_list =============
[20:46:02] [PASSED] no native formats
[20:46:02] [PASSED] XRGB8888 as native format
[20:46:02] [PASSED] remove duplicates
[20:46:02] [PASSED] convert alpha formats
[20:46:02] [PASSED] random formats
[20:46:02] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[20:46:02] ============= [PASSED] drm_sysfb_modeset_test ==============
[20:46:02] ================== drm_fixp (2 subtests) ===================
[20:46:02] [PASSED] drm_test_int2fixp
[20:46:02] [PASSED] drm_test_sm2fixp
[20:46:02] ==================== [PASSED] drm_fixp =====================
[20:46:02] ============================================================
[20:46:02] Testing complete. Ran 621 tests: passed: 621
[20:46:02] Elapsed time: 25.950s total, 1.689s configuring, 24.089s building, 0.132s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[20:46:02] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[20:46:04] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[20:46:14] Starting KUnit Kernel (1/1)...
[20:46:14] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[20:46:14] ================= ttm_device (5 subtests) ==================
[20:46:14] [PASSED] ttm_device_init_basic
[20:46:14] [PASSED] ttm_device_init_multiple
[20:46:14] [PASSED] ttm_device_fini_basic
[20:46:14] [PASSED] ttm_device_init_no_vma_man
[20:46:14] ================== ttm_device_init_pools ==================
[20:46:14] [PASSED] No DMA allocations, no DMA32 required
[20:46:14] [PASSED] DMA allocations, DMA32 required
[20:46:14] [PASSED] No DMA allocations, DMA32 required
[20:46:14] [PASSED] DMA allocations, no DMA32 required
[20:46:14] ============== [PASSED] ttm_device_init_pools ==============
[20:46:14] =================== [PASSED] ttm_device ====================
[20:46:14] ================== ttm_pool (8 subtests) ===================
[20:46:14] ================== ttm_pool_alloc_basic ===================
[20:46:14] [PASSED] One page
[20:46:14] [PASSED] More than one page
[20:46:14] [PASSED] Above the allocation limit
[20:46:14] [PASSED] One page, with coherent DMA mappings enabled
[20:46:14] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[20:46:14] ============== [PASSED] ttm_pool_alloc_basic ===============
[20:46:14] ============== ttm_pool_alloc_basic_dma_addr ==============
[20:46:14] [PASSED] One page
[20:46:14] [PASSED] More than one page
[20:46:14] [PASSED] Above the allocation limit
[20:46:14] [PASSED] One page, with coherent DMA mappings enabled
[20:46:14] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[20:46:14] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[20:46:14] [PASSED] ttm_pool_alloc_order_caching_match
[20:46:14] [PASSED] ttm_pool_alloc_caching_mismatch
[20:46:14] [PASSED] ttm_pool_alloc_order_mismatch
[20:46:14] [PASSED] ttm_pool_free_dma_alloc
[20:46:14] [PASSED] ttm_pool_free_no_dma_alloc
[20:46:14] [PASSED] ttm_pool_fini_basic
[20:46:14] ==================== [PASSED] ttm_pool =====================
[20:46:14] ================ ttm_resource (8 subtests) =================
[20:46:14] ================= ttm_resource_init_basic =================
[20:46:14] [PASSED] Init resource in TTM_PL_SYSTEM
[20:46:14] [PASSED] Init resource in TTM_PL_VRAM
[20:46:14] [PASSED] Init resource in a private placement
[20:46:14] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[20:46:14] ============= [PASSED] ttm_resource_init_basic =============
[20:46:14] [PASSED] ttm_resource_init_pinned
[20:46:14] [PASSED] ttm_resource_fini_basic
[20:46:14] [PASSED] ttm_resource_manager_init_basic
[20:46:14] [PASSED] ttm_resource_manager_usage_basic
[20:46:14] [PASSED] ttm_resource_manager_set_used_basic
[20:46:14] [PASSED] ttm_sys_man_alloc_basic
[20:46:14] [PASSED] ttm_sys_man_free_basic
[20:46:14] ================== [PASSED] ttm_resource ===================
[20:46:14] =================== ttm_tt (15 subtests) ===================
[20:46:14] ==================== ttm_tt_init_basic ====================
[20:46:14] [PASSED] Page-aligned size
[20:46:14] [PASSED] Extra pages requested
[20:46:14] ================ [PASSED] ttm_tt_init_basic ================
[20:46:14] [PASSED] ttm_tt_init_misaligned
[20:46:14] [PASSED] ttm_tt_fini_basic
[20:46:14] [PASSED] ttm_tt_fini_sg
[20:46:14] [PASSED] ttm_tt_fini_shmem
[20:46:14] [PASSED] ttm_tt_create_basic
[20:46:14] [PASSED] ttm_tt_create_invalid_bo_type
[20:46:14] [PASSED] ttm_tt_create_ttm_exists
[20:46:14] [PASSED] ttm_tt_create_failed
[20:46:14] [PASSED] ttm_tt_destroy_basic
[20:46:14] [PASSED] ttm_tt_populate_null_ttm
[20:46:14] [PASSED] ttm_tt_populate_populated_ttm
[20:46:14] [PASSED] ttm_tt_unpopulate_basic
[20:46:14] [PASSED] ttm_tt_unpopulate_empty_ttm
[20:46:14] [PASSED] ttm_tt_swapin_basic
[20:46:14] ===================== [PASSED] ttm_tt ======================
[20:46:14] =================== ttm_bo (14 subtests) ===================
[20:46:14] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[20:46:14] [PASSED] Cannot be interrupted and sleeps
[20:46:14] [PASSED] Cannot be interrupted, locks straight away
[20:46:14] [PASSED] Can be interrupted, sleeps
[20:46:14] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[20:46:14] [PASSED] ttm_bo_reserve_locked_no_sleep
[20:46:14] [PASSED] ttm_bo_reserve_no_wait_ticket
[20:46:14] [PASSED] ttm_bo_reserve_double_resv
[20:46:14] [PASSED] ttm_bo_reserve_interrupted
[20:46:14] [PASSED] ttm_bo_reserve_deadlock
[20:46:14] [PASSED] ttm_bo_unreserve_basic
[20:46:14] [PASSED] ttm_bo_unreserve_pinned
[20:46:14] [PASSED] ttm_bo_unreserve_bulk
[20:46:14] [PASSED] ttm_bo_fini_basic
[20:46:14] [PASSED] ttm_bo_fini_shared_resv
[20:46:14] [PASSED] ttm_bo_pin_basic
[20:46:14] [PASSED] ttm_bo_pin_unpin_resource
[20:46:14] [PASSED] ttm_bo_multiple_pin_one_unpin
[20:46:14] ===================== [PASSED] ttm_bo ======================
[20:46:14] ============== ttm_bo_validate (21 subtests) ===============
[20:46:14] ============== ttm_bo_init_reserved_sys_man ===============
[20:46:14] [PASSED] Buffer object for userspace
[20:46:14] [PASSED] Kernel buffer object
[20:46:14] [PASSED] Shared buffer object
[20:46:14] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[20:46:14] ============== ttm_bo_init_reserved_mock_man ==============
[20:46:14] [PASSED] Buffer object for userspace
[20:46:14] [PASSED] Kernel buffer object
[20:46:14] [PASSED] Shared buffer object
[20:46:14] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[20:46:14] [PASSED] ttm_bo_init_reserved_resv
[20:46:14] ================== ttm_bo_validate_basic ==================
[20:46:14] [PASSED] Buffer object for userspace
[20:46:14] [PASSED] Kernel buffer object
[20:46:14] [PASSED] Shared buffer object
[20:46:14] ============== [PASSED] ttm_bo_validate_basic ==============
[20:46:14] [PASSED] ttm_bo_validate_invalid_placement
[20:46:14] ============= ttm_bo_validate_same_placement ==============
[20:46:14] [PASSED] System manager
[20:46:14] [PASSED] VRAM manager
[20:46:14] ========= [PASSED] ttm_bo_validate_same_placement ==========
[20:46:14] [PASSED] ttm_bo_validate_failed_alloc
[20:46:14] [PASSED] ttm_bo_validate_pinned
[20:46:14] [PASSED] ttm_bo_validate_busy_placement
[20:46:14] ================ ttm_bo_validate_multihop =================
[20:46:14] [PASSED] Buffer object for userspace
[20:46:14] [PASSED] Kernel buffer object
[20:46:14] [PASSED] Shared buffer object
[20:46:14] ============ [PASSED] ttm_bo_validate_multihop =============
[20:46:14] ========== ttm_bo_validate_no_placement_signaled ==========
[20:46:14] [PASSED] Buffer object in system domain, no page vector
[20:46:14] [PASSED] Buffer object in system domain with an existing page vector
[20:46:14] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[20:46:14] ======== ttm_bo_validate_no_placement_not_signaled ========
[20:46:14] [PASSED] Buffer object for userspace
[20:46:14] [PASSED] Kernel buffer object
[20:46:14] [PASSED] Shared buffer object
[20:46:14] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[20:46:14] [PASSED] ttm_bo_validate_move_fence_signaled
[20:46:14] ========= ttm_bo_validate_move_fence_not_signaled =========
[20:46:14] [PASSED] Waits for GPU
[20:46:14] [PASSED] Tries to lock straight away
[20:46:14] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[20:46:14] [PASSED] ttm_bo_validate_happy_evict
[20:46:14] [PASSED] ttm_bo_validate_all_pinned_evict
[20:46:14] [PASSED] ttm_bo_validate_allowed_only_evict
[20:46:14] [PASSED] ttm_bo_validate_deleted_evict
[20:46:14] [PASSED] ttm_bo_validate_busy_domain_evict
[20:46:14] [PASSED] ttm_bo_validate_evict_gutting
[20:46:14] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[20:46:14] ================= [PASSED] ttm_bo_validate =================
[20:46:14] ============================================================
[20:46:14] Testing complete. Ran 101 tests: passed: 101
[20:46:14] Elapsed time: 11.272s total, 1.735s configuring, 9.321s building, 0.186s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 23+ messages in thread* ✓ Xe.CI.BAT: success for drm/xe/guc: Add support for NPK as a GuC log target
2026-02-24 20:36 [PATCH] drm/xe/guc: Add support for NPK as a GuC log target Stuart Summers
2026-02-24 20:46 ` ✓ CI.KUnit: success for " Patchwork
@ 2026-02-24 21:20 ` Patchwork
2026-02-25 0:24 ` [PATCH] " Matt Roper
2026-02-25 5:31 ` ✗ Xe.CI.FULL: failure for " Patchwork
3 siblings, 0 replies; 23+ messages in thread
From: Patchwork @ 2026-02-24 21:20 UTC (permalink / raw)
To: Stuart Summers; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 921 bytes --]
== Series Details ==
Series: drm/xe/guc: Add support for NPK as a GuC log target
URL : https://patchwork.freedesktop.org/series/162087/
State : success
== Summary ==
CI Bug Log - changes from xe-4607-189174b3312588d97dc467dca7cfb9dce42ab81b_BAT -> xe-pw-162087v1_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (13 -> 13)
------------------------------
No changes in participating hosts
Changes
-------
No changes found
Build changes
-------------
* IGT: IGT_8768 -> IGT_8769
* Linux: xe-4607-189174b3312588d97dc467dca7cfb9dce42ab81b -> xe-pw-162087v1
IGT_8768: 8768
IGT_8769: 8769
xe-4607-189174b3312588d97dc467dca7cfb9dce42ab81b: 189174b3312588d97dc467dca7cfb9dce42ab81b
xe-pw-162087v1: 162087v1
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/index.html
[-- Attachment #2: Type: text/html, Size: 1483 bytes --]
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-02-24 20:36 [PATCH] drm/xe/guc: Add support for NPK as a GuC log target Stuart Summers
2026-02-24 20:46 ` ✓ CI.KUnit: success for " Patchwork
2026-02-24 21:20 ` ✓ Xe.CI.BAT: " Patchwork
@ 2026-02-25 0:24 ` Matt Roper
2026-02-25 21:52 ` Summers, Stuart
2026-02-25 5:31 ` ✗ Xe.CI.FULL: failure for " Patchwork
3 siblings, 1 reply; 23+ messages in thread
From: Matt Roper @ 2026-02-25 0:24 UTC (permalink / raw)
To: Stuart Summers; +Cc: shuicheng.lin, intel-xe
On Tue, Feb 24, 2026 at 08:36:16PM +0000, Stuart Summers wrote:
> From: John Harrison <John.C.Harrison@Intel.com>
>
> GuC provides the ability to gather logs through a hardware interface
> called NPK. For certain debugging scenarios this can be advantageous
> over getting logs from memory (or in addition to).
>
> Add a hook for this alternate debugging mode via a modparam similar
> to what is used for GuC log level. This translates into a parameter
> passed to GuC during load time.
In general we're not really supposed to be adding new module parameters
to the driver. Some existing parameters are grandfathered-in because
they were added during early driver development before we really had
better ways of configuring things. But when possible we should probably
be looking more at per-device solutions like configfs these days. It's
a bit more involved to use, but that's especially okay (maybe even
desirable) for something like this that is only useful for low-level
debugging and isn't actually usable or useful for end users on
production hardware.
Matt
>
> Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
> Signed-off-by: Stuart Summers <stuart.summers@intel.com>
> ---
> drivers/gpu/drm/xe/xe_defaults.h | 1 +
> drivers/gpu/drm/xe/xe_guc.c | 7 ++++++-
> drivers/gpu/drm/xe/xe_module.c | 4 ++++
> drivers/gpu/drm/xe/xe_module.h | 1 +
> 4 files changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_defaults.h b/drivers/gpu/drm/xe/xe_defaults.h
> index 5d5d41d067c5..194500fb0ab2 100644
> --- a/drivers/gpu/drm/xe/xe_defaults.h
> +++ b/drivers/gpu/drm/xe/xe_defaults.h
> @@ -12,6 +12,7 @@
> #else
> #define XE_DEFAULT_GUC_LOG_LEVEL 1
> #endif
> +#define XE_DEFAULT_GUC_LOG_TARGET 0
>
> #define XE_DEFAULT_PROBE_DISPLAY true
> #define XE_DEFAULT_VRAM_BAR_SIZE 0
> diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c
> index 54d2fc780127..10bf63c20a14 100644
> --- a/drivers/gpu/drm/xe/xe_guc.c
> +++ b/drivers/gpu/drm/xe/xe_guc.c
> @@ -79,7 +79,12 @@ static u32 guc_ctl_debug_flags(struct xe_guc *guc)
> if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
> flags |= GUC_LOG_DISABLED;
> else
> - flags |= FIELD_PREP(GUC_LOG_VERBOSITY, GUC_LOG_LEVEL_TO_VERBOSITY(level));
> + flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> + GUC_LOG_LEVEL_TO_VERBOSITY(level));
> +
> + if (xe_modparam.guc_log_target)
> + flags |= FIELD_PREP(GUC_LOG_DESTINATION,
> + xe_modparam.guc_log_target);
>
> return flags;
> }
> diff --git a/drivers/gpu/drm/xe/xe_module.c b/drivers/gpu/drm/xe/xe_module.c
> index 903d3b433421..1a8127e508e4 100644
> --- a/drivers/gpu/drm/xe/xe_module.c
> +++ b/drivers/gpu/drm/xe/xe_module.c
> @@ -23,6 +23,7 @@
> struct xe_modparam xe_modparam = {
> .probe_display = XE_DEFAULT_PROBE_DISPLAY,
> .guc_log_level = XE_DEFAULT_GUC_LOG_LEVEL,
> + .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
> .force_probe = XE_DEFAULT_FORCE_PROBE,
> #ifdef CONFIG_PCI_IOV
> .max_vfs = XE_DEFAULT_MAX_VFS,
> @@ -51,6 +52,9 @@ module_param_named(guc_log_level, xe_modparam.guc_log_level, int, 0600);
> MODULE_PARM_DESC(guc_log_level, "GuC firmware logging level (0=disable, 1=normal, 2..5=verbose-levels "
> "[default=" __stringify(XE_DEFAULT_GUC_LOG_LEVEL) "])");
>
> +module_param_named(guc_log_target, xe_modparam.guc_log_target, int, 0600);
> +MODULE_PARM_DESC(guc_log_target, "GuC firmware logging target (0=memory [default], 1 = NPK, 2 = memory + NPK)");
> +
> module_param_named_unsafe(guc_firmware_path, xe_modparam.guc_firmware_path, charp, 0400);
> MODULE_PARM_DESC(guc_firmware_path,
> "GuC firmware path to use instead of the default one");
> diff --git a/drivers/gpu/drm/xe/xe_module.h b/drivers/gpu/drm/xe/xe_module.h
> index 79cb9639c0f3..bab43dbacaa0 100644
> --- a/drivers/gpu/drm/xe/xe_module.h
> +++ b/drivers/gpu/drm/xe/xe_module.h
> @@ -14,6 +14,7 @@ struct xe_modparam {
> bool probe_display;
> int force_vram_bar_size;
> int guc_log_level;
> + int guc_log_target;
> char *guc_firmware_path;
> char *huc_firmware_path;
> char *gsc_firmware_path;
> --
> 2.34.1
>
--
Matt Roper
Graphics Software Engineer
Linux GPU Platform Enablement
Intel Corporation
^ permalink raw reply [flat|nested] 23+ messages in thread* Re: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-02-25 0:24 ` [PATCH] " Matt Roper
@ 2026-02-25 21:52 ` Summers, Stuart
2026-02-25 22:46 ` Matt Roper
0 siblings, 1 reply; 23+ messages in thread
From: Summers, Stuart @ 2026-02-25 21:52 UTC (permalink / raw)
To: Roper, Matthew D; +Cc: intel-xe@lists.freedesktop.org, Lin, Shuicheng
On Tue, 2026-02-24 at 16:24 -0800, Matt Roper wrote:
> On Tue, Feb 24, 2026 at 08:36:16PM +0000, Stuart Summers wrote:
> > From: John Harrison <John.C.Harrison@Intel.com>
> >
> > GuC provides the ability to gather logs through a hardware
> > interface
> > called NPK. For certain debugging scenarios this can be
> > advantageous
> > over getting logs from memory (or in addition to).
> >
> > Add a hook for this alternate debugging mode via a modparam similar
> > to what is used for GuC log level. This translates into a parameter
> > passed to GuC during load time.
>
> In general we're not really supposed to be adding new module
> parameters
> to the driver. Some existing parameters are grandfathered-in because
> they were added during early driver development before we really had
> better ways of configuring things. But when possible we should
> probably
> be looking more at per-device solutions like configfs these days.
> It's
> a bit more involved to use, but that's especially okay (maybe even
> desirable) for something like this that is only useful for low-level
> debugging and isn't actually usable or useful for end users on
> production hardware.
Very good point and you're right. I guess I'm a little hessitant to do
the same for the guc_log_level given we have a lot of tools using that
today in CI, etc, and converting all of those to configfs will take
some time. And I like the idea of keeping all of the GuC configuration
stuff in the same place. Let me know what you think there.
Thanks,
Stuart
>
>
> Matt
>
> >
> > Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
> > Signed-off-by: Stuart Summers <stuart.summers@intel.com>
> > ---
> > drivers/gpu/drm/xe/xe_defaults.h | 1 +
> > drivers/gpu/drm/xe/xe_guc.c | 7 ++++++-
> > drivers/gpu/drm/xe/xe_module.c | 4 ++++
> > drivers/gpu/drm/xe/xe_module.h | 1 +
> > 4 files changed, 12 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_defaults.h
> > b/drivers/gpu/drm/xe/xe_defaults.h
> > index 5d5d41d067c5..194500fb0ab2 100644
> > --- a/drivers/gpu/drm/xe/xe_defaults.h
> > +++ b/drivers/gpu/drm/xe/xe_defaults.h
> > @@ -12,6 +12,7 @@
> > #else
> > #define XE_DEFAULT_GUC_LOG_LEVEL 1
> > #endif
> > +#define XE_DEFAULT_GUC_LOG_TARGET 0
> >
> > #define XE_DEFAULT_PROBE_DISPLAY true
> > #define XE_DEFAULT_VRAM_BAR_SIZE 0
> > diff --git a/drivers/gpu/drm/xe/xe_guc.c
> > b/drivers/gpu/drm/xe/xe_guc.c
> > index 54d2fc780127..10bf63c20a14 100644
> > --- a/drivers/gpu/drm/xe/xe_guc.c
> > +++ b/drivers/gpu/drm/xe/xe_guc.c
> > @@ -79,7 +79,12 @@ static u32 guc_ctl_debug_flags(struct xe_guc
> > *guc)
> > if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
> > flags |= GUC_LOG_DISABLED;
> > else
> > - flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> > GUC_LOG_LEVEL_TO_VERBOSITY(level));
> > + flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> > +
> > GUC_LOG_LEVEL_TO_VERBOSITY(level));
> > +
> > + if (xe_modparam.guc_log_target)
> > + flags |= FIELD_PREP(GUC_LOG_DESTINATION,
> > + xe_modparam.guc_log_target);
> >
> > return flags;
> > }
> > diff --git a/drivers/gpu/drm/xe/xe_module.c
> > b/drivers/gpu/drm/xe/xe_module.c
> > index 903d3b433421..1a8127e508e4 100644
> > --- a/drivers/gpu/drm/xe/xe_module.c
> > +++ b/drivers/gpu/drm/xe/xe_module.c
> > @@ -23,6 +23,7 @@
> > struct xe_modparam xe_modparam = {
> > .probe_display = XE_DEFAULT_PROBE_DISPLAY,
> > .guc_log_level = XE_DEFAULT_GUC_LOG_LEVEL,
> > + .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
> > .force_probe = XE_DEFAULT_FORCE_PROBE,
> > #ifdef CONFIG_PCI_IOV
> > .max_vfs = XE_DEFAULT_MAX_VFS,
> > @@ -51,6 +52,9 @@ module_param_named(guc_log_level,
> > xe_modparam.guc_log_level, int, 0600);
> > MODULE_PARM_DESC(guc_log_level, "GuC firmware logging level
> > (0=disable, 1=normal, 2..5=verbose-levels "
> > "[default=" __stringify(XE_DEFAULT_GUC_LOG_LEVEL)
> > "])");
> >
> > +module_param_named(guc_log_target, xe_modparam.guc_log_target,
> > int, 0600);
> > +MODULE_PARM_DESC(guc_log_target, "GuC firmware logging target
> > (0=memory [default], 1 = NPK, 2 = memory + NPK)");
> > +
> > module_param_named_unsafe(guc_firmware_path,
> > xe_modparam.guc_firmware_path, charp, 0400);
> > MODULE_PARM_DESC(guc_firmware_path,
> > "GuC firmware path to use instead of the default
> > one");
> > diff --git a/drivers/gpu/drm/xe/xe_module.h
> > b/drivers/gpu/drm/xe/xe_module.h
> > index 79cb9639c0f3..bab43dbacaa0 100644
> > --- a/drivers/gpu/drm/xe/xe_module.h
> > +++ b/drivers/gpu/drm/xe/xe_module.h
> > @@ -14,6 +14,7 @@ struct xe_modparam {
> > bool probe_display;
> > int force_vram_bar_size;
> > int guc_log_level;
> > + int guc_log_target;
> > char *guc_firmware_path;
> > char *huc_firmware_path;
> > char *gsc_firmware_path;
> > --
> > 2.34.1
> >
>
^ permalink raw reply [flat|nested] 23+ messages in thread* Re: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-02-25 21:52 ` Summers, Stuart
@ 2026-02-25 22:46 ` Matt Roper
0 siblings, 0 replies; 23+ messages in thread
From: Matt Roper @ 2026-02-25 22:46 UTC (permalink / raw)
To: Summers, Stuart; +Cc: intel-xe@lists.freedesktop.org, Lin, Shuicheng
On Wed, Feb 25, 2026 at 01:52:11PM -0800, Summers, Stuart wrote:
> On Tue, 2026-02-24 at 16:24 -0800, Matt Roper wrote:
> > On Tue, Feb 24, 2026 at 08:36:16PM +0000, Stuart Summers wrote:
> > > From: John Harrison <John.C.Harrison@Intel.com>
> > >
> > > GuC provides the ability to gather logs through a hardware
> > > interface
> > > called NPK. For certain debugging scenarios this can be
> > > advantageous
> > > over getting logs from memory (or in addition to).
> > >
> > > Add a hook for this alternate debugging mode via a modparam similar
> > > to what is used for GuC log level. This translates into a parameter
> > > passed to GuC during load time.
> >
> > In general we're not really supposed to be adding new module
> > parameters
> > to the driver. Some existing parameters are grandfathered-in because
> > they were added during early driver development before we really had
> > better ways of configuring things. But when possible we should
> > probably
> > be looking more at per-device solutions like configfs these days.
> > It's
> > a bit more involved to use, but that's especially okay (maybe even
> > desirable) for something like this that is only useful for low-level
> > debugging and isn't actually usable or useful for end users on
> > production hardware.
>
> Very good point and you're right. I guess I'm a little hessitant to do
> the same for the guc_log_level given we have a lot of tools using that
> today in CI, etc, and converting all of those to configfs will take
> some time. And I like the idea of keeping all of the GuC configuration
> stuff in the same place. Let me know what you think there.
Well, I don't think I'm the one to make the call here; ultimately the
decision really lies with the maintainers since they'll be the ones on
the hook to justify upward why we're still breaking the rules. People
in the upstream Linux community like Greg KH have been pretty vocal
about how drivers should not be adding new module parameters for
drivers. E.g., https://lkml.org/lkml/2023/5/4/260 ("no, please do not
add new module parameters for drivers, this is not the 1990s").
Aside from possibly community pushback, there's also the general problem
that module parameters don't actually match what we're really trying to
do in a lot of cases these days. Most of the things we're configuring
with module parameters today should really be a per-device setting
rather than a global value that applies to all devices. Back in the
early days of i915 it didn't really matter because we didn't have dgpu's
yet so the driver would only ever be supporting a single igpu device.
But those days are far behind us and multi-GPU systems are quite common
now.
Matt
>
> Thanks,
> Stuart
>
> >
> >
> > Matt
> >
> > >
> > > Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
> > > Signed-off-by: Stuart Summers <stuart.summers@intel.com>
> > > ---
> > > drivers/gpu/drm/xe/xe_defaults.h | 1 +
> > > drivers/gpu/drm/xe/xe_guc.c | 7 ++++++-
> > > drivers/gpu/drm/xe/xe_module.c | 4 ++++
> > > drivers/gpu/drm/xe/xe_module.h | 1 +
> > > 4 files changed, 12 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/gpu/drm/xe/xe_defaults.h
> > > b/drivers/gpu/drm/xe/xe_defaults.h
> > > index 5d5d41d067c5..194500fb0ab2 100644
> > > --- a/drivers/gpu/drm/xe/xe_defaults.h
> > > +++ b/drivers/gpu/drm/xe/xe_defaults.h
> > > @@ -12,6 +12,7 @@
> > > #else
> > > #define XE_DEFAULT_GUC_LOG_LEVEL 1
> > > #endif
> > > +#define XE_DEFAULT_GUC_LOG_TARGET 0
> > >
> > > #define XE_DEFAULT_PROBE_DISPLAY true
> > > #define XE_DEFAULT_VRAM_BAR_SIZE 0
> > > diff --git a/drivers/gpu/drm/xe/xe_guc.c
> > > b/drivers/gpu/drm/xe/xe_guc.c
> > > index 54d2fc780127..10bf63c20a14 100644
> > > --- a/drivers/gpu/drm/xe/xe_guc.c
> > > +++ b/drivers/gpu/drm/xe/xe_guc.c
> > > @@ -79,7 +79,12 @@ static u32 guc_ctl_debug_flags(struct xe_guc
> > > *guc)
> > > if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
> > > flags |= GUC_LOG_DISABLED;
> > > else
> > > - flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> > > GUC_LOG_LEVEL_TO_VERBOSITY(level));
> > > + flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> > > +
> > > GUC_LOG_LEVEL_TO_VERBOSITY(level));
> > > +
> > > + if (xe_modparam.guc_log_target)
> > > + flags |= FIELD_PREP(GUC_LOG_DESTINATION,
> > > + xe_modparam.guc_log_target);
> > >
> > > return flags;
> > > }
> > > diff --git a/drivers/gpu/drm/xe/xe_module.c
> > > b/drivers/gpu/drm/xe/xe_module.c
> > > index 903d3b433421..1a8127e508e4 100644
> > > --- a/drivers/gpu/drm/xe/xe_module.c
> > > +++ b/drivers/gpu/drm/xe/xe_module.c
> > > @@ -23,6 +23,7 @@
> > > struct xe_modparam xe_modparam = {
> > > .probe_display = XE_DEFAULT_PROBE_DISPLAY,
> > > .guc_log_level = XE_DEFAULT_GUC_LOG_LEVEL,
> > > + .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
> > > .force_probe = XE_DEFAULT_FORCE_PROBE,
> > > #ifdef CONFIG_PCI_IOV
> > > .max_vfs = XE_DEFAULT_MAX_VFS,
> > > @@ -51,6 +52,9 @@ module_param_named(guc_log_level,
> > > xe_modparam.guc_log_level, int, 0600);
> > > MODULE_PARM_DESC(guc_log_level, "GuC firmware logging level
> > > (0=disable, 1=normal, 2..5=verbose-levels "
> > > "[default=" __stringify(XE_DEFAULT_GUC_LOG_LEVEL)
> > > "])");
> > >
> > > +module_param_named(guc_log_target, xe_modparam.guc_log_target,
> > > int, 0600);
> > > +MODULE_PARM_DESC(guc_log_target, "GuC firmware logging target
> > > (0=memory [default], 1 = NPK, 2 = memory + NPK)");
> > > +
> > > module_param_named_unsafe(guc_firmware_path,
> > > xe_modparam.guc_firmware_path, charp, 0400);
> > > MODULE_PARM_DESC(guc_firmware_path,
> > > "GuC firmware path to use instead of the default
> > > one");
> > > diff --git a/drivers/gpu/drm/xe/xe_module.h
> > > b/drivers/gpu/drm/xe/xe_module.h
> > > index 79cb9639c0f3..bab43dbacaa0 100644
> > > --- a/drivers/gpu/drm/xe/xe_module.h
> > > +++ b/drivers/gpu/drm/xe/xe_module.h
> > > @@ -14,6 +14,7 @@ struct xe_modparam {
> > > bool probe_display;
> > > int force_vram_bar_size;
> > > int guc_log_level;
> > > + int guc_log_target;
> > > char *guc_firmware_path;
> > > char *huc_firmware_path;
> > > char *gsc_firmware_path;
> > > --
> > > 2.34.1
> > >
> >
>
--
Matt Roper
Graphics Software Engineer
Linux GPU Platform Enablement
Intel Corporation
^ permalink raw reply [flat|nested] 23+ messages in thread
* ✗ Xe.CI.FULL: failure for drm/xe/guc: Add support for NPK as a GuC log target
2026-02-24 20:36 [PATCH] drm/xe/guc: Add support for NPK as a GuC log target Stuart Summers
` (2 preceding siblings ...)
2026-02-25 0:24 ` [PATCH] " Matt Roper
@ 2026-02-25 5:31 ` Patchwork
3 siblings, 0 replies; 23+ messages in thread
From: Patchwork @ 2026-02-25 5:31 UTC (permalink / raw)
To: Stuart Summers; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 7464 bytes --]
== Series Details ==
Series: drm/xe/guc: Add support for NPK as a GuC log target
URL : https://patchwork.freedesktop.org/series/162087/
State : failure
== Summary ==
CI Bug Log - changes from xe-4607-189174b3312588d97dc467dca7cfb9dce42ab81b_FULL -> xe-pw-162087v1_FULL
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with xe-pw-162087v1_FULL absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in xe-pw-162087v1_FULL, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
to document this new failure mode, which will reduce false positives in CI.
Participating hosts (2 -> 2)
------------------------------
No changes in participating hosts
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in xe-pw-162087v1_FULL:
### IGT changes ###
#### Possible regressions ####
* igt@xe_exec_fault_mode@twice-bindexecqueue-imm:
- shard-lnl: NOTRUN -> [ABORT][1] +21 other tests abort
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-lnl-4/igt@xe_exec_fault_mode@twice-bindexecqueue-imm.html
* igt@xe_exec_system_allocator@threads-shared-vm-many-execqueues-mmap-prefetch:
- shard-bmg: NOTRUN -> [ABORT][2] +23 other tests abort
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-bmg-9/igt@xe_exec_system_allocator@threads-shared-vm-many-execqueues-mmap-prefetch.html
Known issues
------------
Here are the changes found in xe-pw-162087v1_FULL that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@kms_big_fb@yf-tiled-32bpp-rotate-0:
- shard-bmg: NOTRUN -> [SKIP][3] ([Intel XE#1124])
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-bmg-4/igt@kms_big_fb@yf-tiled-32bpp-rotate-0.html
- shard-lnl: NOTRUN -> [SKIP][4] ([Intel XE#1124])
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-lnl-6/igt@kms_big_fb@yf-tiled-32bpp-rotate-0.html
* igt@kms_cursor_legacy@2x-flip-vs-cursor-legacy:
- shard-lnl: NOTRUN -> [SKIP][5] ([Intel XE#309]) +1 other test skip
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-lnl-7/igt@kms_cursor_legacy@2x-flip-vs-cursor-legacy.html
* igt@kms_dirtyfb@drrs-dirtyfb-ioctl:
- shard-lnl: NOTRUN -> [SKIP][6] ([Intel XE#1508])
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-lnl-6/igt@kms_dirtyfb@drrs-dirtyfb-ioctl.html
* igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-move:
- shard-bmg: NOTRUN -> [SKIP][7] ([Intel XE#4141])
[7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-bmg-8/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-move.html
* igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-render:
- shard-lnl: NOTRUN -> [SKIP][8] ([Intel XE#656]) +3 other tests skip
[8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-lnl-8/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-render.html
* igt@kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-mmap-wc:
- shard-bmg: NOTRUN -> [SKIP][9] ([Intel XE#2313]) +5 other tests skip
[9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-bmg-6/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-mmap-wc.html
* igt@kms_pm_backlight@brightness-with-dpms:
- shard-bmg: NOTRUN -> [SKIP][10] ([Intel XE#2938])
[10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-bmg-8/igt@kms_pm_backlight@brightness-with-dpms.html
* igt@xe_evict@evict-beng-mixed-threads-large-multi-vm:
- shard-lnl: NOTRUN -> [SKIP][11] ([Intel XE#6540] / [Intel XE#688])
[11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-lnl-6/igt@xe_evict@evict-beng-mixed-threads-large-multi-vm.html
* igt@xe_exec_multi_queue@max-queues-preempt-mode-dyn-priority-smem:
- shard-lnl: NOTRUN -> [SKIP][12] ([Intel XE#6874]) +2 other tests skip
[12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-lnl-4/igt@xe_exec_multi_queue@max-queues-preempt-mode-dyn-priority-smem.html
* igt@xe_exec_multi_queue@two-queues-priority:
- shard-bmg: NOTRUN -> [SKIP][13] ([Intel XE#6874]) +3 other tests skip
[13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-bmg-5/igt@xe_exec_multi_queue@two-queues-priority.html
* igt@xe_exec_threads@threads-multi-queue-cm-shared-vm-userptr-rebind:
- shard-lnl: NOTRUN -> [SKIP][14] ([Intel XE#7138])
[14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-lnl-4/igt@xe_exec_threads@threads-multi-queue-cm-shared-vm-userptr-rebind.html
- shard-bmg: NOTRUN -> [SKIP][15] ([Intel XE#7138])
[15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-bmg-6/igt@xe_exec_threads@threads-multi-queue-cm-shared-vm-userptr-rebind.html
* igt@xe_multigpu_svm@mgpu-atomic-op-basic:
- shard-bmg: NOTRUN -> [SKIP][16] ([Intel XE#6964])
[16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-bmg-1/igt@xe_multigpu_svm@mgpu-atomic-op-basic.html
- shard-lnl: NOTRUN -> [SKIP][17] ([Intel XE#6964])
[17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-lnl-5/igt@xe_multigpu_svm@mgpu-atomic-op-basic.html
* igt@xe_pxp@pxp-termination-key-update-post-rpm:
- shard-bmg: NOTRUN -> [SKIP][18] ([Intel XE#4733])
[18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-bmg-3/igt@xe_pxp@pxp-termination-key-update-post-rpm.html
* igt@xe_query@multigpu-query-config:
- shard-lnl: NOTRUN -> [SKIP][19] ([Intel XE#944])
[19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/shard-lnl-6/igt@xe_query@multigpu-query-config.html
[Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
[Intel XE#1508]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1508
[Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
[Intel XE#2938]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2938
[Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
[Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
[Intel XE#4733]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4733
[Intel XE#6540]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6540
[Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
[Intel XE#6874]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6874
[Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
[Intel XE#6964]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6964
[Intel XE#7138]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7138
[Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
Build changes
-------------
* IGT: IGT_8768 -> IGT_8769
* Linux: xe-4607-189174b3312588d97dc467dca7cfb9dce42ab81b -> xe-pw-162087v1
IGT_8768: 8768
IGT_8769: 8769
xe-4607-189174b3312588d97dc467dca7cfb9dce42ab81b: 189174b3312588d97dc467dca7cfb9dce42ab81b
xe-pw-162087v1: 162087v1
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162087v1/index.html
[-- Attachment #2: Type: text/html, Size: 8724 bytes --]
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
@ 2026-02-26 23:26 Stuart Summers
2026-03-19 18:25 ` Summers, Stuart
` (2 more replies)
0 siblings, 3 replies; 23+ messages in thread
From: Stuart Summers @ 2026-02-26 23:26 UTC (permalink / raw)
Cc: shuicheng.lin, matthew.d.roper, intel-xe, John Harrison,
Stuart Summers
From: John Harrison <John.C.Harrison@Intel.com>
GuC provides the ability to gather logs through a hardware interface
called NPK. For certain debugging scenarios this can be advantageous
over getting logs from memory (or in addition to).
Add a hook for this alternate debugging mode via a configfs. This
translates into a parameter passed to GuC during load time.
v2: Convert to configfs from modparam (Matt)
Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
Signed-off-by: Stuart Summers <stuart.summers@intel.com>
---
drivers/gpu/drm/xe/xe_configfs.c | 60 ++++++++++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_configfs.h | 5 +++
drivers/gpu/drm/xe/xe_defaults.h | 1 +
drivers/gpu/drm/xe/xe_guc.c | 7 +++-
4 files changed, 72 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/xe/xe_configfs.c b/drivers/gpu/drm/xe/xe_configfs.c
index 078dee985d24..e0c21328af75 100644
--- a/drivers/gpu/drm/xe/xe_configfs.c
+++ b/drivers/gpu/drm/xe/xe_configfs.c
@@ -83,6 +83,16 @@
*
* This attribute can only be set before binding to the device.
*
+ * GuC log target:
+ * -------------
+ *
+ * Set the destination for the GuC log. 0 - memory only (default),
+ * 1 - NPK only, 2 - memory + NPK.
+ *
+ * # echo 2 > /sys/kernel/config/xe/0000:03:00.0/guc_log_target
+ *
+ * This attribute can only be set before binding to the device.
+ *
* Allowed GT types:
* -----------------
*
@@ -256,6 +266,7 @@ struct xe_config_group_device {
struct config_group sriov;
struct xe_config_device {
+ u8 guc_log_target;
u64 gt_types_allowed;
u64 engines_allowed;
struct wa_bb ctx_restore_post_bb[XE_ENGINE_CLASS_MAX];
@@ -277,6 +288,7 @@ struct xe_config_group_device {
};
static const struct xe_config_device device_defaults = {
+ .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
.gt_types_allowed = U64_MAX,
.engines_allowed = U64_MAX,
.survivability_mode = false,
@@ -357,6 +369,37 @@ static bool is_bound(struct xe_config_group_device *dev)
return ret;
}
+static ssize_t guc_log_target_show(struct config_item *item, char *page)
+{
+ struct xe_config_device *dev = to_xe_config_device(item);
+
+ return sprintf(page, "%d\n", dev->guc_log_target);
+}
+
+static ssize_t guc_log_target_store(struct config_item *item, const char *page, size_t len)
+{
+ struct xe_config_group_device *dev = to_xe_config_group_device(item);
+ u8 guc_log_target;
+ int ret;
+
+ ret = kstrtou8(page, 0, &guc_log_target);
+ if (ret)
+ return ret;
+
+#define GUC_LOG_TARGET_MAX 2
+ if (guc_log_target > GUC_LOG_TARGET_MAX)
+ return -EINVAL;
+#undef GUC_LOG_TARGET_MAX
+
+ guard(mutex)(&dev->lock);
+ if (is_bound(dev))
+ return -EBUSY;
+
+ dev->config.guc_log_target = guc_log_target;
+
+ return len;
+}
+
static ssize_t survivability_mode_show(struct config_item *item, char *page)
{
struct xe_config_device *dev = to_xe_config_device(item);
@@ -814,6 +857,7 @@ CONFIGFS_ATTR(, ctx_restore_mid_bb);
CONFIGFS_ATTR(, ctx_restore_post_bb);
CONFIGFS_ATTR(, enable_psmi);
CONFIGFS_ATTR(, engines_allowed);
+CONFIGFS_ATTR(, guc_log_target);
CONFIGFS_ATTR(, gt_types_allowed);
CONFIGFS_ATTR(, survivability_mode);
@@ -822,6 +866,7 @@ static struct configfs_attribute *xe_config_device_attrs[] = {
&attr_ctx_restore_post_bb,
&attr_enable_psmi,
&attr_engines_allowed,
+ &attr_guc_log_target,
&attr_gt_types_allowed,
&attr_survivability_mode,
NULL,
@@ -1094,6 +1139,7 @@ static void dump_custom_dev_config(struct pci_dev *pdev,
dev->config.attr_); \
} while (0)
+ PRI_CUSTOM_ATTR("%d", guc_log_target);
PRI_CUSTOM_ATTR("%llx", gt_types_allowed);
PRI_CUSTOM_ATTR("%llx", engines_allowed);
PRI_CUSTOM_ATTR("%d", enable_psmi);
@@ -1146,6 +1192,20 @@ bool xe_configfs_get_survivability_mode(struct pci_dev *pdev)
return mode;
}
+u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev)
+{
+ struct xe_config_group_device *dev = find_xe_config_group_device(pdev);
+ u8 target;
+
+ if (!dev)
+ return device_defaults.guc_log_target;
+
+ target = dev->config.guc_log_target;
+ config_group_put(&dev->group);
+
+ return target;
+}
+
static u64 get_gt_types_allowed(struct pci_dev *pdev)
{
struct xe_config_group_device *dev = find_xe_config_group_device(pdev);
diff --git a/drivers/gpu/drm/xe/xe_configfs.h b/drivers/gpu/drm/xe/xe_configfs.h
index 07d62bf0c152..fb5cb7c57e75 100644
--- a/drivers/gpu/drm/xe/xe_configfs.h
+++ b/drivers/gpu/drm/xe/xe_configfs.h
@@ -19,6 +19,7 @@ int xe_configfs_init(void);
void xe_configfs_exit(void);
void xe_configfs_check_device(struct pci_dev *pdev);
bool xe_configfs_get_survivability_mode(struct pci_dev *pdev);
+u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev);
bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev);
bool xe_configfs_media_gt_allowed(struct pci_dev *pdev);
u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
@@ -38,6 +39,10 @@ static inline int xe_configfs_init(void) { return 0; }
static inline void xe_configfs_exit(void) { }
static inline void xe_configfs_check_device(struct pci_dev *pdev) { }
static inline bool xe_configfs_get_survivability_mode(struct pci_dev *pdev) { return false; }
+static inline u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev)
+{
+ return XE_DEFAULT_GUC_LOG_TARGET;
+}
static inline bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev) { return true; }
static inline bool xe_configfs_media_gt_allowed(struct pci_dev *pdev) { return true; }
static inline u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev) { return U64_MAX; }
diff --git a/drivers/gpu/drm/xe/xe_defaults.h b/drivers/gpu/drm/xe/xe_defaults.h
index c8ae1d5f3d60..fbe670668a04 100644
--- a/drivers/gpu/drm/xe/xe_defaults.h
+++ b/drivers/gpu/drm/xe/xe_defaults.h
@@ -12,6 +12,7 @@
#else
#define XE_DEFAULT_GUC_LOG_LEVEL 1
#endif
+#define XE_DEFAULT_GUC_LOG_TARGET 0
#define XE_DEFAULT_PROBE_DISPLAY IS_ENABLED(CONFIG_DRM_XE_DISPLAY)
#define XE_DEFAULT_VRAM_BAR_SIZE 0
diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c
index 54d2fc780127..d98d5d051f1b 100644
--- a/drivers/gpu/drm/xe/xe_guc.c
+++ b/drivers/gpu/drm/xe/xe_guc.c
@@ -73,13 +73,18 @@ static u32 guc_bo_ggtt_addr(struct xe_guc *guc,
static u32 guc_ctl_debug_flags(struct xe_guc *guc)
{
+ struct pci_dev *pdev = to_pci_dev(guc_to_xe(guc)->drm.dev);
u32 level = xe_guc_log_get_level(&guc->log);
u32 flags = 0;
if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
flags |= GUC_LOG_DISABLED;
else
- flags |= FIELD_PREP(GUC_LOG_VERBOSITY, GUC_LOG_LEVEL_TO_VERBOSITY(level));
+ flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
+ GUC_LOG_LEVEL_TO_VERBOSITY(level));
+
+ flags |= FIELD_PREP(GUC_LOG_DESTINATION,
+ xe_configfs_get_guc_log_target(pdev));
return flags;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-02-26 23:26 [PATCH] " Stuart Summers
@ 2026-03-19 18:25 ` Summers, Stuart
2026-04-06 17:58 ` Summers, Stuart
2026-04-06 21:28 ` Daniele Ceraolo Spurio
2026-04-06 21:59 ` Lin, Shuicheng
2 siblings, 1 reply; 23+ messages in thread
From: Summers, Stuart @ 2026-03-19 18:25 UTC (permalink / raw)
To: Summers, Stuart
Cc: intel-xe@lists.freedesktop.org, Lin, Shuicheng, Roper, Matthew D,
Ceraolo Spurio, Daniele
Quick ping here and also CC Daniele in case you have any feedback.
It would be great to get this merged so we aren't carrying this patch
separately for debug purposes.
Thanks,
Stuart
On Thu, 2026-02-26 at 23:26 +0000, Stuart Summers wrote:
> From: John Harrison <John.C.Harrison@Intel.com>
>
> GuC provides the ability to gather logs through a hardware interface
> called NPK. For certain debugging scenarios this can be advantageous
> over getting logs from memory (or in addition to).
>
> Add a hook for this alternate debugging mode via a configfs. This
> translates into a parameter passed to GuC during load time.
>
> v2: Convert to configfs from modparam (Matt)
>
> Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
> Signed-off-by: Stuart Summers <stuart.summers@intel.com>
> ---
> drivers/gpu/drm/xe/xe_configfs.c | 60
> ++++++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_configfs.h | 5 +++
> drivers/gpu/drm/xe/xe_defaults.h | 1 +
> drivers/gpu/drm/xe/xe_guc.c | 7 +++-
> 4 files changed, 72 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_configfs.c
> b/drivers/gpu/drm/xe/xe_configfs.c
> index 078dee985d24..e0c21328af75 100644
> --- a/drivers/gpu/drm/xe/xe_configfs.c
> +++ b/drivers/gpu/drm/xe/xe_configfs.c
> @@ -83,6 +83,16 @@
> *
> * This attribute can only be set before binding to the device.
> *
> + * GuC log target:
> + * -------------
> + *
> + * Set the destination for the GuC log. 0 - memory only (default),
> + * 1 - NPK only, 2 - memory + NPK.
> + *
> + * # echo 2 > /sys/kernel/config/xe/0000:03:00.0/guc_log_target
> + *
> + * This attribute can only be set before binding to the device.
> + *
> * Allowed GT types:
> * -----------------
> *
> @@ -256,6 +266,7 @@ struct xe_config_group_device {
> struct config_group sriov;
>
> struct xe_config_device {
> + u8 guc_log_target;
> u64 gt_types_allowed;
> u64 engines_allowed;
> struct wa_bb
> ctx_restore_post_bb[XE_ENGINE_CLASS_MAX];
> @@ -277,6 +288,7 @@ struct xe_config_group_device {
> };
>
> static const struct xe_config_device device_defaults = {
> + .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
> .gt_types_allowed = U64_MAX,
> .engines_allowed = U64_MAX,
> .survivability_mode = false,
> @@ -357,6 +369,37 @@ static bool is_bound(struct
> xe_config_group_device *dev)
> return ret;
> }
>
> +static ssize_t guc_log_target_show(struct config_item *item, char
> *page)
> +{
> + struct xe_config_device *dev = to_xe_config_device(item);
> +
> + return sprintf(page, "%d\n", dev->guc_log_target);
> +}
> +
> +static ssize_t guc_log_target_store(struct config_item *item, const
> char *page, size_t len)
> +{
> + struct xe_config_group_device *dev =
> to_xe_config_group_device(item);
> + u8 guc_log_target;
> + int ret;
> +
> + ret = kstrtou8(page, 0, &guc_log_target);
> + if (ret)
> + return ret;
> +
> +#define GUC_LOG_TARGET_MAX 2
> + if (guc_log_target > GUC_LOG_TARGET_MAX)
> + return -EINVAL;
> +#undef GUC_LOG_TARGET_MAX
> +
> + guard(mutex)(&dev->lock);
> + if (is_bound(dev))
> + return -EBUSY;
> +
> + dev->config.guc_log_target = guc_log_target;
> +
> + return len;
> +}
> +
> static ssize_t survivability_mode_show(struct config_item *item,
> char *page)
> {
> struct xe_config_device *dev = to_xe_config_device(item);
> @@ -814,6 +857,7 @@ CONFIGFS_ATTR(, ctx_restore_mid_bb);
> CONFIGFS_ATTR(, ctx_restore_post_bb);
> CONFIGFS_ATTR(, enable_psmi);
> CONFIGFS_ATTR(, engines_allowed);
> +CONFIGFS_ATTR(, guc_log_target);
> CONFIGFS_ATTR(, gt_types_allowed);
> CONFIGFS_ATTR(, survivability_mode);
>
> @@ -822,6 +866,7 @@ static struct configfs_attribute
> *xe_config_device_attrs[] = {
> &attr_ctx_restore_post_bb,
> &attr_enable_psmi,
> &attr_engines_allowed,
> + &attr_guc_log_target,
> &attr_gt_types_allowed,
> &attr_survivability_mode,
> NULL,
> @@ -1094,6 +1139,7 @@ static void dump_custom_dev_config(struct
> pci_dev *pdev,
> dev->config.attr_); \
> } while (0)
>
> + PRI_CUSTOM_ATTR("%d", guc_log_target);
> PRI_CUSTOM_ATTR("%llx", gt_types_allowed);
> PRI_CUSTOM_ATTR("%llx", engines_allowed);
> PRI_CUSTOM_ATTR("%d", enable_psmi);
> @@ -1146,6 +1192,20 @@ bool xe_configfs_get_survivability_mode(struct
> pci_dev *pdev)
> return mode;
> }
>
> +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev)
> +{
> + struct xe_config_group_device *dev =
> find_xe_config_group_device(pdev);
> + u8 target;
> +
> + if (!dev)
> + return device_defaults.guc_log_target;
> +
> + target = dev->config.guc_log_target;
> + config_group_put(&dev->group);
> +
> + return target;
> +}
> +
> static u64 get_gt_types_allowed(struct pci_dev *pdev)
> {
> struct xe_config_group_device *dev =
> find_xe_config_group_device(pdev);
> diff --git a/drivers/gpu/drm/xe/xe_configfs.h
> b/drivers/gpu/drm/xe/xe_configfs.h
> index 07d62bf0c152..fb5cb7c57e75 100644
> --- a/drivers/gpu/drm/xe/xe_configfs.h
> +++ b/drivers/gpu/drm/xe/xe_configfs.h
> @@ -19,6 +19,7 @@ int xe_configfs_init(void);
> void xe_configfs_exit(void);
> void xe_configfs_check_device(struct pci_dev *pdev);
> bool xe_configfs_get_survivability_mode(struct pci_dev *pdev);
> +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev);
> bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev);
> bool xe_configfs_media_gt_allowed(struct pci_dev *pdev);
> u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
> @@ -38,6 +39,10 @@ static inline int xe_configfs_init(void) { return
> 0; }
> static inline void xe_configfs_exit(void) { }
> static inline void xe_configfs_check_device(struct pci_dev *pdev) {
> }
> static inline bool xe_configfs_get_survivability_mode(struct pci_dev
> *pdev) { return false; }
> +static inline u8 xe_configfs_get_guc_log_target(struct pci_dev
> *pdev)
> +{
> + return XE_DEFAULT_GUC_LOG_TARGET;
> +}
> static inline bool xe_configfs_primary_gt_allowed(struct pci_dev
> *pdev) { return true; }
> static inline bool xe_configfs_media_gt_allowed(struct pci_dev
> *pdev) { return true; }
> static inline u64 xe_configfs_get_engines_allowed(struct pci_dev
> *pdev) { return U64_MAX; }
> diff --git a/drivers/gpu/drm/xe/xe_defaults.h
> b/drivers/gpu/drm/xe/xe_defaults.h
> index c8ae1d5f3d60..fbe670668a04 100644
> --- a/drivers/gpu/drm/xe/xe_defaults.h
> +++ b/drivers/gpu/drm/xe/xe_defaults.h
> @@ -12,6 +12,7 @@
> #else
> #define XE_DEFAULT_GUC_LOG_LEVEL 1
> #endif
> +#define XE_DEFAULT_GUC_LOG_TARGET 0
>
> #define
> XE_DEFAULT_PROBE_DISPLAY IS_ENABLED(CONFIG_DRM_XE_DISPL
> AY)
> #define XE_DEFAULT_VRAM_BAR_SIZE 0
> diff --git a/drivers/gpu/drm/xe/xe_guc.c
> b/drivers/gpu/drm/xe/xe_guc.c
> index 54d2fc780127..d98d5d051f1b 100644
> --- a/drivers/gpu/drm/xe/xe_guc.c
> +++ b/drivers/gpu/drm/xe/xe_guc.c
> @@ -73,13 +73,18 @@ static u32 guc_bo_ggtt_addr(struct xe_guc *guc,
>
> static u32 guc_ctl_debug_flags(struct xe_guc *guc)
> {
> + struct pci_dev *pdev = to_pci_dev(guc_to_xe(guc)->drm.dev);
> u32 level = xe_guc_log_get_level(&guc->log);
> u32 flags = 0;
>
> if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
> flags |= GUC_LOG_DISABLED;
> else
> - flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> GUC_LOG_LEVEL_TO_VERBOSITY(level));
> + flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> +
> GUC_LOG_LEVEL_TO_VERBOSITY(level));
> +
> + flags |= FIELD_PREP(GUC_LOG_DESTINATION,
> + xe_configfs_get_guc_log_target(pdev));
>
> return flags;
> }
^ permalink raw reply [flat|nested] 23+ messages in thread* Re: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-03-19 18:25 ` Summers, Stuart
@ 2026-04-06 17:58 ` Summers, Stuart
0 siblings, 0 replies; 23+ messages in thread
From: Summers, Stuart @ 2026-04-06 17:58 UTC (permalink / raw)
To: Summers, Stuart
Cc: intel-xe@lists.freedesktop.org, Lin, Shuicheng, Yang, Fei,
Roper, Matthew D, Ceraolo Spurio, Daniele
On Thu, 2026-03-19 at 18:25 +0000, Summers, Stuart wrote:
> Quick ping here and also CC Daniele in case you have any feedback.
>
> It would be great to get this merged so we aren't carrying this patch
> separately for debug purposes.
Another ping.. We are actively using this for debug and I'd really like
to get this merged.
Also adding Fei in case you have any feedback here.
Thanks,
Stuart
>
> Thanks,
> Stuart
>
> On Thu, 2026-02-26 at 23:26 +0000, Stuart Summers wrote:
> > From: John Harrison <John.C.Harrison@Intel.com>
> >
> > GuC provides the ability to gather logs through a hardware
> > interface
> > called NPK. For certain debugging scenarios this can be
> > advantageous
> > over getting logs from memory (or in addition to).
> >
> > Add a hook for this alternate debugging mode via a configfs. This
> > translates into a parameter passed to GuC during load time.
> >
> > v2: Convert to configfs from modparam (Matt)
> >
> > Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
> > Signed-off-by: Stuart Summers <stuart.summers@intel.com>
> > ---
> > drivers/gpu/drm/xe/xe_configfs.c | 60
> > ++++++++++++++++++++++++++++++++
> > drivers/gpu/drm/xe/xe_configfs.h | 5 +++
> > drivers/gpu/drm/xe/xe_defaults.h | 1 +
> > drivers/gpu/drm/xe/xe_guc.c | 7 +++-
> > 4 files changed, 72 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_configfs.c
> > b/drivers/gpu/drm/xe/xe_configfs.c
> > index 078dee985d24..e0c21328af75 100644
> > --- a/drivers/gpu/drm/xe/xe_configfs.c
> > +++ b/drivers/gpu/drm/xe/xe_configfs.c
> > @@ -83,6 +83,16 @@
> > *
> > * This attribute can only be set before binding to the device.
> > *
> > + * GuC log target:
> > + * -------------
> > + *
> > + * Set the destination for the GuC log. 0 - memory only (default),
> > + * 1 - NPK only, 2 - memory + NPK.
> > + *
> > + * # echo 2 >
> > /sys/kernel/config/xe/0000:03:00.0/guc_log_target
> > + *
> > + * This attribute can only be set before binding to the device.
> > + *
> > * Allowed GT types:
> > * -----------------
> > *
> > @@ -256,6 +266,7 @@ struct xe_config_group_device {
> > struct config_group sriov;
> >
> > struct xe_config_device {
> > + u8 guc_log_target;
> > u64 gt_types_allowed;
> > u64 engines_allowed;
> > struct wa_bb
> > ctx_restore_post_bb[XE_ENGINE_CLASS_MAX];
> > @@ -277,6 +288,7 @@ struct xe_config_group_device {
> > };
> >
> > static const struct xe_config_device device_defaults = {
> > + .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
> > .gt_types_allowed = U64_MAX,
> > .engines_allowed = U64_MAX,
> > .survivability_mode = false,
> > @@ -357,6 +369,37 @@ static bool is_bound(struct
> > xe_config_group_device *dev)
> > return ret;
> > }
> >
> > +static ssize_t guc_log_target_show(struct config_item *item, char
> > *page)
> > +{
> > + struct xe_config_device *dev = to_xe_config_device(item);
> > +
> > + return sprintf(page, "%d\n", dev->guc_log_target);
> > +}
> > +
> > +static ssize_t guc_log_target_store(struct config_item *item,
> > const
> > char *page, size_t len)
> > +{
> > + struct xe_config_group_device *dev =
> > to_xe_config_group_device(item);
> > + u8 guc_log_target;
> > + int ret;
> > +
> > + ret = kstrtou8(page, 0, &guc_log_target);
> > + if (ret)
> > + return ret;
> > +
> > +#define GUC_LOG_TARGET_MAX 2
> > + if (guc_log_target > GUC_LOG_TARGET_MAX)
> > + return -EINVAL;
> > +#undef GUC_LOG_TARGET_MAX
> > +
> > + guard(mutex)(&dev->lock);
> > + if (is_bound(dev))
> > + return -EBUSY;
> > +
> > + dev->config.guc_log_target = guc_log_target;
> > +
> > + return len;
> > +}
> > +
> > static ssize_t survivability_mode_show(struct config_item *item,
> > char *page)
> > {
> > struct xe_config_device *dev = to_xe_config_device(item);
> > @@ -814,6 +857,7 @@ CONFIGFS_ATTR(, ctx_restore_mid_bb);
> > CONFIGFS_ATTR(, ctx_restore_post_bb);
> > CONFIGFS_ATTR(, enable_psmi);
> > CONFIGFS_ATTR(, engines_allowed);
> > +CONFIGFS_ATTR(, guc_log_target);
> > CONFIGFS_ATTR(, gt_types_allowed);
> > CONFIGFS_ATTR(, survivability_mode);
> >
> > @@ -822,6 +866,7 @@ static struct configfs_attribute
> > *xe_config_device_attrs[] = {
> > &attr_ctx_restore_post_bb,
> > &attr_enable_psmi,
> > &attr_engines_allowed,
> > + &attr_guc_log_target,
> > &attr_gt_types_allowed,
> > &attr_survivability_mode,
> > NULL,
> > @@ -1094,6 +1139,7 @@ static void dump_custom_dev_config(struct
> > pci_dev *pdev,
> > dev->config.attr_); \
> > } while (0)
> >
> > + PRI_CUSTOM_ATTR("%d", guc_log_target);
> > PRI_CUSTOM_ATTR("%llx", gt_types_allowed);
> > PRI_CUSTOM_ATTR("%llx", engines_allowed);
> > PRI_CUSTOM_ATTR("%d", enable_psmi);
> > @@ -1146,6 +1192,20 @@ bool
> > xe_configfs_get_survivability_mode(struct
> > pci_dev *pdev)
> > return mode;
> > }
> >
> > +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev)
> > +{
> > + struct xe_config_group_device *dev =
> > find_xe_config_group_device(pdev);
> > + u8 target;
> > +
> > + if (!dev)
> > + return device_defaults.guc_log_target;
> > +
> > + target = dev->config.guc_log_target;
> > + config_group_put(&dev->group);
> > +
> > + return target;
> > +}
> > +
> > static u64 get_gt_types_allowed(struct pci_dev *pdev)
> > {
> > struct xe_config_group_device *dev =
> > find_xe_config_group_device(pdev);
> > diff --git a/drivers/gpu/drm/xe/xe_configfs.h
> > b/drivers/gpu/drm/xe/xe_configfs.h
> > index 07d62bf0c152..fb5cb7c57e75 100644
> > --- a/drivers/gpu/drm/xe/xe_configfs.h
> > +++ b/drivers/gpu/drm/xe/xe_configfs.h
> > @@ -19,6 +19,7 @@ int xe_configfs_init(void);
> > void xe_configfs_exit(void);
> > void xe_configfs_check_device(struct pci_dev *pdev);
> > bool xe_configfs_get_survivability_mode(struct pci_dev *pdev);
> > +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev);
> > bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev);
> > bool xe_configfs_media_gt_allowed(struct pci_dev *pdev);
> > u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
> > @@ -38,6 +39,10 @@ static inline int xe_configfs_init(void) {
> > return
> > 0; }
> > static inline void xe_configfs_exit(void) { }
> > static inline void xe_configfs_check_device(struct pci_dev *pdev)
> > {
> > }
> > static inline bool xe_configfs_get_survivability_mode(struct
> > pci_dev
> > *pdev) { return false; }
> > +static inline u8 xe_configfs_get_guc_log_target(struct pci_dev
> > *pdev)
> > +{
> > + return XE_DEFAULT_GUC_LOG_TARGET;
> > +}
> > static inline bool xe_configfs_primary_gt_allowed(struct pci_dev
> > *pdev) { return true; }
> > static inline bool xe_configfs_media_gt_allowed(struct pci_dev
> > *pdev) { return true; }
> > static inline u64 xe_configfs_get_engines_allowed(struct pci_dev
> > *pdev) { return U64_MAX; }
> > diff --git a/drivers/gpu/drm/xe/xe_defaults.h
> > b/drivers/gpu/drm/xe/xe_defaults.h
> > index c8ae1d5f3d60..fbe670668a04 100644
> > --- a/drivers/gpu/drm/xe/xe_defaults.h
> > +++ b/drivers/gpu/drm/xe/xe_defaults.h
> > @@ -12,6 +12,7 @@
> > #else
> > #define XE_DEFAULT_GUC_LOG_LEVEL 1
> > #endif
> > +#define XE_DEFAULT_GUC_LOG_TARGET 0
> >
> > #define
> > XE_DEFAULT_PROBE_DISPLAY IS_ENABLED(CONFIG_DRM_XE_DIS
> > PL
> > AY)
> > #define XE_DEFAULT_VRAM_BAR_SIZE 0
> > diff --git a/drivers/gpu/drm/xe/xe_guc.c
> > b/drivers/gpu/drm/xe/xe_guc.c
> > index 54d2fc780127..d98d5d051f1b 100644
> > --- a/drivers/gpu/drm/xe/xe_guc.c
> > +++ b/drivers/gpu/drm/xe/xe_guc.c
> > @@ -73,13 +73,18 @@ static u32 guc_bo_ggtt_addr(struct xe_guc *guc,
> >
> > static u32 guc_ctl_debug_flags(struct xe_guc *guc)
> > {
> > + struct pci_dev *pdev = to_pci_dev(guc_to_xe(guc)->drm.dev);
> > u32 level = xe_guc_log_get_level(&guc->log);
> > u32 flags = 0;
> >
> > if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
> > flags |= GUC_LOG_DISABLED;
> > else
> > - flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> > GUC_LOG_LEVEL_TO_VERBOSITY(level));
> > + flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> > +
> > GUC_LOG_LEVEL_TO_VERBOSITY(level));
> > +
> > + flags |= FIELD_PREP(GUC_LOG_DESTINATION,
> > + xe_configfs_get_guc_log_target(pdev));
> >
> > return flags;
> > }
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-02-26 23:26 [PATCH] " Stuart Summers
2026-03-19 18:25 ` Summers, Stuart
@ 2026-04-06 21:28 ` Daniele Ceraolo Spurio
2026-04-06 22:37 ` Summers, Stuart
2026-04-06 21:59 ` Lin, Shuicheng
2 siblings, 1 reply; 23+ messages in thread
From: Daniele Ceraolo Spurio @ 2026-04-06 21:28 UTC (permalink / raw)
To: Stuart Summers; +Cc: shuicheng.lin, matthew.d.roper, intel-xe, John Harrison
On 2/26/2026 3:26 PM, Stuart Summers wrote:
> From: John Harrison <John.C.Harrison@Intel.com>
>
> GuC provides the ability to gather logs through a hardware interface
> called NPK. For certain debugging scenarios this can be advantageous
> over getting logs from memory (or in addition to).
>
> Add a hook for this alternate debugging mode via a configfs. This
> translates into a parameter passed to GuC during load time.
>
> v2: Convert to configfs from modparam (Matt)
>
> Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
> Signed-off-by: Stuart Summers <stuart.summers@intel.com>
> ---
> drivers/gpu/drm/xe/xe_configfs.c | 60 ++++++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_configfs.h | 5 +++
> drivers/gpu/drm/xe/xe_defaults.h | 1 +
> drivers/gpu/drm/xe/xe_guc.c | 7 +++-
> 4 files changed, 72 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_configfs.c b/drivers/gpu/drm/xe/xe_configfs.c
> index 078dee985d24..e0c21328af75 100644
> --- a/drivers/gpu/drm/xe/xe_configfs.c
> +++ b/drivers/gpu/drm/xe/xe_configfs.c
> @@ -83,6 +83,16 @@
> *
> * This attribute can only be set before binding to the device.
> *
> + * GuC log target:
> + * -------------
> + *
> + * Set the destination for the GuC log. 0 - memory only (default),
> + * 1 - NPK only, 2 - memory + NPK.
> + *
> + * # echo 2 > /sys/kernel/config/xe/0000:03:00.0/guc_log_target
> + *
> + * This attribute can only be set before binding to the device.
> + *
> * Allowed GT types:
> * -----------------
> *
> @@ -256,6 +266,7 @@ struct xe_config_group_device {
> struct config_group sriov;
>
> struct xe_config_device {
> + u8 guc_log_target;
> u64 gt_types_allowed;
> u64 engines_allowed;
> struct wa_bb ctx_restore_post_bb[XE_ENGINE_CLASS_MAX];
> @@ -277,6 +288,7 @@ struct xe_config_group_device {
> };
>
> static const struct xe_config_device device_defaults = {
> + .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
> .gt_types_allowed = U64_MAX,
> .engines_allowed = U64_MAX,
> .survivability_mode = false,
> @@ -357,6 +369,37 @@ static bool is_bound(struct xe_config_group_device *dev)
> return ret;
> }
>
> +static ssize_t guc_log_target_show(struct config_item *item, char *page)
> +{
> + struct xe_config_device *dev = to_xe_config_device(item);
> +
> + return sprintf(page, "%d\n", dev->guc_log_target);
> +}
> +
> +static ssize_t guc_log_target_store(struct config_item *item, const char *page, size_t len)
> +{
> + struct xe_config_group_device *dev = to_xe_config_group_device(item);
> + u8 guc_log_target;
> + int ret;
> +
> + ret = kstrtou8(page, 0, &guc_log_target);
> + if (ret)
> + return ret;
> +
> +#define GUC_LOG_TARGET_MAX 2
IMO better to define this with XE_DEFAULT_GUC_LOG_TARGET. Maybe also add
a comment to explain that the modes are set directly by the user and
therefore we don't need individual defines.
> + if (guc_log_target > GUC_LOG_TARGET_MAX)
> + return -EINVAL;
> +#undef GUC_LOG_TARGET_MAX
> +
> + guard(mutex)(&dev->lock);
> + if (is_bound(dev))
> + return -EBUSY;
> +
> + dev->config.guc_log_target = guc_log_target;
> +
> + return len;
> +}
> +
> static ssize_t survivability_mode_show(struct config_item *item, char *page)
> {
> struct xe_config_device *dev = to_xe_config_device(item);
> @@ -814,6 +857,7 @@ CONFIGFS_ATTR(, ctx_restore_mid_bb);
> CONFIGFS_ATTR(, ctx_restore_post_bb);
> CONFIGFS_ATTR(, enable_psmi);
> CONFIGFS_ATTR(, engines_allowed);
> +CONFIGFS_ATTR(, guc_log_target);
This should go after gt_types if we want to keep the alphabetical order.
> CONFIGFS_ATTR(, gt_types_allowed);
> CONFIGFS_ATTR(, survivability_mode);
>
> @@ -822,6 +866,7 @@ static struct configfs_attribute *xe_config_device_attrs[] = {
> &attr_ctx_restore_post_bb,
> &attr_enable_psmi,
> &attr_engines_allowed,
> + &attr_guc_log_target,
here as well
> &attr_gt_types_allowed,
> &attr_survivability_mode,
> NULL,
> @@ -1094,6 +1139,7 @@ static void dump_custom_dev_config(struct pci_dev *pdev,
> dev->config.attr_); \
> } while (0)
>
> + PRI_CUSTOM_ATTR("%d", guc_log_target);
> PRI_CUSTOM_ATTR("%llx", gt_types_allowed);
> PRI_CUSTOM_ATTR("%llx", engines_allowed);
> PRI_CUSTOM_ATTR("%d", enable_psmi);
> @@ -1146,6 +1192,20 @@ bool xe_configfs_get_survivability_mode(struct pci_dev *pdev)
> return mode;
> }
>
> +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev)
This function needs documentation
> +{
> + struct xe_config_group_device *dev = find_xe_config_group_device(pdev);
> + u8 target;
> +
> + if (!dev)
> + return device_defaults.guc_log_target;
> +
> + target = dev->config.guc_log_target;
> + config_group_put(&dev->group);
> +
> + return target;
> +}
> +
> static u64 get_gt_types_allowed(struct pci_dev *pdev)
> {
> struct xe_config_group_device *dev = find_xe_config_group_device(pdev);
> diff --git a/drivers/gpu/drm/xe/xe_configfs.h b/drivers/gpu/drm/xe/xe_configfs.h
> index 07d62bf0c152..fb5cb7c57e75 100644
> --- a/drivers/gpu/drm/xe/xe_configfs.h
> +++ b/drivers/gpu/drm/xe/xe_configfs.h
> @@ -19,6 +19,7 @@ int xe_configfs_init(void);
> void xe_configfs_exit(void);
> void xe_configfs_check_device(struct pci_dev *pdev);
> bool xe_configfs_get_survivability_mode(struct pci_dev *pdev);
> +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev);
> bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev);
> bool xe_configfs_media_gt_allowed(struct pci_dev *pdev);
> u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
> @@ -38,6 +39,10 @@ static inline int xe_configfs_init(void) { return 0; }
> static inline void xe_configfs_exit(void) { }
> static inline void xe_configfs_check_device(struct pci_dev *pdev) { }
> static inline bool xe_configfs_get_survivability_mode(struct pci_dev *pdev) { return false; }
> +static inline u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev)
> +{
> + return XE_DEFAULT_GUC_LOG_TARGET;
> +}
> static inline bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev) { return true; }
> static inline bool xe_configfs_media_gt_allowed(struct pci_dev *pdev) { return true; }
> static inline u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev) { return U64_MAX; }
> diff --git a/drivers/gpu/drm/xe/xe_defaults.h b/drivers/gpu/drm/xe/xe_defaults.h
> index c8ae1d5f3d60..fbe670668a04 100644
> --- a/drivers/gpu/drm/xe/xe_defaults.h
> +++ b/drivers/gpu/drm/xe/xe_defaults.h
> @@ -12,6 +12,7 @@
> #else
> #define XE_DEFAULT_GUC_LOG_LEVEL 1
> #endif
> +#define XE_DEFAULT_GUC_LOG_TARGET 0
>
> #define XE_DEFAULT_PROBE_DISPLAY IS_ENABLED(CONFIG_DRM_XE_DISPLAY)
> #define XE_DEFAULT_VRAM_BAR_SIZE 0
> diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c
> index 54d2fc780127..d98d5d051f1b 100644
> --- a/drivers/gpu/drm/xe/xe_guc.c
> +++ b/drivers/gpu/drm/xe/xe_guc.c
> @@ -73,13 +73,18 @@ static u32 guc_bo_ggtt_addr(struct xe_guc *guc,
>
> static u32 guc_ctl_debug_flags(struct xe_guc *guc)
> {
> + struct pci_dev *pdev = to_pci_dev(guc_to_xe(guc)->drm.dev);
> u32 level = xe_guc_log_get_level(&guc->log);
> u32 flags = 0;
>
> if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
> flags |= GUC_LOG_DISABLED;
> else
> - flags |= FIELD_PREP(GUC_LOG_VERBOSITY, GUC_LOG_LEVEL_TO_VERBOSITY(level));
> + flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> + GUC_LOG_LEVEL_TO_VERBOSITY(level));
> +
> + flags |= FIELD_PREP(GUC_LOG_DESTINATION,
> + xe_configfs_get_guc_log_target(pdev));
nit: Should this be part of the else case above? the specs don't say
that it is an error to set this with the logs disabled but it does seem
weird to do so. not a blocker, so I'm ok it you want to keep it here.
Daniele
>
> return flags;
> }
^ permalink raw reply [flat|nested] 23+ messages in thread* Re: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-04-06 21:28 ` Daniele Ceraolo Spurio
@ 2026-04-06 22:37 ` Summers, Stuart
2026-04-06 23:45 ` Daniele Ceraolo Spurio
0 siblings, 1 reply; 23+ messages in thread
From: Summers, Stuart @ 2026-04-06 22:37 UTC (permalink / raw)
To: Ceraolo Spurio, Daniele
Cc: intel-xe@lists.freedesktop.org, John.C.Harrison@Intel.com,
Lin, Shuicheng, Roper, Matthew D
On Mon, 2026-04-06 at 14:28 -0700, Daniele Ceraolo Spurio wrote:
>
>
> On 2/26/2026 3:26 PM, Stuart Summers wrote:
> > From: John Harrison <John.C.Harrison@Intel.com>
> >
> > GuC provides the ability to gather logs through a hardware
> > interface
> > called NPK. For certain debugging scenarios this can be
> > advantageous
> > over getting logs from memory (or in addition to).
> >
> > Add a hook for this alternate debugging mode via a configfs. This
> > translates into a parameter passed to GuC during load time.
> >
> > v2: Convert to configfs from modparam (Matt)
> >
> > Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
> > Signed-off-by: Stuart Summers <stuart.summers@intel.com>
> > ---
> > drivers/gpu/drm/xe/xe_configfs.c | 60
> > ++++++++++++++++++++++++++++++++
> > drivers/gpu/drm/xe/xe_configfs.h | 5 +++
> > drivers/gpu/drm/xe/xe_defaults.h | 1 +
> > drivers/gpu/drm/xe/xe_guc.c | 7 +++-
> > 4 files changed, 72 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_configfs.c
> > b/drivers/gpu/drm/xe/xe_configfs.c
> > index 078dee985d24..e0c21328af75 100644
> > --- a/drivers/gpu/drm/xe/xe_configfs.c
> > +++ b/drivers/gpu/drm/xe/xe_configfs.c
> > @@ -83,6 +83,16 @@
> > *
> > * This attribute can only be set before binding to the device.
> > *
> > + * GuC log target:
> > + * -------------
> > + *
> > + * Set the destination for the GuC log. 0 - memory only (default),
> > + * 1 - NPK only, 2 - memory + NPK.
> > + *
> > + * # echo 2 >
> > /sys/kernel/config/xe/0000:03:00.0/guc_log_target
> > + *
> > + * This attribute can only be set before binding to the device.
> > + *
> > * Allowed GT types:
> > * -----------------
> > *
> > @@ -256,6 +266,7 @@ struct xe_config_group_device {
> > struct config_group sriov;
> >
> > struct xe_config_device {
> > + u8 guc_log_target;
> > u64 gt_types_allowed;
> > u64 engines_allowed;
> > struct wa_bb
> > ctx_restore_post_bb[XE_ENGINE_CLASS_MAX];
> > @@ -277,6 +288,7 @@ struct xe_config_group_device {
> > };
> >
> > static const struct xe_config_device device_defaults = {
> > + .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
> > .gt_types_allowed = U64_MAX,
> > .engines_allowed = U64_MAX,
> > .survivability_mode = false,
> > @@ -357,6 +369,37 @@ static bool is_bound(struct
> > xe_config_group_device *dev)
> > return ret;
> > }
> >
> > +static ssize_t guc_log_target_show(struct config_item *item, char
> > *page)
> > +{
> > + struct xe_config_device *dev = to_xe_config_device(item);
> > +
> > + return sprintf(page, "%d\n", dev->guc_log_target);
> > +}
> > +
> > +static ssize_t guc_log_target_store(struct config_item *item,
> > const char *page, size_t len)
> > +{
> > + struct xe_config_group_device *dev =
> > to_xe_config_group_device(item);
> > + u8 guc_log_target;
> > + int ret;
> > +
> > + ret = kstrtou8(page, 0, &guc_log_target);
> > + if (ret)
> > + return ret;
> > +
> > +#define GUC_LOG_TARGET_MAX 2
>
> IMO better to define this with XE_DEFAULT_GUC_LOG_TARGET. Maybe also
> add
> a comment to explain that the modes are set directly by the user and
> therefore we don't need individual defines.
Hm.. it feels weird to add the max define in the defaults header which
is one reason I kept that here. I could put both of them in
xe_configfs.h or xe_guc_log_types.h?
Comment you suggested makes sense. I'll add that in the next rev.
>
> > + if (guc_log_target > GUC_LOG_TARGET_MAX)
> > + return -EINVAL;
> > +#undef GUC_LOG_TARGET_MAX
> > +
> > + guard(mutex)(&dev->lock);
> > + if (is_bound(dev))
> > + return -EBUSY;
> > +
> > + dev->config.guc_log_target = guc_log_target;
> > +
> > + return len;
> > +}
> > +
> > static ssize_t survivability_mode_show(struct config_item *item,
> > char *page)
> > {
> > struct xe_config_device *dev = to_xe_config_device(item);
> > @@ -814,6 +857,7 @@ CONFIGFS_ATTR(, ctx_restore_mid_bb);
> > CONFIGFS_ATTR(, ctx_restore_post_bb);
> > CONFIGFS_ATTR(, enable_psmi);
> > CONFIGFS_ATTR(, engines_allowed);
> > +CONFIGFS_ATTR(, guc_log_target);
>
> This should go after gt_types if we want to keep the alphabetical
> order.
Makes sense.
>
> > CONFIGFS_ATTR(, gt_types_allowed);
> > CONFIGFS_ATTR(, survivability_mode);
> >
> > @@ -822,6 +866,7 @@ static struct configfs_attribute
> > *xe_config_device_attrs[] = {
> > &attr_ctx_restore_post_bb,
> > &attr_enable_psmi,
> > &attr_engines_allowed,
> > + &attr_guc_log_target,
>
> here as well
>
> > &attr_gt_types_allowed,
> > &attr_survivability_mode,
> > NULL,
> > @@ -1094,6 +1139,7 @@ static void dump_custom_dev_config(struct
> > pci_dev *pdev,
> > dev->config.attr_); \
> > } while (0)
> >
> > + PRI_CUSTOM_ATTR("%d", guc_log_target);
> > PRI_CUSTOM_ATTR("%llx", gt_types_allowed);
> > PRI_CUSTOM_ATTR("%llx", engines_allowed);
> > PRI_CUSTOM_ATTR("%d", enable_psmi);
> > @@ -1146,6 +1192,20 @@ bool
> > xe_configfs_get_survivability_mode(struct pci_dev *pdev)
> > return mode;
> > }
> >
> > +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev)
>
> This function needs documentation
Ok.
>
> > +{
> > + struct xe_config_group_device *dev =
> > find_xe_config_group_device(pdev);
> > + u8 target;
> > +
> > + if (!dev)
> > + return device_defaults.guc_log_target;
> > +
> > + target = dev->config.guc_log_target;
> > + config_group_put(&dev->group);
> > +
> > + return target;
> > +}
> > +
> > static u64 get_gt_types_allowed(struct pci_dev *pdev)
> > {
> > struct xe_config_group_device *dev =
> > find_xe_config_group_device(pdev);
> > diff --git a/drivers/gpu/drm/xe/xe_configfs.h
> > b/drivers/gpu/drm/xe/xe_configfs.h
> > index 07d62bf0c152..fb5cb7c57e75 100644
> > --- a/drivers/gpu/drm/xe/xe_configfs.h
> > +++ b/drivers/gpu/drm/xe/xe_configfs.h
> > @@ -19,6 +19,7 @@ int xe_configfs_init(void);
> > void xe_configfs_exit(void);
> > void xe_configfs_check_device(struct pci_dev *pdev);
> > bool xe_configfs_get_survivability_mode(struct pci_dev *pdev);
> > +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev);
> > bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev);
> > bool xe_configfs_media_gt_allowed(struct pci_dev *pdev);
> > u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
> > @@ -38,6 +39,10 @@ static inline int xe_configfs_init(void) {
> > return 0; }
> > static inline void xe_configfs_exit(void) { }
> > static inline void xe_configfs_check_device(struct pci_dev *pdev)
> > { }
> > static inline bool xe_configfs_get_survivability_mode(struct
> > pci_dev *pdev) { return false; }
> > +static inline u8 xe_configfs_get_guc_log_target(struct pci_dev
> > *pdev)
> > +{
> > + return XE_DEFAULT_GUC_LOG_TARGET;
> > +}
> > static inline bool xe_configfs_primary_gt_allowed(struct pci_dev
> > *pdev) { return true; }
> > static inline bool xe_configfs_media_gt_allowed(struct pci_dev
> > *pdev) { return true; }
> > static inline u64 xe_configfs_get_engines_allowed(struct pci_dev
> > *pdev) { return U64_MAX; }
> > diff --git a/drivers/gpu/drm/xe/xe_defaults.h
> > b/drivers/gpu/drm/xe/xe_defaults.h
> > index c8ae1d5f3d60..fbe670668a04 100644
> > --- a/drivers/gpu/drm/xe/xe_defaults.h
> > +++ b/drivers/gpu/drm/xe/xe_defaults.h
> > @@ -12,6 +12,7 @@
> > #else
> > #define XE_DEFAULT_GUC_LOG_LEVEL 1
> > #endif
> > +#define XE_DEFAULT_GUC_LOG_TARGET 0
> >
> > #define
> > XE_DEFAULT_PROBE_DISPLAY IS_ENABLED(CONFIG_DRM_XE_DISP
> > LAY)
> > #define XE_DEFAULT_VRAM_BAR_SIZE 0
> > diff --git a/drivers/gpu/drm/xe/xe_guc.c
> > b/drivers/gpu/drm/xe/xe_guc.c
> > index 54d2fc780127..d98d5d051f1b 100644
> > --- a/drivers/gpu/drm/xe/xe_guc.c
> > +++ b/drivers/gpu/drm/xe/xe_guc.c
> > @@ -73,13 +73,18 @@ static u32 guc_bo_ggtt_addr(struct xe_guc *guc,
> >
> > static u32 guc_ctl_debug_flags(struct xe_guc *guc)
> > {
> > + struct pci_dev *pdev = to_pci_dev(guc_to_xe(guc)->drm.dev);
> > u32 level = xe_guc_log_get_level(&guc->log);
> > u32 flags = 0;
> >
> > if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
> > flags |= GUC_LOG_DISABLED;
> > else
> > - flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> > GUC_LOG_LEVEL_TO_VERBOSITY(level));
> > + flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> > +
> > GUC_LOG_LEVEL_TO_VERBOSITY(level));
> > +
> > + flags |= FIELD_PREP(GUC_LOG_DESTINATION,
> > + xe_configfs_get_guc_log_target(pdev));
>
> nit: Should this be part of the else case above? the specs don't say
> that it is an error to set this with the logs disabled but it does
> seem
> weird to do so. not a blocker, so I'm ok it you want to keep it here.
Yeah makes sense to me and I agree with your reasoning. I'll make the
change and repost.
Thanks!
Stuart
>
> Daniele
>
> >
> > return flags;
> > }
>
^ permalink raw reply [flat|nested] 23+ messages in thread* Re: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-04-06 22:37 ` Summers, Stuart
@ 2026-04-06 23:45 ` Daniele Ceraolo Spurio
2026-04-06 23:59 ` Summers, Stuart
0 siblings, 1 reply; 23+ messages in thread
From: Daniele Ceraolo Spurio @ 2026-04-06 23:45 UTC (permalink / raw)
To: Summers, Stuart
Cc: intel-xe@lists.freedesktop.org, John.C.Harrison@Intel.com,
Lin, Shuicheng, Roper, Matthew D
On 4/6/2026 3:37 PM, Summers, Stuart wrote:
> On Mon, 2026-04-06 at 14:28 -0700, Daniele Ceraolo Spurio wrote:
>>
>> On 2/26/2026 3:26 PM, Stuart Summers wrote:
>>> From: John Harrison <John.C.Harrison@Intel.com>
>>>
>>> GuC provides the ability to gather logs through a hardware
>>> interface
>>> called NPK. For certain debugging scenarios this can be
>>> advantageous
>>> over getting logs from memory (or in addition to).
>>>
>>> Add a hook for this alternate debugging mode via a configfs. This
>>> translates into a parameter passed to GuC during load time.
>>>
>>> v2: Convert to configfs from modparam (Matt)
>>>
>>> Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
>>> Signed-off-by: Stuart Summers <stuart.summers@intel.com>
>>> ---
>>> drivers/gpu/drm/xe/xe_configfs.c | 60
>>> ++++++++++++++++++++++++++++++++
>>> drivers/gpu/drm/xe/xe_configfs.h | 5 +++
>>> drivers/gpu/drm/xe/xe_defaults.h | 1 +
>>> drivers/gpu/drm/xe/xe_guc.c | 7 +++-
>>> 4 files changed, 72 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/gpu/drm/xe/xe_configfs.c
>>> b/drivers/gpu/drm/xe/xe_configfs.c
>>> index 078dee985d24..e0c21328af75 100644
>>> --- a/drivers/gpu/drm/xe/xe_configfs.c
>>> +++ b/drivers/gpu/drm/xe/xe_configfs.c
>>> @@ -83,6 +83,16 @@
>>> *
>>> * This attribute can only be set before binding to the device.
>>> *
>>> + * GuC log target:
>>> + * -------------
>>> + *
>>> + * Set the destination for the GuC log. 0 - memory only (default),
>>> + * 1 - NPK only, 2 - memory + NPK.
>>> + *
>>> + * # echo 2 >
>>> /sys/kernel/config/xe/0000:03:00.0/guc_log_target
>>> + *
>>> + * This attribute can only be set before binding to the device.
>>> + *
>>> * Allowed GT types:
>>> * -----------------
>>> *
>>> @@ -256,6 +266,7 @@ struct xe_config_group_device {
>>> struct config_group sriov;
>>>
>>> struct xe_config_device {
>>> + u8 guc_log_target;
>>> u64 gt_types_allowed;
>>> u64 engines_allowed;
>>> struct wa_bb
>>> ctx_restore_post_bb[XE_ENGINE_CLASS_MAX];
>>> @@ -277,6 +288,7 @@ struct xe_config_group_device {
>>> };
>>>
>>> static const struct xe_config_device device_defaults = {
>>> + .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
>>> .gt_types_allowed = U64_MAX,
>>> .engines_allowed = U64_MAX,
>>> .survivability_mode = false,
>>> @@ -357,6 +369,37 @@ static bool is_bound(struct
>>> xe_config_group_device *dev)
>>> return ret;
>>> }
>>>
>>> +static ssize_t guc_log_target_show(struct config_item *item, char
>>> *page)
>>> +{
>>> + struct xe_config_device *dev = to_xe_config_device(item);
>>> +
>>> + return sprintf(page, "%d\n", dev->guc_log_target);
>>> +}
>>> +
>>> +static ssize_t guc_log_target_store(struct config_item *item,
>>> const char *page, size_t len)
>>> +{
>>> + struct xe_config_group_device *dev =
>>> to_xe_config_group_device(item);
>>> + u8 guc_log_target;
>>> + int ret;
>>> +
>>> + ret = kstrtou8(page, 0, &guc_log_target);
>>> + if (ret)
>>> + return ret;
>>> +
>>> +#define GUC_LOG_TARGET_MAX 2
>> IMO better to define this with XE_DEFAULT_GUC_LOG_TARGET. Maybe also
>> add
>> a comment to explain that the modes are set directly by the user and
>> therefore we don't need individual defines.
> Hm.. it feels weird to add the max define in the defaults header which
> is one reason I kept that here. I could put both of them in
> xe_configfs.h or xe_guc_log_types.h?
Not sure why but I thought XE_DEFAULT_GUC_LOG_TARGET was in one of the
GuC ABI files. We usually try to keep all the defines related to the GuC
interface in one of the abi files (in this case it would be
abi/guc_log_abi.h). Might be worth defining all 3 modes in that file and
having something like:
in guc_log_abi.h:
enum guc_log_target {
GUC_LOG_TARGET_MEM = 0,
GUC_LOG_TARGET_NPK,
GUC_LOG_TARGET_MEM_AND_NPK,
}
in the configfs files:
#define XE_DEFAULT_GUC_LOG_TARGET GUC_LOG_TARGET_MEM
#define GUC_LOG_TARGET_MAX GUC_LOG_TARGET_MEM_AND_NPK
Although this might be overkill, so I won't block the current approach.
Daniele
>
> Comment you suggested makes sense. I'll add that in the next rev.
>
>>> + if (guc_log_target > GUC_LOG_TARGET_MAX)
>>> + return -EINVAL;
>>> +#undef GUC_LOG_TARGET_MAX
>>> +
>>> + guard(mutex)(&dev->lock);
>>> + if (is_bound(dev))
>>> + return -EBUSY;
>>> +
>>> + dev->config.guc_log_target = guc_log_target;
>>> +
>>> + return len;
>>> +}
>>> +
>>> static ssize_t survivability_mode_show(struct config_item *item,
>>> char *page)
>>> {
>>> struct xe_config_device *dev = to_xe_config_device(item);
>>> @@ -814,6 +857,7 @@ CONFIGFS_ATTR(, ctx_restore_mid_bb);
>>> CONFIGFS_ATTR(, ctx_restore_post_bb);
>>> CONFIGFS_ATTR(, enable_psmi);
>>> CONFIGFS_ATTR(, engines_allowed);
>>> +CONFIGFS_ATTR(, guc_log_target);
>> This should go after gt_types if we want to keep the alphabetical
>> order.
> Makes sense.
>
>>> CONFIGFS_ATTR(, gt_types_allowed);
>>> CONFIGFS_ATTR(, survivability_mode);
>>>
>>> @@ -822,6 +866,7 @@ static struct configfs_attribute
>>> *xe_config_device_attrs[] = {
>>> &attr_ctx_restore_post_bb,
>>> &attr_enable_psmi,
>>> &attr_engines_allowed,
>>> + &attr_guc_log_target,
>> here as well
>>
>>> &attr_gt_types_allowed,
>>> &attr_survivability_mode,
>>> NULL,
>>> @@ -1094,6 +1139,7 @@ static void dump_custom_dev_config(struct
>>> pci_dev *pdev,
>>> dev->config.attr_); \
>>> } while (0)
>>>
>>> + PRI_CUSTOM_ATTR("%d", guc_log_target);
>>> PRI_CUSTOM_ATTR("%llx", gt_types_allowed);
>>> PRI_CUSTOM_ATTR("%llx", engines_allowed);
>>> PRI_CUSTOM_ATTR("%d", enable_psmi);
>>> @@ -1146,6 +1192,20 @@ bool
>>> xe_configfs_get_survivability_mode(struct pci_dev *pdev)
>>> return mode;
>>> }
>>>
>>> +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev)
>> This function needs documentation
> Ok.
>
>>> +{
>>> + struct xe_config_group_device *dev =
>>> find_xe_config_group_device(pdev);
>>> + u8 target;
>>> +
>>> + if (!dev)
>>> + return device_defaults.guc_log_target;
>>> +
>>> + target = dev->config.guc_log_target;
>>> + config_group_put(&dev->group);
>>> +
>>> + return target;
>>> +}
>>> +
>>> static u64 get_gt_types_allowed(struct pci_dev *pdev)
>>> {
>>> struct xe_config_group_device *dev =
>>> find_xe_config_group_device(pdev);
>>> diff --git a/drivers/gpu/drm/xe/xe_configfs.h
>>> b/drivers/gpu/drm/xe/xe_configfs.h
>>> index 07d62bf0c152..fb5cb7c57e75 100644
>>> --- a/drivers/gpu/drm/xe/xe_configfs.h
>>> +++ b/drivers/gpu/drm/xe/xe_configfs.h
>>> @@ -19,6 +19,7 @@ int xe_configfs_init(void);
>>> void xe_configfs_exit(void);
>>> void xe_configfs_check_device(struct pci_dev *pdev);
>>> bool xe_configfs_get_survivability_mode(struct pci_dev *pdev);
>>> +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev);
>>> bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev);
>>> bool xe_configfs_media_gt_allowed(struct pci_dev *pdev);
>>> u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
>>> @@ -38,6 +39,10 @@ static inline int xe_configfs_init(void) {
>>> return 0; }
>>> static inline void xe_configfs_exit(void) { }
>>> static inline void xe_configfs_check_device(struct pci_dev *pdev)
>>> { }
>>> static inline bool xe_configfs_get_survivability_mode(struct
>>> pci_dev *pdev) { return false; }
>>> +static inline u8 xe_configfs_get_guc_log_target(struct pci_dev
>>> *pdev)
>>> +{
>>> + return XE_DEFAULT_GUC_LOG_TARGET;
>>> +}
>>> static inline bool xe_configfs_primary_gt_allowed(struct pci_dev
>>> *pdev) { return true; }
>>> static inline bool xe_configfs_media_gt_allowed(struct pci_dev
>>> *pdev) { return true; }
>>> static inline u64 xe_configfs_get_engines_allowed(struct pci_dev
>>> *pdev) { return U64_MAX; }
>>> diff --git a/drivers/gpu/drm/xe/xe_defaults.h
>>> b/drivers/gpu/drm/xe/xe_defaults.h
>>> index c8ae1d5f3d60..fbe670668a04 100644
>>> --- a/drivers/gpu/drm/xe/xe_defaults.h
>>> +++ b/drivers/gpu/drm/xe/xe_defaults.h
>>> @@ -12,6 +12,7 @@
>>> #else
>>> #define XE_DEFAULT_GUC_LOG_LEVEL 1
>>> #endif
>>> +#define XE_DEFAULT_GUC_LOG_TARGET 0
>>>
>>> #define
>>> XE_DEFAULT_PROBE_DISPLAY IS_ENABLED(CONFIG_DRM_XE_DISP
>>> LAY)
>>> #define XE_DEFAULT_VRAM_BAR_SIZE 0
>>> diff --git a/drivers/gpu/drm/xe/xe_guc.c
>>> b/drivers/gpu/drm/xe/xe_guc.c
>>> index 54d2fc780127..d98d5d051f1b 100644
>>> --- a/drivers/gpu/drm/xe/xe_guc.c
>>> +++ b/drivers/gpu/drm/xe/xe_guc.c
>>> @@ -73,13 +73,18 @@ static u32 guc_bo_ggtt_addr(struct xe_guc *guc,
>>>
>>> static u32 guc_ctl_debug_flags(struct xe_guc *guc)
>>> {
>>> + struct pci_dev *pdev = to_pci_dev(guc_to_xe(guc)->drm.dev);
>>> u32 level = xe_guc_log_get_level(&guc->log);
>>> u32 flags = 0;
>>>
>>> if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
>>> flags |= GUC_LOG_DISABLED;
>>> else
>>> - flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
>>> GUC_LOG_LEVEL_TO_VERBOSITY(level));
>>> + flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
>>> +
>>> GUC_LOG_LEVEL_TO_VERBOSITY(level));
>>> +
>>> + flags |= FIELD_PREP(GUC_LOG_DESTINATION,
>>> + xe_configfs_get_guc_log_target(pdev));
>> nit: Should this be part of the else case above? the specs don't say
>> that it is an error to set this with the logs disabled but it does
>> seem
>> weird to do so. not a blocker, so I'm ok it you want to keep it here.
> Yeah makes sense to me and I agree with your reasoning. I'll make the
> change and repost.
>
> Thanks!
> Stuart
>
>> Daniele
>>
>>>
>>> return flags;
>>> }
^ permalink raw reply [flat|nested] 23+ messages in thread* Re: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-04-06 23:45 ` Daniele Ceraolo Spurio
@ 2026-04-06 23:59 ` Summers, Stuart
0 siblings, 0 replies; 23+ messages in thread
From: Summers, Stuart @ 2026-04-06 23:59 UTC (permalink / raw)
To: Ceraolo Spurio, Daniele
Cc: intel-xe@lists.freedesktop.org, John.C.Harrison@Intel.com,
Lin, Shuicheng, Roper, Matthew D
On Mon, 2026-04-06 at 16:45 -0700, Daniele Ceraolo Spurio wrote:
>
>
> On 4/6/2026 3:37 PM, Summers, Stuart wrote:
> > On Mon, 2026-04-06 at 14:28 -0700, Daniele Ceraolo Spurio wrote:
> > >
> > > On 2/26/2026 3:26 PM, Stuart Summers wrote:
> > > > From: John Harrison <John.C.Harrison@Intel.com>
> > > >
> > > > GuC provides the ability to gather logs through a hardware
> > > > interface
> > > > called NPK. For certain debugging scenarios this can be
> > > > advantageous
> > > > over getting logs from memory (or in addition to).
> > > >
> > > > Add a hook for this alternate debugging mode via a configfs.
> > > > This
> > > > translates into a parameter passed to GuC during load time.
> > > >
> > > > v2: Convert to configfs from modparam (Matt)
> > > >
> > > > Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
> > > > Signed-off-by: Stuart Summers <stuart.summers@intel.com>
> > > > ---
> > > > drivers/gpu/drm/xe/xe_configfs.c | 60
> > > > ++++++++++++++++++++++++++++++++
> > > > drivers/gpu/drm/xe/xe_configfs.h | 5 +++
> > > > drivers/gpu/drm/xe/xe_defaults.h | 1 +
> > > > drivers/gpu/drm/xe/xe_guc.c | 7 +++-
> > > > 4 files changed, 72 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/drivers/gpu/drm/xe/xe_configfs.c
> > > > b/drivers/gpu/drm/xe/xe_configfs.c
> > > > index 078dee985d24..e0c21328af75 100644
> > > > --- a/drivers/gpu/drm/xe/xe_configfs.c
> > > > +++ b/drivers/gpu/drm/xe/xe_configfs.c
> > > > @@ -83,6 +83,16 @@
> > > > *
> > > > * This attribute can only be set before binding to the
> > > > device.
> > > > *
> > > > + * GuC log target:
> > > > + * -------------
> > > > + *
> > > > + * Set the destination for the GuC log. 0 - memory only
> > > > (default),
> > > > + * 1 - NPK only, 2 - memory + NPK.
> > > > + *
> > > > + * # echo 2 >
> > > > /sys/kernel/config/xe/0000:03:00.0/guc_log_target
> > > > + *
> > > > + * This attribute can only be set before binding to the
> > > > device.
> > > > + *
> > > > * Allowed GT types:
> > > > * -----------------
> > > > *
> > > > @@ -256,6 +266,7 @@ struct xe_config_group_device {
> > > > struct config_group sriov;
> > > >
> > > > struct xe_config_device {
> > > > + u8 guc_log_target;
> > > > u64 gt_types_allowed;
> > > > u64 engines_allowed;
> > > > struct wa_bb
> > > > ctx_restore_post_bb[XE_ENGINE_CLASS_MAX];
> > > > @@ -277,6 +288,7 @@ struct xe_config_group_device {
> > > > };
> > > >
> > > > static const struct xe_config_device device_defaults = {
> > > > + .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
> > > > .gt_types_allowed = U64_MAX,
> > > > .engines_allowed = U64_MAX,
> > > > .survivability_mode = false,
> > > > @@ -357,6 +369,37 @@ static bool is_bound(struct
> > > > xe_config_group_device *dev)
> > > > return ret;
> > > > }
> > > >
> > > > +static ssize_t guc_log_target_show(struct config_item *item,
> > > > char
> > > > *page)
> > > > +{
> > > > + struct xe_config_device *dev =
> > > > to_xe_config_device(item);
> > > > +
> > > > + return sprintf(page, "%d\n", dev->guc_log_target);
> > > > +}
> > > > +
> > > > +static ssize_t guc_log_target_store(struct config_item *item,
> > > > const char *page, size_t len)
> > > > +{
> > > > + struct xe_config_group_device *dev =
> > > > to_xe_config_group_device(item);
> > > > + u8 guc_log_target;
> > > > + int ret;
> > > > +
> > > > + ret = kstrtou8(page, 0, &guc_log_target);
> > > > + if (ret)
> > > > + return ret;
> > > > +
> > > > +#define GUC_LOG_TARGET_MAX 2
> > > IMO better to define this with XE_DEFAULT_GUC_LOG_TARGET. Maybe
> > > also
> > > add
> > > a comment to explain that the modes are set directly by the user
> > > and
> > > therefore we don't need individual defines.
> > Hm.. it feels weird to add the max define in the defaults header
> > which
> > is one reason I kept that here. I could put both of them in
> > xe_configfs.h or xe_guc_log_types.h?
>
> Not sure why but I thought XE_DEFAULT_GUC_LOG_TARGET was in one of
> the
> GuC ABI files. We usually try to keep all the defines related to the
> GuC
> interface in one of the abi files (in this case it would be
> abi/guc_log_abi.h). Might be worth defining all 3 modes in that file
> and
> having something like:
>
> in guc_log_abi.h:
>
> enum guc_log_target {
> GUC_LOG_TARGET_MEM = 0,
> GUC_LOG_TARGET_NPK,
> GUC_LOG_TARGET_MEM_AND_NPK,
> }
>
> in the configfs files:
>
> #define XE_DEFAULT_GUC_LOG_TARGET GUC_LOG_TARGET_MEM
> #define GUC_LOG_TARGET_MAX GUC_LOG_TARGET_MEM_AND_NPK
>
> Although this might be overkill, so I won't block the current
> approach.
No not overkill and a little more self documenting than what I have.
Sure let me make the change and repost..
Thanks,
Stuart
>
> Daniele
>
> >
> > Comment you suggested makes sense. I'll add that in the next rev.
> >
> > > > + if (guc_log_target > GUC_LOG_TARGET_MAX)
> > > > + return -EINVAL;
> > > > +#undef GUC_LOG_TARGET_MAX
> > > > +
> > > > + guard(mutex)(&dev->lock);
> > > > + if (is_bound(dev))
> > > > + return -EBUSY;
> > > > +
> > > > + dev->config.guc_log_target = guc_log_target;
> > > > +
> > > > + return len;
> > > > +}
> > > > +
> > > > static ssize_t survivability_mode_show(struct config_item
> > > > *item,
> > > > char *page)
> > > > {
> > > > struct xe_config_device *dev =
> > > > to_xe_config_device(item);
> > > > @@ -814,6 +857,7 @@ CONFIGFS_ATTR(, ctx_restore_mid_bb);
> > > > CONFIGFS_ATTR(, ctx_restore_post_bb);
> > > > CONFIGFS_ATTR(, enable_psmi);
> > > > CONFIGFS_ATTR(, engines_allowed);
> > > > +CONFIGFS_ATTR(, guc_log_target);
> > > This should go after gt_types if we want to keep the alphabetical
> > > order.
> > Makes sense.
> >
> > > > CONFIGFS_ATTR(, gt_types_allowed);
> > > > CONFIGFS_ATTR(, survivability_mode);
> > > >
> > > > @@ -822,6 +866,7 @@ static struct configfs_attribute
> > > > *xe_config_device_attrs[] = {
> > > > &attr_ctx_restore_post_bb,
> > > > &attr_enable_psmi,
> > > > &attr_engines_allowed,
> > > > + &attr_guc_log_target,
> > > here as well
> > >
> > > > &attr_gt_types_allowed,
> > > > &attr_survivability_mode,
> > > > NULL,
> > > > @@ -1094,6 +1139,7 @@ static void dump_custom_dev_config(struct
> > > > pci_dev *pdev,
> > > > dev->config.attr_); \
> > > > } while (0)
> > > >
> > > > + PRI_CUSTOM_ATTR("%d", guc_log_target);
> > > > PRI_CUSTOM_ATTR("%llx", gt_types_allowed);
> > > > PRI_CUSTOM_ATTR("%llx", engines_allowed);
> > > > PRI_CUSTOM_ATTR("%d", enable_psmi);
> > > > @@ -1146,6 +1192,20 @@ bool
> > > > xe_configfs_get_survivability_mode(struct pci_dev *pdev)
> > > > return mode;
> > > > }
> > > >
> > > > +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev)
> > > This function needs documentation
> > Ok.
> >
> > > > +{
> > > > + struct xe_config_group_device *dev =
> > > > find_xe_config_group_device(pdev);
> > > > + u8 target;
> > > > +
> > > > + if (!dev)
> > > > + return device_defaults.guc_log_target;
> > > > +
> > > > + target = dev->config.guc_log_target;
> > > > + config_group_put(&dev->group);
> > > > +
> > > > + return target;
> > > > +}
> > > > +
> > > > static u64 get_gt_types_allowed(struct pci_dev *pdev)
> > > > {
> > > > struct xe_config_group_device *dev =
> > > > find_xe_config_group_device(pdev);
> > > > diff --git a/drivers/gpu/drm/xe/xe_configfs.h
> > > > b/drivers/gpu/drm/xe/xe_configfs.h
> > > > index 07d62bf0c152..fb5cb7c57e75 100644
> > > > --- a/drivers/gpu/drm/xe/xe_configfs.h
> > > > +++ b/drivers/gpu/drm/xe/xe_configfs.h
> > > > @@ -19,6 +19,7 @@ int xe_configfs_init(void);
> > > > void xe_configfs_exit(void);
> > > > void xe_configfs_check_device(struct pci_dev *pdev);
> > > > bool xe_configfs_get_survivability_mode(struct pci_dev
> > > > *pdev);
> > > > +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev);
> > > > bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev);
> > > > bool xe_configfs_media_gt_allowed(struct pci_dev *pdev);
> > > > u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
> > > > @@ -38,6 +39,10 @@ static inline int xe_configfs_init(void) {
> > > > return 0; }
> > > > static inline void xe_configfs_exit(void) { }
> > > > static inline void xe_configfs_check_device(struct pci_dev
> > > > *pdev)
> > > > { }
> > > > static inline bool xe_configfs_get_survivability_mode(struct
> > > > pci_dev *pdev) { return false; }
> > > > +static inline u8 xe_configfs_get_guc_log_target(struct pci_dev
> > > > *pdev)
> > > > +{
> > > > + return XE_DEFAULT_GUC_LOG_TARGET;
> > > > +}
> > > > static inline bool xe_configfs_primary_gt_allowed(struct
> > > > pci_dev
> > > > *pdev) { return true; }
> > > > static inline bool xe_configfs_media_gt_allowed(struct
> > > > pci_dev
> > > > *pdev) { return true; }
> > > > static inline u64 xe_configfs_get_engines_allowed(struct
> > > > pci_dev
> > > > *pdev) { return U64_MAX; }
> > > > diff --git a/drivers/gpu/drm/xe/xe_defaults.h
> > > > b/drivers/gpu/drm/xe/xe_defaults.h
> > > > index c8ae1d5f3d60..fbe670668a04 100644
> > > > --- a/drivers/gpu/drm/xe/xe_defaults.h
> > > > +++ b/drivers/gpu/drm/xe/xe_defaults.h
> > > > @@ -12,6 +12,7 @@
> > > > #else
> > > > #define XE_DEFAULT_GUC_LOG_LEVEL 1
> > > > #endif
> > > > +#define XE_DEFAULT_GUC_LOG_TARGET 0
> > > >
> > > > #define
> > > > XE_DEFAULT_PROBE_DISPLAY IS_ENABLED(CONFIG_DRM_XE_
> > > > DISP
> > > > LAY)
> > > > #define XE_DEFAULT_VRAM_BAR_SIZE 0
> > > > diff --git a/drivers/gpu/drm/xe/xe_guc.c
> > > > b/drivers/gpu/drm/xe/xe_guc.c
> > > > index 54d2fc780127..d98d5d051f1b 100644
> > > > --- a/drivers/gpu/drm/xe/xe_guc.c
> > > > +++ b/drivers/gpu/drm/xe/xe_guc.c
> > > > @@ -73,13 +73,18 @@ static u32 guc_bo_ggtt_addr(struct xe_guc
> > > > *guc,
> > > >
> > > > static u32 guc_ctl_debug_flags(struct xe_guc *guc)
> > > > {
> > > > + struct pci_dev *pdev = to_pci_dev(guc_to_xe(guc)-
> > > > >drm.dev);
> > > > u32 level = xe_guc_log_get_level(&guc->log);
> > > > u32 flags = 0;
> > > >
> > > > if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
> > > > flags |= GUC_LOG_DISABLED;
> > > > else
> > > > - flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> > > > GUC_LOG_LEVEL_TO_VERBOSITY(level));
> > > > + flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> > > > +
> > > > GUC_LOG_LEVEL_TO_VERBOSITY(level));
> > > > +
> > > > + flags |= FIELD_PREP(GUC_LOG_DESTINATION,
> > > > +
> > > > xe_configfs_get_guc_log_target(pdev));
> > > nit: Should this be part of the else case above? the specs don't
> > > say
> > > that it is an error to set this with the logs disabled but it
> > > does
> > > seem
> > > weird to do so. not a blocker, so I'm ok it you want to keep it
> > > here.
> > Yeah makes sense to me and I agree with your reasoning. I'll make
> > the
> > change and repost.
> >
> > Thanks!
> > Stuart
> >
> > > Daniele
> > >
> > > >
> > > > return flags;
> > > > }
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* RE: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-02-26 23:26 [PATCH] " Stuart Summers
2026-03-19 18:25 ` Summers, Stuart
2026-04-06 21:28 ` Daniele Ceraolo Spurio
@ 2026-04-06 21:59 ` Lin, Shuicheng
2026-04-06 22:38 ` Summers, Stuart
2 siblings, 1 reply; 23+ messages in thread
From: Lin, Shuicheng @ 2026-04-06 21:59 UTC (permalink / raw)
To: Summers, Stuart
Cc: Roper, Matthew D, intel-xe@lists.freedesktop.org, John Harrison,
Yang, Fei, Ceraolo Spurio, Daniele
On Thu, Feb 26, 2026 3:27 PM Stuart Summers wrote:
> From: John Harrison <John.C.Harrison@Intel.com>
>
> GuC provides the ability to gather logs through a hardware interface called
> NPK. For certain debugging scenarios this can be advantageous over getting
> logs from memory (or in addition to).
>
> Add a hook for this alternate debugging mode via a configfs. This translates
> into a parameter passed to GuC during load time.
>
> v2: Convert to configfs from modparam (Matt)
>
> Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
> Signed-off-by: Stuart Summers <stuart.summers@intel.com>
Some nits below.
The code itself looks good to me. But I don't have NPK environment to verify it.
Acked-by: Shuicheng Lin <shuicheng.lin@intel.com>
> ---
> drivers/gpu/drm/xe/xe_configfs.c | 60
> ++++++++++++++++++++++++++++++++ drivers/gpu/drm/xe/xe_configfs.h
> | 5 +++ drivers/gpu/drm/xe/xe_defaults.h | 1 +
> drivers/gpu/drm/xe/xe_guc.c | 7 +++-
> 4 files changed, 72 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_configfs.c
> b/drivers/gpu/drm/xe/xe_configfs.c
> index 078dee985d24..e0c21328af75 100644
> --- a/drivers/gpu/drm/xe/xe_configfs.c
> +++ b/drivers/gpu/drm/xe/xe_configfs.c
> @@ -83,6 +83,16 @@
> *
> * This attribute can only be set before binding to the device.
> *
> + * GuC log target:
> + * -------------
Nit: The underline must be at least as long as the header. So there should be 15 dashes (2 missed).
> + *
> + * Set the destination for the GuC log. 0 - memory only (default),
> + * 1 - NPK only, 2 - memory + NPK.
Nit: This line should end with "::" to introduce the code example. We could add " Example to enable it:: " as other cases.
> + *
> + * # echo 2 > /sys/kernel/config/xe/0000:03:00.0/guc_log_target
Nit: There is space + tab between "* #", and that space should be removed.
Shuicheng
> + *
> + * This attribute can only be set before binding to the device.
> + *
> * Allowed GT types:
> * -----------------
> *
> @@ -256,6 +266,7 @@ struct xe_config_group_device {
> struct config_group sriov;
>
> struct xe_config_device {
> + u8 guc_log_target;
> u64 gt_types_allowed;
> u64 engines_allowed;
> struct wa_bb ctx_restore_post_bb[XE_ENGINE_CLASS_MAX];
> @@ -277,6 +288,7 @@ struct xe_config_group_device { };
>
> static const struct xe_config_device device_defaults = {
> + .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
> .gt_types_allowed = U64_MAX,
> .engines_allowed = U64_MAX,
> .survivability_mode = false,
> @@ -357,6 +369,37 @@ static bool is_bound(struct xe_config_group_device
> *dev)
> return ret;
> }
>
> +static ssize_t guc_log_target_show(struct config_item *item, char
> +*page) {
> + struct xe_config_device *dev = to_xe_config_device(item);
> +
> + return sprintf(page, "%d\n", dev->guc_log_target); }
> +
> +static ssize_t guc_log_target_store(struct config_item *item, const
> +char *page, size_t len) {
> + struct xe_config_group_device *dev =
> to_xe_config_group_device(item);
> + u8 guc_log_target;
> + int ret;
> +
> + ret = kstrtou8(page, 0, &guc_log_target);
> + if (ret)
> + return ret;
> +
> +#define GUC_LOG_TARGET_MAX 2
> + if (guc_log_target > GUC_LOG_TARGET_MAX)
> + return -EINVAL;
> +#undef GUC_LOG_TARGET_MAX
> +
> + guard(mutex)(&dev->lock);
> + if (is_bound(dev))
> + return -EBUSY;
> +
> + dev->config.guc_log_target = guc_log_target;
> +
> + return len;
> +}
> +
> static ssize_t survivability_mode_show(struct config_item *item, char *page)
> {
> struct xe_config_device *dev = to_xe_config_device(item); @@ -814,6
> +857,7 @@ CONFIGFS_ATTR(, ctx_restore_mid_bb); CONFIGFS_ATTR(,
> ctx_restore_post_bb); CONFIGFS_ATTR(, enable_psmi); CONFIGFS_ATTR(,
> engines_allowed);
> +CONFIGFS_ATTR(, guc_log_target);
> CONFIGFS_ATTR(, gt_types_allowed);
> CONFIGFS_ATTR(, survivability_mode);
>
> @@ -822,6 +866,7 @@ static struct configfs_attribute
> *xe_config_device_attrs[] = {
> &attr_ctx_restore_post_bb,
> &attr_enable_psmi,
> &attr_engines_allowed,
> + &attr_guc_log_target,
> &attr_gt_types_allowed,
> &attr_survivability_mode,
> NULL,
> @@ -1094,6 +1139,7 @@ static void dump_custom_dev_config(struct
> pci_dev *pdev,
> dev->config.attr_); \
> } while (0)
>
> + PRI_CUSTOM_ATTR("%d", guc_log_target);
> PRI_CUSTOM_ATTR("%llx", gt_types_allowed);
> PRI_CUSTOM_ATTR("%llx", engines_allowed);
> PRI_CUSTOM_ATTR("%d", enable_psmi);
> @@ -1146,6 +1192,20 @@ bool xe_configfs_get_survivability_mode(struct
> pci_dev *pdev)
> return mode;
> }
>
> +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev) {
> + struct xe_config_group_device *dev =
> find_xe_config_group_device(pdev);
> + u8 target;
> +
> + if (!dev)
> + return device_defaults.guc_log_target;
> +
> + target = dev->config.guc_log_target;
> + config_group_put(&dev->group);
> +
> + return target;
> +}
> +
> static u64 get_gt_types_allowed(struct pci_dev *pdev) {
> struct xe_config_group_device *dev =
> find_xe_config_group_device(pdev);
> diff --git a/drivers/gpu/drm/xe/xe_configfs.h
> b/drivers/gpu/drm/xe/xe_configfs.h
> index 07d62bf0c152..fb5cb7c57e75 100644
> --- a/drivers/gpu/drm/xe/xe_configfs.h
> +++ b/drivers/gpu/drm/xe/xe_configfs.h
> @@ -19,6 +19,7 @@ int xe_configfs_init(void); void xe_configfs_exit(void);
> void xe_configfs_check_device(struct pci_dev *pdev); bool
> xe_configfs_get_survivability_mode(struct pci_dev *pdev);
> +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev);
> bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev); bool
> xe_configfs_media_gt_allowed(struct pci_dev *pdev);
> u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev); @@ -38,6
> +39,10 @@ static inline int xe_configfs_init(void) { return 0; } static inline void
> xe_configfs_exit(void) { } static inline void xe_configfs_check_device(struct
> pci_dev *pdev) { } static inline bool xe_configfs_get_survivability_mode(struct
> pci_dev *pdev) { return false; }
> +static inline u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev) {
> + return XE_DEFAULT_GUC_LOG_TARGET;
> +}
> static inline bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev)
> { return true; } static inline bool xe_configfs_media_gt_allowed(struct pci_dev
> *pdev) { return true; } static inline u64
> xe_configfs_get_engines_allowed(struct pci_dev *pdev) { return U64_MAX; }
> diff --git a/drivers/gpu/drm/xe/xe_defaults.h
> b/drivers/gpu/drm/xe/xe_defaults.h
> index c8ae1d5f3d60..fbe670668a04 100644
> --- a/drivers/gpu/drm/xe/xe_defaults.h
> +++ b/drivers/gpu/drm/xe/xe_defaults.h
> @@ -12,6 +12,7 @@
> #else
> #define XE_DEFAULT_GUC_LOG_LEVEL 1
> #endif
> +#define XE_DEFAULT_GUC_LOG_TARGET 0
>
> #define XE_DEFAULT_PROBE_DISPLAY
> IS_ENABLED(CONFIG_DRM_XE_DISPLAY)
> #define XE_DEFAULT_VRAM_BAR_SIZE 0
> diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c index
> 54d2fc780127..d98d5d051f1b 100644
> --- a/drivers/gpu/drm/xe/xe_guc.c
> +++ b/drivers/gpu/drm/xe/xe_guc.c
> @@ -73,13 +73,18 @@ static u32 guc_bo_ggtt_addr(struct xe_guc *guc,
>
> static u32 guc_ctl_debug_flags(struct xe_guc *guc) {
> + struct pci_dev *pdev = to_pci_dev(guc_to_xe(guc)->drm.dev);
> u32 level = xe_guc_log_get_level(&guc->log);
> u32 flags = 0;
>
> if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
> flags |= GUC_LOG_DISABLED;
> else
> - flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> GUC_LOG_LEVEL_TO_VERBOSITY(level));
> + flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> + GUC_LOG_LEVEL_TO_VERBOSITY(level));
> +
> + flags |= FIELD_PREP(GUC_LOG_DESTINATION,
> + xe_configfs_get_guc_log_target(pdev));
>
> return flags;
> }
> --
> 2.34.1
^ permalink raw reply [flat|nested] 23+ messages in thread* Re: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-04-06 21:59 ` Lin, Shuicheng
@ 2026-04-06 22:38 ` Summers, Stuart
0 siblings, 0 replies; 23+ messages in thread
From: Summers, Stuart @ 2026-04-06 22:38 UTC (permalink / raw)
To: Lin, Shuicheng
Cc: intel-xe@lists.freedesktop.org, John.C.Harrison@Intel.com,
Yang, Fei, Roper, Matthew D, Ceraolo Spurio, Daniele
On Mon, 2026-04-06 at 21:59 +0000, Lin, Shuicheng wrote:
> On Thu, Feb 26, 2026 3:27 PM Stuart Summers wrote:
> > From: John Harrison <John.C.Harrison@Intel.com>
> >
> > GuC provides the ability to gather logs through a hardware
> > interface called
> > NPK. For certain debugging scenarios this can be advantageous over
> > getting
> > logs from memory (or in addition to).
> >
> > Add a hook for this alternate debugging mode via a configfs. This
> > translates
> > into a parameter passed to GuC during load time.
> >
> > v2: Convert to configfs from modparam (Matt)
> >
> > Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
> > Signed-off-by: Stuart Summers <stuart.summers@intel.com>
>
> Some nits below.
> The code itself looks good to me. But I don't have NPK environment to
> verify it.
> Acked-by: Shuicheng Lin <shuicheng.lin@intel.com>
Thanks Shuicheng! I'll make your suggested changes in the next rev.
-Stuart
>
> > ---
> > drivers/gpu/drm/xe/xe_configfs.c | 60
> > ++++++++++++++++++++++++++++++++ drivers/gpu/drm/xe/xe_configfs.h
> > > 5 +++ drivers/gpu/drm/xe/xe_defaults.h | 1 +
> > drivers/gpu/drm/xe/xe_guc.c | 7 +++-
> > 4 files changed, 72 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_configfs.c
> > b/drivers/gpu/drm/xe/xe_configfs.c
> > index 078dee985d24..e0c21328af75 100644
> > --- a/drivers/gpu/drm/xe/xe_configfs.c
> > +++ b/drivers/gpu/drm/xe/xe_configfs.c
> > @@ -83,6 +83,16 @@
> > *
> > * This attribute can only be set before binding to the device.
> > *
> > + * GuC log target:
> > + * -------------
>
> Nit: The underline must be at least as long as the header. So there
> should be 15 dashes (2 missed).
>
> > + *
> > + * Set the destination for the GuC log. 0 - memory only (default),
> > + * 1 - NPK only, 2 - memory + NPK.
>
> Nit: This line should end with "::" to introduce the code example. We
> could add " Example to enable it:: " as other cases.
>
> > + *
> > + * # echo 2 >
> > /sys/kernel/config/xe/0000:03:00.0/guc_log_target
>
> Nit: There is space + tab between "* #", and that space should be
> removed.
>
> Shuicheng
>
> > + *
> > + * This attribute can only be set before binding to the device.
> > + *
> > * Allowed GT types:
> > * -----------------
> > *
> > @@ -256,6 +266,7 @@ struct xe_config_group_device {
> > struct config_group sriov;
> >
> > struct xe_config_device {
> > + u8 guc_log_target;
> > u64 gt_types_allowed;
> > u64 engines_allowed;
> > struct wa_bb
> > ctx_restore_post_bb[XE_ENGINE_CLASS_MAX];
> > @@ -277,6 +288,7 @@ struct xe_config_group_device { };
> >
> > static const struct xe_config_device device_defaults = {
> > + .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
> > .gt_types_allowed = U64_MAX,
> > .engines_allowed = U64_MAX,
> > .survivability_mode = false,
> > @@ -357,6 +369,37 @@ static bool is_bound(struct
> > xe_config_group_device
> > *dev)
> > return ret;
> > }
> >
> > +static ssize_t guc_log_target_show(struct config_item *item, char
> > +*page) {
> > + struct xe_config_device *dev = to_xe_config_device(item);
> > +
> > + return sprintf(page, "%d\n", dev->guc_log_target); }
> > +
> > +static ssize_t guc_log_target_store(struct config_item *item,
> > const
> > +char *page, size_t len) {
> > + struct xe_config_group_device *dev =
> > to_xe_config_group_device(item);
> > + u8 guc_log_target;
> > + int ret;
> > +
> > + ret = kstrtou8(page, 0, &guc_log_target);
> > + if (ret)
> > + return ret;
> > +
> > +#define GUC_LOG_TARGET_MAX 2
> > + if (guc_log_target > GUC_LOG_TARGET_MAX)
> > + return -EINVAL;
> > +#undef GUC_LOG_TARGET_MAX
> > +
> > + guard(mutex)(&dev->lock);
> > + if (is_bound(dev))
> > + return -EBUSY;
> > +
> > + dev->config.guc_log_target = guc_log_target;
> > +
> > + return len;
> > +}
> > +
> > static ssize_t survivability_mode_show(struct config_item *item,
> > char *page)
> > {
> > struct xe_config_device *dev = to_xe_config_device(item);
> > @@ -814,6
> > +857,7 @@ CONFIGFS_ATTR(, ctx_restore_mid_bb); CONFIGFS_ATTR(,
> > ctx_restore_post_bb); CONFIGFS_ATTR(, enable_psmi);
> > CONFIGFS_ATTR(,
> > engines_allowed);
> > +CONFIGFS_ATTR(, guc_log_target);
> > CONFIGFS_ATTR(, gt_types_allowed);
> > CONFIGFS_ATTR(, survivability_mode);
> >
> > @@ -822,6 +866,7 @@ static struct configfs_attribute
> > *xe_config_device_attrs[] = {
> > &attr_ctx_restore_post_bb,
> > &attr_enable_psmi,
> > &attr_engines_allowed,
> > + &attr_guc_log_target,
> > &attr_gt_types_allowed,
> > &attr_survivability_mode,
> > NULL,
> > @@ -1094,6 +1139,7 @@ static void dump_custom_dev_config(struct
> > pci_dev *pdev,
> > dev->config.attr_); \
> > } while (0)
> >
> > + PRI_CUSTOM_ATTR("%d", guc_log_target);
> > PRI_CUSTOM_ATTR("%llx", gt_types_allowed);
> > PRI_CUSTOM_ATTR("%llx", engines_allowed);
> > PRI_CUSTOM_ATTR("%d", enable_psmi);
> > @@ -1146,6 +1192,20 @@ bool
> > xe_configfs_get_survivability_mode(struct
> > pci_dev *pdev)
> > return mode;
> > }
> >
> > +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev) {
> > + struct xe_config_group_device *dev =
> > find_xe_config_group_device(pdev);
> > + u8 target;
> > +
> > + if (!dev)
> > + return device_defaults.guc_log_target;
> > +
> > + target = dev->config.guc_log_target;
> > + config_group_put(&dev->group);
> > +
> > + return target;
> > +}
> > +
> > static u64 get_gt_types_allowed(struct pci_dev *pdev) {
> > struct xe_config_group_device *dev =
> > find_xe_config_group_device(pdev);
> > diff --git a/drivers/gpu/drm/xe/xe_configfs.h
> > b/drivers/gpu/drm/xe/xe_configfs.h
> > index 07d62bf0c152..fb5cb7c57e75 100644
> > --- a/drivers/gpu/drm/xe/xe_configfs.h
> > +++ b/drivers/gpu/drm/xe/xe_configfs.h
> > @@ -19,6 +19,7 @@ int xe_configfs_init(void); void
> > xe_configfs_exit(void);
> > void xe_configfs_check_device(struct pci_dev *pdev); bool
> > xe_configfs_get_survivability_mode(struct pci_dev *pdev);
> > +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev);
> > bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev); bool
> > xe_configfs_media_gt_allowed(struct pci_dev *pdev);
> > u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev); @@ -
> > 38,6
> > +39,10 @@ static inline int xe_configfs_init(void) { return 0; }
> > static inline void
> > xe_configfs_exit(void) { } static inline void
> > xe_configfs_check_device(struct
> > pci_dev *pdev) { } static inline bool
> > xe_configfs_get_survivability_mode(struct
> > pci_dev *pdev) { return false; }
> > +static inline u8 xe_configfs_get_guc_log_target(struct pci_dev
> > *pdev) {
> > + return XE_DEFAULT_GUC_LOG_TARGET;
> > +}
> > static inline bool xe_configfs_primary_gt_allowed(struct pci_dev
> > *pdev)
> > { return true; } static inline bool
> > xe_configfs_media_gt_allowed(struct pci_dev
> > *pdev) { return true; } static inline u64
> > xe_configfs_get_engines_allowed(struct pci_dev *pdev) { return
> > U64_MAX; }
> > diff --git a/drivers/gpu/drm/xe/xe_defaults.h
> > b/drivers/gpu/drm/xe/xe_defaults.h
> > index c8ae1d5f3d60..fbe670668a04 100644
> > --- a/drivers/gpu/drm/xe/xe_defaults.h
> > +++ b/drivers/gpu/drm/xe/xe_defaults.h
> > @@ -12,6 +12,7 @@
> > #else
> > #define XE_DEFAULT_GUC_LOG_LEVEL 1
> > #endif
> > +#define XE_DEFAULT_GUC_LOG_TARGET 0
> >
> > #define XE_DEFAULT_PROBE_DISPLAY
> > IS_ENABLED(CONFIG_DRM_XE_DISPLAY)
> > #define XE_DEFAULT_VRAM_BAR_SIZE 0
> > diff --git a/drivers/gpu/drm/xe/xe_guc.c
> > b/drivers/gpu/drm/xe/xe_guc.c index
> > 54d2fc780127..d98d5d051f1b 100644
> > --- a/drivers/gpu/drm/xe/xe_guc.c
> > +++ b/drivers/gpu/drm/xe/xe_guc.c
> > @@ -73,13 +73,18 @@ static u32 guc_bo_ggtt_addr(struct xe_guc *guc,
> >
> > static u32 guc_ctl_debug_flags(struct xe_guc *guc) {
> > + struct pci_dev *pdev = to_pci_dev(guc_to_xe(guc)->drm.dev);
> > u32 level = xe_guc_log_get_level(&guc->log);
> > u32 flags = 0;
> >
> > if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
> > flags |= GUC_LOG_DISABLED;
> > else
> > - flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> > GUC_LOG_LEVEL_TO_VERBOSITY(level));
> > + flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> > +
> > GUC_LOG_LEVEL_TO_VERBOSITY(level));
> > +
> > + flags |= FIELD_PREP(GUC_LOG_DESTINATION,
> > + xe_configfs_get_guc_log_target(pdev));
> >
> > return flags;
> > }
> > --
> > 2.34.1
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
@ 2026-04-06 22:53 Stuart Summers
2026-04-07 9:48 ` Michal Wajdeczko
0 siblings, 1 reply; 23+ messages in thread
From: Stuart Summers @ 2026-04-06 22:53 UTC (permalink / raw)
Cc: matthew.d.roper, fei.yang, shuicheng.lin, daniele.ceraolospurio,
intel-xe, John Harrison, Stuart Summers
From: John Harrison <John.C.Harrison@Intel.com>
GuC provides the ability to gather logs through a hardware interface
called NPK. For certain debugging scenarios this can be advantageous
over getting logs from memory (or in addition to).
Add a hook for this alternate debugging mode via a configfs. This
translates into a parameter passed to GuC during load time.
v2: Convert to configfs from modparam (Matt)
v3: Configfs documentation formatting (Shuicheng)
Kerneldoc/comment add + configfs entry ordering
Only set the guc_log_target when GuC log is enabled (Daniele)
Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
Signed-off-by: Stuart Summers <stuart.summers@intel.com>
Acked-by: Shuicheng Lin <shuicheng.lin@intel.com>
---
drivers/gpu/drm/xe/xe_configfs.c | 70 ++++++++++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_configfs.h | 5 +++
drivers/gpu/drm/xe/xe_defaults.h | 1 +
drivers/gpu/drm/xe/xe_guc.c | 11 +++--
4 files changed, 84 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_configfs.c b/drivers/gpu/drm/xe/xe_configfs.c
index 32102600a148..e4511ee4e135 100644
--- a/drivers/gpu/drm/xe/xe_configfs.c
+++ b/drivers/gpu/drm/xe/xe_configfs.c
@@ -83,6 +83,16 @@
*
* This attribute can only be set before binding to the device.
*
+ * GuC log target:
+ * ---------------
+ *
+ * Set the destination for the GuC log. 0 - memory only (default),
+ * 1 - NPK only, 2 - memory + NPK. Example::
+ *
+ * # echo 2 > /sys/kernel/config/xe/0000:03:00.0/guc_log_target
+ *
+ * This attribute can only be set before binding to the device.
+ *
* Allowed GT types:
* -----------------
*
@@ -256,6 +266,7 @@ struct xe_config_group_device {
struct config_group sriov;
struct xe_config_device {
+ u8 guc_log_target;
u64 gt_types_allowed;
u64 engines_allowed;
struct wa_bb ctx_restore_post_bb[XE_ENGINE_CLASS_MAX];
@@ -277,6 +288,7 @@ struct xe_config_group_device {
};
static const struct xe_config_device device_defaults = {
+ .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
.gt_types_allowed = U64_MAX,
.engines_allowed = U64_MAX,
.survivability_mode = false,
@@ -357,6 +369,41 @@ static bool is_bound(struct xe_config_group_device *dev)
return ret;
}
+static ssize_t guc_log_target_show(struct config_item *item, char *page)
+{
+ struct xe_config_device *dev = to_xe_config_device(item);
+
+ return sprintf(page, "%d\n", dev->guc_log_target);
+}
+
+static ssize_t guc_log_target_store(struct config_item *item, const char *page, size_t len)
+{
+ struct xe_config_group_device *dev = to_xe_config_group_device(item);
+ u8 guc_log_target;
+ int ret;
+
+ ret = kstrtou8(page, 0, &guc_log_target);
+ if (ret)
+ return ret;
+
+ /*
+ * No need to define full enumeration set since this is directly
+ * applied from the user here to GuC.
+ */
+#define GUC_LOG_TARGET_MAX 2
+ if (guc_log_target > GUC_LOG_TARGET_MAX)
+ return -EINVAL;
+#undef GUC_LOG_TARGET_MAX
+
+ guard(mutex)(&dev->lock);
+ if (is_bound(dev))
+ return -EBUSY;
+
+ dev->config.guc_log_target = guc_log_target;
+
+ return len;
+}
+
static ssize_t survivability_mode_show(struct config_item *item, char *page)
{
struct xe_config_device *dev = to_xe_config_device(item);
@@ -815,6 +862,7 @@ CONFIGFS_ATTR(, ctx_restore_post_bb);
CONFIGFS_ATTR(, enable_psmi);
CONFIGFS_ATTR(, engines_allowed);
CONFIGFS_ATTR(, gt_types_allowed);
+CONFIGFS_ATTR(, guc_log_target);
CONFIGFS_ATTR(, survivability_mode);
static struct configfs_attribute *xe_config_device_attrs[] = {
@@ -823,6 +871,7 @@ static struct configfs_attribute *xe_config_device_attrs[] = {
&attr_enable_psmi,
&attr_engines_allowed,
&attr_gt_types_allowed,
+ &attr_guc_log_target,
&attr_survivability_mode,
NULL,
};
@@ -1095,6 +1144,7 @@ static void dump_custom_dev_config(struct pci_dev *pdev,
dev->config.attr_); \
} while (0)
+ PRI_CUSTOM_ATTR("%d", guc_log_target);
PRI_CUSTOM_ATTR("%llx", gt_types_allowed);
PRI_CUSTOM_ATTR("%llx", engines_allowed);
PRI_CUSTOM_ATTR("%d", enable_psmi);
@@ -1147,6 +1197,26 @@ bool xe_configfs_get_survivability_mode(struct pci_dev *pdev)
return mode;
}
+/**
+ * xe_configfs_get_guc_log_target - get configfs GuC log target attribute
+ * @pdev: pci device
+ *
+ * Return: guc_log_target attribute in configfs
+ */
+u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev)
+{
+ struct xe_config_group_device *dev = find_xe_config_group_device(pdev);
+ u8 target;
+
+ if (!dev)
+ return device_defaults.guc_log_target;
+
+ target = dev->config.guc_log_target;
+ config_group_put(&dev->group);
+
+ return target;
+}
+
static u64 get_gt_types_allowed(struct pci_dev *pdev)
{
struct xe_config_group_device *dev = find_xe_config_group_device(pdev);
diff --git a/drivers/gpu/drm/xe/xe_configfs.h b/drivers/gpu/drm/xe/xe_configfs.h
index 07d62bf0c152..fb5cb7c57e75 100644
--- a/drivers/gpu/drm/xe/xe_configfs.h
+++ b/drivers/gpu/drm/xe/xe_configfs.h
@@ -19,6 +19,7 @@ int xe_configfs_init(void);
void xe_configfs_exit(void);
void xe_configfs_check_device(struct pci_dev *pdev);
bool xe_configfs_get_survivability_mode(struct pci_dev *pdev);
+u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev);
bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev);
bool xe_configfs_media_gt_allowed(struct pci_dev *pdev);
u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
@@ -38,6 +39,10 @@ static inline int xe_configfs_init(void) { return 0; }
static inline void xe_configfs_exit(void) { }
static inline void xe_configfs_check_device(struct pci_dev *pdev) { }
static inline bool xe_configfs_get_survivability_mode(struct pci_dev *pdev) { return false; }
+static inline u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev)
+{
+ return XE_DEFAULT_GUC_LOG_TARGET;
+}
static inline bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev) { return true; }
static inline bool xe_configfs_media_gt_allowed(struct pci_dev *pdev) { return true; }
static inline u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev) { return U64_MAX; }
diff --git a/drivers/gpu/drm/xe/xe_defaults.h b/drivers/gpu/drm/xe/xe_defaults.h
index c8ae1d5f3d60..fbe670668a04 100644
--- a/drivers/gpu/drm/xe/xe_defaults.h
+++ b/drivers/gpu/drm/xe/xe_defaults.h
@@ -12,6 +12,7 @@
#else
#define XE_DEFAULT_GUC_LOG_LEVEL 1
#endif
+#define XE_DEFAULT_GUC_LOG_TARGET 0
#define XE_DEFAULT_PROBE_DISPLAY IS_ENABLED(CONFIG_DRM_XE_DISPLAY)
#define XE_DEFAULT_VRAM_BAR_SIZE 0
diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c
index e762eada21db..c40bd4aec2ce 100644
--- a/drivers/gpu/drm/xe/xe_guc.c
+++ b/drivers/gpu/drm/xe/xe_guc.c
@@ -73,13 +73,18 @@ static u32 guc_bo_ggtt_addr(struct xe_guc *guc,
static u32 guc_ctl_debug_flags(struct xe_guc *guc)
{
+ struct pci_dev *pdev = to_pci_dev(guc_to_xe(guc)->drm.dev);
u32 level = xe_guc_log_get_level(&guc->log);
u32 flags = 0;
- if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
+ if (!GUC_LOG_LEVEL_IS_VERBOSE(level)) {
flags |= GUC_LOG_DISABLED;
- else
- flags |= FIELD_PREP(GUC_LOG_VERBOSITY, GUC_LOG_LEVEL_TO_VERBOSITY(level));
+ } else {
+ flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
+ GUC_LOG_LEVEL_TO_VERBOSITY(level));
+ flags |= FIELD_PREP(GUC_LOG_DESTINATION,
+ xe_configfs_get_guc_log_target(pdev));
+ }
return flags;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-04-06 22:53 Stuart Summers
@ 2026-04-07 9:48 ` Michal Wajdeczko
2026-04-07 18:55 ` Summers, Stuart
0 siblings, 1 reply; 23+ messages in thread
From: Michal Wajdeczko @ 2026-04-07 9:48 UTC (permalink / raw)
To: Stuart Summers
Cc: matthew.d.roper, fei.yang, shuicheng.lin, daniele.ceraolospurio,
intel-xe
On 4/7/2026 12:53 AM, Stuart Summers wrote:
> From: John Harrison <John.C.Harrison@Intel.com>
>
> GuC provides the ability to gather logs through a hardware interface
> called NPK. For certain debugging scenarios this can be advantageous
> over getting logs from memory (or in addition to).
>
> Add a hook for this alternate debugging mode via a configfs. This
> translates into a parameter passed to GuC during load time.
>
> v2: Convert to configfs from modparam (Matt)
> v3: Configfs documentation formatting (Shuicheng)
> Kerneldoc/comment add + configfs entry ordering
> Only set the guc_log_target when GuC log is enabled (Daniele)
nit: we may keep change log under --- so it stays on the ML only
and please not forget to use -v option while preparing new patch revisions
[1] https://git-scm.com/docs/git-format-patch#Documentation/git-format-patch.txt--vn
>
> Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
> Signed-off-by: Stuart Summers <stuart.summers@intel.com>
> Acked-by: Shuicheng Lin <shuicheng.lin@intel.com>
> ---
> drivers/gpu/drm/xe/xe_configfs.c | 70 ++++++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_configfs.h | 5 +++
> drivers/gpu/drm/xe/xe_defaults.h | 1 +
> drivers/gpu/drm/xe/xe_guc.c | 11 +++--
> 4 files changed, 84 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_configfs.c b/drivers/gpu/drm/xe/xe_configfs.c
> index 32102600a148..e4511ee4e135 100644
> --- a/drivers/gpu/drm/xe/xe_configfs.c
> +++ b/drivers/gpu/drm/xe/xe_configfs.c
> @@ -83,6 +83,16 @@
> *
> * This attribute can only be set before binding to the device.
> *
> + * GuC log target:
> + * ---------------
> + *
> + * Set the destination for the GuC log. 0 - memory only (default),
> + * 1 - NPK only, 2 - memory + NPK. Example::
> + *
> + * # echo 2 > /sys/kernel/config/xe/0000:03:00.0/guc_log_target
> + *
> + * This attribute can only be set before binding to the device.
> + *
> * Allowed GT types:
> * -----------------
> *
> @@ -256,6 +266,7 @@ struct xe_config_group_device {
> struct config_group sriov;
>
> struct xe_config_device {
> + u8 guc_log_target;
> u64 gt_types_allowed;
> u64 engines_allowed;
> struct wa_bb ctx_restore_post_bb[XE_ENGINE_CLASS_MAX];
> @@ -277,6 +288,7 @@ struct xe_config_group_device {
> };
>
> static const struct xe_config_device device_defaults = {
> + .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
> .gt_types_allowed = U64_MAX,
> .engines_allowed = U64_MAX,
> .survivability_mode = false,
> @@ -357,6 +369,41 @@ static bool is_bound(struct xe_config_group_device *dev)
> return ret;
> }
>
can we expose this new attribute only for XE_DEBUG_GUC config?
we can easily use xe_config_device_is_visible for this
> +static ssize_t guc_log_target_show(struct config_item *item, char *page)
> +{
> + struct xe_config_device *dev = to_xe_config_device(item);
> +
> + return sprintf(page, "%d\n", dev->guc_log_target);
> +}
> +
> +static ssize_t guc_log_target_store(struct config_item *item, const char *page, size_t len)
> +{
> + struct xe_config_group_device *dev = to_xe_config_group_device(item);
> + u8 guc_log_target;
> + int ret;
> +
> + ret = kstrtou8(page, 0, &guc_log_target);
> + if (ret)
> + return ret;
> +
> + /*
> + * No need to define full enumeration set since this is directly
> + * applied from the user here to GuC.
> + */
> +#define GUC_LOG_TARGET_MAX 2
late to the party but agree with Daniele that this should be part of the
GuC ABI file, and unlike Daniele I would prefer to enforce that as otherwise
we will start again mixing local defines that we can change with GuC
definitions that we don't own and can't change
(and yes, GUC_LOG_LEVEL min/max definitions should also follow that rule
so they should be fixed too - someday ...)
for me it looks that this MAX could be based on existing define:
#define GUC_LOG_TARGET_MAX FIELD_MAX(GUC_LOG_DESTINATION)
but I'm wondering whether actually we should expose in stable configfs
the low-level GuC ABI definitions
maybe more safe solution would be to add just higher-level attribute
bool guc_npk; /* use NPK? default: false */
and just convert that into GuC ABI bits in guc_ctl_debug_flags() ?
flags |= FIELD_PREP(GUC_LOG_DESTINATION,
xe_configfs_guc_npk(pdev) ?
GUC_LOG_TARGET_MEM_AND_NPK :
GUC_LOG_TARGET_MEM_ONLY);
> + if (guc_log_target > GUC_LOG_TARGET_MAX)
> + return -EINVAL;
> +#undef GUC_LOG_TARGET_MAX
> +> + guard(mutex)(&dev->lock);
> + if (is_bound(dev))
> + return -EBUSY;
> +
> + dev->config.guc_log_target = guc_log_target;
> +
> + return len;
> +}
> +
> static ssize_t survivability_mode_show(struct config_item *item, char *page)
> {
> struct xe_config_device *dev = to_xe_config_device(item);
> @@ -815,6 +862,7 @@ CONFIGFS_ATTR(, ctx_restore_post_bb);
> CONFIGFS_ATTR(, enable_psmi);
> CONFIGFS_ATTR(, engines_allowed);
> CONFIGFS_ATTR(, gt_types_allowed);
> +CONFIGFS_ATTR(, guc_log_target);
> CONFIGFS_ATTR(, survivability_mode);
>
> static struct configfs_attribute *xe_config_device_attrs[] = {
> @@ -823,6 +871,7 @@ static struct configfs_attribute *xe_config_device_attrs[] = {
> &attr_enable_psmi,
> &attr_engines_allowed,
> &attr_gt_types_allowed,
> + &attr_guc_log_target,
> &attr_survivability_mode,
> NULL,
> };
> @@ -1095,6 +1144,7 @@ static void dump_custom_dev_config(struct pci_dev *pdev,
> dev->config.attr_); \
> } while (0)
>
> + PRI_CUSTOM_ATTR("%d", guc_log_target);
> PRI_CUSTOM_ATTR("%llx", gt_types_allowed);
> PRI_CUSTOM_ATTR("%llx", engines_allowed);
> PRI_CUSTOM_ATTR("%d", enable_psmi);
> @@ -1147,6 +1197,26 @@ bool xe_configfs_get_survivability_mode(struct pci_dev *pdev)
> return mode;
> }
>
> +/**
> + * xe_configfs_get_guc_log_target - get configfs GuC log target attribute
nit: we try to append () to the function name in doc, like:
* xe_configfs_get_guc_log_target() - Get GuC log target attribute.
[2] https://docs.kernel.org/doc-guide/kernel-doc.html#function-documentation
> + * @pdev: pci device
> + *
> + * Return: guc_log_target attribute in configfs
> + */
> +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev)
> +{
> + struct xe_config_group_device *dev = find_xe_config_group_device(pdev);
> + u8 target;
> +
> + if (!dev)
> + return device_defaults.guc_log_target;
> +
> + target = dev->config.guc_log_target;
> + config_group_put(&dev->group);
> +
> + return target;
> +}
> +
> static u64 get_gt_types_allowed(struct pci_dev *pdev)
> {
> struct xe_config_group_device *dev = find_xe_config_group_device(pdev);
> diff --git a/drivers/gpu/drm/xe/xe_configfs.h b/drivers/gpu/drm/xe/xe_configfs.h
> index 07d62bf0c152..fb5cb7c57e75 100644
> --- a/drivers/gpu/drm/xe/xe_configfs.h
> +++ b/drivers/gpu/drm/xe/xe_configfs.h
> @@ -19,6 +19,7 @@ int xe_configfs_init(void);
> void xe_configfs_exit(void);
> void xe_configfs_check_device(struct pci_dev *pdev);
> bool xe_configfs_get_survivability_mode(struct pci_dev *pdev);
> +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev);
> bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev);
> bool xe_configfs_media_gt_allowed(struct pci_dev *pdev);
> u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
> @@ -38,6 +39,10 @@ static inline int xe_configfs_init(void) { return 0; }
> static inline void xe_configfs_exit(void) { }
> static inline void xe_configfs_check_device(struct pci_dev *pdev) { }
> static inline bool xe_configfs_get_survivability_mode(struct pci_dev *pdev) { return false; }
> +static inline u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev)
> +{
> + return XE_DEFAULT_GUC_LOG_TARGET;
> +}
> static inline bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev) { return true; }
> static inline bool xe_configfs_media_gt_allowed(struct pci_dev *pdev) { return true; }
> static inline u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev) { return U64_MAX; }
> diff --git a/drivers/gpu/drm/xe/xe_defaults.h b/drivers/gpu/drm/xe/xe_defaults.h
> index c8ae1d5f3d60..fbe670668a04 100644
> --- a/drivers/gpu/drm/xe/xe_defaults.h
> +++ b/drivers/gpu/drm/xe/xe_defaults.h
> @@ -12,6 +12,7 @@
> #else
> #define XE_DEFAULT_GUC_LOG_LEVEL 1
> #endif
> +#define XE_DEFAULT_GUC_LOG_TARGET 0
>
> #define XE_DEFAULT_PROBE_DISPLAY IS_ENABLED(CONFIG_DRM_XE_DISPLAY)
> #define XE_DEFAULT_VRAM_BAR_SIZE 0
> diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c
> index e762eada21db..c40bd4aec2ce 100644
> --- a/drivers/gpu/drm/xe/xe_guc.c
> +++ b/drivers/gpu/drm/xe/xe_guc.c
> @@ -73,13 +73,18 @@ static u32 guc_bo_ggtt_addr(struct xe_guc *guc,
>
> static u32 guc_ctl_debug_flags(struct xe_guc *guc)
> {
> + struct pci_dev *pdev = to_pci_dev(guc_to_xe(guc)->drm.dev);
> u32 level = xe_guc_log_get_level(&guc->log);
> u32 flags = 0;
>
> - if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
> + if (!GUC_LOG_LEVEL_IS_VERBOSE(level)) {
> flags |= GUC_LOG_DISABLED;
> - else
> - flags |= FIELD_PREP(GUC_LOG_VERBOSITY, GUC_LOG_LEVEL_TO_VERBOSITY(level));
> + } else {
> + flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> + GUC_LOG_LEVEL_TO_VERBOSITY(level));
> + flags |= FIELD_PREP(GUC_LOG_DESTINATION,
> + xe_configfs_get_guc_log_target(pdev));
> + }
>
> return flags;
> }
^ permalink raw reply [flat|nested] 23+ messages in thread* Re: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-04-07 9:48 ` Michal Wajdeczko
@ 2026-04-07 18:55 ` Summers, Stuart
2026-04-08 12:40 ` Michal Wajdeczko
2026-04-08 13:18 ` Jani Nikula
0 siblings, 2 replies; 23+ messages in thread
From: Summers, Stuart @ 2026-04-07 18:55 UTC (permalink / raw)
To: Wajdeczko, Michal
Cc: intel-xe@lists.freedesktop.org, Lin, Shuicheng, Yang, Fei,
Roper, Matthew D, Ceraolo Spurio, Daniele
On Tue, 2026-04-07 at 11:48 +0200, Michal Wajdeczko wrote:
>
> On 4/7/2026 12:53 AM, Stuart Summers wrote:
> > From: John Harrison <John.C.Harrison@Intel.com>
> >
> > GuC provides the ability to gather logs through a hardware
> > interface
> > called NPK. For certain debugging scenarios this can be
> > advantageous
> > over getting logs from memory (or in addition to).
> >
> > Add a hook for this alternate debugging mode via a configfs. This
> > translates into a parameter passed to GuC during load time.
> >
> > v2: Convert to configfs from modparam (Matt)
> > v3: Configfs documentation formatting (Shuicheng)
> > Kerneldoc/comment add + configfs entry ordering
> > Only set the guc_log_target when GuC log is enabled (Daniele)
>
> nit: we may keep change log under --- so it stays on the ML only
Ok makes sense I'll do that on the next upload.
>
> and please not forget to use -v option while preparing new patch
> revisions
Thanks Michal, I'll make sure to include this going forward.
>
> [1]
> https://git-scm.com/docs/git-format-patch#Documentation/git-format-patch.txt--vn
>
> >
> > Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
> > Signed-off-by: Stuart Summers <stuart.summers@intel.com>
> > Acked-by: Shuicheng Lin <shuicheng.lin@intel.com>
> > ---
> > drivers/gpu/drm/xe/xe_configfs.c | 70
> > ++++++++++++++++++++++++++++++++
> > drivers/gpu/drm/xe/xe_configfs.h | 5 +++
> > drivers/gpu/drm/xe/xe_defaults.h | 1 +
> > drivers/gpu/drm/xe/xe_guc.c | 11 +++--
> > 4 files changed, 84 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_configfs.c
> > b/drivers/gpu/drm/xe/xe_configfs.c
> > index 32102600a148..e4511ee4e135 100644
> > --- a/drivers/gpu/drm/xe/xe_configfs.c
> > +++ b/drivers/gpu/drm/xe/xe_configfs.c
> > @@ -83,6 +83,16 @@
> > *
> > * This attribute can only be set before binding to the device.
> > *
> > + * GuC log target:
> > + * ---------------
> > + *
> > + * Set the destination for the GuC log. 0 - memory only (default),
> > + * 1 - NPK only, 2 - memory + NPK. Example::
> > + *
> > + * # echo 2 >
> > /sys/kernel/config/xe/0000:03:00.0/guc_log_target
> > + *
> > + * This attribute can only be set before binding to the device.
> > + *
> > * Allowed GT types:
> > * -----------------
> > *
> > @@ -256,6 +266,7 @@ struct xe_config_group_device {
> > struct config_group sriov;
> >
> > struct xe_config_device {
> > + u8 guc_log_target;
> > u64 gt_types_allowed;
> > u64 engines_allowed;
> > struct wa_bb
> > ctx_restore_post_bb[XE_ENGINE_CLASS_MAX];
> > @@ -277,6 +288,7 @@ struct xe_config_group_device {
> > };
> >
> > static const struct xe_config_device device_defaults = {
> > + .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
> > .gt_types_allowed = U64_MAX,
> > .engines_allowed = U64_MAX,
> > .survivability_mode = false,
> > @@ -357,6 +369,41 @@ static bool is_bound(struct
> > xe_config_group_device *dev)
> > return ret;
> > }
> >
>
> can we expose this new attribute only for XE_DEBUG_GUC config?
> we can easily use xe_config_device_is_visible for this
Makes sense to me. I'll make the change.
>
> > +static ssize_t guc_log_target_show(struct config_item *item, char
> > *page)
> > +{
> > + struct xe_config_device *dev = to_xe_config_device(item);
> > +
> > + return sprintf(page, "%d\n", dev->guc_log_target);
> > +}
> > +
> > +static ssize_t guc_log_target_store(struct config_item *item,
> > const char *page, size_t len)
> > +{
> > + struct xe_config_group_device *dev =
> > to_xe_config_group_device(item);
> > + u8 guc_log_target;
> > + int ret;
> > +
> > + ret = kstrtou8(page, 0, &guc_log_target);
> > + if (ret)
> > + return ret;
> > +
> > + /*
> > + * No need to define full enumeration set since this is
> > directly
> > + * applied from the user here to GuC.
> > + */
> > +#define GUC_LOG_TARGET_MAX 2
>
> late to the party but agree with Daniele that this should be part of
> the
> GuC ABI file, and unlike Daniele I would prefer to enforce that as
> otherwise
> we will start again mixing local defines that we can change with GuC
> definitions that we don't own and can't change
>
> (and yes, GUC_LOG_LEVEL min/max definitions should also follow that
> rule
> so they should be fixed too - someday ...)
Maybe I'll just include that in the next rev...
>
> for me it looks that this MAX could be based on existing define:
>
> #define GUC_LOG_TARGET_MAX FIELD_MAX(GUC_LOG_DESTINATION)
>
> but I'm wondering whether actually we should expose in stable
> configfs
> the low-level GuC ABI definitions
>
> maybe more safe solution would be to add just higher-level attribute
>
> bool guc_npk; /* use NPK? default: false */
>
> and just convert that into GuC ABI bits in guc_ctl_debug_flags() ?
>
> flags |= FIELD_PREP(GUC_LOG_DESTINATION,
> xe_configfs_guc_npk(pdev) ?
> GUC_LOG_TARGET_MEM_AND_NPK :
> GUC_LOG_TARGET_MEM_ONLY);
So I do like having the ability to pick and chose how we configure the
logging here. I think in most cases sending to both lmem and npk is
what we want, but there might be some corner case debugs where any
regular access to lmem (or even smem) like this causes problems and we
really do just want to send everything to npk. And we could of course
default to send to npk and lmem, but I think for the general case we
will never actually use this - it's a debug only function.
But your point about ABI is fair here. We don't have any use case
beyond these two targets today, but that doesn't mean it always has to
be the case... We could enforce these values for 0-2 and only add
additional destinations on top of that.
Although given this is really a debug feature, would it make more sense
to split this out as part of a debug only configfs? That's really the
case for almost all of what we have in configfs today, minus maybe the
max VF configuration - it isn't about performance tuning or anything,
just about reducing scope of the driver in one way or another or
enabling some debug capability otherwise. To me that isn't a true ABI.
What if I split this into xe_configfs.c and xe_configfs_debug.c, moved
all of the debug specific entries to the latter with a little less
restriction and kept the max VF one in xe_configfs.c for now? Then
xe_configfs_debug.c can wrap in
CONFIG_DRM_XE_DEBUG/CONFIG_DRM_XE_DEBUG_GUC?
I'll wait to hear back before making a change like that so we're on the
same page.
>
>
> > + if (guc_log_target > GUC_LOG_TARGET_MAX)
> > + return -EINVAL;
> > +#undef GUC_LOG_TARGET_MAX
> > +> + guard(mutex)(&dev->lock);
> > + if (is_bound(dev))
> > + return -EBUSY;
> > +
> > + dev->config.guc_log_target = guc_log_target;
> > +
> > + return len;
> > +}
> > +
> > static ssize_t survivability_mode_show(struct config_item *item,
> > char *page)
> > {
> > struct xe_config_device *dev = to_xe_config_device(item);
> > @@ -815,6 +862,7 @@ CONFIGFS_ATTR(, ctx_restore_post_bb);
> > CONFIGFS_ATTR(, enable_psmi);
> > CONFIGFS_ATTR(, engines_allowed);
> > CONFIGFS_ATTR(, gt_types_allowed);
> > +CONFIGFS_ATTR(, guc_log_target);
> > CONFIGFS_ATTR(, survivability_mode);
> >
> > static struct configfs_attribute *xe_config_device_attrs[] = {
> > @@ -823,6 +871,7 @@ static struct configfs_attribute
> > *xe_config_device_attrs[] = {
> > &attr_enable_psmi,
> > &attr_engines_allowed,
> > &attr_gt_types_allowed,
> > + &attr_guc_log_target,
> > &attr_survivability_mode,
> > NULL,
> > };
> > @@ -1095,6 +1144,7 @@ static void dump_custom_dev_config(struct
> > pci_dev *pdev,
> > dev->config.attr_); \
> > } while (0)
> >
> > + PRI_CUSTOM_ATTR("%d", guc_log_target);
> > PRI_CUSTOM_ATTR("%llx", gt_types_allowed);
> > PRI_CUSTOM_ATTR("%llx", engines_allowed);
> > PRI_CUSTOM_ATTR("%d", enable_psmi);
> > @@ -1147,6 +1197,26 @@ bool
> > xe_configfs_get_survivability_mode(struct pci_dev *pdev)
> > return mode;
> > }
> >
> > +/**
> > + * xe_configfs_get_guc_log_target - get configfs GuC log target
> > attribute
>
> nit: we try to append () to the function name in doc, like:
>
> * xe_configfs_get_guc_log_target() - Get GuC log target
> attribute.
Ah makes sense thanks.
Thanks,
Stuart
>
> [2]
> https://docs.kernel.org/doc-guide/kernel-doc.html#function-documentation
>
> > + * @pdev: pci device
> > + *
> > + * Return: guc_log_target attribute in configfs
> > + */
> > +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev)
> > +{
> > + struct xe_config_group_device *dev =
> > find_xe_config_group_device(pdev);
> > + u8 target;
> > +
> > + if (!dev)
> > + return device_defaults.guc_log_target;
> > +
> > + target = dev->config.guc_log_target;
> > + config_group_put(&dev->group);
> > +
> > + return target;
> > +}
> > +
> > static u64 get_gt_types_allowed(struct pci_dev *pdev)
> > {
> > struct xe_config_group_device *dev =
> > find_xe_config_group_device(pdev);
> > diff --git a/drivers/gpu/drm/xe/xe_configfs.h
> > b/drivers/gpu/drm/xe/xe_configfs.h
> > index 07d62bf0c152..fb5cb7c57e75 100644
> > --- a/drivers/gpu/drm/xe/xe_configfs.h
> > +++ b/drivers/gpu/drm/xe/xe_configfs.h
> > @@ -19,6 +19,7 @@ int xe_configfs_init(void);
> > void xe_configfs_exit(void);
> > void xe_configfs_check_device(struct pci_dev *pdev);
> > bool xe_configfs_get_survivability_mode(struct pci_dev *pdev);
> > +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev);
> > bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev);
> > bool xe_configfs_media_gt_allowed(struct pci_dev *pdev);
> > u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
> > @@ -38,6 +39,10 @@ static inline int xe_configfs_init(void) {
> > return 0; }
> > static inline void xe_configfs_exit(void) { }
> > static inline void xe_configfs_check_device(struct pci_dev *pdev)
> > { }
> > static inline bool xe_configfs_get_survivability_mode(struct
> > pci_dev *pdev) { return false; }
> > +static inline u8 xe_configfs_get_guc_log_target(struct pci_dev
> > *pdev)
> > +{
> > + return XE_DEFAULT_GUC_LOG_TARGET;
> > +}
> > static inline bool xe_configfs_primary_gt_allowed(struct pci_dev
> > *pdev) { return true; }
> > static inline bool xe_configfs_media_gt_allowed(struct pci_dev
> > *pdev) { return true; }
> > static inline u64 xe_configfs_get_engines_allowed(struct pci_dev
> > *pdev) { return U64_MAX; }
> > diff --git a/drivers/gpu/drm/xe/xe_defaults.h
> > b/drivers/gpu/drm/xe/xe_defaults.h
> > index c8ae1d5f3d60..fbe670668a04 100644
> > --- a/drivers/gpu/drm/xe/xe_defaults.h
> > +++ b/drivers/gpu/drm/xe/xe_defaults.h
> > @@ -12,6 +12,7 @@
> > #else
> > #define XE_DEFAULT_GUC_LOG_LEVEL 1
> > #endif
> > +#define XE_DEFAULT_GUC_LOG_TARGET 0
> >
> > #define
> > XE_DEFAULT_PROBE_DISPLAY IS_ENABLED(CONFIG_DRM_XE_DIS
> > PLAY)
> > #define XE_DEFAULT_VRAM_BAR_SIZE 0
> > diff --git a/drivers/gpu/drm/xe/xe_guc.c
> > b/drivers/gpu/drm/xe/xe_guc.c
> > index e762eada21db..c40bd4aec2ce 100644
> > --- a/drivers/gpu/drm/xe/xe_guc.c
> > +++ b/drivers/gpu/drm/xe/xe_guc.c
> > @@ -73,13 +73,18 @@ static u32 guc_bo_ggtt_addr(struct xe_guc *guc,
> >
> > static u32 guc_ctl_debug_flags(struct xe_guc *guc)
> > {
> > + struct pci_dev *pdev = to_pci_dev(guc_to_xe(guc)->drm.dev);
> > u32 level = xe_guc_log_get_level(&guc->log);
> > u32 flags = 0;
> >
> > - if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
> > + if (!GUC_LOG_LEVEL_IS_VERBOSE(level)) {
> > flags |= GUC_LOG_DISABLED;
> > - else
> > - flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> > GUC_LOG_LEVEL_TO_VERBOSITY(level));
> > + } else {
> > + flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> > +
> > GUC_LOG_LEVEL_TO_VERBOSITY(level));
> > + flags |= FIELD_PREP(GUC_LOG_DESTINATION,
> > +
> > xe_configfs_get_guc_log_target(pdev));
> > + }
> >
> > return flags;
> > }
>
^ permalink raw reply [flat|nested] 23+ messages in thread* Re: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-04-07 18:55 ` Summers, Stuart
@ 2026-04-08 12:40 ` Michal Wajdeczko
2026-04-08 21:51 ` Summers, Stuart
2026-04-08 13:18 ` Jani Nikula
1 sibling, 1 reply; 23+ messages in thread
From: Michal Wajdeczko @ 2026-04-08 12:40 UTC (permalink / raw)
To: Summers, Stuart, Rodrigo Vivi, Thomas Hellström,
Matthew Brost
Cc: intel-xe@lists.freedesktop.org, Lin, Shuicheng, Yang, Fei,
Roper, Matthew D, Ceraolo Spurio, Daniele
On 4/7/2026 8:55 PM, Summers, Stuart wrote:
> On Tue, 2026-04-07 at 11:48 +0200, Michal Wajdeczko wrote:
>>
>> On 4/7/2026 12:53 AM, Stuart Summers wrote:
>>> From: John Harrison <John.C.Harrison@Intel.com>
>>>
>>> GuC provides the ability to gather logs through a hardware
>>> interface
>>> called NPK. For certain debugging scenarios this can be
>>> advantageous
>>> over getting logs from memory (or in addition to).
>>>
>>> Add a hook for this alternate debugging mode via a configfs. This
>>> translates into a parameter passed to GuC during load time.
>>>
>>> v2: Convert to configfs from modparam (Matt)
>>> v3: Configfs documentation formatting (Shuicheng)
>>> Kerneldoc/comment add + configfs entry ordering
>>> Only set the guc_log_target when GuC log is enabled (Daniele)
>>
>> nit: we may keep change log under --- so it stays on the ML only
>
> Ok makes sense I'll do that on the next upload.
>
>>
>> and please not forget to use -v option while preparing new patch
>> revisions
>
> Thanks Michal, I'll make sure to include this going forward.
>
>>
>> [1]
>> https://git-scm.com/docs/git-format-patch#Documentation/git-format-patch.txt--vn
>>
>>>
>>> Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
>>> Signed-off-by: Stuart Summers <stuart.summers@intel.com>
>>> Acked-by: Shuicheng Lin <shuicheng.lin@intel.com>
>>> ---
>>> drivers/gpu/drm/xe/xe_configfs.c | 70
>>> ++++++++++++++++++++++++++++++++
>>> drivers/gpu/drm/xe/xe_configfs.h | 5 +++
>>> drivers/gpu/drm/xe/xe_defaults.h | 1 +
>>> drivers/gpu/drm/xe/xe_guc.c | 11 +++--
>>> 4 files changed, 84 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/xe/xe_configfs.c
>>> b/drivers/gpu/drm/xe/xe_configfs.c
>>> index 32102600a148..e4511ee4e135 100644
>>> --- a/drivers/gpu/drm/xe/xe_configfs.c
>>> +++ b/drivers/gpu/drm/xe/xe_configfs.c
>>> @@ -83,6 +83,16 @@
>>> *
>>> * This attribute can only be set before binding to the device.
>>> *
>>> + * GuC log target:
>>> + * ---------------
>>> + *
>>> + * Set the destination for the GuC log. 0 - memory only (default),
>>> + * 1 - NPK only, 2 - memory + NPK. Example::
>>> + *
>>> + * # echo 2 >
>>> /sys/kernel/config/xe/0000:03:00.0/guc_log_target
>>> + *
>>> + * This attribute can only be set before binding to the device.
>>> + *
>>> * Allowed GT types:
>>> * -----------------
>>> *
>>> @@ -256,6 +266,7 @@ struct xe_config_group_device {
>>> struct config_group sriov;
>>>
>>> struct xe_config_device {
>>> + u8 guc_log_target;
>>> u64 gt_types_allowed;
>>> u64 engines_allowed;
>>> struct wa_bb
>>> ctx_restore_post_bb[XE_ENGINE_CLASS_MAX];
>>> @@ -277,6 +288,7 @@ struct xe_config_group_device {
>>> };
>>>
>>> static const struct xe_config_device device_defaults = {
>>> + .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
>>> .gt_types_allowed = U64_MAX,
>>> .engines_allowed = U64_MAX,
>>> .survivability_mode = false,
>>> @@ -357,6 +369,41 @@ static bool is_bound(struct
>>> xe_config_group_device *dev)
>>> return ret;
>>> }
>>>
>>
>> can we expose this new attribute only for XE_DEBUG_GUC config?
>> we can easily use xe_config_device_is_visible for this
>
> Makes sense to me. I'll make the change.
>
>>
>>> +static ssize_t guc_log_target_show(struct config_item *item, char
>>> *page)
>>> +{
>>> + struct xe_config_device *dev = to_xe_config_device(item);
>>> +
>>> + return sprintf(page, "%d\n", dev->guc_log_target);
>>> +}
>>> +
>>> +static ssize_t guc_log_target_store(struct config_item *item,
>>> const char *page, size_t len)
>>> +{
>>> + struct xe_config_group_device *dev =
>>> to_xe_config_group_device(item);
>>> + u8 guc_log_target;
>>> + int ret;
>>> +
>>> + ret = kstrtou8(page, 0, &guc_log_target);
>>> + if (ret)
>>> + return ret;
>>> +
>>> + /*
>>> + * No need to define full enumeration set since this is
>>> directly
>>> + * applied from the user here to GuC.
>>> + */
>>> +#define GUC_LOG_TARGET_MAX 2
>>
>> late to the party but agree with Daniele that this should be part of
>> the
>> GuC ABI file, and unlike Daniele I would prefer to enforce that as
>> otherwise
>> we will start again mixing local defines that we can change with GuC
>> definitions that we don't own and can't change
>>
>> (and yes, GUC_LOG_LEVEL min/max definitions should also follow that
>> rule
>> so they should be fixed too - someday ...)
>
> Maybe I'll just include that in the next rev...
btw, as there might be more "GuC" specific attributes, maybe we should
try to group them?
/sys/kernel/config/xe/
└── 0000:4d:00.0
├── ...
└── guc
├── firmware_path ""
├── log_level 0..5
├── log_npk false|true
├── log_target 0..3
└── ...
>
>>
>> for me it looks that this MAX could be based on existing define:
>>
>> #define GUC_LOG_TARGET_MAX FIELD_MAX(GUC_LOG_DESTINATION)
>>
>> but I'm wondering whether actually we should expose in stable
>> configfs
>> the low-level GuC ABI definitions
>>
>> maybe more safe solution would be to add just higher-level attribute
>>
>> bool guc_npk; /* use NPK? default: false */
>>
>> and just convert that into GuC ABI bits in guc_ctl_debug_flags() ?
>>
>> flags |= FIELD_PREP(GUC_LOG_DESTINATION,
>> xe_configfs_guc_npk(pdev) ?
>> GUC_LOG_TARGET_MEM_AND_NPK :
>> GUC_LOG_TARGET_MEM_ONLY);
>
> So I do like having the ability to pick and chose how we configure the
> logging here. I think in most cases sending to both lmem and npk is
> what we want, but there might be some corner case debugs where any
> regular access to lmem (or even smem) like this causes problems and we
> really do just want to send everything to npk. And we could of course
> default to send to npk and lmem, but I think for the general case we
> will never actually use this - it's a debug only function.
>
> But your point about ABI is fair here. We don't have any use case
> beyond these two targets today, but that doesn't mean it always has to
> be the case... We could enforce these values for 0-2 and only add
> additional destinations on top of that.
>
> Although given this is really a debug feature, would it make more sense
> to split this out as part of a debug only configfs? That's really the
> case for almost all of what we have in configfs today, minus maybe the
> max VF configuration - it isn't about performance tuning or anything,
> just about reducing scope of the driver in one way or another or
> enabling some debug capability otherwise. To me that isn't a true ABI.
+1
but in the past I was told that configfs is ABI
>
> What if I split this into xe_configfs.c and xe_configfs_debug.c, moved
> all of the debug specific entries to the latter with a little less
> restriction and kept the max VF one in xe_configfs.c for now? Then
> xe_configfs_debug.c can wrap in
> CONFIG_DRM_XE_DEBUG/CONFIG_DRM_XE_DEBUG_GUC?
so now that's the question to the maintainers - and I guess the main
question here is if already exposed attributes can be now hidden
(maybe we can just clarify that some entries are DEBUG only, and
thus may be changed/dropped in the future)
>
> I'll wait to hear back before making a change like that so we're on the
> same page.
>
>>
>>
>>> + if (guc_log_target > GUC_LOG_TARGET_MAX)
>>> + return -EINVAL;
>>> +#undef GUC_LOG_TARGET_MAX
>>> +> + guard(mutex)(&dev->lock);
>>> + if (is_bound(dev))
>>> + return -EBUSY;
>>> +
>>> + dev->config.guc_log_target = guc_log_target;
>>> +
>>> + return len;
>>> +}
>>> +
>>> static ssize_t survivability_mode_show(struct config_item *item,
>>> char *page)
>>> {
>>> struct xe_config_device *dev = to_xe_config_device(item);
>>> @@ -815,6 +862,7 @@ CONFIGFS_ATTR(, ctx_restore_post_bb);
>>> CONFIGFS_ATTR(, enable_psmi);
>>> CONFIGFS_ATTR(, engines_allowed);
>>> CONFIGFS_ATTR(, gt_types_allowed);
>>> +CONFIGFS_ATTR(, guc_log_target);
>>> CONFIGFS_ATTR(, survivability_mode);
>>>
>>> static struct configfs_attribute *xe_config_device_attrs[] = {
>>> @@ -823,6 +871,7 @@ static struct configfs_attribute
>>> *xe_config_device_attrs[] = {
>>> &attr_enable_psmi,
>>> &attr_engines_allowed,
>>> &attr_gt_types_allowed,
>>> + &attr_guc_log_target,
>>> &attr_survivability_mode,
>>> NULL,
>>> };
>>> @@ -1095,6 +1144,7 @@ static void dump_custom_dev_config(struct
>>> pci_dev *pdev,
>>> dev->config.attr_); \
>>> } while (0)
>>>
>>> + PRI_CUSTOM_ATTR("%d", guc_log_target);
>>> PRI_CUSTOM_ATTR("%llx", gt_types_allowed);
>>> PRI_CUSTOM_ATTR("%llx", engines_allowed);
>>> PRI_CUSTOM_ATTR("%d", enable_psmi);
>>> @@ -1147,6 +1197,26 @@ bool
>>> xe_configfs_get_survivability_mode(struct pci_dev *pdev)
>>> return mode;
>>> }
>>>
>>> +/**
>>> + * xe_configfs_get_guc_log_target - get configfs GuC log target
>>> attribute
>>
>> nit: we try to append () to the function name in doc, like:
>>
>> * xe_configfs_get_guc_log_target() - Get GuC log target
>> attribute.
>
> Ah makes sense thanks.
>
> Thanks,
> Stuart
>
>>
>> [2]
>> https://docs.kernel.org/doc-guide/kernel-doc.html#function-documentation
>>
>>> + * @pdev: pci device
>>> + *
>>> + * Return: guc_log_target attribute in configfs
>>> + */
>>> +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev)
>>> +{
>>> + struct xe_config_group_device *dev =
>>> find_xe_config_group_device(pdev);
>>> + u8 target;
>>> +
>>> + if (!dev)
>>> + return device_defaults.guc_log_target;
>>> +
>>> + target = dev->config.guc_log_target;
>>> + config_group_put(&dev->group);
>>> +
>>> + return target;
>>> +}
>>> +
>>> static u64 get_gt_types_allowed(struct pci_dev *pdev)
>>> {
>>> struct xe_config_group_device *dev =
>>> find_xe_config_group_device(pdev);
>>> diff --git a/drivers/gpu/drm/xe/xe_configfs.h
>>> b/drivers/gpu/drm/xe/xe_configfs.h
>>> index 07d62bf0c152..fb5cb7c57e75 100644
>>> --- a/drivers/gpu/drm/xe/xe_configfs.h
>>> +++ b/drivers/gpu/drm/xe/xe_configfs.h
>>> @@ -19,6 +19,7 @@ int xe_configfs_init(void);
>>> void xe_configfs_exit(void);
>>> void xe_configfs_check_device(struct pci_dev *pdev);
>>> bool xe_configfs_get_survivability_mode(struct pci_dev *pdev);
>>> +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev);
>>> bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev);
>>> bool xe_configfs_media_gt_allowed(struct pci_dev *pdev);
>>> u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
>>> @@ -38,6 +39,10 @@ static inline int xe_configfs_init(void) {
>>> return 0; }
>>> static inline void xe_configfs_exit(void) { }
>>> static inline void xe_configfs_check_device(struct pci_dev *pdev)
>>> { }
>>> static inline bool xe_configfs_get_survivability_mode(struct
>>> pci_dev *pdev) { return false; }
>>> +static inline u8 xe_configfs_get_guc_log_target(struct pci_dev
>>> *pdev)
>>> +{
>>> + return XE_DEFAULT_GUC_LOG_TARGET;
>>> +}
>>> static inline bool xe_configfs_primary_gt_allowed(struct pci_dev
>>> *pdev) { return true; }
>>> static inline bool xe_configfs_media_gt_allowed(struct pci_dev
>>> *pdev) { return true; }
>>> static inline u64 xe_configfs_get_engines_allowed(struct pci_dev
>>> *pdev) { return U64_MAX; }
>>> diff --git a/drivers/gpu/drm/xe/xe_defaults.h
>>> b/drivers/gpu/drm/xe/xe_defaults.h
>>> index c8ae1d5f3d60..fbe670668a04 100644
>>> --- a/drivers/gpu/drm/xe/xe_defaults.h
>>> +++ b/drivers/gpu/drm/xe/xe_defaults.h
>>> @@ -12,6 +12,7 @@
>>> #else
>>> #define XE_DEFAULT_GUC_LOG_LEVEL 1
>>> #endif
>>> +#define XE_DEFAULT_GUC_LOG_TARGET 0
>>>
>>> #define
>>> XE_DEFAULT_PROBE_DISPLAY IS_ENABLED(CONFIG_DRM_XE_DIS
>>> PLAY)
>>> #define XE_DEFAULT_VRAM_BAR_SIZE 0
>>> diff --git a/drivers/gpu/drm/xe/xe_guc.c
>>> b/drivers/gpu/drm/xe/xe_guc.c
>>> index e762eada21db..c40bd4aec2ce 100644
>>> --- a/drivers/gpu/drm/xe/xe_guc.c
>>> +++ b/drivers/gpu/drm/xe/xe_guc.c
>>> @@ -73,13 +73,18 @@ static u32 guc_bo_ggtt_addr(struct xe_guc *guc,
>>>
>>> static u32 guc_ctl_debug_flags(struct xe_guc *guc)
>>> {
>>> + struct pci_dev *pdev = to_pci_dev(guc_to_xe(guc)->drm.dev);
>>> u32 level = xe_guc_log_get_level(&guc->log);
>>> u32 flags = 0;
>>>
>>> - if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
>>> + if (!GUC_LOG_LEVEL_IS_VERBOSE(level)) {
>>> flags |= GUC_LOG_DISABLED;
>>> - else
>>> - flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
>>> GUC_LOG_LEVEL_TO_VERBOSITY(level));
>>> + } else {
>>> + flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
>>> +
>>> GUC_LOG_LEVEL_TO_VERBOSITY(level));
>>> + flags |= FIELD_PREP(GUC_LOG_DESTINATION,
>>> +
>>> xe_configfs_get_guc_log_target(pdev));
>>> + }
>>>
>>> return flags;
>>> }
>>
>
^ permalink raw reply [flat|nested] 23+ messages in thread* Re: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-04-08 12:40 ` Michal Wajdeczko
@ 2026-04-08 21:51 ` Summers, Stuart
0 siblings, 0 replies; 23+ messages in thread
From: Summers, Stuart @ 2026-04-08 21:51 UTC (permalink / raw)
To: Vivi, Rodrigo, Brost, Matthew, Wajdeczko, Michal,
thomas.hellstrom@linux.intel.com
Cc: intel-xe@lists.freedesktop.org, Lin, Shuicheng, Yang, Fei,
Roper, Matthew D, Ceraolo Spurio, Daniele
On Wed, 2026-04-08 at 14:40 +0200, Michal Wajdeczko wrote:
>
>
> On 4/7/2026 8:55 PM, Summers, Stuart wrote:
> > On Tue, 2026-04-07 at 11:48 +0200, Michal Wajdeczko wrote:
> > >
> > > On 4/7/2026 12:53 AM, Stuart Summers wrote:
> > > > From: John Harrison <John.C.Harrison@Intel.com>
> > > >
> > > > GuC provides the ability to gather logs through a hardware
> > > > interface
> > > > called NPK. For certain debugging scenarios this can be
> > > > advantageous
> > > > over getting logs from memory (or in addition to).
> > > >
> > > > Add a hook for this alternate debugging mode via a configfs.
> > > > This
> > > > translates into a parameter passed to GuC during load time.
> > > >
> > > > v2: Convert to configfs from modparam (Matt)
> > > > v3: Configfs documentation formatting (Shuicheng)
> > > > Kerneldoc/comment add + configfs entry ordering
> > > > Only set the guc_log_target when GuC log is enabled
> > > > (Daniele)
> > >
> > > nit: we may keep change log under --- so it stays on the ML only
> >
> > Ok makes sense I'll do that on the next upload.
> >
> > >
> > > and please not forget to use -v option while preparing new patch
> > > revisions
> >
> > Thanks Michal, I'll make sure to include this going forward.
> >
> > >
> > > [1]
> > > https://git-scm.com/docs/git-format-patch#Documentation/git-format-patch.txt--vn
> > >
> > > >
> > > > Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
> > > > Signed-off-by: Stuart Summers <stuart.summers@intel.com>
> > > > Acked-by: Shuicheng Lin <shuicheng.lin@intel.com>
> > > > ---
> > > > drivers/gpu/drm/xe/xe_configfs.c | 70
> > > > ++++++++++++++++++++++++++++++++
> > > > drivers/gpu/drm/xe/xe_configfs.h | 5 +++
> > > > drivers/gpu/drm/xe/xe_defaults.h | 1 +
> > > > drivers/gpu/drm/xe/xe_guc.c | 11 +++--
> > > > 4 files changed, 84 insertions(+), 3 deletions(-)
> > > >
> > > > diff --git a/drivers/gpu/drm/xe/xe_configfs.c
> > > > b/drivers/gpu/drm/xe/xe_configfs.c
> > > > index 32102600a148..e4511ee4e135 100644
> > > > --- a/drivers/gpu/drm/xe/xe_configfs.c
> > > > +++ b/drivers/gpu/drm/xe/xe_configfs.c
> > > > @@ -83,6 +83,16 @@
> > > > *
> > > > * This attribute can only be set before binding to the
> > > > device.
> > > > *
> > > > + * GuC log target:
> > > > + * ---------------
> > > > + *
> > > > + * Set the destination for the GuC log. 0 - memory only
> > > > (default),
> > > > + * 1 - NPK only, 2 - memory + NPK. Example::
> > > > + *
> > > > + * # echo 2 >
> > > > /sys/kernel/config/xe/0000:03:00.0/guc_log_target
> > > > + *
> > > > + * This attribute can only be set before binding to the
> > > > device.
> > > > + *
> > > > * Allowed GT types:
> > > > * -----------------
> > > > *
> > > > @@ -256,6 +266,7 @@ struct xe_config_group_device {
> > > > struct config_group sriov;
> > > >
> > > > struct xe_config_device {
> > > > + u8 guc_log_target;
> > > > u64 gt_types_allowed;
> > > > u64 engines_allowed;
> > > > struct wa_bb
> > > > ctx_restore_post_bb[XE_ENGINE_CLASS_MAX];
> > > > @@ -277,6 +288,7 @@ struct xe_config_group_device {
> > > > };
> > > >
> > > > static const struct xe_config_device device_defaults = {
> > > > + .guc_log_target = XE_DEFAULT_GUC_LOG_TARGET,
> > > > .gt_types_allowed = U64_MAX,
> > > > .engines_allowed = U64_MAX,
> > > > .survivability_mode = false,
> > > > @@ -357,6 +369,41 @@ static bool is_bound(struct
> > > > xe_config_group_device *dev)
> > > > return ret;
> > > > }
> > > >
> > >
> > > can we expose this new attribute only for XE_DEBUG_GUC config?
> > > we can easily use xe_config_device_is_visible for this
> >
> > Makes sense to me. I'll make the change.
> >
> > >
> > > > +static ssize_t guc_log_target_show(struct config_item *item,
> > > > char
> > > > *page)
> > > > +{
> > > > + struct xe_config_device *dev =
> > > > to_xe_config_device(item);
> > > > +
> > > > + return sprintf(page, "%d\n", dev->guc_log_target);
> > > > +}
> > > > +
> > > > +static ssize_t guc_log_target_store(struct config_item *item,
> > > > const char *page, size_t len)
> > > > +{
> > > > + struct xe_config_group_device *dev =
> > > > to_xe_config_group_device(item);
> > > > + u8 guc_log_target;
> > > > + int ret;
> > > > +
> > > > + ret = kstrtou8(page, 0, &guc_log_target);
> > > > + if (ret)
> > > > + return ret;
> > > > +
> > > > + /*
> > > > + * No need to define full enumeration set since this is
> > > > directly
> > > > + * applied from the user here to GuC.
> > > > + */
> > > > +#define GUC_LOG_TARGET_MAX 2
> > >
> > > late to the party but agree with Daniele that this should be part
> > > of
> > > the
> > > GuC ABI file, and unlike Daniele I would prefer to enforce that
> > > as
> > > otherwise
> > > we will start again mixing local defines that we can change with
> > > GuC
> > > definitions that we don't own and can't change
> > >
> > > (and yes, GUC_LOG_LEVEL min/max definitions should also follow
> > > that
> > > rule
> > > so they should be fixed too - someday ...)
> >
> > Maybe I'll just include that in the next rev...
>
> btw, as there might be more "GuC" specific attributes, maybe we
> should
> try to group them?
>
> /sys/kernel/config/xe/
> └── 0000:4d:00.0
> ├── ...
> └── guc
> ├── firmware_path ""
> ├── log_level 0..5
> ├── log_npk false|true
> ├── log_target 0..3
> └── ...
Yeah makes sense to me...
>
> >
> > >
> > > for me it looks that this MAX could be based on existing define:
> > >
> > > #define GUC_LOG_TARGET_MAX FIELD_MAX(GUC_LOG_DESTINATION)
> > >
> > > but I'm wondering whether actually we should expose in stable
> > > configfs
> > > the low-level GuC ABI definitions
> > >
> > > maybe more safe solution would be to add just higher-level
> > > attribute
> > >
> > > bool guc_npk; /* use NPK? default: false */
> > >
> > > and just convert that into GuC ABI bits in guc_ctl_debug_flags()
> > > ?
> > >
> > > flags |= FIELD_PREP(GUC_LOG_DESTINATION,
> > > xe_configfs_guc_npk(pdev) ?
> > > GUC_LOG_TARGET_MEM_AND_NPK :
> > > GUC_LOG_TARGET_MEM_ONLY);
> >
> > So I do like having the ability to pick and chose how we configure
> > the
> > logging here. I think in most cases sending to both lmem and npk is
> > what we want, but there might be some corner case debugs where any
> > regular access to lmem (or even smem) like this causes problems and
> > we
> > really do just want to send everything to npk. And we could of
> > course
> > default to send to npk and lmem, but I think for the general case
> > we
> > will never actually use this - it's a debug only function.
> >
> > But your point about ABI is fair here. We don't have any use case
> > beyond these two targets today, but that doesn't mean it always has
> > to
> > be the case... We could enforce these values for 0-2 and only add
> > additional destinations on top of that.
> >
> > Although given this is really a debug feature, would it make more
> > sense
> > to split this out as part of a debug only configfs? That's really
> > the
> > case for almost all of what we have in configfs today, minus maybe
> > the
> > max VF configuration - it isn't about performance tuning or
> > anything,
> > just about reducing scope of the driver in one way or another or
> > enabling some debug capability otherwise. To me that isn't a true
> > ABI.
>
> +1
>
> but in the past I was told that configfs is ABI
At least from the documentation it seems like it is. The documentation
compares it directly to sysfs - a configuration alternative to the
sysfs runtime. But at least wrapping in DRM_XE_DEBUG we can prevent
obvious mis-use... For now I can at least float the patch and get
feedback. I'll add the pros and cons from what you described in the new
cover letter so we can discuss.
>
> >
> > What if I split this into xe_configfs.c and xe_configfs_debug.c,
> > moved
> > all of the debug specific entries to the latter with a little less
> > restriction and kept the max VF one in xe_configfs.c for now? Then
> > xe_configfs_debug.c can wrap in
> > CONFIG_DRM_XE_DEBUG/CONFIG_DRM_XE_DEBUG_GUC?
>
> so now that's the question to the maintainers - and I guess the main
> question here is if already exposed attributes can be now hidden
>
> (maybe we can just clarify that some entries are DEBUG only, and
> thus may be changed/dropped in the future)
Yeah I mean to me at least if we call it out as debug via config, it
means an end user should rely on it... it requires them to rebuild the
kernel if nothing else from the distro release.
Thanks,
Stuart
>
> >
> > I'll wait to hear back before making a change like that so we're on
> > the
> > same page.
> >
> > >
> > >
> > > > + if (guc_log_target > GUC_LOG_TARGET_MAX)
> > > > + return -EINVAL;
> > > > +#undef GUC_LOG_TARGET_MAX
> > > > +> + guard(mutex)(&dev->lock);
> > > > + if (is_bound(dev))
> > > > + return -EBUSY;
> > > > +
> > > > + dev->config.guc_log_target = guc_log_target;
> > > > +
> > > > + return len;
> > > > +}
> > > > +
> > > > static ssize_t survivability_mode_show(struct config_item
> > > > *item,
> > > > char *page)
> > > > {
> > > > struct xe_config_device *dev =
> > > > to_xe_config_device(item);
> > > > @@ -815,6 +862,7 @@ CONFIGFS_ATTR(, ctx_restore_post_bb);
> > > > CONFIGFS_ATTR(, enable_psmi);
> > > > CONFIGFS_ATTR(, engines_allowed);
> > > > CONFIGFS_ATTR(, gt_types_allowed);
> > > > +CONFIGFS_ATTR(, guc_log_target);
> > > > CONFIGFS_ATTR(, survivability_mode);
> > > >
> > > > static struct configfs_attribute *xe_config_device_attrs[] = {
> > > > @@ -823,6 +871,7 @@ static struct configfs_attribute
> > > > *xe_config_device_attrs[] = {
> > > > &attr_enable_psmi,
> > > > &attr_engines_allowed,
> > > > &attr_gt_types_allowed,
> > > > + &attr_guc_log_target,
> > > > &attr_survivability_mode,
> > > > NULL,
> > > > };
> > > > @@ -1095,6 +1144,7 @@ static void dump_custom_dev_config(struct
> > > > pci_dev *pdev,
> > > > dev->config.attr_); \
> > > > } while (0)
> > > >
> > > > + PRI_CUSTOM_ATTR("%d", guc_log_target);
> > > > PRI_CUSTOM_ATTR("%llx", gt_types_allowed);
> > > > PRI_CUSTOM_ATTR("%llx", engines_allowed);
> > > > PRI_CUSTOM_ATTR("%d", enable_psmi);
> > > > @@ -1147,6 +1197,26 @@ bool
> > > > xe_configfs_get_survivability_mode(struct pci_dev *pdev)
> > > > return mode;
> > > > }
> > > >
> > > > +/**
> > > > + * xe_configfs_get_guc_log_target - get configfs GuC log
> > > > target
> > > > attribute
> > >
> > > nit: we try to append () to the function name in doc, like:
> > >
> > > * xe_configfs_get_guc_log_target() - Get GuC log target
> > > attribute.
> >
> > Ah makes sense thanks.
> >
> > Thanks,
> > Stuart
> >
> > >
> > > [2]
> > > https://docs.kernel.org/doc-guide/kernel-doc.html#function-documentation
> > >
> > > > + * @pdev: pci device
> > > > + *
> > > > + * Return: guc_log_target attribute in configfs
> > > > + */
> > > > +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev)
> > > > +{
> > > > + struct xe_config_group_device *dev =
> > > > find_xe_config_group_device(pdev);
> > > > + u8 target;
> > > > +
> > > > + if (!dev)
> > > > + return device_defaults.guc_log_target;
> > > > +
> > > > + target = dev->config.guc_log_target;
> > > > + config_group_put(&dev->group);
> > > > +
> > > > + return target;
> > > > +}
> > > > +
> > > > static u64 get_gt_types_allowed(struct pci_dev *pdev)
> > > > {
> > > > struct xe_config_group_device *dev =
> > > > find_xe_config_group_device(pdev);
> > > > diff --git a/drivers/gpu/drm/xe/xe_configfs.h
> > > > b/drivers/gpu/drm/xe/xe_configfs.h
> > > > index 07d62bf0c152..fb5cb7c57e75 100644
> > > > --- a/drivers/gpu/drm/xe/xe_configfs.h
> > > > +++ b/drivers/gpu/drm/xe/xe_configfs.h
> > > > @@ -19,6 +19,7 @@ int xe_configfs_init(void);
> > > > void xe_configfs_exit(void);
> > > > void xe_configfs_check_device(struct pci_dev *pdev);
> > > > bool xe_configfs_get_survivability_mode(struct pci_dev *pdev);
> > > > +u8 xe_configfs_get_guc_log_target(struct pci_dev *pdev);
> > > > bool xe_configfs_primary_gt_allowed(struct pci_dev *pdev);
> > > > bool xe_configfs_media_gt_allowed(struct pci_dev *pdev);
> > > > u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
> > > > @@ -38,6 +39,10 @@ static inline int xe_configfs_init(void) {
> > > > return 0; }
> > > > static inline void xe_configfs_exit(void) { }
> > > > static inline void xe_configfs_check_device(struct pci_dev
> > > > *pdev)
> > > > { }
> > > > static inline bool xe_configfs_get_survivability_mode(struct
> > > > pci_dev *pdev) { return false; }
> > > > +static inline u8 xe_configfs_get_guc_log_target(struct pci_dev
> > > > *pdev)
> > > > +{
> > > > + return XE_DEFAULT_GUC_LOG_TARGET;
> > > > +}
> > > > static inline bool xe_configfs_primary_gt_allowed(struct
> > > > pci_dev
> > > > *pdev) { return true; }
> > > > static inline bool xe_configfs_media_gt_allowed(struct pci_dev
> > > > *pdev) { return true; }
> > > > static inline u64 xe_configfs_get_engines_allowed(struct
> > > > pci_dev
> > > > *pdev) { return U64_MAX; }
> > > > diff --git a/drivers/gpu/drm/xe/xe_defaults.h
> > > > b/drivers/gpu/drm/xe/xe_defaults.h
> > > > index c8ae1d5f3d60..fbe670668a04 100644
> > > > --- a/drivers/gpu/drm/xe/xe_defaults.h
> > > > +++ b/drivers/gpu/drm/xe/xe_defaults.h
> > > > @@ -12,6 +12,7 @@
> > > > #else
> > > > #define XE_DEFAULT_GUC_LOG_LEVEL 1
> > > > #endif
> > > > +#define XE_DEFAULT_GUC_LOG_TARGET 0
> > > >
> > > > #define
> > > > XE_DEFAULT_PROBE_DISPLAY IS_ENABLED(CONFIG_DRM_XE
> > > > _DIS
> > > > PLAY)
> > > > #define XE_DEFAULT_VRAM_BAR_SIZE 0
> > > > diff --git a/drivers/gpu/drm/xe/xe_guc.c
> > > > b/drivers/gpu/drm/xe/xe_guc.c
> > > > index e762eada21db..c40bd4aec2ce 100644
> > > > --- a/drivers/gpu/drm/xe/xe_guc.c
> > > > +++ b/drivers/gpu/drm/xe/xe_guc.c
> > > > @@ -73,13 +73,18 @@ static u32 guc_bo_ggtt_addr(struct xe_guc
> > > > *guc,
> > > >
> > > > static u32 guc_ctl_debug_flags(struct xe_guc *guc)
> > > > {
> > > > + struct pci_dev *pdev = to_pci_dev(guc_to_xe(guc)-
> > > > >drm.dev);
> > > > u32 level = xe_guc_log_get_level(&guc->log);
> > > > u32 flags = 0;
> > > >
> > > > - if (!GUC_LOG_LEVEL_IS_VERBOSE(level))
> > > > + if (!GUC_LOG_LEVEL_IS_VERBOSE(level)) {
> > > > flags |= GUC_LOG_DISABLED;
> > > > - else
> > > > - flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> > > > GUC_LOG_LEVEL_TO_VERBOSITY(level));
> > > > + } else {
> > > > + flags |= FIELD_PREP(GUC_LOG_VERBOSITY,
> > > > +
> > > > GUC_LOG_LEVEL_TO_VERBOSITY(level));
> > > > + flags |= FIELD_PREP(GUC_LOG_DESTINATION,
> > > > +
> > > > xe_configfs_get_guc_log_target(pdev));
> > > > + }
> > > >
> > > > return flags;
> > > > }
> > >
> >
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-04-07 18:55 ` Summers, Stuart
2026-04-08 12:40 ` Michal Wajdeczko
@ 2026-04-08 13:18 ` Jani Nikula
2026-04-08 22:02 ` Summers, Stuart
1 sibling, 1 reply; 23+ messages in thread
From: Jani Nikula @ 2026-04-08 13:18 UTC (permalink / raw)
To: Summers, Stuart, Wajdeczko, Michal
Cc: intel-xe@lists.freedesktop.org, Lin, Shuicheng, Yang, Fei,
Roper, Matthew D, Ceraolo Spurio, Daniele
On Tue, 07 Apr 2026, "Summers, Stuart" <stuart.summers@intel.com> wrote:
> On Tue, 2026-04-07 at 11:48 +0200, Michal Wajdeczko wrote:
>>
>> On 4/7/2026 12:53 AM, Stuart Summers wrote:
>> > From: John Harrison <John.C.Harrison@Intel.com>
>> >
>> > GuC provides the ability to gather logs through a hardware
>> > interface
>> > called NPK. For certain debugging scenarios this can be
>> > advantageous
>> > over getting logs from memory (or in addition to).
>> >
>> > Add a hook for this alternate debugging mode via a configfs. This
>> > translates into a parameter passed to GuC during load time.
>> >
>> > v2: Convert to configfs from modparam (Matt)
>> > v3: Configfs documentation formatting (Shuicheng)
>> > Kerneldoc/comment add + configfs entry ordering
>> > Only set the guc_log_target when GuC log is enabled (Daniele)
>>
>> nit: we may keep change log under --- so it stays on the ML only
>
> Ok makes sense I'll do that on the next upload.
Is this an intentional deviation from the quite prevalent drm subsystem
style of including the changelog in the commit message?
I'm not dead set on either style personally, but I do not like
conflicting review feedback, and people not knowing what to do.
BR,
Jani.
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH] drm/xe/guc: Add support for NPK as a GuC log target
2026-04-08 13:18 ` Jani Nikula
@ 2026-04-08 22:02 ` Summers, Stuart
0 siblings, 0 replies; 23+ messages in thread
From: Summers, Stuart @ 2026-04-08 22:02 UTC (permalink / raw)
To: jani.nikula@linux.intel.com, Wajdeczko, Michal
Cc: intel-xe@lists.freedesktop.org, Lin, Shuicheng, Yang, Fei,
Roper, Matthew D, Ceraolo Spurio, Daniele
On Wed, 2026-04-08 at 16:18 +0300, Jani Nikula wrote:
> On Tue, 07 Apr 2026, "Summers, Stuart" <stuart.summers@intel.com>
> wrote:
> > On Tue, 2026-04-07 at 11:48 +0200, Michal Wajdeczko wrote:
> > >
> > > On 4/7/2026 12:53 AM, Stuart Summers wrote:
> > > > From: John Harrison <John.C.Harrison@Intel.com>
> > > >
> > > > GuC provides the ability to gather logs through a hardware
> > > > interface
> > > > called NPK. For certain debugging scenarios this can be
> > > > advantageous
> > > > over getting logs from memory (or in addition to).
> > > >
> > > > Add a hook for this alternate debugging mode via a configfs.
> > > > This
> > > > translates into a parameter passed to GuC during load time.
> > > >
> > > > v2: Convert to configfs from modparam (Matt)
> > > > v3: Configfs documentation formatting (Shuicheng)
> > > > Kerneldoc/comment add + configfs entry ordering
> > > > Only set the guc_log_target when GuC log is enabled
> > > > (Daniele)
> > >
> > > nit: we may keep change log under --- so it stays on the ML only
> >
> > Ok makes sense I'll do that on the next upload.
>
> Is this an intentional deviation from the quite prevalent drm
> subsystem
> style of including the changelog in the commit message?
>
> I'm not dead set on either style personally, but I do not like
> conflicting review feedback, and people not knowing what to do.
I agree it would be nice to have consistency, whatever we decide. I
don't have a strong preference either way, although it is interesting
to me to see progression looking at the patch history - but we can get
the same looking at the mailing list archives which is probably even
more interesting.
Do we have a general recommendation here? I don't see anything in the
git format-patch section. The kernel canonical patch format
documentation [1] does mention this as a possibility, but not a
requirement (from my reading):
"""
One good use for the additional comments after the --- marker is for a
diffstat, to show what files have changed, and the number of inserted
and deleted lines per file. A diffstat is especially useful on bigger
patches. Other comments relevant only to the moment or the maintainer,
not suitable for the permanent changelog, should also go here. A good
example of such comments might be patch changelogs which describe what
has changed between the v1 and v2 version of the patch.
"""
[1]:
https://www.kernel.org/doc/html/v4.11/process/submitting-patches.html#the-canonical-patch-format
Thanks,
Stuart
>
>
> BR,
> Jani.
>
>
^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2026-04-08 22:02 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-24 20:36 [PATCH] drm/xe/guc: Add support for NPK as a GuC log target Stuart Summers
2026-02-24 20:46 ` ✓ CI.KUnit: success for " Patchwork
2026-02-24 21:20 ` ✓ Xe.CI.BAT: " Patchwork
2026-02-25 0:24 ` [PATCH] " Matt Roper
2026-02-25 21:52 ` Summers, Stuart
2026-02-25 22:46 ` Matt Roper
2026-02-25 5:31 ` ✗ Xe.CI.FULL: failure for " Patchwork
-- strict thread matches above, loose matches on Subject: below --
2026-02-26 23:26 [PATCH] " Stuart Summers
2026-03-19 18:25 ` Summers, Stuart
2026-04-06 17:58 ` Summers, Stuart
2026-04-06 21:28 ` Daniele Ceraolo Spurio
2026-04-06 22:37 ` Summers, Stuart
2026-04-06 23:45 ` Daniele Ceraolo Spurio
2026-04-06 23:59 ` Summers, Stuart
2026-04-06 21:59 ` Lin, Shuicheng
2026-04-06 22:38 ` Summers, Stuart
2026-04-06 22:53 Stuart Summers
2026-04-07 9:48 ` Michal Wajdeczko
2026-04-07 18:55 ` Summers, Stuart
2026-04-08 12:40 ` Michal Wajdeczko
2026-04-08 21:51 ` Summers, Stuart
2026-04-08 13:18 ` Jani Nikula
2026-04-08 22:02 ` Summers, Stuart
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox