Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 00/27] Scope-based forcewake and runtime PM
@ 2025-11-14 21:43 Matt Roper
  2025-11-14 21:43 ` [PATCH v3 01/27] drm/xe/forcewake: Add scope-based cleanup for forcewake Matt Roper
                   ` (30 more replies)
  0 siblings, 31 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe
  Cc: matthew.d.roper, Michal Wajdeczko, Lucas De Marchi, Gustavo Sousa

Forcewake and runtime PM both follow reference-counted get/put models;
when used in functions that can encounter errors and return early, it's
easy for developers to make mistakes and fail to drop a reference on all
of the error paths.  Cleanup of these reference counts is often
addressed by goto-based error handling which is somewhat ugly and
subject to its own set of mistakes once we accumulate too many error
labels in a function.

Scope-based cleanup ([1][2]) has been gaining increasing popularity in
the Linux kernel for cleaning up various kinds of resources in a more
automated way when code has lots of error paths and early exits.  Let's
add scope-based cleanup for both forcewake and runtime PM, based on the
mechanisms provided in include/linux/cleanup.h.  Scope-based cleanup
allows cleanup destructors to be executed automatically when the current
scope is exited by any means (end of block, return, break, etc.).

For xe_runtime_pm_{get,put} pairs that were grabbed and released within
a single function or block, the preferred replacement is now just

        guard(xe_pm_runtime_noresume)(xe);

which will take care of releasing the runtime PM reference
automatically.  scoped_guard() can be used instead if the reference
should only be held over part of the block.  There are also guard
variants added for xe_pm_runtime_noresume and xe_pm_runtime_ioctl that
allow replacement of those alternate functions as well.

Unlike runtime PM, where all reference tracking is done within the
object parameter itself, forcewake is currently a model where get
operations return a cookie that needs to be passed back to put
operations.  That necessitates a slightly different type of cleanup
helper (CLASS instead of guard), although the underlying mechanisms are
the same.  For forcewake that is grabbed and released within a single
function or block, the preferred form is now:

        CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);

which, like the runtime PM equivalent, will cause the forcewake
reference to be dropped automatically.  If forcewake needs to be held
over only a subset of the current block,

        xe_with_force_wake(fw_ref, gt_to_fw(gt), XE_FW_GT) { ... }

can be used in the same way scoped_guard() is used for runtime PM.

The first few patches in this series make some general cleanups and
restructuring of the existing force wake code.  Then the new guards and
classes for runtime PM and forcewake are defined.  Finally, most of the
existing runtime PM and forcewake usage in the driver is converted to
the scope-based form in the remainder of the series.  Some of the
conversions eliminate goto-based cleanup models and/or significantly
simplify the code.  Other conversions don't significantly simplify the
code (aside from a slight reduction in line count), but are still useful
for consistency across our codebase.

An advantage of doing the conversion everywhere possible, not just the
places where it noticeably simplifies the code, is that it helps
highlight the remaining get/put usage as special cases where wake
references follow more complicated lifetimes (e.g., obtained in one
function and released in a different one, often tied to some other type
of resource or operation).  With fewer direct get/put calls overall, its
easier to identify the ones that remain as special cases and make sure
they truly are paired up properly.

There's other areas where scope-based cleanup could potentially be
applied in the future (e.g., mutex locks, bo locking, etc.), but this
series does not try to address those, even in places where those
resources are also part of the same error handling cleanup paths as
forcewake and runtime PM.  We can potentially think about converting
other types of resources to scope-based cleanup down the road if it
winds up working well here for forcewake and PM.

v2:
 - Add a proper success condition to the xe_pm_runtime_ioctl class so
   that conditional guards properly distinguish success (requiring
   cleanup) from errors (no cleanup).  (CI)
 - Don't bother changing the signature of xe_force_wake_get() before
   adding the forcewake class.  Simply create a separate constructor
   that wraps xe_force_wake_get().  (Michal)
 - Split ACQUIRE_ERR assignments from the condition checks.  Even though
   this takes an extra line of code and deviates from most of the other
   uses in the kernel, it's easier to read (and avoids checkpatch
   warnings).

v3:
 - Wrap xe_with_force_wake's 'done' marker in __UNIQUE_ID. (Gustavo)
 - Add a general xe_force_wake_release_only class which eliminates the
   need for the one-off xe_force_wake_any_engine class later in the
   series.  (Gustavo)
 - Drop scope-based usage from gt_reset_worker() since goto-based flows
   are still used there.  (Gustavo)
 - Add kerneldoc to existing _get functions explaining that scope-based
   options should be preferred when possible.  (Gustavo)
 - Eliminate several 'ret' local variables that become unnecessary after
   the scope-based conversion.  (Gustavo)

References:
 [1] https://www.kernel.org/doc/html/next/core-api/cleanup.html
 [2] https://lwn.net/Articles/934679/


Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: Gustavo Sousa <gustavo.sousa@intel.com>

Matt Roper (27):
  drm/xe/forcewake: Add scope-based cleanup for forcewake
  drm/xe/pm: Add scope-based cleanup helper for runtime PM
  drm/xe/gt: Use scope-based cleanup
  drm/xe/gt_idle: Use scope-based cleanup
  drm/xe/guc: Use scope-based cleanup
  drm/xe/guc_pc: Use scope-based cleanup
  drm/xe/mocs: Use scope-based cleanup
  drm/xe/pat: Use scope-based forcewake
  drm/xe/pxp: Use scope-based cleanup
  drm/xe/gsc: Use scope-based cleanup
  drm/xe/device: Use scope-based cleanup
  drm/xe/devcoredump: Use scope-based cleanup
  drm/xe/display: Use scoped-cleanup
  drm/xe: Return forcewake reference type from
    force_wake_get_any_engine()
  drm/xe/drm_client: Use scope-based cleanup
  drm/xe/gt_debugfs: Use scope-based cleanup
  drm/xe/huc: Use scope-based forcewake
  drm/xe/query: Use scope-based forcewake
  drm/xe/reg_sr: Use scope-based forcewake
  drm/xe/vram: Use scope-based forcewake
  drm/xe/bo: Use scope-based runtime PM
  drm/xe/ggtt: Use scope-based runtime pm
  drm/xe/hwmon: Use scope-based runtime PM
  drm/xe/sriov: Use scope-based runtime PM
  drm/xe/tests: Use scope-based runtime PM
  drm/xe/sysfs: Use scope-based runtime power management
  drm/xe/debugfs: Use scope-based runtime PM

 drivers/gpu/drm/xe/display/xe_fb_pin.c        |  23 ++--
 drivers/gpu/drm/xe/display/xe_hdcp_gsc.c      |  31 ++---
 drivers/gpu/drm/xe/tests/xe_bo.c              |  10 +-
 drivers/gpu/drm/xe/tests/xe_dma_buf.c         |   3 +-
 drivers/gpu/drm/xe/tests/xe_migrate.c         |  10 +-
 drivers/gpu/drm/xe/tests/xe_mocs.c            |  27 ++--
 drivers/gpu/drm/xe/xe_bo.c                    |   8 +-
 drivers/gpu/drm/xe/xe_debugfs.c               |  16 +--
 drivers/gpu/drm/xe/xe_devcoredump.c           |  30 ++--
 drivers/gpu/drm/xe/xe_device.c                |  33 ++---
 drivers/gpu/drm/xe/xe_device_sysfs.c          |  33 ++---
 drivers/gpu/drm/xe/xe_drm_client.c            |  69 +++++-----
 drivers/gpu/drm/xe/xe_force_wake.c            |   7 +
 drivers/gpu/drm/xe/xe_force_wake.h            |  40 ++++++
 drivers/gpu/drm/xe/xe_ggtt.c                  |   3 +-
 drivers/gpu/drm/xe/xe_gsc.c                   |  21 +--
 drivers/gpu/drm/xe/xe_gsc_debugfs.c           |   3 +-
 drivers/gpu/drm/xe/xe_gsc_proxy.c             |  17 +--
 drivers/gpu/drm/xe/xe_gt.c                    | 130 ++++++------------
 drivers/gpu/drm/xe/xe_gt_debugfs.c            |  29 ++--
 drivers/gpu/drm/xe/xe_gt_freq.c               |  27 ++--
 drivers/gpu/drm/xe/xe_gt_idle.c               |  41 ++----
 drivers/gpu/drm/xe/xe_gt_sriov_pf_debugfs.c   |  12 +-
 drivers/gpu/drm/xe/xe_gt_throttle.c           |   9 +-
 drivers/gpu/drm/xe/xe_guc.c                   |  13 +-
 drivers/gpu/drm/xe/xe_guc_debugfs.c           |   8 +-
 drivers/gpu/drm/xe/xe_guc_log.c               |  10 +-
 drivers/gpu/drm/xe/xe_guc_pc.c                |  62 +++------
 drivers/gpu/drm/xe/xe_guc_submit.c            |  11 +-
 drivers/gpu/drm/xe/xe_guc_tlb_inval.c         |   4 +-
 drivers/gpu/drm/xe/xe_huc.c                   |   7 +-
 drivers/gpu/drm/xe/xe_huc_debugfs.c           |   3 +-
 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c |  16 +--
 drivers/gpu/drm/xe/xe_hwmon.c                 |  52 ++-----
 drivers/gpu/drm/xe/xe_mocs.c                  |  18 +--
 drivers/gpu/drm/xe/xe_pat.c                   |  36 ++---
 drivers/gpu/drm/xe/xe_pci_sriov.c             |  10 +-
 drivers/gpu/drm/xe/xe_pm.c                    |  21 +++
 drivers/gpu/drm/xe/xe_pm.h                    |  17 +++
 drivers/gpu/drm/xe/xe_pxp.c                   |  55 +++-----
 drivers/gpu/drm/xe/xe_query.c                 |  16 +--
 drivers/gpu/drm/xe/xe_reg_sr.c                |  17 +--
 drivers/gpu/drm/xe/xe_sriov_pf_debugfs.c      |   6 +-
 drivers/gpu/drm/xe/xe_sriov_pf_sysfs.c        |  16 +--
 drivers/gpu/drm/xe/xe_sriov_vf_ccs.c          |   5 +-
 drivers/gpu/drm/xe/xe_tile_debugfs.c          |   8 +-
 drivers/gpu/drm/xe/xe_tile_sriov_pf_debugfs.c |   3 +-
 drivers/gpu/drm/xe/xe_vram.c                  |   6 +-
 48 files changed, 399 insertions(+), 653 deletions(-)

-- 
2.51.1


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

* [PATCH v3 01/27] drm/xe/forcewake: Add scope-based cleanup for forcewake
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-17 22:03   ` Gustavo Sousa
  2025-11-14 21:43 ` [PATCH v3 02/27] drm/xe/pm: Add scope-based cleanup helper for runtime PM Matt Roper
                   ` (29 subsequent siblings)
  30 siblings, 1 reply; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Michal Wajdeczko, Gustavo Sousa

Since forcewake uses a reference counting get/put model, there are many
places where we need to be careful to drop the forcewake reference when
bailing out of a function early on an error path.  Add scope-based
cleanup options that can be used in place of explicit get/put to help
prevent mistakes in this area.

Examples:

   CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);

       Obtain forcewake on the XE_FW_GT domain and hold it until the
       end of the current block.  The wakeref will be dropped
       automatically when the current scope is exited by any means
       (return, break, reaching the end of the block, etc.).

   xe_with_force_wake(fw_ref, gt_to_fw(ss->gt), XE_FORCEWAKE_ALL) {
        ...
   }

       Hold all forcewake domains for the following block.  As with the
       CLASS usage, forcewake will be dropped automatically when the
       block is exited by any means.

Use of these cleanup helpers should allow us to remove some ugly
goto-based error handling and help avoid mistakes in functions with lots
of early error exits.

An 'xe_force_wake_release_only' class is also added for cases where a
forcewake reference is passed in from another function and the current
function is responsible for releasing it in every flow and error path.

v2:
 - Create a separate constructor that just wraps xe_force_wake_get for
   use in the class.  This eliminates the need to update the signature
   of xe_force_wake_get().  (Michal)

v3:
 - Wrap xe_with_force_wake's 'done' marker in __UNIQUE_ID.  (Gustavo)
 - Add a note to xe_force_wake_get()'s kerneldoc explaining that
   scope-based cleanup is preferred when possible.  (Gustavo)
 - Add an xe_force_wake_release_only class.  (Gustavo)

Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_force_wake.c |  7 ++++++
 drivers/gpu/drm/xe/xe_force_wake.h | 40 ++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_force_wake.c b/drivers/gpu/drm/xe/xe_force_wake.c
index c59a9b330697..76e054f314ee 100644
--- a/drivers/gpu/drm/xe/xe_force_wake.c
+++ b/drivers/gpu/drm/xe/xe_force_wake.c
@@ -166,6 +166,13 @@ static int domain_sleep_wait(struct xe_gt *gt,
  * xe_force_wake_ref_has_domain() function. Caller must call
  * xe_force_wake_put() function to decrease incremented refcounts.
  *
+ * When possible, scope-based forcewake (through CLASS(xe_force_wake, ...) or
+ * xe_with_force_wake()) should be used instead of direct calls to this
+ * function.  Direct usage of get/put should only be used when the function
+ * has goto-based flows that can interfere with scope-based cleanup, or when
+ * the lifetime of the forcewake reference does not match a specific scope
+ * (e.g., forcewake obtained in one function and released in a different one).
+ *
  * Return: opaque reference to woken domains or zero if none of requested
  * domains were awake.
  */
diff --git a/drivers/gpu/drm/xe/xe_force_wake.h b/drivers/gpu/drm/xe/xe_force_wake.h
index 0e3e84bfa51c..ffc4e103fe31 100644
--- a/drivers/gpu/drm/xe/xe_force_wake.h
+++ b/drivers/gpu/drm/xe/xe_force_wake.h
@@ -61,4 +61,44 @@ xe_force_wake_ref_has_domain(unsigned int fw_ref, enum xe_force_wake_domains dom
 	return fw_ref & domain;
 }
 
+struct xe_force_wake_ref {
+	struct xe_force_wake *fw;
+	unsigned int domains;
+};
+
+static struct xe_force_wake_ref
+xe_force_wake_constructor(struct xe_force_wake *fw, unsigned int domains)
+{
+	struct xe_force_wake_ref fw_ref = { .fw = fw };
+
+	fw_ref.domains = xe_force_wake_get(fw, domains);
+
+	return fw_ref;
+}
+
+DEFINE_CLASS(xe_force_wake, struct xe_force_wake_ref,
+	     xe_force_wake_put(_T.fw, _T.domains),
+	     xe_force_wake_constructor(fw, domains),
+	     struct xe_force_wake *fw, unsigned int domains);
+
+/*
+ * Scoped helper for the forcewake class, using the same trick as scoped_guard()
+ * to bind the lifetime to the next statement/block.
+ */
+#define __xe_with_force_wake(ref, fw, domains, done) \
+	for (CLASS(xe_force_wake, ref)(fw, domains), *(done) = NULL; \
+	     !(done); (done) = (void *)1)
+
+#define xe_with_force_wake(ref, fw, domains) \
+	__xe_with_force_wake(ref, fw, domains, __UNIQUE_ID(done))
+
+/*
+ * Used when xe_force_wake_constructor() has already been called by another
+ * function and the current function is responsible for releasing the forcewake
+ * reference in all possible cases and error paths.
+ */
+DEFINE_CLASS(xe_force_wake_release_only, struct xe_force_wake_ref,
+	     xe_force_wake_put(_T.fw, _T.domains), fw_ref,
+	     struct xe_force_wake_ref fw_ref);
+
 #endif
-- 
2.51.1


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

* [PATCH v3 02/27] drm/xe/pm: Add scope-based cleanup helper for runtime PM
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
  2025-11-14 21:43 ` [PATCH v3 01/27] drm/xe/forcewake: Add scope-based cleanup for forcewake Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-17 22:04   ` Gustavo Sousa
  2025-11-14 21:43 ` [PATCH v3 03/27] drm/xe/gt: Use scope-based cleanup Matt Roper
                   ` (28 subsequent siblings)
  30 siblings, 1 reply; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa, Michal Wajdeczko

Add a scope-based helpers for runtime PM that may be used to simplify
cleanup logic and potentially avoid goto-based cleanup.

For example, using

        guard(xe_pm_runtime)(xe);

will get runtime PM and cause a corresponding put to occur automatically
when the current scope is exited.  'xe_pm_runtime_noresume' can be used
as a guard replacement for the corresponding 'noresume' variant.
There's also an xe_pm_runtime_ioctl conditional guard that can be used
as a replacement for xe_runtime_ioctl():

        ACQUIRE(xe_pm_runtime_ioctl, pm)(xe);
        if ((ret = ACQUIRE_ERR(xe_pm_runtime_ioctl, &pm)) < 0)
                /* failed */

In a few rare cases (such as gt_reset_worker()) we need to ensure that
runtime PM is dropped when the function is exited by any means
(including error paths), but the function does not need to acquire
runtime PM because that has already been done earlier by a different
function.  For these special cases, an 'xe_pm_runtime_release_only'
guard can be used to handle the release without doing an acquisition.

These guards will be used in future patches to eliminate some of our
goto-based cleanup.

v2:
 - Specify success condition for xe_pm runtime_ioctl as _RET >= 0 so
   that positive values will be properly identified as success and
   trigger destructor cleanup properly.

v3:
 - Add comments to the kerneldoc for the existing 'get' functions
   indicating that scope-based handling should be preferred where
   possible.  (Gustavo)

Cc: Gustavo Sousa <gustavo.sousa@intel.com>
Reviewed-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_pm.c | 21 +++++++++++++++++++++
 drivers/gpu/drm/xe/xe_pm.h | 17 +++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
index 0e573fb11bbb..ad92a142dc7e 100644
--- a/drivers/gpu/drm/xe/xe_pm.c
+++ b/drivers/gpu/drm/xe/xe_pm.c
@@ -722,6 +722,13 @@ static void xe_pm_runtime_lockdep_prime(void)
 /**
  * xe_pm_runtime_get - Get a runtime_pm reference and resume synchronously
  * @xe: xe device instance
+ *
+ * When possible, scope-based runtime PM (through guard(xe_pm_runtime)) is
+ * be preferred over direct usage of this function.  Manual get/put handling
+ * should only be used when the function contains goto-based logic which
+ * can break scope-based handling, or when the lifetime of the runtime PM
+ * reference does not match a specific scope (e.g., runtime PM obtained in one
+ * function and released in a different one).
  */
 void xe_pm_runtime_get(struct xe_device *xe)
 {
@@ -754,6 +761,13 @@ void xe_pm_runtime_put(struct xe_device *xe)
  * xe_pm_runtime_get_ioctl - Get a runtime_pm reference before ioctl
  * @xe: xe device instance
  *
+ * When possible, scope-based runtime PM (through
+ * ACQUIRE(xe_pm_runtime_ioctl, ...)) is be preferred over direct usage of this
+ * function.  Manual get/put handling should only be used when the function
+ * contains goto-based logic which can break scope-based handling, or when the
+ * lifetime of the runtime PM reference does not match a specific scope (e.g.,
+ * runtime PM obtained in one function and released in a different one).
+ *
  * Returns: Any number greater than or equal to 0 for success, negative error
  * code otherwise.
  */
@@ -823,6 +837,13 @@ static bool xe_pm_suspending_or_resuming(struct xe_device *xe)
  * It will warn if not protected.
  * The reference should be put back after this function regardless, since it
  * will always bump the usage counter, regardless.
+ *
+ * When possible, scope-based runtime PM (through guard(xe_pm_runtime_noresume))
+ * is be preferred over direct usage of this function.  Manual get/put handling
+ * should only be used when the function contains goto-based logic which can
+ * break scope-based handling, or when the lifetime of the runtime PM reference
+ * does not match a specific scope (e.g., runtime PM obtained in one function
+ * and released in a different one).
  */
 void xe_pm_runtime_get_noresume(struct xe_device *xe)
 {
diff --git a/drivers/gpu/drm/xe/xe_pm.h b/drivers/gpu/drm/xe/xe_pm.h
index f7f89a18b6fc..6b27039e7b2d 100644
--- a/drivers/gpu/drm/xe/xe_pm.h
+++ b/drivers/gpu/drm/xe/xe_pm.h
@@ -6,6 +6,7 @@
 #ifndef _XE_PM_H_
 #define _XE_PM_H_
 
+#include <linux/cleanup.h>
 #include <linux/pm_runtime.h>
 
 #define DEFAULT_VRAM_THRESHOLD 300 /* in MB */
@@ -37,4 +38,20 @@ int xe_pm_block_on_suspend(struct xe_device *xe);
 void xe_pm_might_block_on_suspend(void);
 int xe_pm_module_init(void);
 
+static inline void __xe_pm_runtime_noop(struct xe_device *xe) {}
+
+DEFINE_GUARD(xe_pm_runtime, struct xe_device *,
+	     xe_pm_runtime_get(_T), xe_pm_runtime_put(_T))
+DEFINE_GUARD(xe_pm_runtime_noresume, struct xe_device *,
+	     xe_pm_runtime_get_noresume(_T), xe_pm_runtime_put(_T))
+DEFINE_GUARD_COND(xe_pm_runtime, _ioctl, xe_pm_runtime_get_ioctl(_T), _RET >= 0)
+
+/*
+ * Used when a function needs to release runtime PM in all possible cases
+ * and error paths, but the wakeref was already acquired by a different
+ * function (i.e., get() has already happened so only a put() is needed).
+ */
+DEFINE_GUARD(xe_pm_runtime_release_only, struct xe_device *,
+	     __xe_pm_runtime_noop(_T), xe_pm_runtime_put(_T));
+
 #endif
-- 
2.51.1


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

* [PATCH v3 03/27] drm/xe/gt: Use scope-based cleanup
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
  2025-11-14 21:43 ` [PATCH v3 01/27] drm/xe/forcewake: Add scope-based cleanup for forcewake Matt Roper
  2025-11-14 21:43 ` [PATCH v3 02/27] drm/xe/pm: Add scope-based cleanup helper for runtime PM Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:43 ` [PATCH v3 04/27] drm/xe/gt_idle: " Matt Roper
                   ` (27 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Using scope-based cleanup for forcewake and runtime PM allows us to
reduce or eliminate some of the goto-based error handling and simplify
several functions.

v2:
 - Drop changes to do_gt_restart().  This function still has goto-based
   logic, making scope-based cleanup unsafe for now.  (Gustavo)

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_gt.c | 130 ++++++++++++-------------------------
 1 file changed, 41 insertions(+), 89 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c
index 6d479948bf21..514ed50e6d83 100644
--- a/drivers/gpu/drm/xe/xe_gt.c
+++ b/drivers/gpu/drm/xe/xe_gt.c
@@ -103,14 +103,13 @@ void xe_gt_sanitize(struct xe_gt *gt)
 
 static void xe_gt_enable_host_l2_vram(struct xe_gt *gt)
 {
-	unsigned int fw_ref;
 	u32 reg;
 
 	if (!XE_GT_WA(gt, 16023588340))
 		return;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref)
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref.domains)
 		return;
 
 	if (xe_gt_is_main_type(gt)) {
@@ -120,12 +119,10 @@ static void xe_gt_enable_host_l2_vram(struct xe_gt *gt)
 	}
 
 	xe_gt_mcr_multicast_write(gt, XEHPC_L3CLOS_MASK(3), 0xF);
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 }
 
 static void xe_gt_disable_host_l2_vram(struct xe_gt *gt)
 {
-	unsigned int fw_ref;
 	u32 reg;
 
 	if (!XE_GT_WA(gt, 16023588340))
@@ -134,15 +131,13 @@ static void xe_gt_disable_host_l2_vram(struct xe_gt *gt)
 	if (xe_gt_is_media_type(gt))
 		return;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref)
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref.domains)
 		return;
 
 	reg = xe_gt_mcr_unicast_read_any(gt, XE2_GAMREQSTRM_CTRL);
 	reg &= ~CG_DIS_CNTLBUS;
 	xe_gt_mcr_multicast_write(gt, XE2_GAMREQSTRM_CTRL, reg);
-
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 }
 
 static void gt_reset_worker(struct work_struct *w);
@@ -389,7 +384,6 @@ int xe_gt_record_default_lrcs(struct xe_gt *gt)
 
 int xe_gt_init_early(struct xe_gt *gt)
 {
-	unsigned int fw_ref;
 	int err;
 
 	if (IS_SRIOV_PF(gt_to_xe(gt))) {
@@ -436,13 +430,12 @@ int xe_gt_init_early(struct xe_gt *gt)
 	if (err)
 		return err;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref)
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref.domains)
 		return -ETIMEDOUT;
 
 	xe_gt_mcr_init_early(gt);
 	xe_pat_init(gt);
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 
 	return 0;
 }
@@ -460,16 +453,15 @@ static void dump_pat_on_error(struct xe_gt *gt)
 
 static int gt_init_with_gt_forcewake(struct xe_gt *gt)
 {
-	unsigned int fw_ref;
 	int err;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref)
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref.domains)
 		return -ETIMEDOUT;
 
 	err = xe_uc_init(&gt->uc);
 	if (err)
-		goto err_force_wake;
+		return err;
 
 	xe_gt_topology_init(gt);
 	xe_gt_mcr_init(gt);
@@ -478,7 +470,7 @@ static int gt_init_with_gt_forcewake(struct xe_gt *gt)
 	if (xe_gt_is_main_type(gt)) {
 		err = xe_ggtt_init(gt_to_tile(gt)->mem.ggtt);
 		if (err)
-			goto err_force_wake;
+			return err;
 		if (IS_SRIOV_PF(gt_to_xe(gt)))
 			xe_lmtt_init(&gt_to_tile(gt)->sriov.pf.lmtt);
 	}
@@ -492,17 +484,17 @@ static int gt_init_with_gt_forcewake(struct xe_gt *gt)
 	err = xe_hw_engines_init_early(gt);
 	if (err) {
 		dump_pat_on_error(gt);
-		goto err_force_wake;
+		return err;
 	}
 
 	err = xe_hw_engine_class_sysfs_init(gt);
 	if (err)
-		goto err_force_wake;
+		return err;
 
 	/* Initialize CCS mode sysfs after early initialization of HW engines */
 	err = xe_gt_ccs_mode_sysfs_init(gt);
 	if (err)
-		goto err_force_wake;
+		return err;
 
 	/*
 	 * Stash hardware-reported version.  Since this register does not exist
@@ -510,25 +502,16 @@ static int gt_init_with_gt_forcewake(struct xe_gt *gt)
 	 */
 	gt->info.gmdid = xe_mmio_read32(&gt->mmio, GMD_ID);
 
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	return 0;
-
-err_force_wake:
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-
-	return err;
 }
 
 static int gt_init_with_all_forcewake(struct xe_gt *gt)
 {
-	unsigned int fw_ref;
 	int err;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
-	if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL)) {
-		err = -ETIMEDOUT;
-		goto err_force_wake;
-	}
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FORCEWAKE_ALL);
+	if (!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FORCEWAKE_ALL))
+		return -ETIMEDOUT;
 
 	xe_gt_mcr_set_implicit_defaults(gt);
 	xe_wa_process_gt(gt);
@@ -537,20 +520,20 @@ static int gt_init_with_all_forcewake(struct xe_gt *gt)
 
 	err = xe_gt_clock_init(gt);
 	if (err)
-		goto err_force_wake;
+		return err;
 
 	xe_mocs_init(gt);
 	err = xe_execlist_init(gt);
 	if (err)
-		goto err_force_wake;
+		return err;
 
 	err = xe_hw_engines_init(gt);
 	if (err)
-		goto err_force_wake;
+		return err;
 
 	err = xe_uc_init_post_hwconfig(&gt->uc);
 	if (err)
-		goto err_force_wake;
+		return err;
 
 	if (xe_gt_is_main_type(gt)) {
 		/*
@@ -561,10 +544,8 @@ static int gt_init_with_all_forcewake(struct xe_gt *gt)
 
 			gt->usm.bb_pool = xe_sa_bo_manager_init(gt_to_tile(gt),
 								IS_DGFX(xe) ? SZ_1M : SZ_512K, 16);
-			if (IS_ERR(gt->usm.bb_pool)) {
-				err = PTR_ERR(gt->usm.bb_pool);
-				goto err_force_wake;
-			}
+			if (IS_ERR(gt->usm.bb_pool))
+				return PTR_ERR(gt->usm.bb_pool);
 		}
 	}
 
@@ -573,12 +554,12 @@ static int gt_init_with_all_forcewake(struct xe_gt *gt)
 
 		err = xe_migrate_init(tile->migrate);
 		if (err)
-			goto err_force_wake;
+			return err;
 	}
 
 	err = xe_uc_load_hw(&gt->uc);
 	if (err)
-		goto err_force_wake;
+		return err;
 
 	/* Configure default CCS mode of 1 engine with all resources */
 	if (xe_gt_ccs_mode_enabled(gt)) {
@@ -592,14 +573,7 @@ static int gt_init_with_all_forcewake(struct xe_gt *gt)
 	if (IS_SRIOV_PF(gt_to_xe(gt)))
 		xe_gt_sriov_pf_init_hw(gt);
 
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-
 	return 0;
-
-err_force_wake:
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-
-	return err;
 }
 
 static void xe_gt_fini(void *arg)
@@ -902,56 +876,42 @@ void xe_gt_reset_async(struct xe_gt *gt)
 
 void xe_gt_suspend_prepare(struct xe_gt *gt)
 {
-	unsigned int fw_ref;
-
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
-
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FORCEWAKE_ALL);
 	xe_uc_suspend_prepare(&gt->uc);
-
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 }
 
 int xe_gt_suspend(struct xe_gt *gt)
 {
-	unsigned int fw_ref;
 	int err;
 
 	xe_gt_dbg(gt, "suspending\n");
 	xe_gt_sanitize(gt);
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
-	if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL))
-		goto err_msg;
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FORCEWAKE_ALL);
+	if (!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FORCEWAKE_ALL)) {
+		xe_gt_err(gt, "suspend failed (%pe)\n", ERR_PTR(-ETIMEDOUT));
+		return -ETIMEDOUT;
+	}
 
 	err = xe_uc_suspend(&gt->uc);
-	if (err)
-		goto err_force_wake;
+	if (err) {
+		xe_gt_err(gt, "suspend failed (%pe)\n", ERR_PTR(err));
+		return err;
+	}
 
 	xe_gt_idle_disable_pg(gt);
 
 	xe_gt_disable_host_l2_vram(gt);
 
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	xe_gt_dbg(gt, "suspended\n");
 
 	return 0;
-
-err_msg:
-	err = -ETIMEDOUT;
-err_force_wake:
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-	xe_gt_err(gt, "suspend failed (%pe)\n", ERR_PTR(err));
-
-	return err;
 }
 
 void xe_gt_shutdown(struct xe_gt *gt)
 {
-	unsigned int fw_ref;
-
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FORCEWAKE_ALL);
 	do_gt_reset(gt);
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 }
 
 /**
@@ -976,32 +936,24 @@ int xe_gt_sanitize_freq(struct xe_gt *gt)
 
 int xe_gt_resume(struct xe_gt *gt)
 {
-	unsigned int fw_ref;
 	int err;
 
 	xe_gt_dbg(gt, "resuming\n");
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
-	if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL))
-		goto err_msg;
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FORCEWAKE_ALL);
+	if (!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FORCEWAKE_ALL)) {
+		xe_gt_err(gt, "resume failed (%pe)\n", ERR_PTR(-ETIMEDOUT));
+		return -ETIMEDOUT;
+	}
 
 	err = do_gt_restart(gt);
 	if (err)
-		goto err_force_wake;
+		return err;
 
 	xe_gt_idle_enable_pg(gt);
 
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	xe_gt_dbg(gt, "resumed\n");
 
 	return 0;
-
-err_msg:
-	err = -ETIMEDOUT;
-err_force_wake:
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-	xe_gt_err(gt, "resume failed (%pe)\n", ERR_PTR(err));
-
-	return err;
 }
 
 struct xe_hw_engine *xe_gt_hw_engine(struct xe_gt *gt,
-- 
2.51.1


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

* [PATCH v3 04/27] drm/xe/gt_idle: Use scope-based cleanup
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (2 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 03/27] drm/xe/gt: Use scope-based cleanup Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:43 ` [PATCH v3 05/27] drm/xe/guc: " Matt Roper
                   ` (26 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Use scope-based cleanup for runtime PM and forcewake in the GT idle
code.

v2:
 - Use scoped_guard() over guard() in idle_status_show() and
   idle_residency_ms_show().  (Gustavo)
 - Eliminate unnecessary 'ret' local variable in name_show().

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_gt_idle.c | 41 ++++++++++-----------------------
 1 file changed, 12 insertions(+), 29 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_gt_idle.c b/drivers/gpu/drm/xe/xe_gt_idle.c
index bdc9d9877ec4..3ca7bd7c9bcd 100644
--- a/drivers/gpu/drm/xe/xe_gt_idle.c
+++ b/drivers/gpu/drm/xe/xe_gt_idle.c
@@ -103,7 +103,6 @@ void xe_gt_idle_enable_pg(struct xe_gt *gt)
 	struct xe_gt_idle *gtidle = &gt->gtidle;
 	struct xe_mmio *mmio = &gt->mmio;
 	u32 vcs_mask, vecs_mask;
-	unsigned int fw_ref;
 	int i, j;
 
 	if (IS_SRIOV_VF(xe))
@@ -135,7 +134,7 @@ void xe_gt_idle_enable_pg(struct xe_gt *gt)
 		}
 	}
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
 	if (xe->info.skip_guc_pc) {
 		/*
 		 * GuC sets the hysteresis value when GuC PC is enabled
@@ -146,13 +145,11 @@ void xe_gt_idle_enable_pg(struct xe_gt *gt)
 	}
 
 	xe_mmio_write32(mmio, POWERGATE_ENABLE, gtidle->powergate_enable);
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 }
 
 void xe_gt_idle_disable_pg(struct xe_gt *gt)
 {
 	struct xe_gt_idle *gtidle = &gt->gtidle;
-	unsigned int fw_ref;
 
 	if (IS_SRIOV_VF(gt_to_xe(gt)))
 		return;
@@ -160,9 +157,8 @@ void xe_gt_idle_disable_pg(struct xe_gt *gt)
 	xe_device_assert_mem_access(gt_to_xe(gt));
 	gtidle->powergate_enable = 0;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
 	xe_mmio_write32(&gt->mmio, POWERGATE_ENABLE, gtidle->powergate_enable);
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 }
 
 /**
@@ -181,7 +177,6 @@ int xe_gt_idle_pg_print(struct xe_gt *gt, struct drm_printer *p)
 	enum xe_gt_idle_state state;
 	u32 pg_enabled, pg_status = 0;
 	u32 vcs_mask, vecs_mask;
-	unsigned int fw_ref;
 	int n;
 	/*
 	 * Media Slices
@@ -218,14 +213,12 @@ int xe_gt_idle_pg_print(struct xe_gt *gt, struct drm_printer *p)
 
 	/* Do not wake the GT to read powergating status */
 	if (state != GT_IDLE_C6) {
-		fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-		if (!fw_ref)
+		CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+		if (!fw_ref.domains)
 			return -ETIMEDOUT;
 
 		pg_enabled = xe_mmio_read32(&gt->mmio, POWERGATE_ENABLE);
 		pg_status = xe_mmio_read32(&gt->mmio, POWERGATE_DOMAIN_STATUS);
-
-		xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	}
 
 	if (gt->info.engine_mask & XE_HW_ENGINE_RCS_MASK) {
@@ -263,13 +256,9 @@ static ssize_t name_show(struct kobject *kobj,
 	struct device *dev = kobj_to_dev(kobj);
 	struct xe_gt_idle *gtidle = dev_to_gtidle(dev);
 	struct xe_guc_pc *pc = gtidle_to_pc(gtidle);
-	ssize_t ret;
 
-	xe_pm_runtime_get(pc_to_xe(pc));
-	ret = sysfs_emit(buff, "%s\n", gtidle->name);
-	xe_pm_runtime_put(pc_to_xe(pc));
-
-	return ret;
+	guard(xe_pm_runtime)(pc_to_xe(pc));
+	return sysfs_emit(buff, "%s\n", gtidle->name);
 }
 static struct kobj_attribute name_attr = __ATTR_RO(name);
 
@@ -281,9 +270,8 @@ static ssize_t idle_status_show(struct kobject *kobj,
 	struct xe_guc_pc *pc = gtidle_to_pc(gtidle);
 	enum xe_gt_idle_state state;
 
-	xe_pm_runtime_get(pc_to_xe(pc));
-	state = gtidle->idle_status(pc);
-	xe_pm_runtime_put(pc_to_xe(pc));
+	scoped_guard(xe_pm_runtime, pc_to_xe(pc))
+		state = gtidle->idle_status(pc);
 
 	return sysfs_emit(buff, "%s\n", gt_idle_state_to_string(state));
 }
@@ -311,9 +299,8 @@ static ssize_t idle_residency_ms_show(struct kobject *kobj,
 	struct xe_guc_pc *pc = gtidle_to_pc(gtidle);
 	u64 residency;
 
-	xe_pm_runtime_get(pc_to_xe(pc));
-	residency = xe_gt_idle_residency_msec(gtidle);
-	xe_pm_runtime_put(pc_to_xe(pc));
+	scoped_guard(xe_pm_runtime, pc_to_xe(pc))
+		residency = xe_gt_idle_residency_msec(gtidle);
 
 	return sysfs_emit(buff, "%llu\n", residency);
 }
@@ -396,21 +383,17 @@ void xe_gt_idle_enable_c6(struct xe_gt *gt)
 
 int xe_gt_idle_disable_c6(struct xe_gt *gt)
 {
-	unsigned int fw_ref;
-
 	xe_device_assert_mem_access(gt_to_xe(gt));
 
 	if (IS_SRIOV_VF(gt_to_xe(gt)))
 		return 0;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref)
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref.domains)
 		return -ETIMEDOUT;
 
 	xe_mmio_write32(&gt->mmio, RC_CONTROL, 0);
 	xe_mmio_write32(&gt->mmio, RC_STATE, 0);
 
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-
 	return 0;
 }
-- 
2.51.1


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

* [PATCH v3 05/27] drm/xe/guc: Use scope-based cleanup
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (3 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 04/27] drm/xe/gt_idle: " Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:43 ` [PATCH v3 06/27] drm/xe/guc_pc: " Matt Roper
                   ` (25 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Use scope-based cleanup for forcewake and runtime PM.

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_guc.c           | 13 ++++---------
 drivers/gpu/drm/xe/xe_guc_log.c       | 10 ++++------
 drivers/gpu/drm/xe/xe_guc_submit.c    | 11 +++--------
 drivers/gpu/drm/xe/xe_guc_tlb_inval.c |  4 +---
 4 files changed, 12 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c
index a686b04879d6..cf92de1c88a7 100644
--- a/drivers/gpu/drm/xe/xe_guc.c
+++ b/drivers/gpu/drm/xe/xe_guc.c
@@ -660,11 +660,9 @@ static void guc_fini_hw(void *arg)
 {
 	struct xe_guc *guc = arg;
 	struct xe_gt *gt = guc_to_gt(guc);
-	unsigned int fw_ref;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
-	xe_uc_sanitize_reset(&guc_to_gt(guc)->uc);
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
+	xe_with_force_wake(fw_ref, gt_to_fw(gt), XE_FORCEWAKE_ALL)
+		xe_uc_sanitize_reset(&guc_to_gt(guc)->uc);
 
 	guc_g2g_fini(guc);
 }
@@ -1621,15 +1619,14 @@ int xe_guc_start(struct xe_guc *guc)
 void xe_guc_print_info(struct xe_guc *guc, struct drm_printer *p)
 {
 	struct xe_gt *gt = guc_to_gt(guc);
-	unsigned int fw_ref;
 	u32 status;
 	int i;
 
 	xe_uc_fw_print(&guc->fw, p);
 
 	if (!IS_SRIOV_VF(gt_to_xe(gt))) {
-		fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-		if (!fw_ref)
+		CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+		if (!fw_ref.domains)
 			return;
 
 		status = xe_mmio_read32(&gt->mmio, GUC_STATUS);
@@ -1649,8 +1646,6 @@ void xe_guc_print_info(struct xe_guc *guc, struct drm_printer *p)
 			drm_printf(p, "\t%2d: \t0x%x\n",
 				   i, xe_mmio_read32(&gt->mmio, SOFT_SCRATCH(i)));
 		}
-
-		xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	}
 
 	drm_puts(p, "\n");
diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/xe_guc_log.c
index c01ccb35dc75..0c704a11078a 100644
--- a/drivers/gpu/drm/xe/xe_guc_log.c
+++ b/drivers/gpu/drm/xe/xe_guc_log.c
@@ -145,7 +145,6 @@ struct xe_guc_log_snapshot *xe_guc_log_snapshot_capture(struct xe_guc_log *log,
 	struct xe_device *xe = log_to_xe(log);
 	struct xe_guc *guc = log_to_guc(log);
 	struct xe_gt *gt = log_to_gt(log);
-	unsigned int fw_ref;
 	size_t remain;
 	int i;
 
@@ -165,13 +164,12 @@ struct xe_guc_log_snapshot *xe_guc_log_snapshot_capture(struct xe_guc_log *log,
 		remain -= size;
 	}
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref) {
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref.domains)
 		snapshot->stamp = ~0ULL;
-	} else {
+	else
 		snapshot->stamp = xe_mmio_read64_2x32(&gt->mmio, GUC_PMTIMESTAMP_LO);
-		xe_force_wake_put(gt_to_fw(gt), fw_ref);
-	}
+
 	snapshot->ktime = ktime_get_boottime_ns();
 	snapshot->level = log->level;
 	snapshot->ver_found = guc->fw.versions.found[XE_UC_FW_VER_RELEASE];
diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c
index d4ffdb71ef3d..7e0882074a99 100644
--- a/drivers/gpu/drm/xe/xe_guc_submit.c
+++ b/drivers/gpu/drm/xe/xe_guc_submit.c
@@ -1225,7 +1225,6 @@ guc_exec_queue_timedout_job(struct drm_sched_job *drm_job)
 	struct xe_guc *guc = exec_queue_to_guc(q);
 	const char *process_name = "no process";
 	struct xe_device *xe = guc_to_xe(guc);
-	unsigned int fw_ref;
 	int err = -ETIME;
 	pid_t pid = -1;
 	int i = 0;
@@ -1258,13 +1257,11 @@ guc_exec_queue_timedout_job(struct drm_sched_job *drm_job)
 	if (!exec_queue_killed(q) && !xe->devcoredump.captured &&
 	    !xe_guc_capture_get_matching_and_lock(q)) {
 		/* take force wake before engine register manual capture */
-		fw_ref = xe_force_wake_get(gt_to_fw(q->gt), XE_FORCEWAKE_ALL);
-		if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL))
+		CLASS(xe_force_wake, fw_ref)(gt_to_fw(q->gt), XE_FORCEWAKE_ALL);
+		if (!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FORCEWAKE_ALL))
 			xe_gt_info(q->gt, "failed to get forcewake for coredump capture\n");
 
 		xe_engine_snapshot_capture_for_queue(q);
-
-		xe_force_wake_put(gt_to_fw(q->gt), fw_ref);
 	}
 
 	/*
@@ -1455,7 +1452,7 @@ static void __guc_exec_queue_destroy_async(struct work_struct *w)
 	struct xe_exec_queue *q = ge->q;
 	struct xe_guc *guc = exec_queue_to_guc(q);
 
-	xe_pm_runtime_get(guc_to_xe(guc));
+	guard(xe_pm_runtime)(guc_to_xe(guc));
 	trace_xe_exec_queue_destroy(q);
 
 	if (xe_exec_queue_is_lr(q))
@@ -1464,8 +1461,6 @@ static void __guc_exec_queue_destroy_async(struct work_struct *w)
 	cancel_delayed_work_sync(&ge->sched.base.work_tdr);
 
 	xe_exec_queue_fini(q);
-
-	xe_pm_runtime_put(guc_to_xe(guc));
 }
 
 static void guc_exec_queue_destroy_async(struct xe_exec_queue *q)
diff --git a/drivers/gpu/drm/xe/xe_guc_tlb_inval.c b/drivers/gpu/drm/xe/xe_guc_tlb_inval.c
index a80175c7c478..848d3493df10 100644
--- a/drivers/gpu/drm/xe/xe_guc_tlb_inval.c
+++ b/drivers/gpu/drm/xe/xe_guc_tlb_inval.c
@@ -71,12 +71,11 @@ static int send_tlb_inval_ggtt(struct xe_tlb_inval *tlb_inval, u32 seqno)
 		return send_tlb_inval(guc, action, ARRAY_SIZE(action));
 	} else if (xe_device_uc_enabled(xe) && !xe_device_wedged(xe)) {
 		struct xe_mmio *mmio = &gt->mmio;
-		unsigned int fw_ref;
 
 		if (IS_SRIOV_VF(xe))
 			return -ECANCELED;
 
-		fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
+		CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
 		if (xe->info.platform == XE_PVC || GRAPHICS_VER(xe) >= 20) {
 			xe_mmio_write32(mmio, PVC_GUC_TLB_INV_DESC1,
 					PVC_GUC_TLB_INV_DESC1_INVALIDATE);
@@ -86,7 +85,6 @@ static int send_tlb_inval_ggtt(struct xe_tlb_inval *tlb_inval, u32 seqno)
 			xe_mmio_write32(mmio, GUC_TLB_INV_CR,
 					GUC_TLB_INV_CR_INVALIDATE);
 		}
-		xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	}
 
 	return -ECANCELED;
-- 
2.51.1


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

* [PATCH v3 06/27] drm/xe/guc_pc: Use scope-based cleanup
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (4 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 05/27] drm/xe/guc: " Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:43 ` [PATCH v3 07/27] drm/xe/mocs: " Matt Roper
                   ` (24 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Use scope-based cleanup for forcewake and runtime PM in the GuC PC code.
This allows us to eliminate to goto-based cleanup and simplifies some
other functions.

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_guc_pc.c | 62 ++++++++++------------------------
 1 file changed, 17 insertions(+), 45 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_guc_pc.c b/drivers/gpu/drm/xe/xe_guc_pc.c
index 951a49fb1d3e..e2e6edb851ae 100644
--- a/drivers/gpu/drm/xe/xe_guc_pc.c
+++ b/drivers/gpu/drm/xe/xe_guc_pc.c
@@ -499,21 +499,17 @@ u32 xe_guc_pc_get_cur_freq_fw(struct xe_guc_pc *pc)
 int xe_guc_pc_get_cur_freq(struct xe_guc_pc *pc, u32 *freq)
 {
 	struct xe_gt *gt = pc_to_gt(pc);
-	unsigned int fw_ref;
 
 	/*
 	 * GuC SLPC plays with cur freq request when GuCRC is enabled
 	 * Block RC6 for a more reliable read.
 	 */
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!xe_force_wake_ref_has_domain(fw_ref, XE_FW_GT)) {
-		xe_force_wake_put(gt_to_fw(gt), fw_ref);
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FW_GT))
 		return -ETIMEDOUT;
-	}
 
 	*freq = get_cur_freq(gt);
 
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	return 0;
 }
 
@@ -1087,13 +1083,8 @@ int xe_guc_pc_gucrc_disable(struct xe_guc_pc *pc)
  */
 int xe_guc_pc_override_gucrc_mode(struct xe_guc_pc *pc, enum slpc_gucrc_mode mode)
 {
-	int ret;
-
-	xe_pm_runtime_get(pc_to_xe(pc));
-	ret = pc_action_set_param(pc, SLPC_PARAM_PWRGATE_RC_MODE, mode);
-	xe_pm_runtime_put(pc_to_xe(pc));
-
-	return ret;
+	guard(xe_pm_runtime)(pc_to_xe(pc));
+	return pc_action_set_param(pc, SLPC_PARAM_PWRGATE_RC_MODE, mode);
 }
 
 /**
@@ -1104,13 +1095,8 @@ int xe_guc_pc_override_gucrc_mode(struct xe_guc_pc *pc, enum slpc_gucrc_mode mod
  */
 int xe_guc_pc_unset_gucrc_mode(struct xe_guc_pc *pc)
 {
-	int ret;
-
-	xe_pm_runtime_get(pc_to_xe(pc));
-	ret = pc_action_unset_param(pc, SLPC_PARAM_PWRGATE_RC_MODE);
-	xe_pm_runtime_put(pc_to_xe(pc));
-
-	return ret;
+	guard(xe_pm_runtime)(pc_to_xe(pc));
+	return pc_action_unset_param(pc, SLPC_PARAM_PWRGATE_RC_MODE);
 }
 
 static void pc_init_pcode_freq(struct xe_guc_pc *pc)
@@ -1198,7 +1184,7 @@ int xe_guc_pc_set_power_profile(struct xe_guc_pc *pc, const char *buf)
 		return -EINVAL;
 
 	guard(mutex)(&pc->freq_lock);
-	xe_pm_runtime_get_noresume(pc_to_xe(pc));
+	guard(xe_pm_runtime_noresume)(pc_to_xe(pc));
 
 	ret = pc_action_set_param(pc,
 				  SLPC_PARAM_POWER_PROFILE,
@@ -1209,8 +1195,6 @@ int xe_guc_pc_set_power_profile(struct xe_guc_pc *pc, const char *buf)
 	else
 		pc->power_profile = val;
 
-	xe_pm_runtime_put(pc_to_xe(pc));
-
 	return ret;
 }
 
@@ -1223,17 +1207,14 @@ int xe_guc_pc_start(struct xe_guc_pc *pc)
 	struct xe_device *xe = pc_to_xe(pc);
 	struct xe_gt *gt = pc_to_gt(pc);
 	u32 size = PAGE_ALIGN(sizeof(struct slpc_shared_data));
-	unsigned int fw_ref;
 	ktime_t earlier;
 	int ret;
 
 	xe_gt_assert(gt, xe_device_uc_enabled(xe));
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!xe_force_wake_ref_has_domain(fw_ref, XE_FW_GT)) {
-		xe_force_wake_put(gt_to_fw(gt), fw_ref);
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FW_GT))
 		return -ETIMEDOUT;
-	}
 
 	if (xe->info.skip_guc_pc) {
 		if (xe->info.platform != XE_PVC)
@@ -1241,9 +1222,7 @@ int xe_guc_pc_start(struct xe_guc_pc *pc)
 
 		/* Request max possible since dynamic freq mgmt is not enabled */
 		pc_set_cur_freq(pc, UINT_MAX);
-
-		ret = 0;
-		goto out;
+		return 0;
 	}
 
 	xe_map_memset(xe, &pc->bo->vmap, 0, 0, size);
@@ -1252,7 +1231,7 @@ int xe_guc_pc_start(struct xe_guc_pc *pc)
 	earlier = ktime_get();
 	ret = pc_action_reset(pc);
 	if (ret)
-		goto out;
+		return ret;
 
 	if (wait_for_pc_state(pc, SLPC_GLOBAL_STATE_RUNNING,
 			      SLPC_RESET_TIMEOUT_MS)) {
@@ -1263,8 +1242,7 @@ int xe_guc_pc_start(struct xe_guc_pc *pc)
 		if (wait_for_pc_state(pc, SLPC_GLOBAL_STATE_RUNNING,
 				      SLPC_RESET_EXTENDED_TIMEOUT_MS)) {
 			xe_gt_err(gt, "GuC PC Start failed: Dynamic GT frequency control and GT sleep states are now disabled.\n");
-			ret = -EIO;
-			goto out;
+			return -EIO;
 		}
 
 		xe_gt_warn(gt, "GuC PC excessive start time: %lldms",
@@ -1273,21 +1251,20 @@ int xe_guc_pc_start(struct xe_guc_pc *pc)
 
 	ret = pc_init_freqs(pc);
 	if (ret)
-		goto out;
+		return ret;
 
 	ret = pc_set_mert_freq_cap(pc);
 	if (ret)
-		goto out;
+		return ret;
 
 	if (xe->info.platform == XE_PVC) {
 		xe_guc_pc_gucrc_disable(pc);
-		ret = 0;
-		goto out;
+		return 0;
 	}
 
 	ret = pc_action_setup_gucrc(pc, GUCRC_FIRMWARE_CONTROL);
 	if (ret)
-		goto out;
+		return ret;
 
 	/* Enable SLPC Optimized Strategy for compute */
 	ret = pc_action_set_strategy(pc, SLPC_OPTIMIZED_STRATEGY_COMPUTE);
@@ -1297,8 +1274,6 @@ int xe_guc_pc_start(struct xe_guc_pc *pc)
 	if (unlikely(ret))
 		xe_gt_err(gt, "Failed to set SLPC power profile: %pe\n", ERR_PTR(ret));
 
-out:
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	return ret;
 }
 
@@ -1330,19 +1305,16 @@ static void xe_guc_pc_fini_hw(void *arg)
 {
 	struct xe_guc_pc *pc = arg;
 	struct xe_device *xe = pc_to_xe(pc);
-	unsigned int fw_ref;
 
 	if (xe_device_wedged(xe))
 		return;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(pc_to_gt(pc)), XE_FORCEWAKE_ALL);
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(pc_to_gt(pc)), XE_FORCEWAKE_ALL);
 	xe_guc_pc_gucrc_disable(pc);
 	XE_WARN_ON(xe_guc_pc_stop(pc));
 
 	/* Bind requested freq to mert_freq_cap before unload */
 	pc_set_cur_freq(pc, min(pc_max_freq_cap(pc), xe_guc_pc_get_rpe_freq(pc)));
-
-	xe_force_wake_put(gt_to_fw(pc_to_gt(pc)), fw_ref);
 }
 
 /**
-- 
2.51.1


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

* [PATCH v3 07/27] drm/xe/mocs: Use scope-based cleanup
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (5 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 06/27] drm/xe/guc_pc: " Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:43 ` [PATCH v3 08/27] drm/xe/pat: Use scope-based forcewake Matt Roper
                   ` (23 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Using scope-based cleanup for runtime PM and forcewake in the MOCS code
allows us to eliminate some goto-based error handling and simplify some
other functions.

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/tests/xe_mocs.c | 17 ++++++-----------
 drivers/gpu/drm/xe/xe_mocs.c       | 18 ++++++------------
 2 files changed, 12 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/xe/tests/xe_mocs.c b/drivers/gpu/drm/xe/tests/xe_mocs.c
index 6bb278167aaf..28374330b894 100644
--- a/drivers/gpu/drm/xe/tests/xe_mocs.c
+++ b/drivers/gpu/drm/xe/tests/xe_mocs.c
@@ -43,14 +43,12 @@ static void read_l3cc_table(struct xe_gt *gt,
 {
 	struct kunit *test = kunit_get_current_test();
 	u32 l3cc, l3cc_expected;
-	unsigned int fw_ref, i;
+	unsigned int i;
 	u32 reg_val;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
-	if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL)) {
-		xe_force_wake_put(gt_to_fw(gt), fw_ref);
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FORCEWAKE_ALL);
+	if (!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FORCEWAKE_ALL))
 		KUNIT_FAIL_AND_ABORT(test, "Forcewake Failed.\n");
-	}
 
 	for (i = 0; i < info->num_mocs_regs; i++) {
 		if (!(i & 1)) {
@@ -74,7 +72,6 @@ static void read_l3cc_table(struct xe_gt *gt,
 		KUNIT_EXPECT_EQ_MSG(test, l3cc_expected, l3cc,
 				    "l3cc idx=%u has incorrect val.\n", i);
 	}
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 }
 
 static void read_mocs_table(struct xe_gt *gt,
@@ -82,14 +79,14 @@ static void read_mocs_table(struct xe_gt *gt,
 {
 	struct kunit *test = kunit_get_current_test();
 	u32 mocs, mocs_expected;
-	unsigned int fw_ref, i;
+	unsigned int i;
 	u32 reg_val;
 
 	KUNIT_EXPECT_TRUE_MSG(test, info->unused_entries_index,
 			      "Unused entries index should have been defined\n");
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	KUNIT_ASSERT_NE_MSG(test, fw_ref, 0, "Forcewake Failed.\n");
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	KUNIT_ASSERT_NE_MSG(test, fw_ref.domains, 0, "Forcewake Failed.\n");
 
 	for (i = 0; i < info->num_mocs_regs; i++) {
 		if (regs_are_mcr(gt))
@@ -106,8 +103,6 @@ static void read_mocs_table(struct xe_gt *gt,
 		KUNIT_EXPECT_EQ_MSG(test, mocs_expected, mocs,
 				    "mocs reg 0x%x has incorrect val.\n", i);
 	}
-
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 }
 
 static int mocs_kernel_test_run_device(struct xe_device *xe)
diff --git a/drivers/gpu/drm/xe/xe_mocs.c b/drivers/gpu/drm/xe/xe_mocs.c
index 6613d3b48a84..0b7225bd77e0 100644
--- a/drivers/gpu/drm/xe/xe_mocs.c
+++ b/drivers/gpu/drm/xe/xe_mocs.c
@@ -811,26 +811,20 @@ int xe_mocs_dump(struct xe_gt *gt, struct drm_printer *p)
 	struct xe_device *xe = gt_to_xe(gt);
 	enum xe_force_wake_domains domain;
 	struct xe_mocs_info table;
-	unsigned int fw_ref, flags;
-	int err = 0;
+	unsigned int flags;
 
 	flags = get_mocs_settings(xe, &table);
 
 	domain = flags & HAS_LNCF_MOCS ? XE_FORCEWAKE_ALL : XE_FW_GT;
-	xe_pm_runtime_get_noresume(xe);
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), domain);
 
-	if (!xe_force_wake_ref_has_domain(fw_ref, domain)) {
-		err = -ETIMEDOUT;
-		goto err_fw;
-	}
+	guard(xe_pm_runtime_noresume)(xe);
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), domain);
+	if (!xe_force_wake_ref_has_domain(fw_ref.domains, domain))
+		return -ETIMEDOUT;
 
 	table.ops->dump(&table, flags, gt, p);
 
-err_fw:
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-	xe_pm_runtime_put(xe);
-	return err;
+	return 0;
 }
 
 #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
-- 
2.51.1


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

* [PATCH v3 08/27] drm/xe/pat: Use scope-based forcewake
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (6 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 07/27] drm/xe/mocs: " Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:43 ` [PATCH v3 09/27] drm/xe/pxp: Use scope-based cleanup Matt Roper
                   ` (22 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Use scope-based cleanup for forcewake in the PAT code to slightly
simplify the code.

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_pat.c | 36 ++++++++++++------------------------
 1 file changed, 12 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_pat.c b/drivers/gpu/drm/xe/xe_pat.c
index 1b4d5d3def0f..717425dd0475 100644
--- a/drivers/gpu/drm/xe/xe_pat.c
+++ b/drivers/gpu/drm/xe/xe_pat.c
@@ -239,11 +239,10 @@ static void program_pat_mcr(struct xe_gt *gt, const struct xe_pat_table_entry ta
 static int xelp_dump(struct xe_gt *gt, struct drm_printer *p)
 {
 	struct xe_device *xe = gt_to_xe(gt);
-	unsigned int fw_ref;
 	int i;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref)
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref.domains)
 		return -ETIMEDOUT;
 
 	drm_printf(p, "PAT table:\n");
@@ -256,7 +255,6 @@ static int xelp_dump(struct xe_gt *gt, struct drm_printer *p)
 			   XELP_MEM_TYPE_STR_MAP[mem_type], pat);
 	}
 
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	return 0;
 }
 
@@ -268,11 +266,10 @@ static const struct xe_pat_ops xelp_pat_ops = {
 static int xehp_dump(struct xe_gt *gt, struct drm_printer *p)
 {
 	struct xe_device *xe = gt_to_xe(gt);
-	unsigned int fw_ref;
 	int i;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref)
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref.domains)
 		return -ETIMEDOUT;
 
 	drm_printf(p, "PAT table:\n");
@@ -287,7 +284,6 @@ static int xehp_dump(struct xe_gt *gt, struct drm_printer *p)
 			   XELP_MEM_TYPE_STR_MAP[mem_type], pat);
 	}
 
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	return 0;
 }
 
@@ -299,11 +295,10 @@ static const struct xe_pat_ops xehp_pat_ops = {
 static int xehpc_dump(struct xe_gt *gt, struct drm_printer *p)
 {
 	struct xe_device *xe = gt_to_xe(gt);
-	unsigned int fw_ref;
 	int i;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref)
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref.domains)
 		return -ETIMEDOUT;
 
 	drm_printf(p, "PAT table:\n");
@@ -316,7 +311,6 @@ static int xehpc_dump(struct xe_gt *gt, struct drm_printer *p)
 			   REG_FIELD_GET(XEHPC_CLOS_LEVEL_MASK, pat), pat);
 	}
 
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	return 0;
 }
 
@@ -328,11 +322,10 @@ static const struct xe_pat_ops xehpc_pat_ops = {
 static int xelpg_dump(struct xe_gt *gt, struct drm_printer *p)
 {
 	struct xe_device *xe = gt_to_xe(gt);
-	unsigned int fw_ref;
 	int i;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref)
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref.domains)
 		return -ETIMEDOUT;
 
 	drm_printf(p, "PAT table:\n");
@@ -350,7 +343,6 @@ static int xelpg_dump(struct xe_gt *gt, struct drm_printer *p)
 			   REG_FIELD_GET(XELPG_INDEX_COH_MODE_MASK, pat), pat);
 	}
 
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	return 0;
 }
 
@@ -367,12 +359,11 @@ static const struct xe_pat_ops xelpg_pat_ops = {
 static int xe2_dump(struct xe_gt *gt, struct drm_printer *p)
 {
 	struct xe_device *xe = gt_to_xe(gt);
-	unsigned int fw_ref;
 	u32 pat;
 	int i;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref)
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref.domains)
 		return -ETIMEDOUT;
 
 	drm_printf(p, "PAT table: (* = reserved entry)\n");
@@ -412,7 +403,6 @@ static int xe2_dump(struct xe_gt *gt, struct drm_printer *p)
 		   REG_FIELD_GET(XE2_COH_MODE, pat),
 		   pat);
 
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	return 0;
 }
 
@@ -425,12 +415,11 @@ static const struct xe_pat_ops xe2_pat_ops = {
 static int xe3p_xpc_dump(struct xe_gt *gt, struct drm_printer *p)
 {
 	struct xe_device *xe = gt_to_xe(gt);
-	unsigned int fw_ref;
 	u32 pat;
 	int i;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref)
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref.domains)
 		return -ETIMEDOUT;
 
 	drm_printf(p, "PAT table: (* = reserved entry)\n");
@@ -462,7 +451,6 @@ static int xe3p_xpc_dump(struct xe_gt *gt, struct drm_printer *p)
 		   REG_FIELD_GET(XE2_COH_MODE, pat),
 		   pat);
 
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	return 0;
 }
 
-- 
2.51.1


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

* [PATCH v3 09/27] drm/xe/pxp: Use scope-based cleanup
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (7 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 08/27] drm/xe/pat: Use scope-based forcewake Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:43 ` [PATCH v3 10/27] drm/xe/gsc: " Matt Roper
                   ` (21 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Use scope-based cleanup for forcewake and runtime pm.  This allows us to
eliminate some goto-based error handling and simplify other functions.

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_pxp.c | 55 ++++++++++++-------------------------
 1 file changed, 18 insertions(+), 37 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_pxp.c b/drivers/gpu/drm/xe/xe_pxp.c
index bdbdbbf6a678..508f4c128a48 100644
--- a/drivers/gpu/drm/xe/xe_pxp.c
+++ b/drivers/gpu/drm/xe/xe_pxp.c
@@ -58,10 +58,9 @@ bool xe_pxp_is_enabled(const struct xe_pxp *pxp)
 static bool pxp_prerequisites_done(const struct xe_pxp *pxp)
 {
 	struct xe_gt *gt = pxp->gt;
-	unsigned int fw_ref;
 	bool ready;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FORCEWAKE_ALL);
 
 	/*
 	 * If force_wake fails we could falsely report the prerequisites as not
@@ -71,14 +70,12 @@ static bool pxp_prerequisites_done(const struct xe_pxp *pxp)
 	 * PXP. Therefore, we can just log the force_wake error and not escalate
 	 * it.
 	 */
-	XE_WARN_ON(!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL));
+	XE_WARN_ON(!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FORCEWAKE_ALL));
 
 	/* PXP requires both HuC authentication via GSC and GSC proxy initialized */
 	ready = xe_huc_is_authenticated(&gt->uc.huc, XE_HUC_AUTH_VIA_GSC) &&
 		xe_gsc_proxy_init_done(&gt->uc.gsc);
 
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-
 	return ready;
 }
 
@@ -104,13 +101,12 @@ int xe_pxp_get_readiness_status(struct xe_pxp *pxp)
 	    xe_uc_fw_status_to_error(pxp->gt->uc.gsc.fw.status))
 		return -EIO;
 
-	xe_pm_runtime_get(pxp->xe);
+	guard(xe_pm_runtime)(pxp->xe);
 
 	/* PXP requires both HuC loaded and GSC proxy initialized */
 	if (pxp_prerequisites_done(pxp))
 		ret = 1;
 
-	xe_pm_runtime_put(pxp->xe);
 	return ret;
 }
 
@@ -135,35 +131,28 @@ static void pxp_invalidate_queues(struct xe_pxp *pxp);
 static int pxp_terminate_hw(struct xe_pxp *pxp)
 {
 	struct xe_gt *gt = pxp->gt;
-	unsigned int fw_ref;
 	int ret = 0;
 
 	drm_dbg(&pxp->xe->drm, "Terminating PXP\n");
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!xe_force_wake_ref_has_domain(fw_ref, XE_FW_GT)) {
-		ret = -EIO;
-		goto out;
-	}
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FW_GT))
+		return -EIO;
 
 	/* terminate the hw session */
 	ret = xe_pxp_submit_session_termination(pxp, ARB_SESSION);
 	if (ret)
-		goto out;
+		return ret;
 
 	ret = pxp_wait_for_session_state(pxp, ARB_SESSION, false);
 	if (ret)
-		goto out;
+		return ret;
 
 	/* Trigger full HW cleanup */
 	xe_mmio_write32(&gt->mmio, KCR_GLOBAL_TERMINATE, 1);
 
 	/* now we can tell the GSC to clean up its own state */
-	ret = xe_pxp_submit_session_invalidation(&pxp->gsc_res, ARB_SESSION);
-
-out:
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-	return ret;
+	return xe_pxp_submit_session_invalidation(&pxp->gsc_res, ARB_SESSION);
 }
 
 static void mark_termination_in_progress(struct xe_pxp *pxp)
@@ -326,14 +315,12 @@ static int kcr_pxp_set_status(const struct xe_pxp *pxp, bool enable)
 {
 	u32 val = enable ? _MASKED_BIT_ENABLE(KCR_INIT_ALLOW_DISPLAY_ME_WRITES) :
 		  _MASKED_BIT_DISABLE(KCR_INIT_ALLOW_DISPLAY_ME_WRITES);
-	unsigned int fw_ref;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(pxp->gt), XE_FW_GT);
-	if (!xe_force_wake_ref_has_domain(fw_ref, XE_FW_GT))
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(pxp->gt), XE_FW_GT);
+	if (!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FW_GT))
 		return -EIO;
 
 	xe_mmio_write32(&pxp->gt->mmio, KCR_INIT, val);
-	xe_force_wake_put(gt_to_fw(pxp->gt), fw_ref);
 
 	return 0;
 }
@@ -453,34 +440,28 @@ int xe_pxp_init(struct xe_device *xe)
 static int __pxp_start_arb_session(struct xe_pxp *pxp)
 {
 	int ret;
-	unsigned int fw_ref;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(pxp->gt), XE_FW_GT);
-	if (!xe_force_wake_ref_has_domain(fw_ref, XE_FW_GT))
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(pxp->gt), XE_FW_GT);
+	if (!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FW_GT))
 		return -EIO;
 
-	if (pxp_session_is_in_play(pxp, ARB_SESSION)) {
-		ret = -EEXIST;
-		goto out_force_wake;
-	}
+	if (pxp_session_is_in_play(pxp, ARB_SESSION))
+		return -EEXIST;
 
 	ret = xe_pxp_submit_session_init(&pxp->gsc_res, ARB_SESSION);
 	if (ret) {
 		drm_err(&pxp->xe->drm, "Failed to init PXP arb session: %pe\n", ERR_PTR(ret));
-		goto out_force_wake;
+		return ret;
 	}
 
 	ret = pxp_wait_for_session_state(pxp, ARB_SESSION, true);
 	if (ret) {
 		drm_err(&pxp->xe->drm, "PXP ARB session failed to go in play%pe\n", ERR_PTR(ret));
-		goto out_force_wake;
+		return ret;
 	}
 
 	drm_dbg(&pxp->xe->drm, "PXP ARB session is active\n");
-
-out_force_wake:
-	xe_force_wake_put(gt_to_fw(pxp->gt), fw_ref);
-	return ret;
+	return 0;
 }
 
 /**
-- 
2.51.1


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

* [PATCH v3 10/27] drm/xe/gsc: Use scope-based cleanup
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (8 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 09/27] drm/xe/pxp: Use scope-based cleanup Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:43 ` [PATCH v3 11/27] drm/xe/device: " Matt Roper
                   ` (20 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Use scope-based cleanup for forcewake and runtime PM to eliminate some
goto-based error handling and simplify other functions.

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_gsc.c       | 21 ++++++---------------
 drivers/gpu/drm/xe/xe_gsc_proxy.c | 17 +++++++----------
 2 files changed, 13 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_gsc.c b/drivers/gpu/drm/xe/xe_gsc.c
index dd69cb834f8e..a3157b0fe791 100644
--- a/drivers/gpu/drm/xe/xe_gsc.c
+++ b/drivers/gpu/drm/xe/xe_gsc.c
@@ -352,7 +352,6 @@ static void gsc_work(struct work_struct *work)
 	struct xe_gsc *gsc = container_of(work, typeof(*gsc), work);
 	struct xe_gt *gt = gsc_to_gt(gsc);
 	struct xe_device *xe = gt_to_xe(gt);
-	unsigned int fw_ref;
 	u32 actions;
 	int ret;
 
@@ -361,13 +360,12 @@ static void gsc_work(struct work_struct *work)
 	gsc->work_actions = 0;
 	spin_unlock_irq(&gsc->lock);
 
-	xe_pm_runtime_get(xe);
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GSC);
+	guard(xe_pm_runtime)(xe);
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GSC);
 
 	if (actions & GSC_ACTION_ER_COMPLETE) {
-		ret = gsc_er_complete(gt);
-		if (ret)
-			goto out;
+		if (gsc_er_complete(gt))
+			return;
 	}
 
 	if (actions & GSC_ACTION_FW_LOAD) {
@@ -380,10 +378,6 @@ static void gsc_work(struct work_struct *work)
 
 	if (actions & GSC_ACTION_SW_PROXY)
 		xe_gsc_proxy_request_handler(gsc);
-
-out:
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-	xe_pm_runtime_put(xe);
 }
 
 void xe_gsc_hwe_irq_handler(struct xe_hw_engine *hwe, u16 intr_vec)
@@ -615,7 +609,6 @@ void xe_gsc_print_info(struct xe_gsc *gsc, struct drm_printer *p)
 {
 	struct xe_gt *gt = gsc_to_gt(gsc);
 	struct xe_mmio *mmio = &gt->mmio;
-	unsigned int fw_ref;
 
 	xe_uc_fw_print(&gsc->fw, p);
 
@@ -624,8 +617,8 @@ void xe_gsc_print_info(struct xe_gsc *gsc, struct drm_printer *p)
 	if (!xe_uc_fw_is_enabled(&gsc->fw))
 		return;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GSC);
-	if (!fw_ref)
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GSC);
+	if (!fw_ref.domains)
 		return;
 
 	drm_printf(p, "\nHECI1 FWSTS: 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
@@ -635,6 +628,4 @@ void xe_gsc_print_info(struct xe_gsc *gsc, struct drm_printer *p)
 			xe_mmio_read32(mmio, HECI_FWSTS4(MTL_GSC_HECI1_BASE)),
 			xe_mmio_read32(mmio, HECI_FWSTS5(MTL_GSC_HECI1_BASE)),
 			xe_mmio_read32(mmio, HECI_FWSTS6(MTL_GSC_HECI1_BASE)));
-
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 }
diff --git a/drivers/gpu/drm/xe/xe_gsc_proxy.c b/drivers/gpu/drm/xe/xe_gsc_proxy.c
index 464282a89eef..e7573a0c5e5d 100644
--- a/drivers/gpu/drm/xe/xe_gsc_proxy.c
+++ b/drivers/gpu/drm/xe/xe_gsc_proxy.c
@@ -440,22 +440,19 @@ static void xe_gsc_proxy_remove(void *arg)
 	struct xe_gsc *gsc = arg;
 	struct xe_gt *gt = gsc_to_gt(gsc);
 	struct xe_device *xe = gt_to_xe(gt);
-	unsigned int fw_ref = 0;
 
 	if (!gsc->proxy.component_added)
 		return;
 
 	/* disable HECI2 IRQs */
-	xe_pm_runtime_get(xe);
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GSC);
-	if (!fw_ref)
-		xe_gt_err(gt, "failed to get forcewake to disable GSC interrupts\n");
+	scoped_guard(xe_pm_runtime, xe) {
+		CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GSC);
+		if (!fw_ref.domains)
+			xe_gt_err(gt, "failed to get forcewake to disable GSC interrupts\n");
 
-	/* try do disable irq even if forcewake failed */
-	gsc_proxy_irq_toggle(gsc, false);
-
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-	xe_pm_runtime_put(xe);
+		/* try do disable irq even if forcewake failed */
+		gsc_proxy_irq_toggle(gsc, false);
+	}
 
 	xe_gsc_wait_for_worker_completion(gsc);
 
-- 
2.51.1


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

* [PATCH v3 11/27] drm/xe/device: Use scope-based cleanup
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (9 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 10/27] drm/xe/gsc: " Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:43 ` [PATCH v3 12/27] drm/xe/devcoredump: " Matt Roper
                   ` (19 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Convert device code to use scope-based forcewake and runtime PM.

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_device.c | 33 +++++++++++----------------------
 1 file changed, 11 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index c7d373c70f0f..1197f914ef77 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -166,7 +166,7 @@ static void xe_file_close(struct drm_device *dev, struct drm_file *file)
 	struct xe_exec_queue *q;
 	unsigned long idx;
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 
 	/*
 	 * No need for exec_queue.lock here as there is no contention for it
@@ -184,8 +184,6 @@ static void xe_file_close(struct drm_device *dev, struct drm_file *file)
 		xe_vm_close_and_put(vm);
 
 	xe_file_put(xef);
-
-	xe_pm_runtime_put(xe);
 }
 
 static const struct drm_ioctl_desc xe_ioctls[] = {
@@ -220,10 +218,10 @@ static long xe_drm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 	if (xe_device_wedged(xe))
 		return -ECANCELED;
 
-	ret = xe_pm_runtime_get_ioctl(xe);
+	ACQUIRE(xe_pm_runtime_ioctl, pm)(xe);
+	ret = ACQUIRE_ERR(xe_pm_runtime_ioctl, &pm);
 	if (ret >= 0)
 		ret = drm_ioctl(file, cmd, arg);
-	xe_pm_runtime_put(xe);
 
 	return ret;
 }
@@ -238,10 +236,10 @@ static long xe_drm_compat_ioctl(struct file *file, unsigned int cmd, unsigned lo
 	if (xe_device_wedged(xe))
 		return -ECANCELED;
 
-	ret = xe_pm_runtime_get_ioctl(xe);
+	ACQUIRE(xe_pm_runtime_ioctl, pm)(xe);
+	ret = ACQUIRE_ERR(xe_pm_runtime_ioctl, &pm);
 	if (ret >= 0)
 		ret = drm_compat_ioctl(file, cmd, arg);
-	xe_pm_runtime_put(xe);
 
 	return ret;
 }
@@ -775,7 +773,6 @@ ALLOW_ERROR_INJECTION(xe_device_probe_early, ERRNO); /* See xe_pci_probe() */
 static int probe_has_flat_ccs(struct xe_device *xe)
 {
 	struct xe_gt *gt;
-	unsigned int fw_ref;
 	u32 reg;
 
 	/* Always enabled/disabled, no runtime check to do */
@@ -786,8 +783,8 @@ static int probe_has_flat_ccs(struct xe_device *xe)
 	if (!gt)
 		return 0;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref)
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref.domains)
 		return -ETIMEDOUT;
 
 	reg = xe_gt_mcr_unicast_read_any(gt, XE2_FLAT_CCS_BASE_RANGE_LOWER);
@@ -797,8 +794,6 @@ static int probe_has_flat_ccs(struct xe_device *xe)
 		drm_dbg(&xe->drm,
 			"Flat CCS has been disabled in bios, May lead to performance impact");
 
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-
 	return 0;
 }
 
@@ -1034,7 +1029,6 @@ void xe_device_wmb(struct xe_device *xe)
  */
 static void tdf_request_sync(struct xe_device *xe)
 {
-	unsigned int fw_ref;
 	struct xe_gt *gt;
 	u8 id;
 
@@ -1042,8 +1036,8 @@ static void tdf_request_sync(struct xe_device *xe)
 		if (xe_gt_is_media_type(gt))
 			continue;
 
-		fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-		if (!fw_ref)
+		CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+		if (!fw_ref.domains)
 			return;
 
 		xe_mmio_write32(&gt->mmio, XE2_TDF_CTRL, TRANSIENT_FLUSH_REQUEST);
@@ -1058,15 +1052,12 @@ static void tdf_request_sync(struct xe_device *xe)
 		if (xe_mmio_wait32(&gt->mmio, XE2_TDF_CTRL, TRANSIENT_FLUSH_REQUEST, 0,
 				   150, NULL, false))
 			xe_gt_err_once(gt, "TD flush timeout\n");
-
-		xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	}
 }
 
 void xe_device_l2_flush(struct xe_device *xe)
 {
 	struct xe_gt *gt;
-	unsigned int fw_ref;
 
 	gt = xe_root_mmio_gt(xe);
 	if (!gt)
@@ -1075,8 +1066,8 @@ void xe_device_l2_flush(struct xe_device *xe)
 	if (!XE_GT_WA(gt, 16023588340))
 		return;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref)
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref.domains)
 		return;
 
 	spin_lock(&gt->global_invl_lock);
@@ -1086,8 +1077,6 @@ void xe_device_l2_flush(struct xe_device *xe)
 		xe_gt_err_once(gt, "Global invalidation timeout\n");
 
 	spin_unlock(&gt->global_invl_lock);
-
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 }
 
 /**
-- 
2.51.1


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

* [PATCH v3 12/27] drm/xe/devcoredump: Use scope-based cleanup
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (10 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 11/27] drm/xe/device: " Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-17 22:09   ` Gustavo Sousa
  2025-11-14 21:43 ` [PATCH v3 13/27] drm/xe/display: Use scoped-cleanup Matt Roper
                   ` (18 subsequent siblings)
  30 siblings, 1 reply; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Use scope-based cleanup for forcewake and runtime PM in the devcoredump
code.  This eliminates some goto-based error handling and slightly
simplifies other functions.

v2:
 - Move the forcewake acquisition slightly higher in
   devcoredump_snapshot() so that we maintain an easy-to-understand LIFO
   cleanup order.  (Gustavo)

Cc: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_devcoredump.c | 30 ++++++++++++-----------------
 1 file changed, 12 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_devcoredump.c b/drivers/gpu/drm/xe/xe_devcoredump.c
index 203e3038cc81..bf347714b5e0 100644
--- a/drivers/gpu/drm/xe/xe_devcoredump.c
+++ b/drivers/gpu/drm/xe/xe_devcoredump.c
@@ -276,7 +276,6 @@ static void xe_devcoredump_deferred_snap_work(struct work_struct *work)
 	struct xe_devcoredump_snapshot *ss = container_of(work, typeof(*ss), work);
 	struct xe_devcoredump *coredump = container_of(ss, typeof(*coredump), snapshot);
 	struct xe_device *xe = coredump_to_xe(coredump);
-	unsigned int fw_ref;
 
 	/*
 	 * NB: Despite passing a GFP_ flags parameter here, more allocations are done
@@ -287,15 +286,15 @@ static void xe_devcoredump_deferred_snap_work(struct work_struct *work)
 			      xe_devcoredump_read, xe_devcoredump_free,
 			      XE_COREDUMP_TIMEOUT_JIFFIES);
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 
 	/* keep going if fw fails as we still want to save the memory and SW data */
-	fw_ref = xe_force_wake_get(gt_to_fw(ss->gt), XE_FORCEWAKE_ALL);
-	if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL))
-		xe_gt_info(ss->gt, "failed to get forcewake for coredump capture\n");
-	xe_vm_snapshot_capture_delayed(ss->vm);
-	xe_guc_exec_queue_snapshot_capture_delayed(ss->ge);
-	xe_force_wake_put(gt_to_fw(ss->gt), fw_ref);
+	xe_with_force_wake(fw_ref, gt_to_fw(ss->gt), XE_FORCEWAKE_ALL) {
+		if (!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FORCEWAKE_ALL))
+			xe_gt_info(ss->gt, "failed to get forcewake for coredump capture\n");
+		xe_vm_snapshot_capture_delayed(ss->vm);
+		xe_guc_exec_queue_snapshot_capture_delayed(ss->ge);
+	}
 
 	ss->read.chunk_position = 0;
 
@@ -306,7 +305,7 @@ static void xe_devcoredump_deferred_snap_work(struct work_struct *work)
 		ss->read.buffer = kvmalloc(XE_DEVCOREDUMP_CHUNK_MAX,
 					   GFP_USER);
 		if (!ss->read.buffer)
-			goto put_pm;
+			return;
 
 		__xe_devcoredump_read(ss->read.buffer,
 				      XE_DEVCOREDUMP_CHUNK_MAX,
@@ -314,15 +313,12 @@ static void xe_devcoredump_deferred_snap_work(struct work_struct *work)
 	} else {
 		ss->read.buffer = kvmalloc(ss->read.size, GFP_USER);
 		if (!ss->read.buffer)
-			goto put_pm;
+			return;
 
 		__xe_devcoredump_read(ss->read.buffer, ss->read.size, 0,
 				      coredump);
 		xe_devcoredump_snapshot_free(ss);
 	}
-
-put_pm:
-	xe_pm_runtime_put(xe);
 }
 
 static void devcoredump_snapshot(struct xe_devcoredump *coredump,
@@ -332,7 +328,6 @@ static void devcoredump_snapshot(struct xe_devcoredump *coredump,
 	struct xe_devcoredump_snapshot *ss = &coredump->snapshot;
 	struct xe_guc *guc = exec_queue_to_guc(q);
 	const char *process_name = "no process";
-	unsigned int fw_ref;
 	bool cookie;
 
 	ss->snapshot_time = ktime_get_real();
@@ -348,11 +343,11 @@ static void devcoredump_snapshot(struct xe_devcoredump *coredump,
 	ss->gt = q->gt;
 	INIT_WORK(&ss->work, xe_devcoredump_deferred_snap_work);
 
+	/* keep going if fw fails as we still want to save the memory and SW data */
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(q->gt), XE_FORCEWAKE_ALL);
+
 	cookie = dma_fence_begin_signalling();
 
-	/* keep going if fw fails as we still want to save the memory and SW data */
-	fw_ref = xe_force_wake_get(gt_to_fw(q->gt), XE_FORCEWAKE_ALL);
-
 	ss->guc.log = xe_guc_log_snapshot_capture(&guc->log, true);
 	ss->guc.ct = xe_guc_ct_snapshot_capture(&guc->ct);
 	ss->ge = xe_guc_exec_queue_snapshot_capture(q);
@@ -364,7 +359,6 @@ static void devcoredump_snapshot(struct xe_devcoredump *coredump,
 
 	queue_work(system_unbound_wq, &ss->work);
 
-	xe_force_wake_put(gt_to_fw(q->gt), fw_ref);
 	dma_fence_end_signalling(cookie);
 }
 
-- 
2.51.1


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

* [PATCH v3 13/27] drm/xe/display: Use scoped-cleanup
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (11 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 12/27] drm/xe/devcoredump: " Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-17 22:11   ` Gustavo Sousa
  2025-11-14 21:43 ` [PATCH v3 14/27] drm/xe: Return forcewake reference type from force_wake_get_any_engine() Matt Roper
                   ` (17 subsequent siblings)
  30 siblings, 1 reply; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper

Eliminate some goto-based cleanup by utilizing scoped cleanup helpers.

v2:
 - Eliminate unnecessary 'ret' variable in intel_hdcp_gsc_check_status()
   (Gustavo)

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/display/xe_fb_pin.c   | 23 +++++++-----------
 drivers/gpu/drm/xe/display/xe_hdcp_gsc.c | 31 +++++++-----------------
 2 files changed, 18 insertions(+), 36 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index 1fd4a815e784..6a935a75f2a4 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -210,10 +210,11 @@ static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb,
 	/* TODO: Consider sharing framebuffer mapping?
 	 * embed i915_vma inside intel_framebuffer
 	 */
-	xe_pm_runtime_get_noresume(xe);
-	ret = mutex_lock_interruptible(&ggtt->lock);
+	guard(xe_pm_runtime_noresume)(xe);
+	ACQUIRE(mutex_intr, lock)(&ggtt->lock);
+	ret = ACQUIRE_ERR(mutex_intr, &lock);
 	if (ret)
-		goto out;
+		return ret;
 
 	align = XE_PAGE_SIZE;
 	if (xe_bo_is_vram(bo) && ggtt->flags & XE_GGTT_FLAGS_64K)
@@ -223,15 +224,13 @@ static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb,
 		vma->node = bo->ggtt_node[tile0->id];
 	} else if (view->type == I915_GTT_VIEW_NORMAL) {
 		vma->node = xe_ggtt_node_init(ggtt);
-		if (IS_ERR(vma->node)) {
-			ret = PTR_ERR(vma->node);
-			goto out_unlock;
-		}
+		if (IS_ERR(vma->node))
+			return PTR_ERR(vma->node);
 
 		ret = xe_ggtt_node_insert_locked(vma->node, xe_bo_size(bo), align, 0);
 		if (ret) {
 			xe_ggtt_node_fini(vma->node);
-			goto out_unlock;
+			return ret;
 		}
 
 		xe_ggtt_map_bo(ggtt, vma->node, bo, xe->pat.idx[XE_CACHE_NONE]);
@@ -245,13 +244,13 @@ static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb,
 		vma->node = xe_ggtt_node_init(ggtt);
 		if (IS_ERR(vma->node)) {
 			ret = PTR_ERR(vma->node);
-			goto out_unlock;
+			return ret;
 		}
 
 		ret = xe_ggtt_node_insert_locked(vma->node, size, align, 0);
 		if (ret) {
 			xe_ggtt_node_fini(vma->node);
-			goto out_unlock;
+			return ret;
 		}
 
 		ggtt_ofs = vma->node->base.start;
@@ -265,10 +264,6 @@ static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb,
 					   rot_info->plane[i].dst_stride);
 	}
 
-out_unlock:
-	mutex_unlock(&ggtt->lock);
-out:
-	xe_pm_runtime_put(xe);
 	return ret;
 }
 
diff --git a/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c b/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c
index 4ae847b628e2..71d21fde1736 100644
--- a/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c
+++ b/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c
@@ -36,8 +36,6 @@ bool intel_hdcp_gsc_check_status(struct drm_device *drm)
 	struct xe_tile *tile = xe_device_get_root_tile(xe);
 	struct xe_gt *gt = tile->media_gt;
 	struct xe_gsc *gsc = &gt->uc.gsc;
-	bool ret = true;
-	unsigned int fw_ref;
 
 	if (!gsc || !xe_uc_fw_is_enabled(&gsc->fw)) {
 		drm_dbg_kms(&xe->drm,
@@ -45,22 +43,15 @@ bool intel_hdcp_gsc_check_status(struct drm_device *drm)
 		return false;
 	}
 
-	xe_pm_runtime_get(xe);
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GSC);
-	if (!fw_ref) {
+	guard(xe_pm_runtime)(xe);
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GSC);
+	if (!fw_ref.domains) {
 		drm_dbg_kms(&xe->drm,
 			    "failed to get forcewake to check proxy status\n");
-		ret = false;
-		goto out;
+		return false;
 	}
 
-	if (!xe_gsc_proxy_init_done(gsc))
-		ret = false;
-
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-out:
-	xe_pm_runtime_put(xe);
-	return ret;
+	return xe_gsc_proxy_init_done(gsc);
 }
 
 /*This function helps allocate memory for the command that we will send to gsc cs */
@@ -166,17 +157,15 @@ ssize_t intel_hdcp_gsc_msg_send(struct intel_hdcp_gsc_context *gsc_context,
 	u32 addr_out_off, addr_in_wr_off = 0;
 	int ret, tries = 0;
 
-	if (msg_in_len > max_msg_size || msg_out_len > max_msg_size) {
-		ret = -ENOSPC;
-		goto out;
-	}
+	if (msg_in_len > max_msg_size || msg_out_len > max_msg_size)
+		return -ENOSPC;
 
 	msg_size_in = msg_in_len + HDCP_GSC_HEADER_SIZE;
 	msg_size_out = msg_out_len + HDCP_GSC_HEADER_SIZE;
 	addr_out_off = PAGE_SIZE;
 
 	host_session_id = xe_gsc_create_host_session_id();
-	xe_pm_runtime_get_noresume(xe);
+	guard(xe_pm_runtime_noresume)(xe);
 	addr_in_wr_off = xe_gsc_emit_header(xe, &gsc_context->hdcp_bo->vmap,
 					    addr_in_wr_off, HECI_MEADDRESS_HDCP,
 					    host_session_id, msg_in_len);
@@ -201,13 +190,11 @@ ssize_t intel_hdcp_gsc_msg_send(struct intel_hdcp_gsc_context *gsc_context,
 	} while (++tries < 20);
 
 	if (ret)
-		goto out;
+		return ret;
 
 	xe_map_memcpy_from(xe, msg_out, &gsc_context->hdcp_bo->vmap,
 			   addr_out_off + HDCP_GSC_HEADER_SIZE,
 			   msg_out_len);
 
-out:
-	xe_pm_runtime_put(xe);
 	return ret;
 }
-- 
2.51.1


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

* [PATCH v3 14/27] drm/xe: Return forcewake reference type from force_wake_get_any_engine()
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (12 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 13/27] drm/xe/display: Use scoped-cleanup Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-17 22:19   ` Gustavo Sousa
  2025-11-14 21:43 ` [PATCH v3 15/27] drm/xe/drm_client: Use scope-based cleanup Matt Roper
                   ` (16 subsequent siblings)
  30 siblings, 1 reply; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper

Adjust the signature of force_wake_get_any_engine() such that it returns
a 'struct xe_force_wake_ref' rather than a boolean success/failure.
Failure cases are now recognized by inspecting the hardware engine
returned by reference; a NULL hwe indicates that no engine's forcewake
could be obtained.

These changes will make it cleaner and easier to incorporate scope-based
cleanup in force_wake_get_any_engine()'s caller in a future patch.

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_drm_client.c | 38 +++++++++++++++---------------
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_drm_client.c b/drivers/gpu/drm/xe/xe_drm_client.c
index f931ff9b1ec0..78551832723b 100644
--- a/drivers/gpu/drm/xe/xe_drm_client.c
+++ b/drivers/gpu/drm/xe/xe_drm_client.c
@@ -285,32 +285,31 @@ static struct xe_hw_engine *any_engine(struct xe_device *xe)
 	return NULL;
 }
 
-static bool force_wake_get_any_engine(struct xe_device *xe,
-				      struct xe_hw_engine **phwe,
-				      unsigned int *pfw_ref)
+/*
+ * Pick any engine and grab its forcewake.  On error phwe will be NULL and
+ * the returned forcewake reference will be invalid.  Callers should check
+ * phwe against NULL.
+ */
+static struct xe_force_wake_ref force_wake_get_any_engine(struct xe_device *xe,
+							  struct xe_hw_engine **phwe)
 {
 	enum xe_force_wake_domains domain;
-	unsigned int fw_ref;
+	struct xe_force_wake_ref fw_ref = {};
 	struct xe_hw_engine *hwe;
-	struct xe_force_wake *fw;
+
+	*phwe = NULL;
 
 	hwe = any_engine(xe);
 	if (!hwe)
-		return false;
+		return fw_ref;	/* will be invalid */
 
 	domain = xe_hw_engine_to_fw_domain(hwe);
-	fw = gt_to_fw(hwe->gt);
 
-	fw_ref = xe_force_wake_get(fw, domain);
-	if (!xe_force_wake_ref_has_domain(fw_ref, domain)) {
-		xe_force_wake_put(fw, fw_ref);
-		return false;
-	}
+	fw_ref = xe_force_wake_constructor(gt_to_fw(hwe->gt), domain);
+	if (xe_force_wake_ref_has_domain(fw_ref.domains, domain))
+		*phwe = hwe;	/* valid forcewake */
 
-	*phwe = hwe;
-	*pfw_ref = fw_ref;
-
-	return true;
+	return fw_ref;
 }
 
 static void show_run_ticks(struct drm_printer *p, struct drm_file *file)
@@ -322,7 +321,7 @@ static void show_run_ticks(struct drm_printer *p, struct drm_file *file)
 	struct xe_hw_engine *hwe;
 	struct xe_exec_queue *q;
 	u64 gpu_timestamp;
-	unsigned int fw_ref;
+	struct xe_force_wake_ref fw_ref;
 
 	/*
 	 * RING_TIMESTAMP registers are inaccessible in VF mode.
@@ -340,7 +339,8 @@ static void show_run_ticks(struct drm_printer *p, struct drm_file *file)
 		       !atomic_read(&xef->exec_queue.pending_removal));
 
 	xe_pm_runtime_get(xe);
-	if (!force_wake_get_any_engine(xe, &hwe, &fw_ref)) {
+	fw_ref = force_wake_get_any_engine(xe, &hwe);
+	if (!hwe) {
 		xe_pm_runtime_put(xe);
 		return;
 	}
@@ -360,7 +360,7 @@ static void show_run_ticks(struct drm_printer *p, struct drm_file *file)
 
 	gpu_timestamp = xe_hw_engine_read_timestamp(hwe);
 
-	xe_force_wake_put(gt_to_fw(hwe->gt), fw_ref);
+	xe_force_wake_put(gt_to_fw(hwe->gt), fw_ref.domains);
 	xe_pm_runtime_put(xe);
 
 	for (class = 0; class < XE_ENGINE_CLASS_MAX; class++) {
-- 
2.51.1


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

* [PATCH v3 15/27] drm/xe/drm_client: Use scope-based cleanup
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (13 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 14/27] drm/xe: Return forcewake reference type from force_wake_get_any_engine() Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-17 22:28   ` Gustavo Sousa
  2025-11-14 21:43 ` [PATCH v3 16/27] drm/xe/gt_debugfs: " Matt Roper
                   ` (15 subsequent siblings)
  30 siblings, 1 reply; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper

Use scope-based cleanup for forcewake and runtime PM.

v2:
 - Use xe_force_wake_release_only rather than a custom one-off class for
   "any engine" forcewake.  (Gustavo)

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_drm_client.c | 39 +++++++++++++-----------------
 1 file changed, 17 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_drm_client.c b/drivers/gpu/drm/xe/xe_drm_client.c
index 78551832723b..2787bbb36141 100644
--- a/drivers/gpu/drm/xe/xe_drm_client.c
+++ b/drivers/gpu/drm/xe/xe_drm_client.c
@@ -321,7 +321,6 @@ static void show_run_ticks(struct drm_printer *p, struct drm_file *file)
 	struct xe_hw_engine *hwe;
 	struct xe_exec_queue *q;
 	u64 gpu_timestamp;
-	struct xe_force_wake_ref fw_ref;
 
 	/*
 	 * RING_TIMESTAMP registers are inaccessible in VF mode.
@@ -338,30 +337,26 @@ static void show_run_ticks(struct drm_printer *p, struct drm_file *file)
 	wait_var_event(&xef->exec_queue.pending_removal,
 		       !atomic_read(&xef->exec_queue.pending_removal));
 
-	xe_pm_runtime_get(xe);
-	fw_ref = force_wake_get_any_engine(xe, &hwe);
-	if (!hwe) {
-		xe_pm_runtime_put(xe);
-		return;
-	}
-
-	/* Accumulate all the exec queues from this client */
-	mutex_lock(&xef->exec_queue.lock);
-	xa_for_each(&xef->exec_queue.xa, i, q) {
-		xe_exec_queue_get(q);
-		mutex_unlock(&xef->exec_queue.lock);
-
-		xe_exec_queue_update_run_ticks(q);
+	scoped_guard(xe_pm_runtime, xe) {
+		CLASS(xe_force_wake_release_only, fw_ref)(force_wake_get_any_engine(xe, &hwe));
+		if (!hwe)
+			return;
 
+		/* Accumulate all the exec queues from this client */
 		mutex_lock(&xef->exec_queue.lock);
-		xe_exec_queue_put(q);
+		xa_for_each(&xef->exec_queue.xa, i, q) {
+			xe_exec_queue_get(q);
+			mutex_unlock(&xef->exec_queue.lock);
+
+			xe_exec_queue_update_run_ticks(q);
+
+			mutex_lock(&xef->exec_queue.lock);
+			xe_exec_queue_put(q);
+		}
+		mutex_unlock(&xef->exec_queue.lock);
+
+		gpu_timestamp = xe_hw_engine_read_timestamp(hwe);
 	}
-	mutex_unlock(&xef->exec_queue.lock);
-
-	gpu_timestamp = xe_hw_engine_read_timestamp(hwe);
-
-	xe_force_wake_put(gt_to_fw(hwe->gt), fw_ref.domains);
-	xe_pm_runtime_put(xe);
 
 	for (class = 0; class < XE_ENGINE_CLASS_MAX; class++) {
 		const char *class_name;
-- 
2.51.1


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

* [PATCH v3 16/27] drm/xe/gt_debugfs: Use scope-based cleanup
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (14 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 15/27] drm/xe/drm_client: Use scope-based cleanup Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:43 ` [PATCH v3 17/27] drm/xe/huc: Use scope-based forcewake Matt Roper
                   ` (14 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Use scope-based cleanup for forcewake and runtime PM to simplify the
debugfs code slightly.

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_gt_debugfs.c | 29 ++++++++---------------------
 1 file changed, 8 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_gt_debugfs.c b/drivers/gpu/drm/xe/xe_gt_debugfs.c
index e4fd632f43cf..7c3de6539044 100644
--- a/drivers/gpu/drm/xe/xe_gt_debugfs.c
+++ b/drivers/gpu/drm/xe/xe_gt_debugfs.c
@@ -105,35 +105,24 @@ int xe_gt_debugfs_show_with_rpm(struct seq_file *m, void *data)
 	struct drm_info_node *node = m->private;
 	struct xe_gt *gt = node_to_gt(node);
 	struct xe_device *xe = gt_to_xe(gt);
-	int ret;
 
-	xe_pm_runtime_get(xe);
-	ret = xe_gt_debugfs_simple_show(m, data);
-	xe_pm_runtime_put(xe);
-
-	return ret;
+	guard(xe_pm_runtime)(xe);
+	return xe_gt_debugfs_simple_show(m, data);
 }
 
 static int hw_engines(struct xe_gt *gt, struct drm_printer *p)
 {
 	struct xe_hw_engine *hwe;
 	enum xe_hw_engine_id id;
-	unsigned int fw_ref;
-	int ret = 0;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
-	if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL)) {
-		ret = -ETIMEDOUT;
-		goto fw_put;
-	}
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FORCEWAKE_ALL);
+	if (!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FORCEWAKE_ALL))
+		return -ETIMEDOUT;
 
 	for_each_hw_engine(hwe, gt, id)
 		xe_hw_engine_print(hwe, p);
 
-fw_put:
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-
-	return ret;
+	return 0;
 }
 
 static int steering(struct xe_gt *gt, struct drm_printer *p)
@@ -269,9 +258,8 @@ static void force_reset(struct xe_gt *gt)
 {
 	struct xe_device *xe = gt_to_xe(gt);
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 	xe_gt_reset_async(gt);
-	xe_pm_runtime_put(xe);
 }
 
 static ssize_t force_reset_write(struct file *file,
@@ -297,9 +285,8 @@ static void force_reset_sync(struct xe_gt *gt)
 {
 	struct xe_device *xe = gt_to_xe(gt);
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 	xe_gt_reset(gt);
-	xe_pm_runtime_put(xe);
 }
 
 static ssize_t force_reset_sync_write(struct file *file,
-- 
2.51.1


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

* [PATCH v3 17/27] drm/xe/huc: Use scope-based forcewake
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (15 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 16/27] drm/xe/gt_debugfs: " Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:43 ` [PATCH v3 18/27] drm/xe/query: " Matt Roper
                   ` (13 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Use scope-based forcewake in the HuC code for a small simplification and
consistency with other parts of the driver.

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_huc.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_huc.c b/drivers/gpu/drm/xe/xe_huc.c
index 0a70c8924582..4212162913af 100644
--- a/drivers/gpu/drm/xe/xe_huc.c
+++ b/drivers/gpu/drm/xe/xe_huc.c
@@ -300,19 +300,16 @@ void xe_huc_sanitize(struct xe_huc *huc)
 void xe_huc_print_info(struct xe_huc *huc, struct drm_printer *p)
 {
 	struct xe_gt *gt = huc_to_gt(huc);
-	unsigned int fw_ref;
 
 	xe_uc_fw_print(&huc->fw, p);
 
 	if (!xe_uc_fw_is_enabled(&huc->fw))
 		return;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref)
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref.domains)
 		return;
 
 	drm_printf(p, "\nHuC status: 0x%08x\n",
 		   xe_mmio_read32(&gt->mmio, HUC_KERNEL_LOAD_INFO));
-
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 }
-- 
2.51.1


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

* [PATCH v3 18/27] drm/xe/query: Use scope-based forcewake
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (16 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 17/27] drm/xe/huc: Use scope-based forcewake Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:43 ` [PATCH v3 19/27] drm/xe/reg_sr: " Matt Roper
                   ` (12 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Use scope-based forcewake handling for consistency with other parts of
the driver.

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_query.c | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_query.c b/drivers/gpu/drm/xe/xe_query.c
index 1c0915e2cc16..a7bf1fd6dd6a 100644
--- a/drivers/gpu/drm/xe/xe_query.c
+++ b/drivers/gpu/drm/xe/xe_query.c
@@ -122,7 +122,6 @@ query_engine_cycles(struct xe_device *xe,
 	__ktime_func_t cpu_clock;
 	struct xe_hw_engine *hwe;
 	struct xe_gt *gt;
-	unsigned int fw_ref;
 
 	if (IS_SRIOV_VF(xe))
 		return -EOPNOTSUPP;
@@ -158,17 +157,14 @@ query_engine_cycles(struct xe_device *xe,
 	if (!hwe)
 		return -EINVAL;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
-	if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL))  {
-		xe_force_wake_put(gt_to_fw(gt), fw_ref);
-		return -EIO;
+	xe_with_force_wake(fw_ref, gt_to_fw(gt), XE_FORCEWAKE_ALL) {
+		if (!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FORCEWAKE_ALL))
+			return -EIO;
+
+		hwe_read_timestamp(hwe, &resp.engine_cycles, &resp.cpu_timestamp,
+				   &resp.cpu_delta, cpu_clock);
 	}
 
-	hwe_read_timestamp(hwe, &resp.engine_cycles, &resp.cpu_timestamp,
-			   &resp.cpu_delta, cpu_clock);
-
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-
 	if (GRAPHICS_VER(xe) >= 20)
 		resp.width = 64;
 	else
-- 
2.51.1


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

* [PATCH v3 19/27] drm/xe/reg_sr: Use scope-based forcewake
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (17 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 18/27] drm/xe/query: " Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:43 ` [PATCH v3 20/27] drm/xe/vram: " Matt Roper
                   ` (11 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Use scope-based forcewake to slightly simplify the reg_sr code.

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_reg_sr.c | 17 +++++------------
 1 file changed, 5 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_reg_sr.c b/drivers/gpu/drm/xe/xe_reg_sr.c
index fc8447a838c4..1a465385f909 100644
--- a/drivers/gpu/drm/xe/xe_reg_sr.c
+++ b/drivers/gpu/drm/xe/xe_reg_sr.c
@@ -168,7 +168,6 @@ void xe_reg_sr_apply_mmio(struct xe_reg_sr *sr, struct xe_gt *gt)
 {
 	struct xe_reg_sr_entry *entry;
 	unsigned long reg;
-	unsigned int fw_ref;
 
 	if (xa_empty(&sr->xa))
 		return;
@@ -178,20 +177,14 @@ void xe_reg_sr_apply_mmio(struct xe_reg_sr *sr, struct xe_gt *gt)
 
 	xe_gt_dbg(gt, "Applying %s save-restore MMIOs\n", sr->name);
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
-	if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL))
-		goto err_force_wake;
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FORCEWAKE_ALL);
+	if (!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FORCEWAKE_ALL)) {
+		xe_gt_err(gt, "Failed to apply, err=-ETIMEDOUT\n");
+		return;
+	}
 
 	xa_for_each(&sr->xa, reg, entry)
 		apply_one_mmio(gt, entry);
-
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-
-	return;
-
-err_force_wake:
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-	xe_gt_err(gt, "Failed to apply, err=-ETIMEDOUT\n");
 }
 
 /**
-- 
2.51.1


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

* [PATCH v3 20/27] drm/xe/vram: Use scope-based forcewake
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (18 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 19/27] drm/xe/reg_sr: " Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:43 ` [PATCH v3 21/27] drm/xe/bo: Use scope-based runtime PM Matt Roper
                   ` (10 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Switch VRAM code to use scope-based forcewake for consistency with other
parts of the driver.

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_vram.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_vram.c b/drivers/gpu/drm/xe/xe_vram.c
index 0e10da790cc5..0a645e76e5fa 100644
--- a/drivers/gpu/drm/xe/xe_vram.c
+++ b/drivers/gpu/drm/xe/xe_vram.c
@@ -186,12 +186,11 @@ static int determine_lmem_bar_size(struct xe_device *xe, struct xe_vram_region *
 static int get_flat_ccs_offset(struct xe_gt *gt, u64 tile_size, u64 *poffset)
 {
 	struct xe_device *xe = gt_to_xe(gt);
-	unsigned int fw_ref;
 	u64 offset;
 	u32 reg;
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref)
+	CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref.domains)
 		return -ETIMEDOUT;
 
 	if (GRAPHICS_VER(xe) >= 20) {
@@ -223,7 +222,6 @@ static int get_flat_ccs_offset(struct xe_gt *gt, u64 tile_size, u64 *poffset)
 		offset = (u64)REG_FIELD_GET(XEHP_FLAT_CCS_PTR, reg) * SZ_64K;
 	}
 
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	*poffset = offset;
 
 	return 0;
-- 
2.51.1


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

* [PATCH v3 21/27] drm/xe/bo: Use scope-based runtime PM
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (19 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 20/27] drm/xe/vram: " Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:43 ` [PATCH v3 22/27] drm/xe/ggtt: Use scope-based runtime pm Matt Roper
                   ` (9 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Use scope-based runtime power management in the BO code for consistency
with other parts of the driver.

v2:
 - Drop unnecessary 'ret' variable.  (Gustavo)

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_bo.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index b0bd31d14bb9..6fd6ce6c6586 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -2033,13 +2033,9 @@ static int xe_bo_vm_access(struct vm_area_struct *vma, unsigned long addr,
 	struct ttm_buffer_object *ttm_bo = vma->vm_private_data;
 	struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
 	struct xe_device *xe = xe_bo_device(bo);
-	int ret;
 
-	xe_pm_runtime_get(xe);
-	ret = ttm_bo_vm_access(vma, addr, buf, len, write);
-	xe_pm_runtime_put(xe);
-
-	return ret;
+	guard(xe_pm_runtime)(xe);
+	return ttm_bo_vm_access(vma, addr, buf, len, write);
 }
 
 /**
-- 
2.51.1


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

* [PATCH v3 22/27] drm/xe/ggtt: Use scope-based runtime pm
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (20 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 21/27] drm/xe/bo: Use scope-based runtime PM Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:43 ` [PATCH v3 23/27] drm/xe/hwmon: Use scope-based runtime PM Matt Roper
                   ` (8 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Switch the GGTT code to scope-based runtime PM for consistency with
other parts of the driver.

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_ggtt.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
index ef481b334af4..48ab8b43fcd0 100644
--- a/drivers/gpu/drm/xe/xe_ggtt.c
+++ b/drivers/gpu/drm/xe/xe_ggtt.c
@@ -396,9 +396,8 @@ static void ggtt_node_remove_work_func(struct work_struct *work)
 						 delayed_removal_work);
 	struct xe_device *xe = tile_to_xe(node->ggtt->tile);
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 	ggtt_node_remove(node);
-	xe_pm_runtime_put(xe);
 }
 
 /**
-- 
2.51.1


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

* [PATCH v3 23/27] drm/xe/hwmon: Use scope-based runtime PM
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (21 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 22/27] drm/xe/ggtt: Use scope-based runtime pm Matt Roper
@ 2025-11-14 21:43 ` Matt Roper
  2025-11-14 21:44 ` [PATCH v3 24/27] drm/xe/sriov: " Matt Roper
                   ` (7 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:43 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Use scope-based runtime power management in the hwmon code for
consistency with other parts of the driver.

v2:
 - Drop unnecessary 'ret' variables.  (Gustavo)

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_hwmon.c | 52 ++++++++++-------------------------
 1 file changed, 14 insertions(+), 38 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_hwmon.c b/drivers/gpu/drm/xe/xe_hwmon.c
index 97879daeefc1..ff2aea52ef75 100644
--- a/drivers/gpu/drm/xe/xe_hwmon.c
+++ b/drivers/gpu/drm/xe/xe_hwmon.c
@@ -502,7 +502,7 @@ xe_hwmon_power_max_interval_show(struct device *dev, struct device_attribute *at
 
 	int ret = 0;
 
-	xe_pm_runtime_get(hwmon->xe);
+	guard(xe_pm_runtime)(hwmon->xe);
 
 	mutex_lock(&hwmon->hwmon_lock);
 
@@ -521,8 +521,6 @@ xe_hwmon_power_max_interval_show(struct device *dev, struct device_attribute *at
 
 	mutex_unlock(&hwmon->hwmon_lock);
 
-	xe_pm_runtime_put(hwmon->xe);
-
 	x = REG_FIELD_GET(PWR_LIM_TIME_X, reg_val);
 	y = REG_FIELD_GET(PWR_LIM_TIME_Y, reg_val);
 
@@ -604,7 +602,7 @@ xe_hwmon_power_max_interval_store(struct device *dev, struct device_attribute *a
 	rxy = REG_FIELD_PREP(PWR_LIM_TIME_X, x) |
 			       REG_FIELD_PREP(PWR_LIM_TIME_Y, y);
 
-	xe_pm_runtime_get(hwmon->xe);
+	guard(xe_pm_runtime)(hwmon->xe);
 
 	mutex_lock(&hwmon->hwmon_lock);
 
@@ -616,8 +614,6 @@ xe_hwmon_power_max_interval_store(struct device *dev, struct device_attribute *a
 
 	mutex_unlock(&hwmon->hwmon_lock);
 
-	xe_pm_runtime_put(hwmon->xe);
-
 	return count;
 }
 
@@ -1124,37 +1120,25 @@ xe_hwmon_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
 	      int channel, long *val)
 {
 	struct xe_hwmon *hwmon = dev_get_drvdata(dev);
-	int ret;
 
-	xe_pm_runtime_get(hwmon->xe);
+	guard(xe_pm_runtime)(hwmon->xe);
 
 	switch (type) {
 	case hwmon_temp:
-		ret = xe_hwmon_temp_read(hwmon, attr, channel, val);
-		break;
+		return xe_hwmon_temp_read(hwmon, attr, channel, val);
 	case hwmon_power:
-		ret = xe_hwmon_power_read(hwmon, attr, channel, val);
-		break;
+		return xe_hwmon_power_read(hwmon, attr, channel, val);
 	case hwmon_curr:
-		ret = xe_hwmon_curr_read(hwmon, attr, channel, val);
-		break;
+		return xe_hwmon_curr_read(hwmon, attr, channel, val);
 	case hwmon_in:
-		ret = xe_hwmon_in_read(hwmon, attr, channel, val);
-		break;
+		return xe_hwmon_in_read(hwmon, attr, channel, val);
 	case hwmon_energy:
-		ret = xe_hwmon_energy_read(hwmon, attr, channel, val);
-		break;
+		return xe_hwmon_energy_read(hwmon, attr, channel, val);
 	case hwmon_fan:
-		ret = xe_hwmon_fan_read(hwmon, attr, channel, val);
-		break;
+		return xe_hwmon_fan_read(hwmon, attr, channel, val);
 	default:
-		ret = -EOPNOTSUPP;
-		break;
+		return -EOPNOTSUPP;
 	}
-
-	xe_pm_runtime_put(hwmon->xe);
-
-	return ret;
 }
 
 static int
@@ -1162,25 +1146,17 @@ xe_hwmon_write(struct device *dev, enum hwmon_sensor_types type, u32 attr,
 	       int channel, long val)
 {
 	struct xe_hwmon *hwmon = dev_get_drvdata(dev);
-	int ret;
 
-	xe_pm_runtime_get(hwmon->xe);
+	guard(xe_pm_runtime)(hwmon->xe);
 
 	switch (type) {
 	case hwmon_power:
-		ret = xe_hwmon_power_write(hwmon, attr, channel, val);
-		break;
+		return xe_hwmon_power_write(hwmon, attr, channel, val);
 	case hwmon_curr:
-		ret = xe_hwmon_curr_write(hwmon, attr, channel, val);
-		break;
+		return xe_hwmon_curr_write(hwmon, attr, channel, val);
 	default:
-		ret = -EOPNOTSUPP;
-		break;
+		return -EOPNOTSUPP;
 	}
-
-	xe_pm_runtime_put(hwmon->xe);
-
-	return ret;
 }
 
 static int xe_hwmon_read_label(struct device *dev,
-- 
2.51.1


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

* [PATCH v3 24/27] drm/xe/sriov: Use scope-based runtime PM
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (22 preceding siblings ...)
  2025-11-14 21:43 ` [PATCH v3 23/27] drm/xe/hwmon: Use scope-based runtime PM Matt Roper
@ 2025-11-14 21:44 ` Matt Roper
  2025-11-14 21:44 ` [PATCH v3 25/27] drm/xe/tests: " Matt Roper
                   ` (6 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:44 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Use scope-based runtime power management in the SRIOV code for
consistency with other parts of the driver.

v2:
 - Drop unnecessary 'ret' variables.  (Gustavo)

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_pci_sriov.c             | 10 +++-------
 drivers/gpu/drm/xe/xe_sriov_pf_debugfs.c      |  6 ++----
 drivers/gpu/drm/xe/xe_sriov_pf_sysfs.c        | 16 ++++------------
 drivers/gpu/drm/xe/xe_sriov_vf_ccs.c          |  5 +----
 drivers/gpu/drm/xe/xe_tile_sriov_pf_debugfs.c |  3 +--
 5 files changed, 11 insertions(+), 29 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_pci_sriov.c b/drivers/gpu/drm/xe/xe_pci_sriov.c
index 9ff69c4843b0..3fd22034f03e 100644
--- a/drivers/gpu/drm/xe/xe_pci_sriov.c
+++ b/drivers/gpu/drm/xe/xe_pci_sriov.c
@@ -219,7 +219,6 @@ static int pf_disable_vfs(struct xe_device *xe)
 int xe_pci_sriov_configure(struct pci_dev *pdev, int num_vfs)
 {
 	struct xe_device *xe = pdev_to_xe_device(pdev);
-	int ret;
 
 	if (!IS_SRIOV_PF(xe))
 		return -ENODEV;
@@ -233,14 +232,11 @@ int xe_pci_sriov_configure(struct pci_dev *pdev, int num_vfs)
 	if (num_vfs && pci_num_vf(pdev))
 		return -EBUSY;
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 	if (num_vfs > 0)
-		ret = pf_enable_vfs(xe, num_vfs);
+		return pf_enable_vfs(xe, num_vfs);
 	else
-		ret = pf_disable_vfs(xe);
-	xe_pm_runtime_put(xe);
-
-	return ret;
+		return pf_disable_vfs(xe);
 }
 
 /**
diff --git a/drivers/gpu/drm/xe/xe_sriov_pf_debugfs.c b/drivers/gpu/drm/xe/xe_sriov_pf_debugfs.c
index bad751217e1e..e84bdde9bc80 100644
--- a/drivers/gpu/drm/xe/xe_sriov_pf_debugfs.c
+++ b/drivers/gpu/drm/xe/xe_sriov_pf_debugfs.c
@@ -70,9 +70,8 @@ static ssize_t from_file_write_to_xe_call(struct file *file, const char __user *
 	if (ret < 0)
 		return ret;
 	if (yes) {
-		xe_pm_runtime_get(xe);
+		guard(xe_pm_runtime)(xe);
 		ret = call(xe);
-		xe_pm_runtime_put(xe);
 	}
 	if (ret < 0)
 		return ret;
@@ -209,9 +208,8 @@ static ssize_t from_file_write_to_vf_call(struct file *file, const char __user *
 	if (ret < 0)
 		return ret;
 	if (yes) {
-		xe_pm_runtime_get(xe);
+		guard(xe_pm_runtime)(xe);
 		ret = call(xe, vfid);
-		xe_pm_runtime_put(xe);
 	}
 	if (ret < 0)
 		return ret;
diff --git a/drivers/gpu/drm/xe/xe_sriov_pf_sysfs.c b/drivers/gpu/drm/xe/xe_sriov_pf_sysfs.c
index c0b767ac735c..3d140506ba36 100644
--- a/drivers/gpu/drm/xe/xe_sriov_pf_sysfs.c
+++ b/drivers/gpu/drm/xe/xe_sriov_pf_sysfs.c
@@ -389,16 +389,12 @@ static ssize_t xe_sriov_dev_attr_store(struct kobject *kobj, struct attribute *a
 	struct xe_sriov_dev_attr *vattr = to_xe_sriov_dev_attr(attr);
 	struct xe_sriov_kobj *vkobj = to_xe_sriov_kobj(kobj);
 	struct xe_device *xe = vkobj->xe;
-	ssize_t ret;
 
 	if (!vattr->store)
 		return -EPERM;
 
-	xe_pm_runtime_get(xe);
-	ret = xe_sriov_pf_wait_ready(xe) ?: vattr->store(xe, buf, count);
-	xe_pm_runtime_put(xe);
-
-	return ret;
+	guard(xe_pm_runtime)(xe);
+	return xe_sriov_pf_wait_ready(xe) ?: vattr->store(xe, buf, count);
 }
 
 static ssize_t xe_sriov_vf_attr_show(struct kobject *kobj, struct attribute *attr, char *buf)
@@ -423,18 +419,14 @@ static ssize_t xe_sriov_vf_attr_store(struct kobject *kobj, struct attribute *at
 	struct xe_sriov_kobj *vkobj = to_xe_sriov_kobj(kobj);
 	struct xe_device *xe = vkobj->xe;
 	unsigned int vfid = vkobj->vfid;
-	ssize_t ret;
 
 	xe_sriov_pf_assert_vfid(xe, vfid);
 
 	if (!vattr->store)
 		return -EPERM;
 
-	xe_pm_runtime_get(xe);
-	ret = xe_sriov_pf_wait_ready(xe) ?: vattr->store(xe, vfid, buf, count);
-	xe_pm_runtime_get(xe);
-
-	return ret;
+	guard(xe_pm_runtime)(xe);
+	return xe_sriov_pf_wait_ready(xe) ?: vattr->store(xe, vfid, buf, count);
 }
 
 static const struct sysfs_ops xe_sriov_dev_sysfs_ops = {
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
index 797a4b866226..e1cdc46ad710 100644
--- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
+++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
@@ -463,8 +463,7 @@ void xe_sriov_vf_ccs_print(struct xe_device *xe, struct drm_printer *p)
 	if (!IS_VF_CCS_READY(xe))
 		return;
 
-	xe_pm_runtime_get(xe);
-
+	guard(xe_pm_runtime)(xe);
 	for_each_ccs_rw_ctx(ctx_id) {
 		bb_pool = xe->sriov.vf.ccs.contexts[ctx_id].mem.ccs_bb_pool;
 		if (!bb_pool)
@@ -475,6 +474,4 @@ void xe_sriov_vf_ccs_print(struct xe_device *xe, struct drm_printer *p)
 		drm_suballoc_dump_debug_info(&bb_pool->base, p, xe_sa_manager_gpu_addr(bb_pool));
 		drm_puts(p, "\n");
 	}
-
-	xe_pm_runtime_put(xe);
 }
diff --git a/drivers/gpu/drm/xe/xe_tile_sriov_pf_debugfs.c b/drivers/gpu/drm/xe/xe_tile_sriov_pf_debugfs.c
index f3f478f14ff5..7f97db2f89bb 100644
--- a/drivers/gpu/drm/xe/xe_tile_sriov_pf_debugfs.c
+++ b/drivers/gpu/drm/xe/xe_tile_sriov_pf_debugfs.c
@@ -141,12 +141,11 @@ static int NAME##_set(void *data, u64 val)					\
 	if (val > (TYPE)~0ull)							\
 		return -EOVERFLOW;						\
 										\
-	xe_pm_runtime_get(xe);							\
+	guard(xe_pm_runtime)(xe);						\
 	err = xe_sriov_pf_wait_ready(xe) ?:					\
 	      xe_gt_sriov_pf_config_set_##CONFIG(gt, vfid, val);		\
 	if (!err)								\
 		xe_sriov_pf_provision_set_custom_mode(xe);			\
-	xe_pm_runtime_put(xe);							\
 										\
 	return err;								\
 }										\
-- 
2.51.1


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

* [PATCH v3 25/27] drm/xe/tests: Use scope-based runtime PM
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (23 preceding siblings ...)
  2025-11-14 21:44 ` [PATCH v3 24/27] drm/xe/sriov: " Matt Roper
@ 2025-11-14 21:44 ` Matt Roper
  2025-11-14 21:44 ` [PATCH v3 26/27] drm/xe/sysfs: Use scope-based runtime power management Matt Roper
                   ` (5 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:44 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Use scope-based handling of runtime PM in the kunit tests for
consistency with other parts of the driver.

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/tests/xe_bo.c      | 10 ++--------
 drivers/gpu/drm/xe/tests/xe_dma_buf.c |  3 +--
 drivers/gpu/drm/xe/tests/xe_migrate.c | 10 ++--------
 drivers/gpu/drm/xe/tests/xe_mocs.c    | 10 ++--------
 4 files changed, 7 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/xe/tests/xe_bo.c b/drivers/gpu/drm/xe/tests/xe_bo.c
index 2294cf89f3e1..2278e589a493 100644
--- a/drivers/gpu/drm/xe/tests/xe_bo.c
+++ b/drivers/gpu/drm/xe/tests/xe_bo.c
@@ -185,8 +185,7 @@ static int ccs_test_run_device(struct xe_device *xe)
 		return 0;
 	}
 
-	xe_pm_runtime_get(xe);
-
+	guard(xe_pm_runtime)(xe);
 	for_each_tile(tile, xe, id) {
 		/* For igfx run only for primary tile */
 		if (!IS_DGFX(xe) && id > 0)
@@ -194,8 +193,6 @@ static int ccs_test_run_device(struct xe_device *xe)
 		ccs_test_run_tile(xe, tile, test);
 	}
 
-	xe_pm_runtime_put(xe);
-
 	return 0;
 }
 
@@ -356,13 +353,10 @@ static int evict_test_run_device(struct xe_device *xe)
 		return 0;
 	}
 
-	xe_pm_runtime_get(xe);
-
+	guard(xe_pm_runtime)(xe);
 	for_each_tile(tile, xe, id)
 		evict_test_run_tile(xe, tile, test);
 
-	xe_pm_runtime_put(xe);
-
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/xe/tests/xe_dma_buf.c b/drivers/gpu/drm/xe/tests/xe_dma_buf.c
index 5df98de5ba3c..954b6b911ea0 100644
--- a/drivers/gpu/drm/xe/tests/xe_dma_buf.c
+++ b/drivers/gpu/drm/xe/tests/xe_dma_buf.c
@@ -266,7 +266,7 @@ static int dma_buf_run_device(struct xe_device *xe)
 	const struct dma_buf_test_params *params;
 	struct kunit *test = kunit_get_current_test();
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 	for (params = test_params; params->mem_mask; ++params) {
 		struct dma_buf_test_params p = *params;
 
@@ -274,7 +274,6 @@ static int dma_buf_run_device(struct xe_device *xe)
 		test->priv = &p;
 		xe_test_dmabuf_import_same_driver(xe);
 	}
-	xe_pm_runtime_put(xe);
 
 	/* A non-zero return would halt iteration over driver devices */
 	return 0;
diff --git a/drivers/gpu/drm/xe/tests/xe_migrate.c b/drivers/gpu/drm/xe/tests/xe_migrate.c
index 5904d658d1f2..34e2f0f4631f 100644
--- a/drivers/gpu/drm/xe/tests/xe_migrate.c
+++ b/drivers/gpu/drm/xe/tests/xe_migrate.c
@@ -344,8 +344,7 @@ static int migrate_test_run_device(struct xe_device *xe)
 	struct xe_tile *tile;
 	int id;
 
-	xe_pm_runtime_get(xe);
-
+	guard(xe_pm_runtime)(xe);
 	for_each_tile(tile, xe, id) {
 		struct xe_migrate *m = tile->migrate;
 		struct drm_exec *exec = XE_VALIDATION_OPT_OUT;
@@ -356,8 +355,6 @@ static int migrate_test_run_device(struct xe_device *xe)
 		xe_vm_unlock(m->q->vm);
 	}
 
-	xe_pm_runtime_put(xe);
-
 	return 0;
 }
 
@@ -759,13 +756,10 @@ static int validate_ccs_test_run_device(struct xe_device *xe)
 		return 0;
 	}
 
-	xe_pm_runtime_get(xe);
-
+	guard(xe_pm_runtime)(xe);
 	for_each_tile(tile, xe, id)
 		validate_ccs_test_run_tile(xe, tile, test);
 
-	xe_pm_runtime_put(xe);
-
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/xe/tests/xe_mocs.c b/drivers/gpu/drm/xe/tests/xe_mocs.c
index 28374330b894..daf3c6836c75 100644
--- a/drivers/gpu/drm/xe/tests/xe_mocs.c
+++ b/drivers/gpu/drm/xe/tests/xe_mocs.c
@@ -115,8 +115,7 @@ static int mocs_kernel_test_run_device(struct xe_device *xe)
 	unsigned int flags;
 	int id;
 
-	xe_pm_runtime_get(xe);
-
+	guard(xe_pm_runtime)(xe);
 	for_each_gt(gt, xe, id) {
 		flags = live_mocs_init(&mocs, gt);
 		if (flags & HAS_GLOBAL_MOCS)
@@ -125,8 +124,6 @@ static int mocs_kernel_test_run_device(struct xe_device *xe)
 			read_l3cc_table(gt, &mocs.table);
 	}
 
-	xe_pm_runtime_put(xe);
-
 	return 0;
 }
 
@@ -150,8 +147,7 @@ static int mocs_reset_test_run_device(struct xe_device *xe)
 	int id;
 	struct kunit *test = kunit_get_current_test();
 
-	xe_pm_runtime_get(xe);
-
+	guard(xe_pm_runtime)(xe);
 	for_each_gt(gt, xe, id) {
 		flags = live_mocs_init(&mocs, gt);
 		kunit_info(test, "mocs_reset_test before reset\n");
@@ -169,8 +165,6 @@ static int mocs_reset_test_run_device(struct xe_device *xe)
 			read_l3cc_table(gt, &mocs.table);
 	}
 
-	xe_pm_runtime_put(xe);
-
 	return 0;
 }
 
-- 
2.51.1


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

* [PATCH v3 26/27] drm/xe/sysfs: Use scope-based runtime power management
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (24 preceding siblings ...)
  2025-11-14 21:44 ` [PATCH v3 25/27] drm/xe/tests: " Matt Roper
@ 2025-11-14 21:44 ` Matt Roper
  2025-11-14 21:44 ` [PATCH v3 27/27] drm/xe/debugfs: Use scope-based runtime PM Matt Roper
                   ` (4 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:44 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Switch sysfs to use scope-based runtime power management to slightly
simplify the code.

v2:
 - Drop unnecessary local variables.  (Gustavo)

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_device_sysfs.c          | 33 ++++++++-----------
 drivers/gpu/drm/xe/xe_gt_freq.c               | 27 +++++----------
 drivers/gpu/drm/xe/xe_gt_throttle.c           |  9 ++---
 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 16 ++++-----
 4 files changed, 31 insertions(+), 54 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_device_sysfs.c b/drivers/gpu/drm/xe/xe_device_sysfs.c
index ec9c06b06fb5..a73e0e957cb0 100644
--- a/drivers/gpu/drm/xe/xe_device_sysfs.c
+++ b/drivers/gpu/drm/xe/xe_device_sysfs.c
@@ -57,9 +57,8 @@ vram_d3cold_threshold_store(struct device *dev, struct device_attribute *attr,
 
 	drm_dbg(&xe->drm, "vram_d3cold_threshold: %u\n", vram_d3cold_threshold);
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 	ret = xe_pm_set_vram_threshold(xe, vram_d3cold_threshold);
-	xe_pm_runtime_put(xe);
 
 	return ret ?: count;
 }
@@ -84,33 +83,31 @@ lb_fan_control_version_show(struct device *dev, struct device_attribute *attr, c
 	u16 major = 0, minor = 0, hotfix = 0, build = 0;
 	int ret;
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 
 	ret = xe_pcode_read(root, PCODE_MBOX(PCODE_LATE_BINDING, GET_CAPABILITY_STATUS, 0),
 			    &cap, NULL);
 	if (ret)
-		goto out;
+		return ret;
 
 	if (REG_FIELD_GET(V1_FAN_PROVISIONED, cap)) {
 		ret = xe_pcode_read(root, PCODE_MBOX(PCODE_LATE_BINDING, GET_VERSION_LOW, 0),
 				    &ver_low, NULL);
 		if (ret)
-			goto out;
+			return ret;
 
 		ret = xe_pcode_read(root, PCODE_MBOX(PCODE_LATE_BINDING, GET_VERSION_HIGH, 0),
 				    &ver_high, NULL);
 		if (ret)
-			goto out;
+			return ret;
 
 		major = REG_FIELD_GET(MAJOR_VERSION_MASK, ver_low);
 		minor = REG_FIELD_GET(MINOR_VERSION_MASK, ver_low);
 		hotfix = REG_FIELD_GET(HOTFIX_VERSION_MASK, ver_high);
 		build = REG_FIELD_GET(BUILD_VERSION_MASK, ver_high);
 	}
-out:
-	xe_pm_runtime_put(xe);
 
-	return ret ?: sysfs_emit(buf, "%u.%u.%u.%u\n", major, minor, hotfix, build);
+	return sysfs_emit(buf, "%u.%u.%u.%u\n", major, minor, hotfix, build);
 }
 static DEVICE_ATTR_ADMIN_RO(lb_fan_control_version);
 
@@ -123,33 +120,31 @@ lb_voltage_regulator_version_show(struct device *dev, struct device_attribute *a
 	u16 major = 0, minor = 0, hotfix = 0, build = 0;
 	int ret;
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 
 	ret = xe_pcode_read(root, PCODE_MBOX(PCODE_LATE_BINDING, GET_CAPABILITY_STATUS, 0),
 			    &cap, NULL);
 	if (ret)
-		goto out;
+		return ret;
 
 	if (REG_FIELD_GET(VR_PARAMS_PROVISIONED, cap)) {
 		ret = xe_pcode_read(root, PCODE_MBOX(PCODE_LATE_BINDING, GET_VERSION_LOW, 0),
 				    &ver_low, NULL);
 		if (ret)
-			goto out;
+			return ret;
 
 		ret = xe_pcode_read(root, PCODE_MBOX(PCODE_LATE_BINDING, GET_VERSION_HIGH, 0),
 				    &ver_high, NULL);
 		if (ret)
-			goto out;
+			return ret;
 
 		major = REG_FIELD_GET(MAJOR_VERSION_MASK, ver_low);
 		minor = REG_FIELD_GET(MINOR_VERSION_MASK, ver_low);
 		hotfix = REG_FIELD_GET(HOTFIX_VERSION_MASK, ver_high);
 		build = REG_FIELD_GET(BUILD_VERSION_MASK, ver_high);
 	}
-out:
-	xe_pm_runtime_put(xe);
 
-	return ret ?: sysfs_emit(buf, "%u.%u.%u.%u\n", major, minor, hotfix, build);
+	return sysfs_emit(buf, "%u.%u.%u.%u\n", major, minor, hotfix, build);
 }
 static DEVICE_ATTR_ADMIN_RO(lb_voltage_regulator_version);
 
@@ -233,9 +228,8 @@ auto_link_downgrade_capable_show(struct device *dev, struct device_attribute *at
 	struct xe_device *xe = pdev_to_xe_device(pdev);
 	u32 cap, val;
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 	val = xe_mmio_read32(xe_root_tile_mmio(xe), BMG_PCIE_CAP);
-	xe_pm_runtime_put(xe);
 
 	cap = REG_FIELD_GET(LINK_DOWNGRADE, val);
 	return sysfs_emit(buf, "%u\n", cap == DOWNGRADE_CAPABLE);
@@ -251,11 +245,10 @@ auto_link_downgrade_status_show(struct device *dev, struct device_attribute *att
 	u32 val = 0;
 	int ret;
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 	ret = xe_pcode_read(xe_device_get_root_tile(xe),
 			    PCODE_MBOX(DGFX_PCODE_STATUS, DGFX_GET_INIT_STATUS, 0),
 			    &val, NULL);
-	xe_pm_runtime_put(xe);
 
 	return ret ?: sysfs_emit(buf, "%u\n", REG_FIELD_GET(DGFX_LINK_DOWNGRADE_STATUS, val));
 }
diff --git a/drivers/gpu/drm/xe/xe_gt_freq.c b/drivers/gpu/drm/xe/xe_gt_freq.c
index 849ea6c86e8e..6284a4daf00a 100644
--- a/drivers/gpu/drm/xe/xe_gt_freq.c
+++ b/drivers/gpu/drm/xe/xe_gt_freq.c
@@ -70,9 +70,8 @@ static ssize_t act_freq_show(struct kobject *kobj,
 	struct xe_guc_pc *pc = dev_to_pc(dev);
 	u32 freq;
 
-	xe_pm_runtime_get(dev_to_xe(dev));
+	guard(xe_pm_runtime)(dev_to_xe(dev));
 	freq = xe_guc_pc_get_act_freq(pc);
-	xe_pm_runtime_put(dev_to_xe(dev));
 
 	return sysfs_emit(buf, "%d\n", freq);
 }
@@ -86,9 +85,8 @@ static ssize_t cur_freq_show(struct kobject *kobj,
 	u32 freq;
 	ssize_t ret;
 
-	xe_pm_runtime_get(dev_to_xe(dev));
+	guard(xe_pm_runtime)(dev_to_xe(dev));
 	ret = xe_guc_pc_get_cur_freq(pc, &freq);
-	xe_pm_runtime_put(dev_to_xe(dev));
 	if (ret)
 		return ret;
 
@@ -113,9 +111,8 @@ static ssize_t rpe_freq_show(struct kobject *kobj,
 	struct xe_guc_pc *pc = dev_to_pc(dev);
 	u32 freq;
 
-	xe_pm_runtime_get(dev_to_xe(dev));
+	guard(xe_pm_runtime)(dev_to_xe(dev));
 	freq = xe_guc_pc_get_rpe_freq(pc);
-	xe_pm_runtime_put(dev_to_xe(dev));
 
 	return sysfs_emit(buf, "%d\n", freq);
 }
@@ -128,9 +125,8 @@ static ssize_t rpa_freq_show(struct kobject *kobj,
 	struct xe_guc_pc *pc = dev_to_pc(dev);
 	u32 freq;
 
-	xe_pm_runtime_get(dev_to_xe(dev));
+	guard(xe_pm_runtime)(dev_to_xe(dev));
 	freq = xe_guc_pc_get_rpa_freq(pc);
-	xe_pm_runtime_put(dev_to_xe(dev));
 
 	return sysfs_emit(buf, "%d\n", freq);
 }
@@ -154,9 +150,8 @@ static ssize_t min_freq_show(struct kobject *kobj,
 	u32 freq;
 	ssize_t ret;
 
-	xe_pm_runtime_get(dev_to_xe(dev));
+	guard(xe_pm_runtime)(dev_to_xe(dev));
 	ret = xe_guc_pc_get_min_freq(pc, &freq);
-	xe_pm_runtime_put(dev_to_xe(dev));
 	if (ret)
 		return ret;
 
@@ -175,9 +170,8 @@ static ssize_t min_freq_store(struct kobject *kobj,
 	if (ret)
 		return ret;
 
-	xe_pm_runtime_get(dev_to_xe(dev));
+	guard(xe_pm_runtime)(dev_to_xe(dev));
 	ret = xe_guc_pc_set_min_freq(pc, freq);
-	xe_pm_runtime_put(dev_to_xe(dev));
 	if (ret)
 		return ret;
 
@@ -193,9 +187,8 @@ static ssize_t max_freq_show(struct kobject *kobj,
 	u32 freq;
 	ssize_t ret;
 
-	xe_pm_runtime_get(dev_to_xe(dev));
+	guard(xe_pm_runtime)(dev_to_xe(dev));
 	ret = xe_guc_pc_get_max_freq(pc, &freq);
-	xe_pm_runtime_put(dev_to_xe(dev));
 	if (ret)
 		return ret;
 
@@ -214,9 +207,8 @@ static ssize_t max_freq_store(struct kobject *kobj,
 	if (ret)
 		return ret;
 
-	xe_pm_runtime_get(dev_to_xe(dev));
+	guard(xe_pm_runtime)(dev_to_xe(dev));
 	ret = xe_guc_pc_set_max_freq(pc, freq);
-	xe_pm_runtime_put(dev_to_xe(dev));
 	if (ret)
 		return ret;
 
@@ -243,9 +235,8 @@ static ssize_t power_profile_store(struct kobject *kobj,
 	struct xe_guc_pc *pc = dev_to_pc(dev);
 	int err;
 
-	xe_pm_runtime_get(dev_to_xe(dev));
+	guard(xe_pm_runtime)(dev_to_xe(dev));
 	err = xe_guc_pc_set_power_profile(pc, buff);
-	xe_pm_runtime_put(dev_to_xe(dev));
 
 	return err ?: count;
 }
diff --git a/drivers/gpu/drm/xe/xe_gt_throttle.c b/drivers/gpu/drm/xe/xe_gt_throttle.c
index 82c5fbcdfbe3..096a6187ff12 100644
--- a/drivers/gpu/drm/xe/xe_gt_throttle.c
+++ b/drivers/gpu/drm/xe/xe_gt_throttle.c
@@ -85,7 +85,7 @@ u32 xe_gt_throttle_get_limit_reasons(struct xe_gt *gt)
 {
 	struct xe_device *xe = gt_to_xe(gt);
 	struct xe_reg reg;
-	u32 val, mask;
+	u32 mask;
 
 	if (xe_gt_is_media_type(gt))
 		reg = MTL_MEDIA_PERF_LIMIT_REASONS;
@@ -97,11 +97,8 @@ u32 xe_gt_throttle_get_limit_reasons(struct xe_gt *gt)
 	else
 		mask = GT0_PERF_LIMIT_REASONS_MASK;
 
-	xe_pm_runtime_get(xe);
-	val = xe_mmio_read32(&gt->mmio, reg) & mask;
-	xe_pm_runtime_put(xe);
-
-	return val;
+	guard(xe_pm_runtime)(xe);
+	return xe_mmio_read32(&gt->mmio, reg) & mask;
 }
 
 static bool is_throttled_by(struct xe_gt *gt, u32 mask)
diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
index 640950172088..cb45cdceef67 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
+++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
@@ -43,16 +43,14 @@ static ssize_t xe_hw_engine_class_sysfs_attr_show(struct kobject *kobj,
 {
 	struct xe_device *xe = kobj_to_xe(kobj);
 	struct kobj_attribute *kattr;
-	ssize_t ret = -EIO;
 
 	kattr = container_of(attr, struct kobj_attribute, attr);
 	if (kattr->show) {
-		xe_pm_runtime_get(xe);
-		ret = kattr->show(kobj, kattr, buf);
-		xe_pm_runtime_put(xe);
+		guard(xe_pm_runtime)(xe);
+		return kattr->show(kobj, kattr, buf);
 	}
 
-	return ret;
+	return -EIO;
 }
 
 static ssize_t xe_hw_engine_class_sysfs_attr_store(struct kobject *kobj,
@@ -62,16 +60,14 @@ static ssize_t xe_hw_engine_class_sysfs_attr_store(struct kobject *kobj,
 {
 	struct xe_device *xe = kobj_to_xe(kobj);
 	struct kobj_attribute *kattr;
-	ssize_t ret = -EIO;
 
 	kattr = container_of(attr, struct kobj_attribute, attr);
 	if (kattr->store) {
-		xe_pm_runtime_get(xe);
-		ret = kattr->store(kobj, kattr, buf, count);
-		xe_pm_runtime_put(xe);
+		guard(xe_pm_runtime)(xe);
+		return kattr->store(kobj, kattr, buf, count);
 	}
 
-	return ret;
+	return -EIO;
 }
 
 static const struct sysfs_ops xe_hw_engine_class_sysfs_ops = {
-- 
2.51.1


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

* [PATCH v3 27/27] drm/xe/debugfs: Use scope-based runtime PM
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (25 preceding siblings ...)
  2025-11-14 21:44 ` [PATCH v3 26/27] drm/xe/sysfs: Use scope-based runtime power management Matt Roper
@ 2025-11-14 21:44 ` Matt Roper
  2025-11-14 23:22 ` ✗ CI.checkpatch: warning for Scope-based forcewake and runtime PM (rev4) Patchwork
                   ` (3 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Matt Roper @ 2025-11-14 21:44 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Switch the debugfs code to use scope-based runtime PM where possible,
for consistency with other parts of the driver.

v2:
 - Drop unnecessary 'ret' variables.  (Gustavo)

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_debugfs.c             | 16 +++++-----------
 drivers/gpu/drm/xe/xe_gsc_debugfs.c         |  3 +--
 drivers/gpu/drm/xe/xe_gt_sriov_pf_debugfs.c | 12 ++++--------
 drivers/gpu/drm/xe/xe_guc_debugfs.c         |  8 ++------
 drivers/gpu/drm/xe/xe_huc_debugfs.c         |  3 +--
 drivers/gpu/drm/xe/xe_tile_debugfs.c        |  8 ++------
 6 files changed, 15 insertions(+), 35 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_debugfs.c b/drivers/gpu/drm/xe/xe_debugfs.c
index e91da9589c5f..1d5a2a43a9d7 100644
--- a/drivers/gpu/drm/xe/xe_debugfs.c
+++ b/drivers/gpu/drm/xe/xe_debugfs.c
@@ -68,7 +68,7 @@ static int info(struct seq_file *m, void *data)
 	struct xe_gt *gt;
 	u8 id;
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 
 	drm_printf(&p, "graphics_verx100 %d\n", xe->info.graphics_verx100);
 	drm_printf(&p, "media_verx100 %d\n", xe->info.media_verx100);
@@ -95,7 +95,6 @@ static int info(struct seq_file *m, void *data)
 			   gt->info.engine_mask);
 	}
 
-	xe_pm_runtime_put(xe);
 	return 0;
 }
 
@@ -110,9 +109,8 @@ static int sriov_info(struct seq_file *m, void *data)
 
 static int workarounds(struct xe_device *xe, struct drm_printer *p)
 {
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 	xe_wa_device_dump(xe, p);
-	xe_pm_runtime_put(xe);
 
 	return 0;
 }
@@ -134,7 +132,7 @@ static int dgfx_pkg_residencies_show(struct seq_file *m, void *data)
 
 	xe = node_to_xe(m->private);
 	p = drm_seq_file_printer(m);
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 	mmio = xe_root_tile_mmio(xe);
 	static const struct {
 		u32 offset;
@@ -151,7 +149,6 @@ static int dgfx_pkg_residencies_show(struct seq_file *m, void *data)
 	for (int i = 0; i < ARRAY_SIZE(residencies); i++)
 		read_residency_counter(xe, mmio, residencies[i].offset, residencies[i].name, &p);
 
-	xe_pm_runtime_put(xe);
 	return 0;
 }
 
@@ -163,7 +160,7 @@ static int dgfx_pcie_link_residencies_show(struct seq_file *m, void *data)
 
 	xe = node_to_xe(m->private);
 	p = drm_seq_file_printer(m);
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 	mmio = xe_root_tile_mmio(xe);
 
 	static const struct {
@@ -178,7 +175,6 @@ static int dgfx_pcie_link_residencies_show(struct seq_file *m, void *data)
 	for (int i = 0; i < ARRAY_SIZE(residencies); i++)
 		read_residency_counter(xe, mmio, residencies[i].offset, residencies[i].name, &p);
 
-	xe_pm_runtime_put(xe);
 	return 0;
 }
 
@@ -277,16 +273,14 @@ static ssize_t wedged_mode_set(struct file *f, const char __user *ubuf,
 
 	xe->wedged.mode = wedged_mode;
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 	for_each_gt(gt, xe, id) {
 		ret = xe_guc_ads_scheduler_policy_toggle_reset(&gt->uc.guc.ads);
 		if (ret) {
 			xe_gt_err(gt, "Failed to update GuC ADS scheduler policy. GuC may still cause engine reset even with wedged_mode=2\n");
-			xe_pm_runtime_put(xe);
 			return -EIO;
 		}
 	}
-	xe_pm_runtime_put(xe);
 
 	return size;
 }
diff --git a/drivers/gpu/drm/xe/xe_gsc_debugfs.c b/drivers/gpu/drm/xe/xe_gsc_debugfs.c
index 461d7e99c2b3..b13928b50eb9 100644
--- a/drivers/gpu/drm/xe/xe_gsc_debugfs.c
+++ b/drivers/gpu/drm/xe/xe_gsc_debugfs.c
@@ -37,9 +37,8 @@ static int gsc_info(struct seq_file *m, void *data)
 	struct xe_device *xe = gsc_to_xe(gsc);
 	struct drm_printer p = drm_seq_file_printer(m);
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 	xe_gsc_print_info(gsc, &p);
-	xe_pm_runtime_put(xe);
 
 	return 0;
 }
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_debugfs.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_debugfs.c
index 5278ea4fd655..0fd863609848 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_debugfs.c
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_debugfs.c
@@ -123,11 +123,10 @@ static int POLICY##_set(void *data, u64 val)					\
 	if (val > (TYPE)~0ull)							\
 		return -EOVERFLOW;						\
 										\
-	xe_pm_runtime_get(xe);							\
+	guard(xe_pm_runtime)(xe);							\
 	err = xe_gt_sriov_pf_policy_set_##POLICY(gt, val);			\
 	if (!err)								\
 		xe_sriov_pf_provision_set_custom_mode(xe);			\
-	xe_pm_runtime_put(xe);							\
 										\
 	return err;								\
 }										\
@@ -189,12 +188,11 @@ static int CONFIG##_set(void *data, u64 val)					\
 	if (val > (TYPE)~0ull)							\
 		return -EOVERFLOW;						\
 										\
-	xe_pm_runtime_get(xe);							\
+	guard(xe_pm_runtime)(xe);							\
 	err = xe_sriov_pf_wait_ready(xe) ?:					\
 	      xe_gt_sriov_pf_config_set_##CONFIG(gt, vfid, val);		\
 	if (!err)								\
 		xe_sriov_pf_provision_set_custom_mode(xe);			\
-	xe_pm_runtime_put(xe);							\
 										\
 	return err;								\
 }										\
@@ -249,11 +247,10 @@ static int set_threshold(void *data, u64 val, enum xe_guc_klv_threshold_index in
 	if (val > (u32)~0ull)
 		return -EOVERFLOW;
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 	err = xe_gt_sriov_pf_config_set_threshold(gt, vfid, index, val);
 	if (!err)
 		xe_sriov_pf_provision_set_custom_mode(xe);
-	xe_pm_runtime_put(xe);
 
 	return err;
 }
@@ -358,9 +355,8 @@ static ssize_t control_write(struct file *file, const char __user *buf, size_t c
 		xe_gt_assert(gt, sizeof(cmd) > strlen(control_cmds[n].cmd));
 
 		if (sysfs_streq(cmd, control_cmds[n].cmd)) {
-			xe_pm_runtime_get(xe);
+			guard(xe_pm_runtime)(xe);
 			ret = control_cmds[n].fn ? (*control_cmds[n].fn)(gt, vfid) : 0;
-			xe_pm_runtime_put(xe);
 			break;
 		}
 	}
diff --git a/drivers/gpu/drm/xe/xe_guc_debugfs.c b/drivers/gpu/drm/xe/xe_guc_debugfs.c
index 0b102ab46c4d..efaca259d3e8 100644
--- a/drivers/gpu/drm/xe/xe_guc_debugfs.c
+++ b/drivers/gpu/drm/xe/xe_guc_debugfs.c
@@ -70,13 +70,9 @@ static int guc_debugfs_show(struct seq_file *m, void *data)
 	struct xe_gt *gt = grandparent->d_inode->i_private;
 	struct xe_device *xe = gt_to_xe(gt);
 	int (*print)(struct xe_guc *, struct drm_printer *) = node->info_ent->data;
-	int ret;
 
-	xe_pm_runtime_get(xe);
-	ret = print(&gt->uc.guc, &p);
-	xe_pm_runtime_put(xe);
-
-	return ret;
+	guard(xe_pm_runtime)(xe);
+	return print(&gt->uc.guc, &p);
 }
 
 static int guc_log(struct xe_guc *guc, struct drm_printer *p)
diff --git a/drivers/gpu/drm/xe/xe_huc_debugfs.c b/drivers/gpu/drm/xe/xe_huc_debugfs.c
index 3a888a40188b..df9c4d79b710 100644
--- a/drivers/gpu/drm/xe/xe_huc_debugfs.c
+++ b/drivers/gpu/drm/xe/xe_huc_debugfs.c
@@ -37,9 +37,8 @@ static int huc_info(struct seq_file *m, void *data)
 	struct xe_device *xe = huc_to_xe(huc);
 	struct drm_printer p = drm_seq_file_printer(m);
 
-	xe_pm_runtime_get(xe);
+	guard(xe_pm_runtime)(xe);
 	xe_huc_print_info(huc, &p);
-	xe_pm_runtime_put(xe);
 
 	return 0;
 }
diff --git a/drivers/gpu/drm/xe/xe_tile_debugfs.c b/drivers/gpu/drm/xe/xe_tile_debugfs.c
index fff242a5ae56..39eeca75dded 100644
--- a/drivers/gpu/drm/xe/xe_tile_debugfs.c
+++ b/drivers/gpu/drm/xe/xe_tile_debugfs.c
@@ -82,13 +82,9 @@ int xe_tile_debugfs_show_with_rpm(struct seq_file *m, void *data)
 	struct drm_info_node *node = m->private;
 	struct xe_tile *tile = node_to_tile(node);
 	struct xe_device *xe = tile_to_xe(tile);
-	int ret;
 
-	xe_pm_runtime_get(xe);
-	ret = xe_tile_debugfs_simple_show(m, data);
-	xe_pm_runtime_put(xe);
-
-	return ret;
+	guard(xe_pm_runtime)(xe);
+	return xe_tile_debugfs_simple_show(m, data);
 }
 
 static int ggtt(struct xe_tile *tile, struct drm_printer *p)
-- 
2.51.1


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

* ✗ CI.checkpatch: warning for Scope-based forcewake and runtime PM (rev4)
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (26 preceding siblings ...)
  2025-11-14 21:44 ` [PATCH v3 27/27] drm/xe/debugfs: Use scope-based runtime PM Matt Roper
@ 2025-11-14 23:22 ` Patchwork
  2025-11-14 23:23 ` ✓ CI.KUnit: success " Patchwork
                   ` (2 subsequent siblings)
  30 siblings, 0 replies; 39+ messages in thread
From: Patchwork @ 2025-11-14 23:22 UTC (permalink / raw)
  To: Matt Roper; +Cc: intel-xe

== Series Details ==

Series: Scope-based forcewake and runtime PM (rev4)
URL   : https://patchwork.freedesktop.org/series/157253/
State : warning

== Summary ==

+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
2de9a3901bc28757c7906b454717b64e2a214021
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 45f0cad405f735d7bf5e5c05b1d6253ac9ce3bc7
Author: Matt Roper <matthew.d.roper@intel.com>
Date:   Fri Nov 14 13:44:03 2025 -0800

    drm/xe/debugfs: Use scope-based runtime PM
    
    Switch the debugfs code to use scope-based runtime PM where possible,
    for consistency with other parts of the driver.
    
    v2:
     - Drop unnecessary 'ret' variables.  (Gustavo)
    
    Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
    Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
+ /mt/dim checkpatch 3e04a6544879d3b9d186bf466fc9c1a8b4d1fa36 drm-intel
b4691c81e5d2 drm/xe/forcewake: Add scope-based cleanup for forcewake
-:102: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'done' - possible side-effects?
#102: FILE: drivers/gpu/drm/xe/xe_force_wake.h:88:
+#define __xe_with_force_wake(ref, fw, domains, done) \
+	for (CLASS(xe_force_wake, ref)(fw, domains), *(done) = NULL; \
+	     !(done); (done) = (void *)1)

total: 0 errors, 0 warnings, 1 checks, 57 lines checked
d076fcdfb3e1 drm/xe/pm: Add scope-based cleanup helper for runtime PM
e8ac9db4f339 drm/xe/gt: Use scope-based cleanup
c4dbd6928320 drm/xe/gt_idle: Use scope-based cleanup
b23dc8980338 drm/xe/guc: Use scope-based cleanup
7300889aa6f3 drm/xe/guc_pc: Use scope-based cleanup
9a813dd4bb52 drm/xe/mocs: Use scope-based cleanup
14ea82867271 drm/xe/pat: Use scope-based forcewake
79228806d76d drm/xe/pxp: Use scope-based cleanup
19be5fa06d00 drm/xe/gsc: Use scope-based cleanup
b0040dddf147 drm/xe/device: Use scope-based cleanup
3c4d8c7524c9 drm/xe/devcoredump: Use scope-based cleanup
0d1e54d870cc drm/xe/display: Use scoped-cleanup
cfa7602e542d drm/xe: Return forcewake reference type from force_wake_get_any_engine()
8fd17fc05f3d drm/xe/drm_client: Use scope-based cleanup
ec660a956fc0 drm/xe/gt_debugfs: Use scope-based cleanup
46307f7f58e0 drm/xe/huc: Use scope-based forcewake
2a65cd5c5e33 drm/xe/query: Use scope-based forcewake
087a2e897b0e drm/xe/reg_sr: Use scope-based forcewake
bcc19884ddde drm/xe/vram: Use scope-based forcewake
91ae50d776f2 drm/xe/bo: Use scope-based runtime PM
4360c707c862 drm/xe/ggtt: Use scope-based runtime pm
fe2920d106cc drm/xe/hwmon: Use scope-based runtime PM
134ae8bed7bf drm/xe/sriov: Use scope-based runtime PM
1b238e870830 drm/xe/tests: Use scope-based runtime PM
140917ded73a drm/xe/sysfs: Use scope-based runtime power management
45f0cad405f7 drm/xe/debugfs: Use scope-based runtime PM



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

* ✓ CI.KUnit: success for Scope-based forcewake and runtime PM (rev4)
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (27 preceding siblings ...)
  2025-11-14 23:22 ` ✗ CI.checkpatch: warning for Scope-based forcewake and runtime PM (rev4) Patchwork
@ 2025-11-14 23:23 ` Patchwork
  2025-11-15  0:14 ` ✓ Xe.CI.BAT: " Patchwork
  2025-11-15 11:18 ` ✗ Xe.CI.Full: failure " Patchwork
  30 siblings, 0 replies; 39+ messages in thread
From: Patchwork @ 2025-11-14 23:23 UTC (permalink / raw)
  To: Matt Roper; +Cc: intel-xe

== Series Details ==

Series: Scope-based forcewake and runtime PM (rev4)
URL   : https://patchwork.freedesktop.org/series/157253/
State : success

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[23:22:01] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[23:22:06] 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
[23:22:39] Starting KUnit Kernel (1/1)...
[23:22:39] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[23:22:39] ================== guc_buf (11 subtests) ===================
[23:22:39] [PASSED] test_smallest
[23:22:39] [PASSED] test_largest
[23:22:39] [PASSED] test_granular
[23:22:39] [PASSED] test_unique
[23:22:39] [PASSED] test_overlap
[23:22:39] [PASSED] test_reusable
[23:22:39] [PASSED] test_too_big
[23:22:39] [PASSED] test_flush
[23:22:39] [PASSED] test_lookup
[23:22:39] [PASSED] test_data
[23:22:39] [PASSED] test_class
[23:22:39] ===================== [PASSED] guc_buf =====================
[23:22:39] =================== guc_dbm (7 subtests) ===================
[23:22:39] [PASSED] test_empty
[23:22:39] [PASSED] test_default
[23:22:39] ======================== test_size  ========================
[23:22:39] [PASSED] 4
[23:22:39] [PASSED] 8
[23:22:39] [PASSED] 32
[23:22:39] [PASSED] 256
[23:22:39] ==================== [PASSED] test_size ====================
[23:22:39] ======================= test_reuse  ========================
[23:22:39] [PASSED] 4
[23:22:39] [PASSED] 8
[23:22:39] [PASSED] 32
[23:22:39] [PASSED] 256
[23:22:39] =================== [PASSED] test_reuse ====================
[23:22:39] =================== test_range_overlap  ====================
[23:22:39] [PASSED] 4
[23:22:39] [PASSED] 8
[23:22:39] [PASSED] 32
[23:22:39] [PASSED] 256
[23:22:39] =============== [PASSED] test_range_overlap ================
[23:22:39] =================== test_range_compact  ====================
[23:22:39] [PASSED] 4
[23:22:39] [PASSED] 8
[23:22:39] [PASSED] 32
[23:22:39] [PASSED] 256
[23:22:39] =============== [PASSED] test_range_compact ================
[23:22:39] ==================== test_range_spare  =====================
[23:22:39] [PASSED] 4
[23:22:39] [PASSED] 8
[23:22:39] [PASSED] 32
[23:22:39] [PASSED] 256
[23:22:39] ================ [PASSED] test_range_spare =================
[23:22:39] ===================== [PASSED] guc_dbm =====================
[23:22:39] =================== guc_idm (6 subtests) ===================
[23:22:39] [PASSED] bad_init
[23:22:39] [PASSED] no_init
[23:22:39] [PASSED] init_fini
[23:22:39] [PASSED] check_used
[23:22:39] [PASSED] check_quota
[23:22:39] [PASSED] check_all
[23:22:39] ===================== [PASSED] guc_idm =====================
[23:22:39] ================== no_relay (3 subtests) ===================
[23:22:39] [PASSED] xe_drops_guc2pf_if_not_ready
[23:22:39] [PASSED] xe_drops_guc2vf_if_not_ready
[23:22:39] [PASSED] xe_rejects_send_if_not_ready
[23:22:39] ==================== [PASSED] no_relay =====================
[23:22:39] ================== pf_relay (14 subtests) ==================
[23:22:39] [PASSED] pf_rejects_guc2pf_too_short
[23:22:39] [PASSED] pf_rejects_guc2pf_too_long
[23:22:39] [PASSED] pf_rejects_guc2pf_no_payload
[23:22:39] [PASSED] pf_fails_no_payload
[23:22:39] [PASSED] pf_fails_bad_origin
[23:22:39] [PASSED] pf_fails_bad_type
[23:22:39] [PASSED] pf_txn_reports_error
[23:22:39] [PASSED] pf_txn_sends_pf2guc
[23:22:39] [PASSED] pf_sends_pf2guc
[23:22:39] [SKIPPED] pf_loopback_nop
[23:22:39] [SKIPPED] pf_loopback_echo
[23:22:39] [SKIPPED] pf_loopback_fail
[23:22:39] [SKIPPED] pf_loopback_busy
[23:22:39] [SKIPPED] pf_loopback_retry
[23:22:39] ==================== [PASSED] pf_relay =====================
[23:22:39] ================== vf_relay (3 subtests) ===================
[23:22:39] [PASSED] vf_rejects_guc2vf_too_short
[23:22:39] [PASSED] vf_rejects_guc2vf_too_long
[23:22:39] [PASSED] vf_rejects_guc2vf_no_payload
[23:22:39] ==================== [PASSED] vf_relay =====================
[23:22:39] ================ pf_gt_config (6 subtests) =================
[23:22:39] [PASSED] fair_contexts_1vf
[23:22:39] [PASSED] fair_doorbells_1vf
[23:22:39] [PASSED] fair_ggtt_1vf
[23:22:39] ====================== fair_contexts  ======================
[23:22:39] [PASSED] 1 VF
[23:22:39] [PASSED] 2 VFs
[23:22:39] [PASSED] 3 VFs
[23:22:39] [PASSED] 4 VFs
[23:22:39] [PASSED] 5 VFs
[23:22:39] [PASSED] 6 VFs
[23:22:39] [PASSED] 7 VFs
[23:22:39] [PASSED] 8 VFs
[23:22:39] [PASSED] 9 VFs
[23:22:39] [PASSED] 10 VFs
[23:22:39] [PASSED] 11 VFs
[23:22:39] [PASSED] 12 VFs
[23:22:39] [PASSED] 13 VFs
[23:22:39] [PASSED] 14 VFs
[23:22:39] [PASSED] 15 VFs
[23:22:39] [PASSED] 16 VFs
[23:22:39] [PASSED] 17 VFs
[23:22:39] [PASSED] 18 VFs
[23:22:39] [PASSED] 19 VFs
[23:22:39] [PASSED] 20 VFs
[23:22:39] [PASSED] 21 VFs
[23:22:39] [PASSED] 22 VFs
[23:22:39] [PASSED] 23 VFs
[23:22:39] [PASSED] 24 VFs
[23:22:39] [PASSED] 25 VFs
[23:22:39] [PASSED] 26 VFs
[23:22:39] [PASSED] 27 VFs
[23:22:39] [PASSED] 28 VFs
[23:22:39] [PASSED] 29 VFs
[23:22:39] [PASSED] 30 VFs
[23:22:39] [PASSED] 31 VFs
[23:22:39] [PASSED] 32 VFs
[23:22:39] [PASSED] 33 VFs
[23:22:39] [PASSED] 34 VFs
[23:22:39] [PASSED] 35 VFs
[23:22:39] [PASSED] 36 VFs
[23:22:39] [PASSED] 37 VFs
[23:22:39] [PASSED] 38 VFs
[23:22:39] [PASSED] 39 VFs
[23:22:39] [PASSED] 40 VFs
[23:22:39] [PASSED] 41 VFs
[23:22:39] [PASSED] 42 VFs
[23:22:39] [PASSED] 43 VFs
[23:22:39] [PASSED] 44 VFs
[23:22:39] [PASSED] 45 VFs
[23:22:39] [PASSED] 46 VFs
[23:22:39] [PASSED] 47 VFs
[23:22:39] [PASSED] 48 VFs
[23:22:39] [PASSED] 49 VFs
[23:22:39] [PASSED] 50 VFs
[23:22:39] [PASSED] 51 VFs
[23:22:39] [PASSED] 52 VFs
[23:22:39] [PASSED] 53 VFs
[23:22:39] [PASSED] 54 VFs
[23:22:39] [PASSED] 55 VFs
[23:22:39] [PASSED] 56 VFs
[23:22:39] [PASSED] 57 VFs
[23:22:39] [PASSED] 58 VFs
[23:22:39] [PASSED] 59 VFs
[23:22:39] [PASSED] 60 VFs
[23:22:39] [PASSED] 61 VFs
[23:22:39] [PASSED] 62 VFs
[23:22:39] [PASSED] 63 VFs
[23:22:39] ================== [PASSED] fair_contexts ==================
[23:22:39] ===================== fair_doorbells  ======================
[23:22:39] [PASSED] 1 VF
[23:22:39] [PASSED] 2 VFs
[23:22:39] [PASSED] 3 VFs
[23:22:39] [PASSED] 4 VFs
[23:22:39] [PASSED] 5 VFs
[23:22:39] [PASSED] 6 VFs
[23:22:39] [PASSED] 7 VFs
[23:22:39] [PASSED] 8 VFs
[23:22:39] [PASSED] 9 VFs
[23:22:39] [PASSED] 10 VFs
[23:22:39] [PASSED] 11 VFs
[23:22:39] [PASSED] 12 VFs
[23:22:39] [PASSED] 13 VFs
[23:22:39] [PASSED] 14 VFs
[23:22:39] [PASSED] 15 VFs
[23:22:39] [PASSED] 16 VFs
[23:22:39] [PASSED] 17 VFs
[23:22:39] [PASSED] 18 VFs
[23:22:39] [PASSED] 19 VFs
[23:22:39] [PASSED] 20 VFs
[23:22:39] [PASSED] 21 VFs
[23:22:39] [PASSED] 22 VFs
[23:22:39] [PASSED] 23 VFs
[23:22:39] [PASSED] 24 VFs
[23:22:39] [PASSED] 25 VFs
[23:22:39] [PASSED] 26 VFs
[23:22:39] [PASSED] 27 VFs
[23:22:39] [PASSED] 28 VFs
[23:22:39] [PASSED] 29 VFs
[23:22:39] [PASSED] 30 VFs
[23:22:39] [PASSED] 31 VFs
[23:22:39] [PASSED] 32 VFs
[23:22:39] [PASSED] 33 VFs
[23:22:39] [PASSED] 34 VFs
[23:22:39] [PASSED] 35 VFs
[23:22:39] [PASSED] 36 VFs
[23:22:39] [PASSED] 37 VFs
[23:22:39] [PASSED] 38 VFs
[23:22:39] [PASSED] 39 VFs
[23:22:39] [PASSED] 40 VFs
[23:22:39] [PASSED] 41 VFs
[23:22:39] [PASSED] 42 VFs
[23:22:39] [PASSED] 43 VFs
[23:22:39] [PASSED] 44 VFs
[23:22:39] [PASSED] 45 VFs
[23:22:39] [PASSED] 46 VFs
[23:22:39] [PASSED] 47 VFs
[23:22:39] [PASSED] 48 VFs
[23:22:39] [PASSED] 49 VFs
[23:22:39] [PASSED] 50 VFs
[23:22:39] [PASSED] 51 VFs
[23:22:39] [PASSED] 52 VFs
[23:22:39] [PASSED] 53 VFs
[23:22:39] [PASSED] 54 VFs
[23:22:39] [PASSED] 55 VFs
[23:22:39] [PASSED] 56 VFs
[23:22:39] [PASSED] 57 VFs
[23:22:39] [PASSED] 58 VFs
[23:22:39] [PASSED] 59 VFs
[23:22:39] [PASSED] 60 VFs
[23:22:39] [PASSED] 61 VFs
[23:22:39] [PASSED] 62 VFs
[23:22:39] [PASSED] 63 VFs
[23:22:39] ================= [PASSED] fair_doorbells ==================
[23:22:39] ======================== fair_ggtt  ========================
[23:22:39] [PASSED] 1 VF
[23:22:39] [PASSED] 2 VFs
[23:22:39] [PASSED] 3 VFs
[23:22:39] [PASSED] 4 VFs
[23:22:39] [PASSED] 5 VFs
[23:22:39] [PASSED] 6 VFs
[23:22:39] [PASSED] 7 VFs
[23:22:39] [PASSED] 8 VFs
[23:22:39] [PASSED] 9 VFs
[23:22:39] [PASSED] 10 VFs
[23:22:39] [PASSED] 11 VFs
[23:22:39] [PASSED] 12 VFs
[23:22:39] [PASSED] 13 VFs
[23:22:39] [PASSED] 14 VFs
[23:22:39] [PASSED] 15 VFs
[23:22:39] [PASSED] 16 VFs
[23:22:39] [PASSED] 17 VFs
[23:22:39] [PASSED] 18 VFs
[23:22:39] [PASSED] 19 VFs
[23:22:39] [PASSED] 20 VFs
[23:22:39] [PASSED] 21 VFs
[23:22:39] [PASSED] 22 VFs
[23:22:39] [PASSED] 23 VFs
[23:22:39] [PASSED] 24 VFs
[23:22:39] [PASSED] 25 VFs
[23:22:39] [PASSED] 26 VFs
[23:22:39] [PASSED] 27 VFs
[23:22:39] [PASSED] 28 VFs
[23:22:39] [PASSED] 29 VFs
[23:22:39] [PASSED] 30 VFs
[23:22:39] [PASSED] 31 VFs
[23:22:39] [PASSED] 32 VFs
[23:22:39] [PASSED] 33 VFs
[23:22:39] [PASSED] 34 VFs
[23:22:39] [PASSED] 35 VFs
[23:22:39] [PASSED] 36 VFs
[23:22:39] [PASSED] 37 VFs
[23:22:39] [PASSED] 38 VFs
[23:22:39] [PASSED] 39 VFs
[23:22:39] [PASSED] 40 VFs
[23:22:39] [PASSED] 41 VFs
[23:22:39] [PASSED] 42 VFs
[23:22:39] [PASSED] 43 VFs
[23:22:39] [PASSED] 44 VFs
[23:22:39] [PASSED] 45 VFs
[23:22:39] [PASSED] 46 VFs
[23:22:39] [PASSED] 47 VFs
[23:22:39] [PASSED] 48 VFs
[23:22:39] [PASSED] 49 VFs
[23:22:39] [PASSED] 50 VFs
[23:22:39] [PASSED] 51 VFs
[23:22:39] [PASSED] 52 VFs
[23:22:39] [PASSED] 53 VFs
[23:22:39] [PASSED] 54 VFs
[23:22:39] [PASSED] 55 VFs
[23:22:39] [PASSED] 56 VFs
[23:22:39] [PASSED] 57 VFs
[23:22:39] [PASSED] 58 VFs
[23:22:39] [PASSED] 59 VFs
[23:22:39] [PASSED] 60 VFs
[23:22:39] [PASSED] 61 VFs
[23:22:39] [PASSED] 62 VFs
[23:22:39] [PASSED] 63 VFs
[23:22:39] ==================== [PASSED] fair_ggtt ====================
[23:22:39] ================== [PASSED] pf_gt_config ===================
[23:22:39] ===================== lmtt (1 subtest) =====================
[23:22:39] ======================== test_ops  =========================
[23:22:39] [PASSED] 2-level
[23:22:39] [PASSED] multi-level
[23:22:39] ==================== [PASSED] test_ops =====================
[23:22:39] ====================== [PASSED] lmtt =======================
[23:22:39] ================= pf_service (11 subtests) =================
[23:22:39] [PASSED] pf_negotiate_any
[23:22:39] [PASSED] pf_negotiate_base_match
[23:22:39] [PASSED] pf_negotiate_base_newer
[23:22:39] [PASSED] pf_negotiate_base_next
[23:22:39] [SKIPPED] pf_negotiate_base_older
[23:22:39] [PASSED] pf_negotiate_base_prev
[23:22:39] [PASSED] pf_negotiate_latest_match
[23:22:39] [PASSED] pf_negotiate_latest_newer
[23:22:39] [PASSED] pf_negotiate_latest_next
[23:22:39] [SKIPPED] pf_negotiate_latest_older
[23:22:39] [SKIPPED] pf_negotiate_latest_prev
[23:22:39] =================== [PASSED] pf_service ====================
[23:22:39] ================= xe_guc_g2g (2 subtests) ==================
[23:22:39] ============== xe_live_guc_g2g_kunit_default  ==============
[23:22:39] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[23:22:39] ============== xe_live_guc_g2g_kunit_allmem  ===============
[23:22:39] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[23:22:39] =================== [SKIPPED] xe_guc_g2g ===================
[23:22:39] =================== xe_mocs (2 subtests) ===================
[23:22:39] ================ xe_live_mocs_kernel_kunit  ================
[23:22:39] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[23:22:39] ================ xe_live_mocs_reset_kunit  =================
[23:22:39] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[23:22:39] ==================== [SKIPPED] xe_mocs =====================
[23:22:39] ================= xe_migrate (2 subtests) ==================
[23:22:39] ================= xe_migrate_sanity_kunit  =================
[23:22:39] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[23:22:39] ================== xe_validate_ccs_kunit  ==================
[23:22:39] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[23:22:39] =================== [SKIPPED] xe_migrate ===================
[23:22:39] ================== xe_dma_buf (1 subtest) ==================
[23:22:39] ==================== xe_dma_buf_kunit  =====================
[23:22:39] ================ [SKIPPED] xe_dma_buf_kunit ================
[23:22:39] =================== [SKIPPED] xe_dma_buf ===================
[23:22:39] ================= xe_bo_shrink (1 subtest) =================
[23:22:39] =================== xe_bo_shrink_kunit  ====================
[23:22:39] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[23:22:39] ================== [SKIPPED] xe_bo_shrink ==================
[23:22:39] ==================== xe_bo (2 subtests) ====================
[23:22:39] ================== xe_ccs_migrate_kunit  ===================
[23:22:39] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[23:22:39] ==================== xe_bo_evict_kunit  ====================
[23:22:39] =============== [SKIPPED] xe_bo_evict_kunit ================
[23:22:39] ===================== [SKIPPED] xe_bo ======================
[23:22:39] ==================== args (11 subtests) ====================
[23:22:39] [PASSED] count_args_test
[23:22:39] [PASSED] call_args_example
[23:22:39] [PASSED] call_args_test
[23:22:39] [PASSED] drop_first_arg_example
[23:22:39] [PASSED] drop_first_arg_test
[23:22:39] [PASSED] first_arg_example
[23:22:39] [PASSED] first_arg_test
[23:22:39] [PASSED] last_arg_example
[23:22:39] [PASSED] last_arg_test
[23:22:39] [PASSED] pick_arg_example
[23:22:39] [PASSED] sep_comma_example
[23:22:39] ====================== [PASSED] args =======================
[23:22:39] =================== xe_pci (3 subtests) ====================
[23:22:39] ==================== check_graphics_ip  ====================
[23:22:39] [PASSED] 12.00 Xe_LP
[23:22:39] [PASSED] 12.10 Xe_LP+
[23:22:39] [PASSED] 12.55 Xe_HPG
[23:22:39] [PASSED] 12.60 Xe_HPC
[23:22:39] [PASSED] 12.70 Xe_LPG
[23:22:39] [PASSED] 12.71 Xe_LPG
[23:22:39] [PASSED] 12.74 Xe_LPG+
[23:22:39] [PASSED] 20.01 Xe2_HPG
[23:22:39] [PASSED] 20.02 Xe2_HPG
[23:22:39] [PASSED] 20.04 Xe2_LPG
[23:22:39] [PASSED] 30.00 Xe3_LPG
[23:22:39] [PASSED] 30.01 Xe3_LPG
[23:22:39] [PASSED] 30.03 Xe3_LPG
[23:22:39] [PASSED] 30.04 Xe3_LPG
[23:22:39] [PASSED] 30.05 Xe3_LPG
[23:22:39] [PASSED] 35.11 Xe3p_XPC
[23:22:39] ================ [PASSED] check_graphics_ip ================
[23:22:39] ===================== check_media_ip  ======================
[23:22:39] [PASSED] 12.00 Xe_M
[23:22:39] [PASSED] 12.55 Xe_HPM
[23:22:39] [PASSED] 13.00 Xe_LPM+
[23:22:39] [PASSED] 13.01 Xe2_HPM
[23:22:39] [PASSED] 20.00 Xe2_LPM
[23:22:39] [PASSED] 30.00 Xe3_LPM
[23:22:39] [PASSED] 30.02 Xe3_LPM
[23:22:39] [PASSED] 35.00 Xe3p_LPM
[23:22:39] [PASSED] 35.03 Xe3p_HPM
[23:22:39] ================= [PASSED] check_media_ip ==================
[23:22:39] =================== check_platform_desc  ===================
[23:22:39] [PASSED] 0x9A60 (TIGERLAKE)
[23:22:39] [PASSED] 0x9A68 (TIGERLAKE)
[23:22:39] [PASSED] 0x9A70 (TIGERLAKE)
[23:22:39] [PASSED] 0x9A40 (TIGERLAKE)
[23:22:39] [PASSED] 0x9A49 (TIGERLAKE)
[23:22:39] [PASSED] 0x9A59 (TIGERLAKE)
[23:22:39] [PASSED] 0x9A78 (TIGERLAKE)
[23:22:39] [PASSED] 0x9AC0 (TIGERLAKE)
[23:22:39] [PASSED] 0x9AC9 (TIGERLAKE)
[23:22:39] [PASSED] 0x9AD9 (TIGERLAKE)
[23:22:39] [PASSED] 0x9AF8 (TIGERLAKE)
[23:22:39] [PASSED] 0x4C80 (ROCKETLAKE)
[23:22:39] [PASSED] 0x4C8A (ROCKETLAKE)
[23:22:39] [PASSED] 0x4C8B (ROCKETLAKE)
[23:22:39] [PASSED] 0x4C8C (ROCKETLAKE)
[23:22:39] [PASSED] 0x4C90 (ROCKETLAKE)
[23:22:39] [PASSED] 0x4C9A (ROCKETLAKE)
[23:22:39] [PASSED] 0x4680 (ALDERLAKE_S)
[23:22:39] [PASSED] 0x4682 (ALDERLAKE_S)
[23:22:39] [PASSED] 0x4688 (ALDERLAKE_S)
[23:22:39] [PASSED] 0x468A (ALDERLAKE_S)
[23:22:39] [PASSED] 0x468B (ALDERLAKE_S)
[23:22:39] [PASSED] 0x4690 (ALDERLAKE_S)
[23:22:39] [PASSED] 0x4692 (ALDERLAKE_S)
[23:22:39] [PASSED] 0x4693 (ALDERLAKE_S)
[23:22:39] [PASSED] 0x46A0 (ALDERLAKE_P)
[23:22:39] [PASSED] 0x46A1 (ALDERLAKE_P)
[23:22:39] [PASSED] 0x46A2 (ALDERLAKE_P)
[23:22:39] [PASSED] 0x46A3 (ALDERLAKE_P)
[23:22:39] [PASSED] 0x46A6 (ALDERLAKE_P)
[23:22:39] [PASSED] 0x46A8 (ALDERLAKE_P)
[23:22:39] [PASSED] 0x46AA (ALDERLAKE_P)
[23:22:39] [PASSED] 0x462A (ALDERLAKE_P)
[23:22:39] [PASSED] 0x4626 (ALDERLAKE_P)
[23:22:39] [PASSED] 0x4628 (ALDERLAKE_P)
[23:22:39] [PASSED] 0x46B0 (ALDERLAKE_P)
stty: 'standard input': Inappropriate ioctl for device
[23:22:39] [PASSED] 0x46B1 (ALDERLAKE_P)
[23:22:39] [PASSED] 0x46B2 (ALDERLAKE_P)
[23:22:39] [PASSED] 0x46B3 (ALDERLAKE_P)
[23:22:39] [PASSED] 0x46C0 (ALDERLAKE_P)
[23:22:39] [PASSED] 0x46C1 (ALDERLAKE_P)
[23:22:39] [PASSED] 0x46C2 (ALDERLAKE_P)
[23:22:39] [PASSED] 0x46C3 (ALDERLAKE_P)
[23:22:39] [PASSED] 0x46D0 (ALDERLAKE_N)
[23:22:39] [PASSED] 0x46D1 (ALDERLAKE_N)
[23:22:39] [PASSED] 0x46D2 (ALDERLAKE_N)
[23:22:39] [PASSED] 0x46D3 (ALDERLAKE_N)
[23:22:39] [PASSED] 0x46D4 (ALDERLAKE_N)
[23:22:39] [PASSED] 0xA721 (ALDERLAKE_P)
[23:22:39] [PASSED] 0xA7A1 (ALDERLAKE_P)
[23:22:39] [PASSED] 0xA7A9 (ALDERLAKE_P)
[23:22:39] [PASSED] 0xA7AC (ALDERLAKE_P)
[23:22:39] [PASSED] 0xA7AD (ALDERLAKE_P)
[23:22:39] [PASSED] 0xA720 (ALDERLAKE_P)
[23:22:39] [PASSED] 0xA7A0 (ALDERLAKE_P)
[23:22:39] [PASSED] 0xA7A8 (ALDERLAKE_P)
[23:22:39] [PASSED] 0xA7AA (ALDERLAKE_P)
[23:22:39] [PASSED] 0xA7AB (ALDERLAKE_P)
[23:22:39] [PASSED] 0xA780 (ALDERLAKE_S)
[23:22:39] [PASSED] 0xA781 (ALDERLAKE_S)
[23:22:39] [PASSED] 0xA782 (ALDERLAKE_S)
[23:22:39] [PASSED] 0xA783 (ALDERLAKE_S)
[23:22:39] [PASSED] 0xA788 (ALDERLAKE_S)
[23:22:39] [PASSED] 0xA789 (ALDERLAKE_S)
[23:22:39] [PASSED] 0xA78A (ALDERLAKE_S)
[23:22:39] [PASSED] 0xA78B (ALDERLAKE_S)
[23:22:39] [PASSED] 0x4905 (DG1)
[23:22:39] [PASSED] 0x4906 (DG1)
[23:22:39] [PASSED] 0x4907 (DG1)
[23:22:39] [PASSED] 0x4908 (DG1)
[23:22:39] [PASSED] 0x4909 (DG1)
[23:22:39] [PASSED] 0x56C0 (DG2)
[23:22:39] [PASSED] 0x56C2 (DG2)
[23:22:39] [PASSED] 0x56C1 (DG2)
[23:22:39] [PASSED] 0x7D51 (METEORLAKE)
[23:22:39] [PASSED] 0x7DD1 (METEORLAKE)
[23:22:39] [PASSED] 0x7D41 (METEORLAKE)
[23:22:39] [PASSED] 0x7D67 (METEORLAKE)
[23:22:39] [PASSED] 0xB640 (METEORLAKE)
[23:22:39] [PASSED] 0x56A0 (DG2)
[23:22:39] [PASSED] 0x56A1 (DG2)
[23:22:39] [PASSED] 0x56A2 (DG2)
[23:22:39] [PASSED] 0x56BE (DG2)
[23:22:39] [PASSED] 0x56BF (DG2)
[23:22:39] [PASSED] 0x5690 (DG2)
[23:22:39] [PASSED] 0x5691 (DG2)
[23:22:39] [PASSED] 0x5692 (DG2)
[23:22:39] [PASSED] 0x56A5 (DG2)
[23:22:39] [PASSED] 0x56A6 (DG2)
[23:22:39] [PASSED] 0x56B0 (DG2)
[23:22:39] [PASSED] 0x56B1 (DG2)
[23:22:39] [PASSED] 0x56BA (DG2)
[23:22:39] [PASSED] 0x56BB (DG2)
[23:22:39] [PASSED] 0x56BC (DG2)
[23:22:39] [PASSED] 0x56BD (DG2)
[23:22:39] [PASSED] 0x5693 (DG2)
[23:22:39] [PASSED] 0x5694 (DG2)
[23:22:39] [PASSED] 0x5695 (DG2)
[23:22:39] [PASSED] 0x56A3 (DG2)
[23:22:39] [PASSED] 0x56A4 (DG2)
[23:22:39] [PASSED] 0x56B2 (DG2)
[23:22:39] [PASSED] 0x56B3 (DG2)
[23:22:39] [PASSED] 0x5696 (DG2)
[23:22:39] [PASSED] 0x5697 (DG2)
[23:22:39] [PASSED] 0xB69 (PVC)
[23:22:39] [PASSED] 0xB6E (PVC)
[23:22:39] [PASSED] 0xBD4 (PVC)
[23:22:39] [PASSED] 0xBD5 (PVC)
[23:22:39] [PASSED] 0xBD6 (PVC)
[23:22:39] [PASSED] 0xBD7 (PVC)
[23:22:39] [PASSED] 0xBD8 (PVC)
[23:22:39] [PASSED] 0xBD9 (PVC)
[23:22:39] [PASSED] 0xBDA (PVC)
[23:22:39] [PASSED] 0xBDB (PVC)
[23:22:39] [PASSED] 0xBE0 (PVC)
[23:22:39] [PASSED] 0xBE1 (PVC)
[23:22:39] [PASSED] 0xBE5 (PVC)
[23:22:39] [PASSED] 0x7D40 (METEORLAKE)
[23:22:39] [PASSED] 0x7D45 (METEORLAKE)
[23:22:39] [PASSED] 0x7D55 (METEORLAKE)
[23:22:39] [PASSED] 0x7D60 (METEORLAKE)
[23:22:39] [PASSED] 0x7DD5 (METEORLAKE)
[23:22:39] [PASSED] 0x6420 (LUNARLAKE)
[23:22:39] [PASSED] 0x64A0 (LUNARLAKE)
[23:22:39] [PASSED] 0x64B0 (LUNARLAKE)
[23:22:39] [PASSED] 0xE202 (BATTLEMAGE)
[23:22:39] [PASSED] 0xE209 (BATTLEMAGE)
[23:22:39] [PASSED] 0xE20B (BATTLEMAGE)
[23:22:39] [PASSED] 0xE20C (BATTLEMAGE)
[23:22:39] [PASSED] 0xE20D (BATTLEMAGE)
[23:22:39] [PASSED] 0xE210 (BATTLEMAGE)
[23:22:39] [PASSED] 0xE211 (BATTLEMAGE)
[23:22:39] [PASSED] 0xE212 (BATTLEMAGE)
[23:22:39] [PASSED] 0xE216 (BATTLEMAGE)
[23:22:39] [PASSED] 0xE220 (BATTLEMAGE)
[23:22:39] [PASSED] 0xE221 (BATTLEMAGE)
[23:22:39] [PASSED] 0xE222 (BATTLEMAGE)
[23:22:39] [PASSED] 0xE223 (BATTLEMAGE)
[23:22:39] [PASSED] 0xB080 (PANTHERLAKE)
[23:22:39] [PASSED] 0xB081 (PANTHERLAKE)
[23:22:39] [PASSED] 0xB082 (PANTHERLAKE)
[23:22:39] [PASSED] 0xB083 (PANTHERLAKE)
[23:22:39] [PASSED] 0xB084 (PANTHERLAKE)
[23:22:39] [PASSED] 0xB085 (PANTHERLAKE)
[23:22:39] [PASSED] 0xB086 (PANTHERLAKE)
[23:22:39] [PASSED] 0xB087 (PANTHERLAKE)
[23:22:39] [PASSED] 0xB08F (PANTHERLAKE)
[23:22:39] [PASSED] 0xB090 (PANTHERLAKE)
[23:22:39] [PASSED] 0xB0A0 (PANTHERLAKE)
[23:22:39] [PASSED] 0xB0B0 (PANTHERLAKE)
[23:22:39] [PASSED] 0xD740 (NOVALAKE_S)
[23:22:39] [PASSED] 0xD741 (NOVALAKE_S)
[23:22:39] [PASSED] 0xD742 (NOVALAKE_S)
[23:22:39] [PASSED] 0xD743 (NOVALAKE_S)
[23:22:39] [PASSED] 0xD744 (NOVALAKE_S)
[23:22:39] [PASSED] 0xD745 (NOVALAKE_S)
[23:22:39] [PASSED] 0x674C (CRESCENTISLAND)
[23:22:39] [PASSED] 0xFD80 (PANTHERLAKE)
[23:22:39] [PASSED] 0xFD81 (PANTHERLAKE)
[23:22:39] =============== [PASSED] check_platform_desc ===============
[23:22:39] ===================== [PASSED] xe_pci ======================
[23:22:39] =================== xe_rtp (2 subtests) ====================
[23:22:39] =============== xe_rtp_process_to_sr_tests  ================
[23:22:39] [PASSED] coalesce-same-reg
[23:22:39] [PASSED] no-match-no-add
[23:22:39] [PASSED] match-or
[23:22:39] [PASSED] match-or-xfail
[23:22:39] [PASSED] no-match-no-add-multiple-rules
[23:22:39] [PASSED] two-regs-two-entries
[23:22:39] [PASSED] clr-one-set-other
[23:22:39] [PASSED] set-field
[23:22:39] [PASSED] conflict-duplicate
[23:22:39] [PASSED] conflict-not-disjoint
[23:22:39] [PASSED] conflict-reg-type
[23:22:39] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[23:22:39] ================== xe_rtp_process_tests  ===================
[23:22:39] [PASSED] active1
[23:22:39] [PASSED] active2
[23:22:39] [PASSED] active-inactive
[23:22:39] [PASSED] inactive-active
[23:22:39] [PASSED] inactive-1st_or_active-inactive
[23:22:39] [PASSED] inactive-2nd_or_active-inactive
[23:22:39] [PASSED] inactive-last_or_active-inactive
[23:22:39] [PASSED] inactive-no_or_active-inactive
[23:22:39] ============== [PASSED] xe_rtp_process_tests ===============
[23:22:39] ===================== [PASSED] xe_rtp ======================
[23:22:39] ==================== xe_wa (1 subtest) =====================
[23:22:39] ======================== xe_wa_gt  =========================
[23:22:39] [PASSED] TIGERLAKE B0
[23:22:39] [PASSED] DG1 A0
[23:22:39] [PASSED] DG1 B0
[23:22:39] [PASSED] ALDERLAKE_S A0
[23:22:39] [PASSED] ALDERLAKE_S B0
[23:22:39] [PASSED] ALDERLAKE_S C0
[23:22:39] [PASSED] ALDERLAKE_S D0
[23:22:39] [PASSED] ALDERLAKE_P A0
[23:22:39] [PASSED] ALDERLAKE_P B0
[23:22:39] [PASSED] ALDERLAKE_P C0
[23:22:39] [PASSED] ALDERLAKE_S RPLS D0
[23:22:39] [PASSED] ALDERLAKE_P RPLU E0
[23:22:39] [PASSED] DG2 G10 C0
[23:22:39] [PASSED] DG2 G11 B1
[23:22:39] [PASSED] DG2 G12 A1
[23:22:39] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[23:22:39] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[23:22:39] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[23:22:39] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[23:22:39] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[23:22:39] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[23:22:39] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[23:22:39] ==================== [PASSED] xe_wa_gt =====================
[23:22:39] ====================== [PASSED] xe_wa ======================
[23:22:39] ============================================================
[23:22:39] Testing complete. Ran 510 tests: passed: 492, skipped: 18
[23:22:39] Elapsed time: 37.871s total, 4.226s configuring, 33.178s building, 0.457s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[23:22:39] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[23:22:41] 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
[23:23:07] Starting KUnit Kernel (1/1)...
[23:23:07] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[23:23:07] ============ drm_test_pick_cmdline (2 subtests) ============
[23:23:07] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[23:23:07] =============== drm_test_pick_cmdline_named  ===============
[23:23:07] [PASSED] NTSC
[23:23:07] [PASSED] NTSC-J
[23:23:07] [PASSED] PAL
[23:23:07] [PASSED] PAL-M
[23:23:07] =========== [PASSED] drm_test_pick_cmdline_named ===========
[23:23:07] ============== [PASSED] drm_test_pick_cmdline ==============
[23:23:07] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[23:23:07] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[23:23:07] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[23:23:07] =========== drm_validate_clone_mode (2 subtests) ===========
[23:23:07] ============== drm_test_check_in_clone_mode  ===============
[23:23:07] [PASSED] in_clone_mode
[23:23:07] [PASSED] not_in_clone_mode
[23:23:07] ========== [PASSED] drm_test_check_in_clone_mode ===========
[23:23:07] =============== drm_test_check_valid_clones  ===============
[23:23:07] [PASSED] not_in_clone_mode
[23:23:07] [PASSED] valid_clone
[23:23:07] [PASSED] invalid_clone
[23:23:07] =========== [PASSED] drm_test_check_valid_clones ===========
[23:23:07] ============= [PASSED] drm_validate_clone_mode =============
[23:23:07] ============= drm_validate_modeset (1 subtest) =============
[23:23:07] [PASSED] drm_test_check_connector_changed_modeset
[23:23:07] ============== [PASSED] drm_validate_modeset ===============
[23:23:07] ====== drm_test_bridge_get_current_state (2 subtests) ======
[23:23:07] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[23:23:07] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[23:23:07] ======== [PASSED] drm_test_bridge_get_current_state ========
[23:23:07] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[23:23:07] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[23:23:07] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[23:23:07] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[23:23:07] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[23:23:07] ============== drm_bridge_alloc (2 subtests) ===============
[23:23:07] [PASSED] drm_test_drm_bridge_alloc_basic
[23:23:07] [PASSED] drm_test_drm_bridge_alloc_get_put
[23:23:07] ================ [PASSED] drm_bridge_alloc =================
[23:23:07] ================== drm_buddy (8 subtests) ==================
[23:23:07] [PASSED] drm_test_buddy_alloc_limit
[23:23:07] [PASSED] drm_test_buddy_alloc_optimistic
[23:23:07] [PASSED] drm_test_buddy_alloc_pessimistic
[23:23:07] [PASSED] drm_test_buddy_alloc_pathological
[23:23:07] [PASSED] drm_test_buddy_alloc_contiguous
[23:23:07] [PASSED] drm_test_buddy_alloc_clear
[23:23:07] [PASSED] drm_test_buddy_alloc_range_bias
[23:23:08] [PASSED] drm_test_buddy_fragmentation_performance
[23:23:08] ==================== [PASSED] drm_buddy ====================
[23:23:08] ============= drm_cmdline_parser (40 subtests) =============
[23:23:08] [PASSED] drm_test_cmdline_force_d_only
[23:23:08] [PASSED] drm_test_cmdline_force_D_only_dvi
[23:23:08] [PASSED] drm_test_cmdline_force_D_only_hdmi
[23:23:08] [PASSED] drm_test_cmdline_force_D_only_not_digital
[23:23:08] [PASSED] drm_test_cmdline_force_e_only
[23:23:08] [PASSED] drm_test_cmdline_res
[23:23:08] [PASSED] drm_test_cmdline_res_vesa
[23:23:08] [PASSED] drm_test_cmdline_res_vesa_rblank
[23:23:08] [PASSED] drm_test_cmdline_res_rblank
[23:23:08] [PASSED] drm_test_cmdline_res_bpp
[23:23:08] [PASSED] drm_test_cmdline_res_refresh
[23:23:08] [PASSED] drm_test_cmdline_res_bpp_refresh
[23:23:08] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[23:23:08] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[23:23:08] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[23:23:08] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[23:23:08] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[23:23:08] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[23:23:08] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[23:23:08] [PASSED] drm_test_cmdline_res_margins_force_on
[23:23:08] [PASSED] drm_test_cmdline_res_vesa_margins
[23:23:08] [PASSED] drm_test_cmdline_name
[23:23:08] [PASSED] drm_test_cmdline_name_bpp
[23:23:08] [PASSED] drm_test_cmdline_name_option
[23:23:08] [PASSED] drm_test_cmdline_name_bpp_option
[23:23:08] [PASSED] drm_test_cmdline_rotate_0
[23:23:08] [PASSED] drm_test_cmdline_rotate_90
[23:23:08] [PASSED] drm_test_cmdline_rotate_180
[23:23:08] [PASSED] drm_test_cmdline_rotate_270
[23:23:08] [PASSED] drm_test_cmdline_hmirror
[23:23:08] [PASSED] drm_test_cmdline_vmirror
[23:23:08] [PASSED] drm_test_cmdline_margin_options
[23:23:08] [PASSED] drm_test_cmdline_multiple_options
[23:23:08] [PASSED] drm_test_cmdline_bpp_extra_and_option
[23:23:08] [PASSED] drm_test_cmdline_extra_and_option
[23:23:08] [PASSED] drm_test_cmdline_freestanding_options
[23:23:08] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[23:23:08] [PASSED] drm_test_cmdline_panel_orientation
[23:23:08] ================ drm_test_cmdline_invalid  =================
[23:23:08] [PASSED] margin_only
[23:23:08] [PASSED] interlace_only
[23:23:08] [PASSED] res_missing_x
[23:23:08] [PASSED] res_missing_y
[23:23:08] [PASSED] res_bad_y
[23:23:08] [PASSED] res_missing_y_bpp
[23:23:08] [PASSED] res_bad_bpp
[23:23:08] [PASSED] res_bad_refresh
[23:23:08] [PASSED] res_bpp_refresh_force_on_off
[23:23:08] [PASSED] res_invalid_mode
[23:23:08] [PASSED] res_bpp_wrong_place_mode
[23:23:08] [PASSED] name_bpp_refresh
[23:23:08] [PASSED] name_refresh
[23:23:08] [PASSED] name_refresh_wrong_mode
[23:23:08] [PASSED] name_refresh_invalid_mode
[23:23:08] [PASSED] rotate_multiple
[23:23:08] [PASSED] rotate_invalid_val
[23:23:08] [PASSED] rotate_truncated
[23:23:08] [PASSED] invalid_option
[23:23:08] [PASSED] invalid_tv_option
[23:23:08] [PASSED] truncated_tv_option
[23:23:08] ============ [PASSED] drm_test_cmdline_invalid =============
[23:23:08] =============== drm_test_cmdline_tv_options  ===============
[23:23:08] [PASSED] NTSC
[23:23:08] [PASSED] NTSC_443
[23:23:08] [PASSED] NTSC_J
[23:23:08] [PASSED] PAL
[23:23:08] [PASSED] PAL_M
[23:23:08] [PASSED] PAL_N
[23:23:08] [PASSED] SECAM
[23:23:08] [PASSED] MONO_525
[23:23:08] [PASSED] MONO_625
[23:23:08] =========== [PASSED] drm_test_cmdline_tv_options ===========
[23:23:08] =============== [PASSED] drm_cmdline_parser ================
[23:23:08] ========== drmm_connector_hdmi_init (20 subtests) ==========
[23:23:08] [PASSED] drm_test_connector_hdmi_init_valid
[23:23:08] [PASSED] drm_test_connector_hdmi_init_bpc_8
[23:23:08] [PASSED] drm_test_connector_hdmi_init_bpc_10
[23:23:08] [PASSED] drm_test_connector_hdmi_init_bpc_12
[23:23:08] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[23:23:08] [PASSED] drm_test_connector_hdmi_init_bpc_null
[23:23:08] [PASSED] drm_test_connector_hdmi_init_formats_empty
[23:23:08] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[23:23:08] === drm_test_connector_hdmi_init_formats_yuv420_allowed  ===
[23:23:08] [PASSED] supported_formats=0x9 yuv420_allowed=1
[23:23:08] [PASSED] supported_formats=0x9 yuv420_allowed=0
[23:23:08] [PASSED] supported_formats=0x3 yuv420_allowed=1
[23:23:08] [PASSED] supported_formats=0x3 yuv420_allowed=0
[23:23:08] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[23:23:08] [PASSED] drm_test_connector_hdmi_init_null_ddc
[23:23:08] [PASSED] drm_test_connector_hdmi_init_null_product
[23:23:08] [PASSED] drm_test_connector_hdmi_init_null_vendor
[23:23:08] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[23:23:08] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[23:23:08] [PASSED] drm_test_connector_hdmi_init_product_valid
[23:23:08] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[23:23:08] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[23:23:08] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[23:23:08] ========= drm_test_connector_hdmi_init_type_valid  =========
[23:23:08] [PASSED] HDMI-A
[23:23:08] [PASSED] HDMI-B
[23:23:08] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[23:23:08] ======== drm_test_connector_hdmi_init_type_invalid  ========
[23:23:08] [PASSED] Unknown
[23:23:08] [PASSED] VGA
[23:23:08] [PASSED] DVI-I
[23:23:08] [PASSED] DVI-D
[23:23:08] [PASSED] DVI-A
[23:23:08] [PASSED] Composite
[23:23:08] [PASSED] SVIDEO
[23:23:08] [PASSED] LVDS
[23:23:08] [PASSED] Component
[23:23:08] [PASSED] DIN
[23:23:08] [PASSED] DP
[23:23:08] [PASSED] TV
[23:23:08] [PASSED] eDP
[23:23:08] [PASSED] Virtual
[23:23:08] [PASSED] DSI
[23:23:08] [PASSED] DPI
[23:23:08] [PASSED] Writeback
[23:23:08] [PASSED] SPI
[23:23:08] [PASSED] USB
[23:23:08] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[23:23:08] ============ [PASSED] drmm_connector_hdmi_init =============
[23:23:08] ============= drmm_connector_init (3 subtests) =============
[23:23:08] [PASSED] drm_test_drmm_connector_init
[23:23:08] [PASSED] drm_test_drmm_connector_init_null_ddc
[23:23:08] ========= drm_test_drmm_connector_init_type_valid  =========
[23:23:08] [PASSED] Unknown
[23:23:08] [PASSED] VGA
[23:23:08] [PASSED] DVI-I
[23:23:08] [PASSED] DVI-D
[23:23:08] [PASSED] DVI-A
[23:23:08] [PASSED] Composite
[23:23:08] [PASSED] SVIDEO
[23:23:08] [PASSED] LVDS
[23:23:08] [PASSED] Component
[23:23:08] [PASSED] DIN
[23:23:08] [PASSED] DP
[23:23:08] [PASSED] HDMI-A
[23:23:08] [PASSED] HDMI-B
[23:23:08] [PASSED] TV
[23:23:08] [PASSED] eDP
[23:23:08] [PASSED] Virtual
[23:23:08] [PASSED] DSI
[23:23:08] [PASSED] DPI
[23:23:08] [PASSED] Writeback
[23:23:08] [PASSED] SPI
[23:23:08] [PASSED] USB
[23:23:08] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[23:23:08] =============== [PASSED] drmm_connector_init ===============
[23:23:08] ========= drm_connector_dynamic_init (6 subtests) ==========
[23:23:08] [PASSED] drm_test_drm_connector_dynamic_init
[23:23:08] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[23:23:08] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[23:23:08] [PASSED] drm_test_drm_connector_dynamic_init_properties
[23:23:08] ===== drm_test_drm_connector_dynamic_init_type_valid  ======
[23:23:08] [PASSED] Unknown
[23:23:08] [PASSED] VGA
[23:23:08] [PASSED] DVI-I
[23:23:08] [PASSED] DVI-D
[23:23:08] [PASSED] DVI-A
[23:23:08] [PASSED] Composite
[23:23:08] [PASSED] SVIDEO
[23:23:08] [PASSED] LVDS
[23:23:08] [PASSED] Component
[23:23:08] [PASSED] DIN
[23:23:08] [PASSED] DP
[23:23:08] [PASSED] HDMI-A
[23:23:08] [PASSED] HDMI-B
[23:23:08] [PASSED] TV
[23:23:08] [PASSED] eDP
[23:23:08] [PASSED] Virtual
[23:23:08] [PASSED] DSI
[23:23:08] [PASSED] DPI
[23:23:08] [PASSED] Writeback
[23:23:08] [PASSED] SPI
[23:23:08] [PASSED] USB
[23:23:08] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[23:23:08] ======== drm_test_drm_connector_dynamic_init_name  =========
[23:23:08] [PASSED] Unknown
[23:23:08] [PASSED] VGA
[23:23:08] [PASSED] DVI-I
[23:23:08] [PASSED] DVI-D
[23:23:08] [PASSED] DVI-A
[23:23:08] [PASSED] Composite
[23:23:08] [PASSED] SVIDEO
[23:23:08] [PASSED] LVDS
[23:23:08] [PASSED] Component
[23:23:08] [PASSED] DIN
[23:23:08] [PASSED] DP
[23:23:08] [PASSED] HDMI-A
[23:23:08] [PASSED] HDMI-B
[23:23:08] [PASSED] TV
[23:23:08] [PASSED] eDP
[23:23:08] [PASSED] Virtual
[23:23:08] [PASSED] DSI
[23:23:08] [PASSED] DPI
[23:23:08] [PASSED] Writeback
[23:23:08] [PASSED] SPI
[23:23:08] [PASSED] USB
[23:23:08] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[23:23:08] =========== [PASSED] drm_connector_dynamic_init ============
[23:23:08] ==== drm_connector_dynamic_register_early (4 subtests) =====
[23:23:08] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[23:23:08] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[23:23:08] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[23:23:08] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[23:23:08] ====== [PASSED] drm_connector_dynamic_register_early =======
[23:23:08] ======= drm_connector_dynamic_register (7 subtests) ========
[23:23:08] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[23:23:08] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[23:23:08] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[23:23:08] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[23:23:08] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[23:23:08] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[23:23:08] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[23:23:08] ========= [PASSED] drm_connector_dynamic_register ==========
[23:23:08] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[23:23:08] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[23:23:08] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[23:23:08] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[23:23:08] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[23:23:08] ========== drm_test_get_tv_mode_from_name_valid  ===========
[23:23:08] [PASSED] NTSC
[23:23:08] [PASSED] NTSC-443
[23:23:08] [PASSED] NTSC-J
[23:23:08] [PASSED] PAL
[23:23:08] [PASSED] PAL-M
[23:23:08] [PASSED] PAL-N
[23:23:08] [PASSED] SECAM
[23:23:08] [PASSED] Mono
[23:23:08] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[23:23:08] [PASSED] drm_test_get_tv_mode_from_name_truncated
[23:23:08] ============ [PASSED] drm_get_tv_mode_from_name ============
[23:23:08] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[23:23:08] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[23:23:08] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[23:23:08] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[23:23:08] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[23:23:08] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[23:23:08] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[23:23:08] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid  =
[23:23:08] [PASSED] VIC 96
[23:23:08] [PASSED] VIC 97
[23:23:08] [PASSED] VIC 101
[23:23:08] [PASSED] VIC 102
[23:23:08] [PASSED] VIC 106
[23:23:08] [PASSED] VIC 107
[23:23:08] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[23:23:08] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[23:23:08] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[23:23:08] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[23:23:08] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[23:23:08] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[23:23:08] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[23:23:08] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[23:23:08] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name  ====
[23:23:08] [PASSED] Automatic
[23:23:08] [PASSED] Full
[23:23:08] [PASSED] Limited 16:235
[23:23:08] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[23:23:08] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[23:23:08] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[23:23:08] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[23:23:08] === drm_test_drm_hdmi_connector_get_output_format_name  ====
[23:23:08] [PASSED] RGB
[23:23:08] [PASSED] YUV 4:2:0
[23:23:08] [PASSED] YUV 4:2:2
[23:23:08] [PASSED] YUV 4:4:4
[23:23:08] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[23:23:08] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[23:23:08] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[23:23:08] ============= drm_damage_helper (21 subtests) ==============
[23:23:08] [PASSED] drm_test_damage_iter_no_damage
[23:23:08] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[23:23:08] [PASSED] drm_test_damage_iter_no_damage_src_moved
[23:23:08] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[23:23:08] [PASSED] drm_test_damage_iter_no_damage_not_visible
[23:23:08] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[23:23:08] [PASSED] drm_test_damage_iter_no_damage_no_fb
[23:23:08] [PASSED] drm_test_damage_iter_simple_damage
[23:23:08] [PASSED] drm_test_damage_iter_single_damage
[23:23:08] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[23:23:08] [PASSED] drm_test_damage_iter_single_damage_outside_src
[23:23:08] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[23:23:08] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[23:23:08] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[23:23:08] [PASSED] drm_test_damage_iter_single_damage_src_moved
[23:23:08] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[23:23:08] [PASSED] drm_test_damage_iter_damage
[23:23:08] [PASSED] drm_test_damage_iter_damage_one_intersect
[23:23:08] [PASSED] drm_test_damage_iter_damage_one_outside
[23:23:08] [PASSED] drm_test_damage_iter_damage_src_moved
[23:23:08] [PASSED] drm_test_damage_iter_damage_not_visible
[23:23:08] ================ [PASSED] drm_damage_helper ================
[23:23:08] ============== drm_dp_mst_helper (3 subtests) ==============
[23:23:08] ============== drm_test_dp_mst_calc_pbn_mode  ==============
[23:23:08] [PASSED] Clock 154000 BPP 30 DSC disabled
[23:23:08] [PASSED] Clock 234000 BPP 30 DSC disabled
[23:23:08] [PASSED] Clock 297000 BPP 24 DSC disabled
[23:23:08] [PASSED] Clock 332880 BPP 24 DSC enabled
[23:23:08] [PASSED] Clock 324540 BPP 24 DSC enabled
[23:23:08] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[23:23:08] ============== drm_test_dp_mst_calc_pbn_div  ===============
[23:23:08] [PASSED] Link rate 2000000 lane count 4
[23:23:08] [PASSED] Link rate 2000000 lane count 2
[23:23:08] [PASSED] Link rate 2000000 lane count 1
[23:23:08] [PASSED] Link rate 1350000 lane count 4
[23:23:08] [PASSED] Link rate 1350000 lane count 2
[23:23:08] [PASSED] Link rate 1350000 lane count 1
[23:23:08] [PASSED] Link rate 1000000 lane count 4
[23:23:08] [PASSED] Link rate 1000000 lane count 2
[23:23:08] [PASSED] Link rate 1000000 lane count 1
[23:23:08] [PASSED] Link rate 810000 lane count 4
[23:23:08] [PASSED] Link rate 810000 lane count 2
[23:23:08] [PASSED] Link rate 810000 lane count 1
[23:23:08] [PASSED] Link rate 540000 lane count 4
[23:23:08] [PASSED] Link rate 540000 lane count 2
[23:23:08] [PASSED] Link rate 540000 lane count 1
[23:23:08] [PASSED] Link rate 270000 lane count 4
[23:23:08] [PASSED] Link rate 270000 lane count 2
[23:23:08] [PASSED] Link rate 270000 lane count 1
[23:23:08] [PASSED] Link rate 162000 lane count 4
[23:23:08] [PASSED] Link rate 162000 lane count 2
[23:23:08] [PASSED] Link rate 162000 lane count 1
[23:23:08] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[23:23:08] ========= drm_test_dp_mst_sideband_msg_req_decode  =========
[23:23:08] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[23:23:08] [PASSED] DP_POWER_UP_PHY with port number
[23:23:08] [PASSED] DP_POWER_DOWN_PHY with port number
[23:23:08] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[23:23:08] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[23:23:08] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[23:23:08] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[23:23:08] [PASSED] DP_QUERY_PAYLOAD with port number
[23:23:08] [PASSED] DP_QUERY_PAYLOAD with VCPI
[23:23:08] [PASSED] DP_REMOTE_DPCD_READ with port number
[23:23:08] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[23:23:08] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[23:23:08] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[23:23:08] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[23:23:08] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[23:23:08] [PASSED] DP_REMOTE_I2C_READ with port number
[23:23:08] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[23:23:08] [PASSED] DP_REMOTE_I2C_READ with transactions array
[23:23:08] [PASSED] DP_REMOTE_I2C_WRITE with port number
[23:23:08] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[23:23:08] [PASSED] DP_REMOTE_I2C_WRITE with data array
[23:23:08] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[23:23:08] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[23:23:08] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[23:23:08] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[23:23:08] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[23:23:08] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[23:23:08] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[23:23:08] ================ [PASSED] drm_dp_mst_helper ================
[23:23:08] ================== drm_exec (7 subtests) ===================
[23:23:08] [PASSED] sanitycheck
[23:23:08] [PASSED] test_lock
[23:23:08] [PASSED] test_lock_unlock
[23:23:08] [PASSED] test_duplicates
[23:23:08] [PASSED] test_prepare
[23:23:08] [PASSED] test_prepare_array
[23:23:08] [PASSED] test_multiple_loops
[23:23:08] ==================== [PASSED] drm_exec =====================
[23:23:08] =========== drm_format_helper_test (17 subtests) ===========
[23:23:08] ============== drm_test_fb_xrgb8888_to_gray8  ==============
[23:23:08] [PASSED] single_pixel_source_buffer
[23:23:08] [PASSED] single_pixel_clip_rectangle
[23:23:08] [PASSED] well_known_colors
[23:23:08] [PASSED] destination_pitch
[23:23:08] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[23:23:08] ============= drm_test_fb_xrgb8888_to_rgb332  ==============
[23:23:08] [PASSED] single_pixel_source_buffer
[23:23:08] [PASSED] single_pixel_clip_rectangle
[23:23:08] [PASSED] well_known_colors
[23:23:08] [PASSED] destination_pitch
[23:23:08] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[23:23:08] ============= drm_test_fb_xrgb8888_to_rgb565  ==============
[23:23:08] [PASSED] single_pixel_source_buffer
[23:23:08] [PASSED] single_pixel_clip_rectangle
[23:23:08] [PASSED] well_known_colors
[23:23:08] [PASSED] destination_pitch
[23:23:08] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[23:23:08] ============ drm_test_fb_xrgb8888_to_xrgb1555  =============
[23:23:08] [PASSED] single_pixel_source_buffer
[23:23:08] [PASSED] single_pixel_clip_rectangle
[23:23:08] [PASSED] well_known_colors
[23:23:08] [PASSED] destination_pitch
[23:23:08] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[23:23:08] ============ drm_test_fb_xrgb8888_to_argb1555  =============
[23:23:08] [PASSED] single_pixel_source_buffer
[23:23:08] [PASSED] single_pixel_clip_rectangle
[23:23:08] [PASSED] well_known_colors
[23:23:08] [PASSED] destination_pitch
[23:23:08] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[23:23:08] ============ drm_test_fb_xrgb8888_to_rgba5551  =============
[23:23:08] [PASSED] single_pixel_source_buffer
[23:23:08] [PASSED] single_pixel_clip_rectangle
[23:23:08] [PASSED] well_known_colors
[23:23:08] [PASSED] destination_pitch
[23:23:08] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[23:23:08] ============= drm_test_fb_xrgb8888_to_rgb888  ==============
[23:23:08] [PASSED] single_pixel_source_buffer
[23:23:08] [PASSED] single_pixel_clip_rectangle
[23:23:08] [PASSED] well_known_colors
[23:23:08] [PASSED] destination_pitch
[23:23:08] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[23:23:08] ============= drm_test_fb_xrgb8888_to_bgr888  ==============
[23:23:08] [PASSED] single_pixel_source_buffer
[23:23:08] [PASSED] single_pixel_clip_rectangle
[23:23:08] [PASSED] well_known_colors
[23:23:08] [PASSED] destination_pitch
[23:23:08] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[23:23:08] ============ drm_test_fb_xrgb8888_to_argb8888  =============
[23:23:08] [PASSED] single_pixel_source_buffer
[23:23:08] [PASSED] single_pixel_clip_rectangle
[23:23:08] [PASSED] well_known_colors
[23:23:08] [PASSED] destination_pitch
[23:23:08] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[23:23:08] =========== drm_test_fb_xrgb8888_to_xrgb2101010  ===========
[23:23:08] [PASSED] single_pixel_source_buffer
[23:23:08] [PASSED] single_pixel_clip_rectangle
[23:23:08] [PASSED] well_known_colors
[23:23:08] [PASSED] destination_pitch
[23:23:08] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[23:23:08] =========== drm_test_fb_xrgb8888_to_argb2101010  ===========
[23:23:08] [PASSED] single_pixel_source_buffer
[23:23:08] [PASSED] single_pixel_clip_rectangle
[23:23:08] [PASSED] well_known_colors
[23:23:08] [PASSED] destination_pitch
[23:23:08] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[23:23:08] ============== drm_test_fb_xrgb8888_to_mono  ===============
[23:23:08] [PASSED] single_pixel_source_buffer
[23:23:08] [PASSED] single_pixel_clip_rectangle
[23:23:08] [PASSED] well_known_colors
[23:23:08] [PASSED] destination_pitch
[23:23:08] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[23:23:08] ==================== drm_test_fb_swab  =====================
[23:23:08] [PASSED] single_pixel_source_buffer
[23:23:08] [PASSED] single_pixel_clip_rectangle
[23:23:08] [PASSED] well_known_colors
[23:23:08] [PASSED] destination_pitch
[23:23:08] ================ [PASSED] drm_test_fb_swab =================
[23:23:08] ============ drm_test_fb_xrgb8888_to_xbgr8888  =============
[23:23:08] [PASSED] single_pixel_source_buffer
[23:23:08] [PASSED] single_pixel_clip_rectangle
[23:23:08] [PASSED] well_known_colors
[23:23:08] [PASSED] destination_pitch
[23:23:08] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[23:23:08] ============ drm_test_fb_xrgb8888_to_abgr8888  =============
[23:23:08] [PASSED] single_pixel_source_buffer
[23:23:08] [PASSED] single_pixel_clip_rectangle
[23:23:08] [PASSED] well_known_colors
[23:23:08] [PASSED] destination_pitch
[23:23:08] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[23:23:08] ================= drm_test_fb_clip_offset  =================
[23:23:08] [PASSED] pass through
[23:23:08] [PASSED] horizontal offset
[23:23:08] [PASSED] vertical offset
[23:23:08] [PASSED] horizontal and vertical offset
[23:23:08] [PASSED] horizontal offset (custom pitch)
[23:23:08] [PASSED] vertical offset (custom pitch)
[23:23:08] [PASSED] horizontal and vertical offset (custom pitch)
[23:23:08] ============= [PASSED] drm_test_fb_clip_offset =============
[23:23:08] =================== drm_test_fb_memcpy  ====================
[23:23:08] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[23:23:08] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[23:23:08] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[23:23:08] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[23:23:08] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[23:23:08] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[23:23:08] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[23:23:08] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[23:23:08] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[23:23:08] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[23:23:08] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[23:23:08] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[23:23:08] =============== [PASSED] drm_test_fb_memcpy ================
[23:23:08] ============= [PASSED] drm_format_helper_test ==============
[23:23:08] ================= drm_format (18 subtests) =================
[23:23:08] [PASSED] drm_test_format_block_width_invalid
[23:23:08] [PASSED] drm_test_format_block_width_one_plane
[23:23:08] [PASSED] drm_test_format_block_width_two_plane
[23:23:08] [PASSED] drm_test_format_block_width_three_plane
[23:23:08] [PASSED] drm_test_format_block_width_tiled
[23:23:08] [PASSED] drm_test_format_block_height_invalid
[23:23:08] [PASSED] drm_test_format_block_height_one_plane
[23:23:08] [PASSED] drm_test_format_block_height_two_plane
[23:23:08] [PASSED] drm_test_format_block_height_three_plane
[23:23:08] [PASSED] drm_test_format_block_height_tiled
[23:23:08] [PASSED] drm_test_format_min_pitch_invalid
[23:23:08] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[23:23:08] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[23:23:08] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[23:23:08] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[23:23:08] [PASSED] drm_test_format_min_pitch_two_plane
[23:23:08] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[23:23:08] [PASSED] drm_test_format_min_pitch_tiled
[23:23:08] =================== [PASSED] drm_format ====================
[23:23:08] ============== drm_framebuffer (10 subtests) ===============
[23:23:08] ========== drm_test_framebuffer_check_src_coords  ==========
[23:23:08] [PASSED] Success: source fits into fb
[23:23:08] [PASSED] Fail: overflowing fb with x-axis coordinate
[23:23:08] [PASSED] Fail: overflowing fb with y-axis coordinate
[23:23:08] [PASSED] Fail: overflowing fb with source width
[23:23:08] [PASSED] Fail: overflowing fb with source height
[23:23:08] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[23:23:08] [PASSED] drm_test_framebuffer_cleanup
[23:23:08] =============== drm_test_framebuffer_create  ===============
[23:23:08] [PASSED] ABGR8888 normal sizes
[23:23:08] [PASSED] ABGR8888 max sizes
[23:23:08] [PASSED] ABGR8888 pitch greater than min required
[23:23:08] [PASSED] ABGR8888 pitch less than min required
[23:23:08] [PASSED] ABGR8888 Invalid width
[23:23:08] [PASSED] ABGR8888 Invalid buffer handle
[23:23:08] [PASSED] No pixel format
[23:23:08] [PASSED] ABGR8888 Width 0
[23:23:08] [PASSED] ABGR8888 Height 0
[23:23:08] [PASSED] ABGR8888 Out of bound height * pitch combination
[23:23:08] [PASSED] ABGR8888 Large buffer offset
[23:23:08] [PASSED] ABGR8888 Buffer offset for inexistent plane
[23:23:08] [PASSED] ABGR8888 Invalid flag
[23:23:08] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[23:23:08] [PASSED] ABGR8888 Valid buffer modifier
[23:23:08] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[23:23:08] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[23:23:08] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[23:23:08] [PASSED] NV12 Normal sizes
[23:23:08] [PASSED] NV12 Max sizes
[23:23:08] [PASSED] NV12 Invalid pitch
[23:23:08] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[23:23:08] [PASSED] NV12 different  modifier per-plane
[23:23:08] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[23:23:08] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[23:23:08] [PASSED] NV12 Modifier for inexistent plane
[23:23:08] [PASSED] NV12 Handle for inexistent plane
[23:23:08] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[23:23:08] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[23:23:08] [PASSED] YVU420 Normal sizes
[23:23:08] [PASSED] YVU420 Max sizes
[23:23:08] [PASSED] YVU420 Invalid pitch
[23:23:08] [PASSED] YVU420 Different pitches
[23:23:08] [PASSED] YVU420 Different buffer offsets/pitches
[23:23:08] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[23:23:08] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[23:23:08] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[23:23:08] [PASSED] YVU420 Valid modifier
[23:23:08] [PASSED] YVU420 Different modifiers per plane
[23:23:08] [PASSED] YVU420 Modifier for inexistent plane
[23:23:08] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[23:23:08] [PASSED] X0L2 Normal sizes
[23:23:08] [PASSED] X0L2 Max sizes
[23:23:08] [PASSED] X0L2 Invalid pitch
[23:23:08] [PASSED] X0L2 Pitch greater than minimum required
[23:23:08] [PASSED] X0L2 Handle for inexistent plane
[23:23:08] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[23:23:08] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[23:23:08] [PASSED] X0L2 Valid modifier
[23:23:08] [PASSED] X0L2 Modifier for inexistent plane
[23:23:08] =========== [PASSED] drm_test_framebuffer_create ===========
[23:23:08] [PASSED] drm_test_framebuffer_free
[23:23:08] [PASSED] drm_test_framebuffer_init
[23:23:08] [PASSED] drm_test_framebuffer_init_bad_format
[23:23:08] [PASSED] drm_test_framebuffer_init_dev_mismatch
[23:23:08] [PASSED] drm_test_framebuffer_lookup
[23:23:08] [PASSED] drm_test_framebuffer_lookup_inexistent
[23:23:08] [PASSED] drm_test_framebuffer_modifiers_not_supported
[23:23:08] ================= [PASSED] drm_framebuffer =================
[23:23:08] ================ drm_gem_shmem (8 subtests) ================
[23:23:08] [PASSED] drm_gem_shmem_test_obj_create
[23:23:08] [PASSED] drm_gem_shmem_test_obj_create_private
[23:23:08] [PASSED] drm_gem_shmem_test_pin_pages
[23:23:08] [PASSED] drm_gem_shmem_test_vmap
[23:23:08] [PASSED] drm_gem_shmem_test_get_pages_sgt
[23:23:08] [PASSED] drm_gem_shmem_test_get_sg_table
[23:23:08] [PASSED] drm_gem_shmem_test_madvise
[23:23:08] [PASSED] drm_gem_shmem_test_purge
[23:23:08] ================== [PASSED] drm_gem_shmem ==================
[23:23:08] === drm_atomic_helper_connector_hdmi_check (27 subtests) ===
[23:23:08] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[23:23:08] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[23:23:08] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[23:23:08] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[23:23:08] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[23:23:08] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[23:23:08] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420  =======
[23:23:08] [PASSED] Automatic
[23:23:08] [PASSED] Full
[23:23:08] [PASSED] Limited 16:235
[23:23:08] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[23:23:08] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[23:23:08] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[23:23:08] [PASSED] drm_test_check_disable_connector
[23:23:08] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[23:23:08] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[23:23:08] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[23:23:08] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[23:23:08] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[23:23:08] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[23:23:08] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[23:23:08] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[23:23:08] [PASSED] drm_test_check_output_bpc_dvi
[23:23:08] [PASSED] drm_test_check_output_bpc_format_vic_1
[23:23:08] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[23:23:08] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[23:23:08] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[23:23:08] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[23:23:08] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[23:23:08] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[23:23:08] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[23:23:08] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[23:23:08] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[23:23:08] [PASSED] drm_test_check_broadcast_rgb_value
[23:23:08] [PASSED] drm_test_check_bpc_8_value
[23:23:08] [PASSED] drm_test_check_bpc_10_value
[23:23:08] [PASSED] drm_test_check_bpc_12_value
[23:23:08] [PASSED] drm_test_check_format_value
[23:23:08] [PASSED] drm_test_check_tmds_char_value
[23:23:08] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[23:23:08] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[23:23:08] [PASSED] drm_test_check_mode_valid
[23:23:08] [PASSED] drm_test_check_mode_valid_reject
[23:23:08] [PASSED] drm_test_check_mode_valid_reject_rate
[23:23:08] [PASSED] drm_test_check_mode_valid_reject_max_clock
[23:23:08] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[23:23:08] ================= drm_managed (2 subtests) =================
[23:23:08] [PASSED] drm_test_managed_release_action
[23:23:08] [PASSED] drm_test_managed_run_action
[23:23:08] =================== [PASSED] drm_managed ===================
[23:23:08] =================== drm_mm (6 subtests) ====================
[23:23:08] [PASSED] drm_test_mm_init
[23:23:08] [PASSED] drm_test_mm_debug
[23:23:08] [PASSED] drm_test_mm_align32
[23:23:08] [PASSED] drm_test_mm_align64
[23:23:08] [PASSED] drm_test_mm_lowest
[23:23:08] [PASSED] drm_test_mm_highest
[23:23:08] ===================== [PASSED] drm_mm ======================
[23:23:08] ============= drm_modes_analog_tv (5 subtests) =============
[23:23:08] [PASSED] drm_test_modes_analog_tv_mono_576i
[23:23:08] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[23:23:08] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[23:23:08] [PASSED] drm_test_modes_analog_tv_pal_576i
[23:23:08] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[23:23:08] =============== [PASSED] drm_modes_analog_tv ===============
[23:23:08] ============== drm_plane_helper (2 subtests) ===============
[23:23:08] =============== drm_test_check_plane_state  ================
[23:23:08] [PASSED] clipping_simple
[23:23:08] [PASSED] clipping_rotate_reflect
[23:23:08] [PASSED] positioning_simple
[23:23:08] [PASSED] upscaling
[23:23:08] [PASSED] downscaling
[23:23:08] [PASSED] rounding1
[23:23:08] [PASSED] rounding2
[23:23:08] [PASSED] rounding3
[23:23:08] [PASSED] rounding4
[23:23:08] =========== [PASSED] drm_test_check_plane_state ============
[23:23:08] =========== drm_test_check_invalid_plane_state  ============
[23:23:08] [PASSED] positioning_invalid
[23:23:08] [PASSED] upscaling_invalid
[23:23:08] [PASSED] downscaling_invalid
[23:23:08] ======= [PASSED] drm_test_check_invalid_plane_state ========
[23:23:08] ================ [PASSED] drm_plane_helper =================
[23:23:08] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[23:23:08] ====== drm_test_connector_helper_tv_get_modes_check  =======
[23:23:08] [PASSED] None
[23:23:08] [PASSED] PAL
[23:23:08] [PASSED] NTSC
[23:23:08] [PASSED] Both, NTSC Default
[23:23:08] [PASSED] Both, PAL Default
[23:23:08] [PASSED] Both, NTSC Default, with PAL on command-line
[23:23:08] [PASSED] Both, PAL Default, with NTSC on command-line
[23:23:08] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[23:23:08] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[23:23:08] ================== drm_rect (9 subtests) ===================
[23:23:08] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[23:23:08] [PASSED] drm_test_rect_clip_scaled_not_clipped
[23:23:08] [PASSED] drm_test_rect_clip_scaled_clipped
[23:23:08] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[23:23:08] ================= drm_test_rect_intersect  =================
[23:23:08] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[23:23:08] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[23:23:08] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[23:23:08] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[23:23:08] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[23:23:08] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[23:23:08] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[23:23:08] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[23:23:08] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[23:23:08] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[23:23:08] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[23:23:08] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[23:23:08] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[23:23:08] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[23:23:08] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[23:23:08] ============= [PASSED] drm_test_rect_intersect =============
[23:23:08] ================ drm_test_rect_calc_hscale  ================
[23:23:08] [PASSED] normal use
[23:23:08] [PASSED] out of max range
[23:23:08] [PASSED] out of min range
[23:23:08] [PASSED] zero dst
[23:23:08] [PASSED] negative src
[23:23:08] [PASSED] negative dst
[23:23:08] ============ [PASSED] drm_test_rect_calc_hscale ============
[23:23:08] ================ drm_test_rect_calc_vscale  ================
[23:23:08] [PASSED] normal use
stty: 'standard input': Inappropriate ioctl for device
[23:23:08] [PASSED] out of max range
[23:23:08] [PASSED] out of min range
[23:23:08] [PASSED] zero dst
[23:23:08] [PASSED] negative src
[23:23:08] [PASSED] negative dst
[23:23:08] ============ [PASSED] drm_test_rect_calc_vscale ============
[23:23:08] ================== drm_test_rect_rotate  ===================
[23:23:08] [PASSED] reflect-x
[23:23:08] [PASSED] reflect-y
[23:23:08] [PASSED] rotate-0
[23:23:08] [PASSED] rotate-90
[23:23:08] [PASSED] rotate-180
[23:23:08] [PASSED] rotate-270
[23:23:08] ============== [PASSED] drm_test_rect_rotate ===============
[23:23:08] ================ drm_test_rect_rotate_inv  =================
[23:23:08] [PASSED] reflect-x
[23:23:08] [PASSED] reflect-y
[23:23:08] [PASSED] rotate-0
[23:23:08] [PASSED] rotate-90
[23:23:08] [PASSED] rotate-180
[23:23:08] [PASSED] rotate-270
[23:23:08] ============ [PASSED] drm_test_rect_rotate_inv =============
[23:23:08] ==================== [PASSED] drm_rect =====================
[23:23:08] ============ drm_sysfb_modeset_test (1 subtest) ============
[23:23:08] ============ drm_test_sysfb_build_fourcc_list  =============
[23:23:08] [PASSED] no native formats
[23:23:08] [PASSED] XRGB8888 as native format
[23:23:08] [PASSED] remove duplicates
[23:23:08] [PASSED] convert alpha formats
[23:23:08] [PASSED] random formats
[23:23:08] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[23:23:08] ============= [PASSED] drm_sysfb_modeset_test ==============
[23:23:08] ============================================================
[23:23:08] Testing complete. Ran 622 tests: passed: 622
[23:23:08] Elapsed time: 28.313s total, 1.674s configuring, 26.168s building, 0.450s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[23:23:08] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[23:23:09] 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
[23:23:19] Starting KUnit Kernel (1/1)...
[23:23:19] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[23:23:19] ================= ttm_device (5 subtests) ==================
[23:23:19] [PASSED] ttm_device_init_basic
[23:23:19] [PASSED] ttm_device_init_multiple
[23:23:19] [PASSED] ttm_device_fini_basic
[23:23:19] [PASSED] ttm_device_init_no_vma_man
[23:23:19] ================== ttm_device_init_pools  ==================
[23:23:19] [PASSED] No DMA allocations, no DMA32 required
[23:23:19] [PASSED] DMA allocations, DMA32 required
[23:23:19] [PASSED] No DMA allocations, DMA32 required
[23:23:19] [PASSED] DMA allocations, no DMA32 required
[23:23:19] ============== [PASSED] ttm_device_init_pools ==============
[23:23:19] =================== [PASSED] ttm_device ====================
[23:23:19] ================== ttm_pool (8 subtests) ===================
[23:23:19] ================== ttm_pool_alloc_basic  ===================
[23:23:19] [PASSED] One page
[23:23:19] [PASSED] More than one page
[23:23:19] [PASSED] Above the allocation limit
[23:23:19] [PASSED] One page, with coherent DMA mappings enabled
[23:23:19] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[23:23:19] ============== [PASSED] ttm_pool_alloc_basic ===============
[23:23:19] ============== ttm_pool_alloc_basic_dma_addr  ==============
[23:23:19] [PASSED] One page
[23:23:19] [PASSED] More than one page
[23:23:19] [PASSED] Above the allocation limit
[23:23:19] [PASSED] One page, with coherent DMA mappings enabled
[23:23:19] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[23:23:19] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[23:23:19] [PASSED] ttm_pool_alloc_order_caching_match
[23:23:19] [PASSED] ttm_pool_alloc_caching_mismatch
[23:23:19] [PASSED] ttm_pool_alloc_order_mismatch
[23:23:19] [PASSED] ttm_pool_free_dma_alloc
[23:23:19] [PASSED] ttm_pool_free_no_dma_alloc
[23:23:19] [PASSED] ttm_pool_fini_basic
[23:23:19] ==================== [PASSED] ttm_pool =====================
[23:23:19] ================ ttm_resource (8 subtests) =================
[23:23:19] ================= ttm_resource_init_basic  =================
[23:23:19] [PASSED] Init resource in TTM_PL_SYSTEM
[23:23:19] [PASSED] Init resource in TTM_PL_VRAM
[23:23:19] [PASSED] Init resource in a private placement
[23:23:19] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[23:23:19] ============= [PASSED] ttm_resource_init_basic =============
[23:23:19] [PASSED] ttm_resource_init_pinned
[23:23:19] [PASSED] ttm_resource_fini_basic
[23:23:19] [PASSED] ttm_resource_manager_init_basic
[23:23:19] [PASSED] ttm_resource_manager_usage_basic
[23:23:19] [PASSED] ttm_resource_manager_set_used_basic
[23:23:19] [PASSED] ttm_sys_man_alloc_basic
[23:23:19] [PASSED] ttm_sys_man_free_basic
[23:23:19] ================== [PASSED] ttm_resource ===================
[23:23:19] =================== ttm_tt (15 subtests) ===================
[23:23:19] ==================== ttm_tt_init_basic  ====================
[23:23:19] [PASSED] Page-aligned size
[23:23:19] [PASSED] Extra pages requested
[23:23:19] ================ [PASSED] ttm_tt_init_basic ================
[23:23:19] [PASSED] ttm_tt_init_misaligned
[23:23:19] [PASSED] ttm_tt_fini_basic
[23:23:19] [PASSED] ttm_tt_fini_sg
[23:23:19] [PASSED] ttm_tt_fini_shmem
[23:23:19] [PASSED] ttm_tt_create_basic
[23:23:19] [PASSED] ttm_tt_create_invalid_bo_type
[23:23:19] [PASSED] ttm_tt_create_ttm_exists
[23:23:19] [PASSED] ttm_tt_create_failed
[23:23:19] [PASSED] ttm_tt_destroy_basic
[23:23:19] [PASSED] ttm_tt_populate_null_ttm
[23:23:19] [PASSED] ttm_tt_populate_populated_ttm
[23:23:19] [PASSED] ttm_tt_unpopulate_basic
[23:23:19] [PASSED] ttm_tt_unpopulate_empty_ttm
[23:23:19] [PASSED] ttm_tt_swapin_basic
[23:23:19] ===================== [PASSED] ttm_tt ======================
[23:23:19] =================== ttm_bo (14 subtests) ===================
[23:23:19] =========== ttm_bo_reserve_optimistic_no_ticket  ===========
[23:23:19] [PASSED] Cannot be interrupted and sleeps
[23:23:19] [PASSED] Cannot be interrupted, locks straight away
[23:23:19] [PASSED] Can be interrupted, sleeps
[23:23:19] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[23:23:19] [PASSED] ttm_bo_reserve_locked_no_sleep
[23:23:19] [PASSED] ttm_bo_reserve_no_wait_ticket
[23:23:19] [PASSED] ttm_bo_reserve_double_resv
[23:23:19] [PASSED] ttm_bo_reserve_interrupted
[23:23:19] [PASSED] ttm_bo_reserve_deadlock
[23:23:19] [PASSED] ttm_bo_unreserve_basic
[23:23:19] [PASSED] ttm_bo_unreserve_pinned
[23:23:19] [PASSED] ttm_bo_unreserve_bulk
[23:23:19] [PASSED] ttm_bo_fini_basic
[23:23:19] [PASSED] ttm_bo_fini_shared_resv
[23:23:19] [PASSED] ttm_bo_pin_basic
[23:23:19] [PASSED] ttm_bo_pin_unpin_resource
[23:23:19] [PASSED] ttm_bo_multiple_pin_one_unpin
[23:23:19] ===================== [PASSED] ttm_bo ======================
[23:23:19] ============== ttm_bo_validate (21 subtests) ===============
[23:23:19] ============== ttm_bo_init_reserved_sys_man  ===============
[23:23:19] [PASSED] Buffer object for userspace
[23:23:19] [PASSED] Kernel buffer object
[23:23:19] [PASSED] Shared buffer object
[23:23:19] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[23:23:19] ============== ttm_bo_init_reserved_mock_man  ==============
[23:23:19] [PASSED] Buffer object for userspace
[23:23:19] [PASSED] Kernel buffer object
[23:23:19] [PASSED] Shared buffer object
[23:23:19] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[23:23:19] [PASSED] ttm_bo_init_reserved_resv
[23:23:19] ================== ttm_bo_validate_basic  ==================
[23:23:19] [PASSED] Buffer object for userspace
[23:23:19] [PASSED] Kernel buffer object
[23:23:19] [PASSED] Shared buffer object
[23:23:19] ============== [PASSED] ttm_bo_validate_basic ==============
[23:23:19] [PASSED] ttm_bo_validate_invalid_placement
[23:23:19] ============= ttm_bo_validate_same_placement  ==============
[23:23:19] [PASSED] System manager
[23:23:19] [PASSED] VRAM manager
[23:23:19] ========= [PASSED] ttm_bo_validate_same_placement ==========
[23:23:19] [PASSED] ttm_bo_validate_failed_alloc
[23:23:19] [PASSED] ttm_bo_validate_pinned
[23:23:19] [PASSED] ttm_bo_validate_busy_placement
[23:23:19] ================ ttm_bo_validate_multihop  =================
[23:23:19] [PASSED] Buffer object for userspace
[23:23:19] [PASSED] Kernel buffer object
[23:23:19] [PASSED] Shared buffer object
[23:23:19] ============ [PASSED] ttm_bo_validate_multihop =============
[23:23:19] ========== ttm_bo_validate_no_placement_signaled  ==========
[23:23:19] [PASSED] Buffer object in system domain, no page vector
[23:23:19] [PASSED] Buffer object in system domain with an existing page vector
[23:23:19] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[23:23:19] ======== ttm_bo_validate_no_placement_not_signaled  ========
[23:23:19] [PASSED] Buffer object for userspace
[23:23:19] [PASSED] Kernel buffer object
[23:23:19] [PASSED] Shared buffer object
[23:23:19] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[23:23:19] [PASSED] ttm_bo_validate_move_fence_signaled
[23:23:19] ========= ttm_bo_validate_move_fence_not_signaled  =========
[23:23:19] [PASSED] Waits for GPU
[23:23:19] [PASSED] Tries to lock straight away
[23:23:19] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[23:23:19] [PASSED] ttm_bo_validate_happy_evict
[23:23:19] [PASSED] ttm_bo_validate_all_pinned_evict
[23:23:19] [PASSED] ttm_bo_validate_allowed_only_evict
[23:23:19] [PASSED] ttm_bo_validate_deleted_evict
[23:23:19] [PASSED] ttm_bo_validate_busy_domain_evict
[23:23:19] [PASSED] ttm_bo_validate_evict_gutting
[23:23:19] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[23:23:19] ================= [PASSED] ttm_bo_validate =================
[23:23:19] ============================================================
[23:23:19] Testing complete. Ran 101 tests: passed: 101
[23:23:19] Elapsed time: 11.434s total, 1.772s configuring, 9.447s building, 0.177s running

+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel



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

* ✓ Xe.CI.BAT: success for Scope-based forcewake and runtime PM (rev4)
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (28 preceding siblings ...)
  2025-11-14 23:23 ` ✓ CI.KUnit: success " Patchwork
@ 2025-11-15  0:14 ` Patchwork
  2025-11-15 11:18 ` ✗ Xe.CI.Full: failure " Patchwork
  30 siblings, 0 replies; 39+ messages in thread
From: Patchwork @ 2025-11-15  0:14 UTC (permalink / raw)
  To: Matt Roper; +Cc: intel-xe

[-- Attachment #1: Type: text/plain, Size: 1499 bytes --]

== Series Details ==

Series: Scope-based forcewake and runtime PM (rev4)
URL   : https://patchwork.freedesktop.org/series/157253/
State : success

== Summary ==

CI Bug Log - changes from xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61_BAT -> xe-pw-157253v4_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (13 -> 13)
------------------------------

  No changes in participating hosts

Known issues
------------

  Here are the changes found in xe-pw-157253v4_BAT that come from known issues:

### IGT changes ###

#### Possible fixes ####

  * igt@xe_waitfence@engine:
    - bat-dg2-oem2:       [FAIL][1] ([Intel XE#6519]) -> [PASS][2]
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/bat-dg2-oem2/igt@xe_waitfence@engine.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/bat-dg2-oem2/igt@xe_waitfence@engine.html

  
  [Intel XE#6519]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6519


Build changes
-------------

  * Linux: xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61 -> xe-pw-157253v4

  IGT_8625: 69d0aa3606a205aec90d6145bb20cbae755e8559 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61: 5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61
  xe-pw-157253v4: 157253v4

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/index.html

[-- Attachment #2: Type: text/html, Size: 2064 bytes --]

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

* ✗ Xe.CI.Full: failure for Scope-based forcewake and runtime PM (rev4)
  2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
                   ` (29 preceding siblings ...)
  2025-11-15  0:14 ` ✓ Xe.CI.BAT: " Patchwork
@ 2025-11-15 11:18 ` Patchwork
  30 siblings, 0 replies; 39+ messages in thread
From: Patchwork @ 2025-11-15 11:18 UTC (permalink / raw)
  To: Matt Roper; +Cc: intel-xe

[-- Attachment #1: Type: text/plain, Size: 48062 bytes --]

== Series Details ==

Series: Scope-based forcewake and runtime PM (rev4)
URL   : https://patchwork.freedesktop.org/series/157253/
State : failure

== Summary ==

CI Bug Log - changes from xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61_FULL -> xe-pw-157253v4_FULL
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with xe-pw-157253v4_FULL absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in xe-pw-157253v4_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 (4 -> 4)
------------------------------

  No changes in participating hosts

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in xe-pw-157253v4_FULL:

### IGT changes ###

#### Possible regressions ####

  * igt@xe_pmu@engine-activity-accuracy-50:
    - shard-adlp:         [PASS][1] -> [FAIL][2] +5 other tests fail
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-adlp-8/igt@xe_pmu@engine-activity-accuracy-50.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-adlp-8/igt@xe_pmu@engine-activity-accuracy-50.html

  
Known issues
------------

  Here are the changes found in xe-pw-157253v4_FULL that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-a-hdmi-a-1:
    - shard-adlp:         [PASS][3] -> [FAIL][4] ([Intel XE#6078]) +1 other test fail
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-adlp-3/igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-a-hdmi-a-1.html
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-adlp-8/igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-a-hdmi-a-1.html

  * igt@kms_big_fb@4-tiled-8bpp-rotate-270:
    - shard-dg2-set2:     NOTRUN -> [SKIP][5] ([Intel XE#316]) +1 other test skip
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@kms_big_fb@4-tiled-8bpp-rotate-270.html

  * igt@kms_big_fb@linear-64bpp-rotate-270:
    - shard-bmg:          NOTRUN -> [SKIP][6] ([Intel XE#2327]) +1 other test skip
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_big_fb@linear-64bpp-rotate-270.html

  * igt@kms_big_fb@y-tiled-16bpp-rotate-180:
    - shard-bmg:          NOTRUN -> [SKIP][7] ([Intel XE#1124]) +3 other tests skip
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-4/igt@kms_big_fb@y-tiled-16bpp-rotate-180.html

  * igt@kms_big_fb@y-tiled-16bpp-rotate-90:
    - shard-dg2-set2:     NOTRUN -> [SKIP][8] ([Intel XE#1124]) +3 other tests skip
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-434/igt@kms_big_fb@y-tiled-16bpp-rotate-90.html

  * igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow:
    - shard-bmg:          NOTRUN -> [SKIP][9] ([Intel XE#607]) +1 other test skip
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-4/igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow.html

  * igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p:
    - shard-bmg:          [PASS][10] -> [SKIP][11] ([Intel XE#2314] / [Intel XE#2894])
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-5/igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p.html
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-6/igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p.html

  * igt@kms_bw@connected-linear-tiling-3-displays-3840x2160p:
    - shard-dg2-set2:     NOTRUN -> [SKIP][12] ([Intel XE#2191]) +1 other test skip
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@kms_bw@connected-linear-tiling-3-displays-3840x2160p.html

  * igt@kms_bw@linear-tiling-3-displays-1920x1080p:
    - shard-bmg:          NOTRUN -> [SKIP][13] ([Intel XE#367])
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-4/igt@kms_bw@linear-tiling-3-displays-1920x1080p.html

  * igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs@pipe-b-dp-2:
    - shard-bmg:          NOTRUN -> [SKIP][14] ([Intel XE#2652] / [Intel XE#787]) +12 other tests skip
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-5/igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs@pipe-b-dp-2.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs:
    - shard-bmg:          NOTRUN -> [SKIP][15] ([Intel XE#3432])
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-4/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs.html

  * igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-mc-ccs@pipe-b-dp-4:
    - shard-dg2-set2:     NOTRUN -> [SKIP][16] ([Intel XE#787]) +6 other tests skip
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-mc-ccs@pipe-b-dp-4.html

  * igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-mc-ccs@pipe-d-dp-4:
    - shard-dg2-set2:     NOTRUN -> [SKIP][17] ([Intel XE#455] / [Intel XE#787]) +1 other test skip
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-mc-ccs@pipe-d-dp-4.html

  * igt@kms_ccs@crc-sprite-planes-basic-4-tiled-dg2-rc-ccs-cc:
    - shard-bmg:          NOTRUN -> [SKIP][18] ([Intel XE#2887]) +6 other tests skip
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-dg2-rc-ccs-cc.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs:
    - shard-dg2-set2:     [PASS][19] -> [INCOMPLETE][20] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#4345] / [Intel XE#6168])
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-dg2-466/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs.html
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-435/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-a-hdmi-a-6:
    - shard-dg2-set2:     [PASS][21] -> [INCOMPLETE][22] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#6168])
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-dg2-466/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-a-hdmi-a-6.html
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-435/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-a-hdmi-a-6.html

  * igt@kms_chamelium_edid@dp-edid-change-during-hibernate:
    - shard-dg2-set2:     NOTRUN -> [SKIP][23] ([Intel XE#373]) +1 other test skip
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-434/igt@kms_chamelium_edid@dp-edid-change-during-hibernate.html

  * igt@kms_chamelium_frames@vga-frame-dump:
    - shard-bmg:          NOTRUN -> [SKIP][24] ([Intel XE#2252]) +5 other tests skip
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_chamelium_frames@vga-frame-dump.html

  * igt@kms_content_protection@srm:
    - shard-bmg:          NOTRUN -> [FAIL][25] ([Intel XE#1178]) +1 other test fail
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_content_protection@srm.html

  * igt@kms_cursor_crc@cursor-offscreen-max-size:
    - shard-bmg:          NOTRUN -> [SKIP][26] ([Intel XE#2320]) +1 other test skip
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_cursor_crc@cursor-offscreen-max-size.html

  * igt@kms_cursor_crc@cursor-random-max-size:
    - shard-dg2-set2:     NOTRUN -> [SKIP][27] ([Intel XE#455]) +6 other tests skip
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@kms_cursor_crc@cursor-random-max-size.html

  * igt@kms_cursor_crc@cursor-rapid-movement-512x512:
    - shard-bmg:          NOTRUN -> [SKIP][28] ([Intel XE#2321])
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-4/igt@kms_cursor_crc@cursor-rapid-movement-512x512.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size:
    - shard-bmg:          [PASS][29] -> [SKIP][30] ([Intel XE#2291]) +3 other tests skip
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-5/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size.html
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-6/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@flip-vs-cursor-legacy:
    - shard-bmg:          [PASS][31] -> [FAIL][32] ([Intel XE#5299])
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-6/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-5/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html

  * igt@kms_dp_link_training@non-uhbr-mst:
    - shard-dg2-set2:     NOTRUN -> [SKIP][33] ([Intel XE#4354])
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-466/igt@kms_dp_link_training@non-uhbr-mst.html
    - shard-bmg:          NOTRUN -> [SKIP][34] ([Intel XE#4354])
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-4/igt@kms_dp_link_training@non-uhbr-mst.html

  * igt@kms_dsc@dsc-fractional-bpp:
    - shard-bmg:          NOTRUN -> [SKIP][35] ([Intel XE#2244])
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_dsc@dsc-fractional-bpp.html

  * igt@kms_feature_discovery@psr1:
    - shard-bmg:          NOTRUN -> [SKIP][36] ([Intel XE#2374])
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_feature_discovery@psr1.html

  * igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset:
    - shard-bmg:          [PASS][37] -> [SKIP][38] ([Intel XE#2316]) +5 other tests skip
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-5/igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset.html
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-6/igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset.html

  * igt@kms_flip@flip-vs-absolute-wf_vblank-interruptible@c-hdmi-a1:
    - shard-adlp:         [PASS][39] -> [DMESG-WARN][40] ([Intel XE#4543]) +2 other tests dmesg-warn
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-adlp-2/igt@kms_flip@flip-vs-absolute-wf_vblank-interruptible@c-hdmi-a1.html
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-adlp-4/igt@kms_flip@flip-vs-absolute-wf_vblank-interruptible@c-hdmi-a1.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling:
    - shard-bmg:          NOTRUN -> [SKIP][41] ([Intel XE#2293] / [Intel XE#2380]) +3 other tests skip
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling@pipe-a-valid-mode:
    - shard-bmg:          NOTRUN -> [SKIP][42] ([Intel XE#2293]) +3 other tests skip
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling@pipe-a-valid-mode.html

  * igt@kms_frontbuffer_tracking@drrs-1p-offscreen-pri-indfb-draw-mmap-wc:
    - shard-dg2-set2:     NOTRUN -> [SKIP][43] ([Intel XE#6312]) +1 other test skip
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@kms_frontbuffer_tracking@drrs-1p-offscreen-pri-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-pri-shrfb-draw-mmap-wc:
    - shard-bmg:          NOTRUN -> [SKIP][44] ([Intel XE#2311]) +14 other tests skip
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-onoff:
    - shard-dg2-set2:     NOTRUN -> [SKIP][45] ([Intel XE#651]) +2 other tests skip
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-msflip-blt:
    - shard-bmg:          NOTRUN -> [SKIP][46] ([Intel XE#5390]) +10 other tests skip
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-indfb-draw-blt:
    - shard-dg2-set2:     NOTRUN -> [SKIP][47] ([Intel XE#653]) +11 other tests skip
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-tiling-y:
    - shard-dg2-set2:     NOTRUN -> [SKIP][48] ([Intel XE#658])
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@kms_frontbuffer_tracking@fbcpsr-tiling-y.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt:
    - shard-bmg:          NOTRUN -> [SKIP][49] ([Intel XE#2313]) +14 other tests skip
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-4/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt.html

  * igt@kms_joiner@invalid-modeset-force-ultra-joiner:
    - shard-dg2-set2:     NOTRUN -> [SKIP][50] ([Intel XE#2925])
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-434/igt@kms_joiner@invalid-modeset-force-ultra-joiner.html

  * igt@kms_panel_fitting@legacy:
    - shard-bmg:          NOTRUN -> [SKIP][51] ([Intel XE#2486])
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_panel_fitting@legacy.html

  * igt@kms_pm_backlight@brightness-with-dpms:
    - shard-bmg:          NOTRUN -> [SKIP][52] ([Intel XE#2938])
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-4/igt@kms_pm_backlight@brightness-with-dpms.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][53] ([Intel XE#2938])
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-466/igt@kms_pm_backlight@brightness-with-dpms.html

  * igt@kms_pm_backlight@fade-with-dpms:
    - shard-bmg:          NOTRUN -> [SKIP][54] ([Intel XE#870])
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_pm_backlight@fade-with-dpms.html

  * igt@kms_pm_dc@dc6-dpms:
    - shard-dg2-set2:     NOTRUN -> [SKIP][55] ([Intel XE#908])
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@kms_pm_dc@dc6-dpms.html

  * igt@kms_pm_rpm@modeset-lpsp:
    - shard-bmg:          NOTRUN -> [SKIP][56] ([Intel XE#1439] / [Intel XE#3141] / [Intel XE#836]) +1 other test skip
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-4/igt@kms_pm_rpm@modeset-lpsp.html

  * igt@kms_properties@plane-properties-atomic@pipe-a-hdmi-a-1:
    - shard-adlp:         [PASS][57] -> [DMESG-WARN][58] ([Intel XE#2953] / [Intel XE#4173]) +5 other tests dmesg-warn
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-adlp-8/igt@kms_properties@plane-properties-atomic@pipe-a-hdmi-a-1.html
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-adlp-8/igt@kms_properties@plane-properties-atomic@pipe-a-hdmi-a-1.html

  * igt@kms_psr2_sf@fbc-pr-cursor-plane-update-sf:
    - shard-dg2-set2:     NOTRUN -> [SKIP][59] ([Intel XE#1406] / [Intel XE#1489]) +3 other tests skip
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@kms_psr2_sf@fbc-pr-cursor-plane-update-sf.html

  * igt@kms_psr2_sf@fbc-psr2-overlay-primary-update-sf-dmg-area:
    - shard-bmg:          NOTRUN -> [SKIP][60] ([Intel XE#1406] / [Intel XE#1489]) +3 other tests skip
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_psr2_sf@fbc-psr2-overlay-primary-update-sf-dmg-area.html

  * igt@kms_psr@pr-sprite-render:
    - shard-dg2-set2:     NOTRUN -> [SKIP][61] ([Intel XE#1406] / [Intel XE#2850] / [Intel XE#929]) +2 other tests skip
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@kms_psr@pr-sprite-render.html

  * igt@kms_psr@psr-cursor-plane-onoff:
    - shard-bmg:          NOTRUN -> [SKIP][62] ([Intel XE#1406] / [Intel XE#2234] / [Intel XE#2850]) +7 other tests skip
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-4/igt@kms_psr@psr-cursor-plane-onoff.html

  * igt@kms_rotation_crc@primary-y-tiled-reflect-x-0:
    - shard-dg2-set2:     NOTRUN -> [SKIP][63] ([Intel XE#1127])
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-434/igt@kms_rotation_crc@primary-y-tiled-reflect-x-0.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270:
    - shard-dg2-set2:     NOTRUN -> [SKIP][64] ([Intel XE#3414])
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html

  * igt@kms_rotation_crc@sprite-rotation-90:
    - shard-bmg:          NOTRUN -> [SKIP][65] ([Intel XE#3414] / [Intel XE#3904]) +1 other test skip
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-4/igt@kms_rotation_crc@sprite-rotation-90.html

  * igt@kms_setmode@basic@pipe-b-edp-1:
    - shard-lnl:          [PASS][66] -> [FAIL][67] ([Intel XE#6361])
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-lnl-3/igt@kms_setmode@basic@pipe-b-edp-1.html
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-lnl-5/igt@kms_setmode@basic@pipe-b-edp-1.html

  * igt@kms_setmode@invalid-clone-single-crtc:
    - shard-bmg:          [PASS][68] -> [SKIP][69] ([Intel XE#1435])
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-5/igt@kms_setmode@invalid-clone-single-crtc.html
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-6/igt@kms_setmode@invalid-clone-single-crtc.html

  * igt@kms_sharpness_filter@filter-scaler-upscale:
    - shard-bmg:          NOTRUN -> [SKIP][70] ([Intel XE#6503])
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_sharpness_filter@filter-scaler-upscale.html

  * igt@kms_tiled_display@basic-test-pattern:
    - shard-bmg:          NOTRUN -> [SKIP][71] ([Intel XE#2426])
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-4/igt@kms_tiled_display@basic-test-pattern.html

  * igt@xe_eu_stall@invalid-sampling-rate:
    - shard-dg2-set2:     NOTRUN -> [SKIP][72] ([Intel XE#5626])
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@xe_eu_stall@invalid-sampling-rate.html

  * igt@xe_eudebug@basic-vm-bind-metadata-discovery:
    - shard-bmg:          NOTRUN -> [SKIP][73] ([Intel XE#4837]) +5 other tests skip
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@xe_eudebug@basic-vm-bind-metadata-discovery.html

  * igt@xe_eudebug@basic-vm-bind-ufence-delay-ack:
    - shard-dg2-set2:     NOTRUN -> [SKIP][74] ([Intel XE#4837]) +3 other tests skip
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@xe_eudebug@basic-vm-bind-ufence-delay-ack.html

  * igt@xe_evict@evict-beng-mixed-many-threads-small:
    - shard-bmg:          [PASS][75] -> [INCOMPLETE][76] ([Intel XE#6321] / [Intel XE#6606])
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-1/igt@xe_evict@evict-beng-mixed-many-threads-small.html
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-7/igt@xe_evict@evict-beng-mixed-many-threads-small.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr-invalidate:
    - shard-bmg:          NOTRUN -> [SKIP][77] ([Intel XE#2322]) +4 other tests skip
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr-invalidate.html

  * igt@xe_exec_fault_mode@many-basic-prefetch:
    - shard-dg2-set2:     NOTRUN -> [SKIP][78] ([Intel XE#288]) +7 other tests skip
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-434/igt@xe_exec_fault_mode@many-basic-prefetch.html

  * igt@xe_exec_system_allocator@process-many-large-mmap-huge-nomemset:
    - shard-bmg:          NOTRUN -> [SKIP][79] ([Intel XE#4943]) +8 other tests skip
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-4/igt@xe_exec_system_allocator@process-many-large-mmap-huge-nomemset.html

  * igt@xe_exec_system_allocator@threads-shared-vm-many-large-malloc:
    - shard-dg2-set2:     NOTRUN -> [SKIP][80] ([Intel XE#4915]) +105 other tests skip
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@xe_exec_system_allocator@threads-shared-vm-many-large-malloc.html

  * igt@xe_live_ktest@xe_migrate@xe_validate_ccs_kunit:
    - shard-dg2-set2:     NOTRUN -> [SKIP][81] ([Intel XE#2229])
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-434/igt@xe_live_ktest@xe_migrate@xe_validate_ccs_kunit.html

  * igt@xe_module_load@many-reload:
    - shard-adlp:         [PASS][82] -> [DMESG-WARN][83] ([Intel XE#2953] / [Intel XE#4173] / [Intel XE#5244])
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-adlp-8/igt@xe_module_load@many-reload.html
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-adlp-8/igt@xe_module_load@many-reload.html

  * igt@xe_oa@mmio-triggered-reports-read:
    - shard-dg2-set2:     NOTRUN -> [SKIP][84] ([Intel XE#6032])
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-434/igt@xe_oa@mmio-triggered-reports-read.html

  * igt@xe_oa@syncs-ufence-wait:
    - shard-dg2-set2:     NOTRUN -> [SKIP][85] ([Intel XE#3573]) +1 other test skip
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@xe_oa@syncs-ufence-wait.html

  * igt@xe_peer2peer@read@read-gpua-vram01-gpub-system-p2p:
    - shard-dg2-set2:     NOTRUN -> [SKIP][86] ([Intel XE#6566])
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-434/igt@xe_peer2peer@read@read-gpua-vram01-gpub-system-p2p.html

  * igt@xe_pm@s2idle-d3cold-basic-exec:
    - shard-dg2-set2:     NOTRUN -> [SKIP][87] ([Intel XE#2284] / [Intel XE#366])
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@xe_pm@s2idle-d3cold-basic-exec.html

  * igt@xe_pmu@engine-activity-accuracy-90@engine-drm_xe_engine_class_compute0:
    - shard-lnl:          [PASS][88] -> [FAIL][89] ([Intel XE#6251]) +2 other tests fail
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-lnl-4/igt@xe_pmu@engine-activity-accuracy-90@engine-drm_xe_engine_class_compute0.html
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-lnl-2/igt@xe_pmu@engine-activity-accuracy-90@engine-drm_xe_engine_class_compute0.html

  * igt@xe_pxp@pxp-stale-bo-exec-post-suspend:
    - shard-bmg:          NOTRUN -> [SKIP][90] ([Intel XE#4733]) +1 other test skip
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@xe_pxp@pxp-stale-bo-exec-post-suspend.html

  * igt@xe_pxp@pxp-stale-bo-exec-post-termination-irq:
    - shard-dg2-set2:     NOTRUN -> [SKIP][91] ([Intel XE#4733]) +2 other tests skip
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-434/igt@xe_pxp@pxp-stale-bo-exec-post-termination-irq.html

  * igt@xe_query@multigpu-query-gt-list:
    - shard-dg2-set2:     NOTRUN -> [SKIP][92] ([Intel XE#944])
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@xe_query@multigpu-query-gt-list.html

  * igt@xe_query@multigpu-query-hwconfig:
    - shard-bmg:          NOTRUN -> [SKIP][93] ([Intel XE#944]) +1 other test skip
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-4/igt@xe_query@multigpu-query-hwconfig.html

  * igt@xe_render_copy@render-stress-4-copies:
    - shard-dg2-set2:     NOTRUN -> [SKIP][94] ([Intel XE#4814]) +1 other test skip
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@xe_render_copy@render-stress-4-copies.html

  * igt@xe_sriov_flr@flr-each-isolation:
    - shard-dg2-set2:     NOTRUN -> [SKIP][95] ([Intel XE#3342])
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@xe_sriov_flr@flr-each-isolation.html

  * igt@xe_sriov_scheduling@nonpreempt-engine-resets@numvfs-random:
    - shard-adlp:         [PASS][96] -> [DMESG-FAIL][97] ([Intel XE#3868] / [Intel XE#5213] / [Intel XE#5545]) +1 other test dmesg-fail
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-adlp-8/igt@xe_sriov_scheduling@nonpreempt-engine-resets@numvfs-random.html
   [97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-adlp-8/igt@xe_sriov_scheduling@nonpreempt-engine-resets@numvfs-random.html

  * igt@xe_vm@munmap-style-unbind-many-end:
    - shard-adlp:         [PASS][98] -> [ABORT][99] ([Intel XE#3970])
   [98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-adlp-9/igt@xe_vm@munmap-style-unbind-many-end.html
   [99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-adlp-3/igt@xe_vm@munmap-style-unbind-many-end.html

  
#### Possible fixes ####

  * igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-hdmi-a-1:
    - shard-adlp:         [FAIL][100] ([Intel XE#3908]) -> [PASS][101] +1 other test pass
   [100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-adlp-3/igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-hdmi-a-1.html
   [101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-adlp-3/igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-hdmi-a-1.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip:
    - shard-adlp:         [DMESG-FAIL][102] ([Intel XE#4543]) -> [PASS][103]
   [102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-adlp-3/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip.html
   [103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-adlp-8/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-hdmi-a-6:
    - shard-dg2-set2:     [DMESG-WARN][104] ([Intel XE#1727] / [Intel XE#3113]) -> [PASS][105]
   [104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-dg2-433/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-hdmi-a-6.html
   [105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-432/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-hdmi-a-6.html

  * igt@kms_cursor_crc@cursor-rapid-movement-64x64:
    - shard-adlp:         [DMESG-WARN][106] ([Intel XE#2953] / [Intel XE#4173]) -> [PASS][107] +8 other tests pass
   [106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-adlp-2/igt@kms_cursor_crc@cursor-rapid-movement-64x64.html
   [107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-adlp-4/igt@kms_cursor_crc@cursor-rapid-movement-64x64.html

  * igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy:
    - shard-bmg:          [SKIP][108] ([Intel XE#2291]) -> [PASS][109] +3 other tests pass
   [108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-6/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy.html
   [109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-4/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy.html

  * igt@kms_fbcon_fbt@psr-suspend:
    - shard-lnl:          [FAIL][110] ([Intel XE#4164]) -> [PASS][111]
   [110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-lnl-4/igt@kms_fbcon_fbt@psr-suspend.html
   [111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-lnl-2/igt@kms_fbcon_fbt@psr-suspend.html

  * igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible:
    - shard-bmg:          [SKIP][112] ([Intel XE#2316]) -> [PASS][113] +5 other tests pass
   [112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-6/igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible.html
   [113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-5/igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible.html

  * igt@kms_flip@basic-flip-vs-modeset@b-hdmi-a1:
    - shard-adlp:         [DMESG-WARN][114] ([Intel XE#4543]) -> [PASS][115] +1 other test pass
   [114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-adlp-3/igt@kms_flip@basic-flip-vs-modeset@b-hdmi-a1.html
   [115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-adlp-8/igt@kms_flip@basic-flip-vs-modeset@b-hdmi-a1.html

  * igt@kms_flip@flip-vs-expired-vblank@b-edp1:
    - shard-lnl:          [FAIL][116] ([Intel XE#301]) -> [PASS][117] +1 other test pass
   [116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-lnl-3/igt@kms_flip@flip-vs-expired-vblank@b-edp1.html
   [117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-lnl-5/igt@kms_flip@flip-vs-expired-vblank@b-edp1.html

  * igt@kms_flip@flip-vs-suspend:
    - shard-bmg:          [INCOMPLETE][118] ([Intel XE#2049] / [Intel XE#2597]) -> [PASS][119] +1 other test pass
   [118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-7/igt@kms_flip@flip-vs-suspend.html
   [119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-1/igt@kms_flip@flip-vs-suspend.html

  * igt@kms_hdr@static-toggle-dpms:
    - shard-bmg:          [SKIP][120] ([Intel XE#1503]) -> [PASS][121]
   [120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-6/igt@kms_hdr@static-toggle-dpms.html
   [121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_hdr@static-toggle-dpms.html

  * igt@kms_plane_multiple@2x-tiling-none:
    - shard-bmg:          [SKIP][122] ([Intel XE#4596]) -> [PASS][123]
   [122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-6/igt@kms_plane_multiple@2x-tiling-none.html
   [123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-4/igt@kms_plane_multiple@2x-tiling-none.html

  * igt@kms_vrr@seamless-rr-switch-virtual@pipe-a-edp-1:
    - shard-lnl:          [FAIL][124] ([Intel XE#2142]) -> [PASS][125] +1 other test pass
   [124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-lnl-1/igt@kms_vrr@seamless-rr-switch-virtual@pipe-a-edp-1.html
   [125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-lnl-4/igt@kms_vrr@seamless-rr-switch-virtual@pipe-a-edp-1.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-userptr:
    - shard-adlp:         [DMESG-FAIL][126] ([Intel XE#3868] / [Intel XE#3876] / [Intel XE#5213] / [Intel XE#5545]) -> [PASS][127]
   [126]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-adlp-6/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-userptr.html
   [127]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-adlp-2/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-userptr.html

  * igt@xe_fault_injection@probe-fail-guc-xe_guc_mmio_send_recv:
    - shard-dg2-set2:     [DMESG-WARN][128] ([Intel XE#5893]) -> [PASS][129]
   [128]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-dg2-436/igt@xe_fault_injection@probe-fail-guc-xe_guc_mmio_send_recv.html
   [129]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@xe_fault_injection@probe-fail-guc-xe_guc_mmio_send_recv.html

  * igt@xe_pm@s3-vm-bind-prefetch:
    - shard-dg2-set2:     [TIMEOUT][130] -> [PASS][131]
   [130]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-dg2-436/igt@xe_pm@s3-vm-bind-prefetch.html
   [131]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-464/igt@xe_pm@s3-vm-bind-prefetch.html

  * igt@xe_pmu@gt-frequency:
    - shard-dg2-set2:     [FAIL][132] ([Intel XE#4819]) -> [PASS][133] +1 other test pass
   [132]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-dg2-435/igt@xe_pmu@gt-frequency.html
   [133]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-466/igt@xe_pmu@gt-frequency.html

  
#### Warnings ####

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc:
    - shard-dg2-set2:     [INCOMPLETE][134] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#4345] / [Intel XE#6168]) -> [INCOMPLETE][135] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#4345])
   [134]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-dg2-433/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html
   [135]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-432/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-dp-4:
    - shard-dg2-set2:     [INCOMPLETE][136] ([Intel XE#6168]) -> [INCOMPLETE][137] ([Intel XE#3113])
   [136]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-dg2-433/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-dp-4.html
   [137]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-dg2-432/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-dp-4.html

  * igt@kms_content_protection@legacy:
    - shard-bmg:          [FAIL][138] ([Intel XE#1178]) -> [SKIP][139] ([Intel XE#2341])
   [138]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-5/igt@kms_content_protection@legacy.html
   [139]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-6/igt@kms_content_protection@legacy.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-adlp:         [DMESG-WARN][140] ([Intel XE#2953] / [Intel XE#4173]) -> [DMESG-WARN][141] ([Intel XE#4543])
   [140]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-adlp-2/igt@kms_flip@flip-vs-suspend-interruptible.html
   [141]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-adlp-4/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt:
    - shard-bmg:          [SKIP][142] ([Intel XE#2311]) -> [SKIP][143] ([Intel XE#2312]) +10 other tests skip
   [142]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-2/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt.html
   [143]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][144] ([Intel XE#2312]) -> [SKIP][145] ([Intel XE#2311]) +10 other tests skip
   [144]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-wc.html
   [145]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-8/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][146] ([Intel XE#5390]) -> [SKIP][147] ([Intel XE#2312]) +3 other tests skip
   [146]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-5/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-mmap-wc.html
   [147]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-onoff:
    - shard-bmg:          [SKIP][148] ([Intel XE#2312]) -> [SKIP][149] ([Intel XE#5390]) +3 other tests skip
   [148]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-onoff.html
   [149]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-5/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-render:
    - shard-bmg:          [SKIP][150] ([Intel XE#2312]) -> [SKIP][151] ([Intel XE#2313]) +10 other tests skip
   [150]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-render.html
   [151]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-5/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt:
    - shard-bmg:          [SKIP][152] ([Intel XE#2313]) -> [SKIP][153] ([Intel XE#2312]) +11 other tests skip
   [152]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-2/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt.html
   [153]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt.html

  * igt@kms_hdr@brightness-with-hdr:
    - shard-bmg:          [SKIP][154] ([Intel XE#3374] / [Intel XE#3544]) -> [SKIP][155] ([Intel XE#3544])
   [154]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-4/igt@kms_hdr@brightness-with-hdr.html
   [155]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-1/igt@kms_hdr@brightness-with-hdr.html

  * igt@kms_tiled_display@basic-test-pattern-with-chamelium:
    - shard-bmg:          [SKIP][156] ([Intel XE#2509]) -> [SKIP][157] ([Intel XE#2426])
   [156]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-bmg-5/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
   [157]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-bmg-6/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html

  * igt@xe_exec_reset@cm-cat-error:
    - shard-adlp:         [DMESG-WARN][158] ([Intel XE#3868]) -> [DMESG-FAIL][159] ([Intel XE#3868])
   [158]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61/shard-adlp-9/igt@xe_exec_reset@cm-cat-error.html
   [159]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/shard-adlp-3/igt@xe_exec_reset@cm-cat-error.html

  
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [Intel XE#1127]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1127
  [Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
  [Intel XE#1406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1406
  [Intel XE#1435]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1435
  [Intel XE#1439]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1439
  [Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
  [Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
  [Intel XE#1727]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1727
  [Intel XE#2049]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2049
  [Intel XE#2142]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2142
  [Intel XE#2191]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2191
  [Intel XE#2229]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2229
  [Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
  [Intel XE#2244]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2244
  [Intel XE#2252]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2252
  [Intel XE#2284]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2284
  [Intel XE#2291]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2291
  [Intel XE#2293]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2293
  [Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
  [Intel XE#2312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2312
  [Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
  [Intel XE#2314]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2314
  [Intel XE#2316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2316
  [Intel XE#2320]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2320
  [Intel XE#2321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2321
  [Intel XE#2322]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2322
  [Intel XE#2327]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2327
  [Intel XE#2341]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2341
  [Intel XE#2374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2374
  [Intel XE#2380]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2380
  [Intel XE#2426]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2426
  [Intel XE#2486]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2486
  [Intel XE#2509]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2509
  [Intel XE#2597]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2597
  [Intel XE#2652]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2652
  [Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
  [Intel XE#288]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/288
  [Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
  [Intel XE#2894]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2894
  [Intel XE#2925]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2925
  [Intel XE#2938]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2938
  [Intel XE#2953]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2953
  [Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
  [Intel XE#3113]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3113
  [Intel XE#3141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3141
  [Intel XE#316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/316
  [Intel XE#3342]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3342
  [Intel XE#3374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3374
  [Intel XE#3414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3414
  [Intel XE#3432]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3432
  [Intel XE#3544]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3544
  [Intel XE#3573]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3573
  [Intel XE#366]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/366
  [Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
  [Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
  [Intel XE#3868]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3868
  [Intel XE#3876]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3876
  [Intel XE#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
  [Intel XE#3908]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3908
  [Intel XE#3970]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3970
  [Intel XE#4164]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4164
  [Intel XE#4173]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4173
  [Intel XE#4345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4345
  [Intel XE#4354]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4354
  [Intel XE#4543]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4543
  [Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
  [Intel XE#4596]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4596
  [Intel XE#4733]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4733
  [Intel XE#4814]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4814
  [Intel XE#4819]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4819
  [Intel XE#4837]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4837
  [Intel XE#4915]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4915
  [Intel XE#4943]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4943
  [Intel XE#5213]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5213
  [Intel XE#5244]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5244
  [Intel XE#5299]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5299
  [Intel XE#5390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5390
  [Intel XE#5545]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5545
  [Intel XE#5626]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5626
  [Intel XE#5893]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5893
  [Intel XE#6032]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6032
  [Intel XE#607]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/607
  [Intel XE#6078]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6078
  [Intel XE#6168]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6168
  [Intel XE#6251]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6251
  [Intel XE#6312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6312
  [Intel XE#6321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6321
  [Intel XE#6361]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6361
  [Intel XE#6503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6503
  [Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
  [Intel XE#653]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/653
  [Intel XE#6566]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6566
  [Intel XE#658]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/658
  [Intel XE#6606]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6606
  [Intel XE#787]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/787
  [Intel XE#836]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/836
  [Intel XE#870]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/870
  [Intel XE#908]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/908
  [Intel XE#929]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/929
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944


Build changes
-------------

  * Linux: xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61 -> xe-pw-157253v4

  IGT_8625: 69d0aa3606a205aec90d6145bb20cbae755e8559 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-4110-5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61: 5f250ba2e3bb0b4541473f2bd5dd8a8f22305b61
  xe-pw-157253v4: 157253v4

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-157253v4/index.html

[-- Attachment #2: Type: text/html, Size: 55129 bytes --]

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

* Re: [PATCH v3 01/27] drm/xe/forcewake: Add scope-based cleanup for forcewake
  2025-11-14 21:43 ` [PATCH v3 01/27] drm/xe/forcewake: Add scope-based cleanup for forcewake Matt Roper
@ 2025-11-17 22:03   ` Gustavo Sousa
  2025-11-17 22:17     ` Gustavo Sousa
  0 siblings, 1 reply; 39+ messages in thread
From: Gustavo Sousa @ 2025-11-17 22:03 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper, Michal Wajdeczko

Quoting Matt Roper (2025-11-14 18:43:37-03:00)
>Since forcewake uses a reference counting get/put model, there are many
>places where we need to be careful to drop the forcewake reference when
>bailing out of a function early on an error path.  Add scope-based
>cleanup options that can be used in place of explicit get/put to help
>prevent mistakes in this area.
>
>Examples:
>
>   CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
>
>       Obtain forcewake on the XE_FW_GT domain and hold it until the
>       end of the current block.  The wakeref will be dropped
>       automatically when the current scope is exited by any means
>       (return, break, reaching the end of the block, etc.).
>
>   xe_with_force_wake(fw_ref, gt_to_fw(ss->gt), XE_FORCEWAKE_ALL) {
>        ...
>   }
>
>       Hold all forcewake domains for the following block.  As with the
>       CLASS usage, forcewake will be dropped automatically when the
>       block is exited by any means.
>
>Use of these cleanup helpers should allow us to remove some ugly
>goto-based error handling and help avoid mistakes in functions with lots
>of early error exits.
>
>An 'xe_force_wake_release_only' class is also added for cases where a
>forcewake reference is passed in from another function and the current
>function is responsible for releasing it in every flow and error path.
>
>v2:
> - Create a separate constructor that just wraps xe_force_wake_get for
>   use in the class.  This eliminates the need to update the signature
>   of xe_force_wake_get().  (Michal)
>
>v3:
> - Wrap xe_with_force_wake's 'done' marker in __UNIQUE_ID.  (Gustavo)
> - Add a note to xe_force_wake_get()'s kerneldoc explaining that
>   scope-based cleanup is preferred when possible.  (Gustavo)
> - Add an xe_force_wake_release_only class.  (Gustavo)
>
>Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
>Cc: Gustavo Sousa <gustavo.sousa@intel.com>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>

>---
> drivers/gpu/drm/xe/xe_force_wake.c |  7 ++++++
> drivers/gpu/drm/xe/xe_force_wake.h | 40 ++++++++++++++++++++++++++++++
> 2 files changed, 47 insertions(+)
>
>diff --git a/drivers/gpu/drm/xe/xe_force_wake.c b/drivers/gpu/drm/xe/xe_force_wake.c
>index c59a9b330697..76e054f314ee 100644
>--- a/drivers/gpu/drm/xe/xe_force_wake.c
>+++ b/drivers/gpu/drm/xe/xe_force_wake.c
>@@ -166,6 +166,13 @@ static int domain_sleep_wait(struct xe_gt *gt,
>  * xe_force_wake_ref_has_domain() function. Caller must call
>  * xe_force_wake_put() function to decrease incremented refcounts.
>  *
>+ * When possible, scope-based forcewake (through CLASS(xe_force_wake, ...) or
>+ * xe_with_force_wake()) should be used instead of direct calls to this
>+ * function.  Direct usage of get/put should only be used when the function
>+ * has goto-based flows that can interfere with scope-based cleanup, or when
>+ * the lifetime of the forcewake reference does not match a specific scope
>+ * (e.g., forcewake obtained in one function and released in a different one).
>+ *
>  * Return: opaque reference to woken domains or zero if none of requested
>  * domains were awake.
>  */
>diff --git a/drivers/gpu/drm/xe/xe_force_wake.h b/drivers/gpu/drm/xe/xe_force_wake.h
>index 0e3e84bfa51c..ffc4e103fe31 100644
>--- a/drivers/gpu/drm/xe/xe_force_wake.h
>+++ b/drivers/gpu/drm/xe/xe_force_wake.h
>@@ -61,4 +61,44 @@ xe_force_wake_ref_has_domain(unsigned int fw_ref, enum xe_force_wake_domains dom
>         return fw_ref & domain;
> }
> 
>+struct xe_force_wake_ref {
>+        struct xe_force_wake *fw;
>+        unsigned int domains;
>+};
>+
>+static struct xe_force_wake_ref
>+xe_force_wake_constructor(struct xe_force_wake *fw, unsigned int domains)
>+{
>+        struct xe_force_wake_ref fw_ref = { .fw = fw };
>+
>+        fw_ref.domains = xe_force_wake_get(fw, domains);
>+
>+        return fw_ref;
>+}
>+
>+DEFINE_CLASS(xe_force_wake, struct xe_force_wake_ref,
>+             xe_force_wake_put(_T.fw, _T.domains),
>+             xe_force_wake_constructor(fw, domains),
>+             struct xe_force_wake *fw, unsigned int domains);
>+
>+/*
>+ * Scoped helper for the forcewake class, using the same trick as scoped_guard()
>+ * to bind the lifetime to the next statement/block.
>+ */
>+#define __xe_with_force_wake(ref, fw, domains, done) \
>+        for (CLASS(xe_force_wake, ref)(fw, domains), *(done) = NULL; \
>+             !(done); (done) = (void *)1)
>+
>+#define xe_with_force_wake(ref, fw, domains) \
>+        __xe_with_force_wake(ref, fw, domains, __UNIQUE_ID(done))
>+
>+/*
>+ * Used when xe_force_wake_constructor() has already been called by another
>+ * function and the current function is responsible for releasing the forcewake
>+ * reference in all possible cases and error paths.
>+ */
>+DEFINE_CLASS(xe_force_wake_release_only, struct xe_force_wake_ref,
>+             xe_force_wake_put(_T.fw, _T.domains), fw_ref,
>+             struct xe_force_wake_ref fw_ref);
>+
> #endif
>-- 
>2.51.1
>

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

* Re: [PATCH v3 02/27] drm/xe/pm: Add scope-based cleanup helper for runtime PM
  2025-11-14 21:43 ` [PATCH v3 02/27] drm/xe/pm: Add scope-based cleanup helper for runtime PM Matt Roper
@ 2025-11-17 22:04   ` Gustavo Sousa
  0 siblings, 0 replies; 39+ messages in thread
From: Gustavo Sousa @ 2025-11-17 22:04 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper, Michal Wajdeczko

Quoting Matt Roper (2025-11-14 18:43:38-03:00)
>Add a scope-based helpers for runtime PM that may be used to simplify
>cleanup logic and potentially avoid goto-based cleanup.
>
>For example, using
>
>        guard(xe_pm_runtime)(xe);
>
>will get runtime PM and cause a corresponding put to occur automatically
>when the current scope is exited.  'xe_pm_runtime_noresume' can be used
>as a guard replacement for the corresponding 'noresume' variant.
>There's also an xe_pm_runtime_ioctl conditional guard that can be used
>as a replacement for xe_runtime_ioctl():
>
>        ACQUIRE(xe_pm_runtime_ioctl, pm)(xe);
>        if ((ret = ACQUIRE_ERR(xe_pm_runtime_ioctl, &pm)) < 0)
>                /* failed */
>
>In a few rare cases (such as gt_reset_worker()) we need to ensure that
>runtime PM is dropped when the function is exited by any means
>(including error paths), but the function does not need to acquire
>runtime PM because that has already been done earlier by a different
>function.  For these special cases, an 'xe_pm_runtime_release_only'
>guard can be used to handle the release without doing an acquisition.
>
>These guards will be used in future patches to eliminate some of our
>goto-based cleanup.
>
>v2:
> - Specify success condition for xe_pm runtime_ioctl as _RET >= 0 so
>   that positive values will be properly identified as success and
>   trigger destructor cleanup properly.
>
>v3:
> - Add comments to the kerneldoc for the existing 'get' functions
>   indicating that scope-based handling should be preferred where
>   possible.  (Gustavo)
>
>Cc: Gustavo Sousa <gustavo.sousa@intel.com>
>Reviewed-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>

>---
> drivers/gpu/drm/xe/xe_pm.c | 21 +++++++++++++++++++++
> drivers/gpu/drm/xe/xe_pm.h | 17 +++++++++++++++++
> 2 files changed, 38 insertions(+)
>
>diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
>index 0e573fb11bbb..ad92a142dc7e 100644
>--- a/drivers/gpu/drm/xe/xe_pm.c
>+++ b/drivers/gpu/drm/xe/xe_pm.c
>@@ -722,6 +722,13 @@ static void xe_pm_runtime_lockdep_prime(void)
> /**
>  * xe_pm_runtime_get - Get a runtime_pm reference and resume synchronously
>  * @xe: xe device instance
>+ *
>+ * When possible, scope-based runtime PM (through guard(xe_pm_runtime)) is
>+ * be preferred over direct usage of this function.  Manual get/put handling
>+ * should only be used when the function contains goto-based logic which
>+ * can break scope-based handling, or when the lifetime of the runtime PM
>+ * reference does not match a specific scope (e.g., runtime PM obtained in one
>+ * function and released in a different one).
>  */
> void xe_pm_runtime_get(struct xe_device *xe)
> {
>@@ -754,6 +761,13 @@ void xe_pm_runtime_put(struct xe_device *xe)
>  * xe_pm_runtime_get_ioctl - Get a runtime_pm reference before ioctl
>  * @xe: xe device instance
>  *
>+ * When possible, scope-based runtime PM (through
>+ * ACQUIRE(xe_pm_runtime_ioctl, ...)) is be preferred over direct usage of this
>+ * function.  Manual get/put handling should only be used when the function
>+ * contains goto-based logic which can break scope-based handling, or when the
>+ * lifetime of the runtime PM reference does not match a specific scope (e.g.,
>+ * runtime PM obtained in one function and released in a different one).
>+ *
>  * Returns: Any number greater than or equal to 0 for success, negative error
>  * code otherwise.
>  */
>@@ -823,6 +837,13 @@ static bool xe_pm_suspending_or_resuming(struct xe_device *xe)
>  * It will warn if not protected.
>  * The reference should be put back after this function regardless, since it
>  * will always bump the usage counter, regardless.
>+ *
>+ * When possible, scope-based runtime PM (through guard(xe_pm_runtime_noresume))
>+ * is be preferred over direct usage of this function.  Manual get/put handling
>+ * should only be used when the function contains goto-based logic which can
>+ * break scope-based handling, or when the lifetime of the runtime PM reference
>+ * does not match a specific scope (e.g., runtime PM obtained in one function
>+ * and released in a different one).
>  */
> void xe_pm_runtime_get_noresume(struct xe_device *xe)
> {
>diff --git a/drivers/gpu/drm/xe/xe_pm.h b/drivers/gpu/drm/xe/xe_pm.h
>index f7f89a18b6fc..6b27039e7b2d 100644
>--- a/drivers/gpu/drm/xe/xe_pm.h
>+++ b/drivers/gpu/drm/xe/xe_pm.h
>@@ -6,6 +6,7 @@
> #ifndef _XE_PM_H_
> #define _XE_PM_H_
> 
>+#include <linux/cleanup.h>
> #include <linux/pm_runtime.h>
> 
> #define DEFAULT_VRAM_THRESHOLD 300 /* in MB */
>@@ -37,4 +38,20 @@ int xe_pm_block_on_suspend(struct xe_device *xe);
> void xe_pm_might_block_on_suspend(void);
> int xe_pm_module_init(void);
> 
>+static inline void __xe_pm_runtime_noop(struct xe_device *xe) {}
>+
>+DEFINE_GUARD(xe_pm_runtime, struct xe_device *,
>+             xe_pm_runtime_get(_T), xe_pm_runtime_put(_T))
>+DEFINE_GUARD(xe_pm_runtime_noresume, struct xe_device *,
>+             xe_pm_runtime_get_noresume(_T), xe_pm_runtime_put(_T))
>+DEFINE_GUARD_COND(xe_pm_runtime, _ioctl, xe_pm_runtime_get_ioctl(_T), _RET >= 0)
>+
>+/*
>+ * Used when a function needs to release runtime PM in all possible cases
>+ * and error paths, but the wakeref was already acquired by a different
>+ * function (i.e., get() has already happened so only a put() is needed).
>+ */
>+DEFINE_GUARD(xe_pm_runtime_release_only, struct xe_device *,
>+             __xe_pm_runtime_noop(_T), xe_pm_runtime_put(_T));
>+
> #endif
>-- 
>2.51.1
>

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

* Re: [PATCH v3 12/27] drm/xe/devcoredump: Use scope-based cleanup
  2025-11-14 21:43 ` [PATCH v3 12/27] drm/xe/devcoredump: " Matt Roper
@ 2025-11-17 22:09   ` Gustavo Sousa
  0 siblings, 0 replies; 39+ messages in thread
From: Gustavo Sousa @ 2025-11-17 22:09 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper

Quoting Matt Roper (2025-11-14 18:43:48-03:00)
>Use scope-based cleanup for forcewake and runtime PM in the devcoredump
>code.  This eliminates some goto-based error handling and slightly
>simplifies other functions.
>
>v2:
> - Move the forcewake acquisition slightly higher in
>   devcoredump_snapshot() so that we maintain an easy-to-understand LIFO
>   cleanup order.  (Gustavo)
>
>Cc: Gustavo Sousa <gustavo.sousa@intel.com>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>

>---
> drivers/gpu/drm/xe/xe_devcoredump.c | 30 ++++++++++++-----------------
> 1 file changed, 12 insertions(+), 18 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_devcoredump.c b/drivers/gpu/drm/xe/xe_devcoredump.c
>index 203e3038cc81..bf347714b5e0 100644
>--- a/drivers/gpu/drm/xe/xe_devcoredump.c
>+++ b/drivers/gpu/drm/xe/xe_devcoredump.c
>@@ -276,7 +276,6 @@ static void xe_devcoredump_deferred_snap_work(struct work_struct *work)
>         struct xe_devcoredump_snapshot *ss = container_of(work, typeof(*ss), work);
>         struct xe_devcoredump *coredump = container_of(ss, typeof(*coredump), snapshot);
>         struct xe_device *xe = coredump_to_xe(coredump);
>-        unsigned int fw_ref;
> 
>         /*
>          * NB: Despite passing a GFP_ flags parameter here, more allocations are done
>@@ -287,15 +286,15 @@ static void xe_devcoredump_deferred_snap_work(struct work_struct *work)
>                               xe_devcoredump_read, xe_devcoredump_free,
>                               XE_COREDUMP_TIMEOUT_JIFFIES);
> 
>-        xe_pm_runtime_get(xe);
>+        guard(xe_pm_runtime)(xe);
> 
>         /* keep going if fw fails as we still want to save the memory and SW data */
>-        fw_ref = xe_force_wake_get(gt_to_fw(ss->gt), XE_FORCEWAKE_ALL);
>-        if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL))
>-                xe_gt_info(ss->gt, "failed to get forcewake for coredump capture\n");
>-        xe_vm_snapshot_capture_delayed(ss->vm);
>-        xe_guc_exec_queue_snapshot_capture_delayed(ss->ge);
>-        xe_force_wake_put(gt_to_fw(ss->gt), fw_ref);
>+        xe_with_force_wake(fw_ref, gt_to_fw(ss->gt), XE_FORCEWAKE_ALL) {
>+                if (!xe_force_wake_ref_has_domain(fw_ref.domains, XE_FORCEWAKE_ALL))
>+                        xe_gt_info(ss->gt, "failed to get forcewake for coredump capture\n");
>+                xe_vm_snapshot_capture_delayed(ss->vm);
>+                xe_guc_exec_queue_snapshot_capture_delayed(ss->ge);
>+        }
> 
>         ss->read.chunk_position = 0;
> 
>@@ -306,7 +305,7 @@ static void xe_devcoredump_deferred_snap_work(struct work_struct *work)
>                 ss->read.buffer = kvmalloc(XE_DEVCOREDUMP_CHUNK_MAX,
>                                            GFP_USER);
>                 if (!ss->read.buffer)
>-                        goto put_pm;
>+                        return;
> 
>                 __xe_devcoredump_read(ss->read.buffer,
>                                       XE_DEVCOREDUMP_CHUNK_MAX,
>@@ -314,15 +313,12 @@ static void xe_devcoredump_deferred_snap_work(struct work_struct *work)
>         } else {
>                 ss->read.buffer = kvmalloc(ss->read.size, GFP_USER);
>                 if (!ss->read.buffer)
>-                        goto put_pm;
>+                        return;
> 
>                 __xe_devcoredump_read(ss->read.buffer, ss->read.size, 0,
>                                       coredump);
>                 xe_devcoredump_snapshot_free(ss);
>         }
>-
>-put_pm:
>-        xe_pm_runtime_put(xe);
> }
> 
> static void devcoredump_snapshot(struct xe_devcoredump *coredump,
>@@ -332,7 +328,6 @@ static void devcoredump_snapshot(struct xe_devcoredump *coredump,
>         struct xe_devcoredump_snapshot *ss = &coredump->snapshot;
>         struct xe_guc *guc = exec_queue_to_guc(q);
>         const char *process_name = "no process";
>-        unsigned int fw_ref;
>         bool cookie;
> 
>         ss->snapshot_time = ktime_get_real();
>@@ -348,11 +343,11 @@ static void devcoredump_snapshot(struct xe_devcoredump *coredump,
>         ss->gt = q->gt;
>         INIT_WORK(&ss->work, xe_devcoredump_deferred_snap_work);
> 
>+        /* keep going if fw fails as we still want to save the memory and SW data */
>+        CLASS(xe_force_wake, fw_ref)(gt_to_fw(q->gt), XE_FORCEWAKE_ALL);
>+
>         cookie = dma_fence_begin_signalling();
> 
>-        /* keep going if fw fails as we still want to save the memory and SW data */
>-        fw_ref = xe_force_wake_get(gt_to_fw(q->gt), XE_FORCEWAKE_ALL);
>-
>         ss->guc.log = xe_guc_log_snapshot_capture(&guc->log, true);
>         ss->guc.ct = xe_guc_ct_snapshot_capture(&guc->ct);
>         ss->ge = xe_guc_exec_queue_snapshot_capture(q);
>@@ -364,7 +359,6 @@ static void devcoredump_snapshot(struct xe_devcoredump *coredump,
> 
>         queue_work(system_unbound_wq, &ss->work);
> 
>-        xe_force_wake_put(gt_to_fw(q->gt), fw_ref);
>         dma_fence_end_signalling(cookie);
> }
> 
>-- 
>2.51.1
>

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

* Re: [PATCH v3 13/27] drm/xe/display: Use scoped-cleanup
  2025-11-14 21:43 ` [PATCH v3 13/27] drm/xe/display: Use scoped-cleanup Matt Roper
@ 2025-11-17 22:11   ` Gustavo Sousa
  0 siblings, 0 replies; 39+ messages in thread
From: Gustavo Sousa @ 2025-11-17 22:11 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper

Quoting Matt Roper (2025-11-14 18:43:49-03:00)
>Eliminate some goto-based cleanup by utilizing scoped cleanup helpers.
>
>v2:
> - Eliminate unnecessary 'ret' variable in intel_hdcp_gsc_check_status()
>   (Gustavo)
>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>

>---
> drivers/gpu/drm/xe/display/xe_fb_pin.c   | 23 +++++++-----------
> drivers/gpu/drm/xe/display/xe_hdcp_gsc.c | 31 +++++++-----------------
> 2 files changed, 18 insertions(+), 36 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
>index 1fd4a815e784..6a935a75f2a4 100644
>--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
>+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
>@@ -210,10 +210,11 @@ static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb,
>         /* TODO: Consider sharing framebuffer mapping?
>          * embed i915_vma inside intel_framebuffer
>          */
>-        xe_pm_runtime_get_noresume(xe);
>-        ret = mutex_lock_interruptible(&ggtt->lock);
>+        guard(xe_pm_runtime_noresume)(xe);
>+        ACQUIRE(mutex_intr, lock)(&ggtt->lock);
>+        ret = ACQUIRE_ERR(mutex_intr, &lock);
>         if (ret)
>-                goto out;
>+                return ret;
> 
>         align = XE_PAGE_SIZE;
>         if (xe_bo_is_vram(bo) && ggtt->flags & XE_GGTT_FLAGS_64K)
>@@ -223,15 +224,13 @@ static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb,
>                 vma->node = bo->ggtt_node[tile0->id];
>         } else if (view->type == I915_GTT_VIEW_NORMAL) {
>                 vma->node = xe_ggtt_node_init(ggtt);
>-                if (IS_ERR(vma->node)) {
>-                        ret = PTR_ERR(vma->node);
>-                        goto out_unlock;
>-                }
>+                if (IS_ERR(vma->node))
>+                        return PTR_ERR(vma->node);
> 
>                 ret = xe_ggtt_node_insert_locked(vma->node, xe_bo_size(bo), align, 0);
>                 if (ret) {
>                         xe_ggtt_node_fini(vma->node);
>-                        goto out_unlock;
>+                        return ret;
>                 }
> 
>                 xe_ggtt_map_bo(ggtt, vma->node, bo, xe->pat.idx[XE_CACHE_NONE]);
>@@ -245,13 +244,13 @@ static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb,
>                 vma->node = xe_ggtt_node_init(ggtt);
>                 if (IS_ERR(vma->node)) {
>                         ret = PTR_ERR(vma->node);
>-                        goto out_unlock;
>+                        return ret;
>                 }
> 
>                 ret = xe_ggtt_node_insert_locked(vma->node, size, align, 0);
>                 if (ret) {
>                         xe_ggtt_node_fini(vma->node);
>-                        goto out_unlock;
>+                        return ret;
>                 }
> 
>                 ggtt_ofs = vma->node->base.start;
>@@ -265,10 +264,6 @@ static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb,
>                                            rot_info->plane[i].dst_stride);
>         }
> 
>-out_unlock:
>-        mutex_unlock(&ggtt->lock);
>-out:
>-        xe_pm_runtime_put(xe);
>         return ret;
> }
> 
>diff --git a/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c b/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c
>index 4ae847b628e2..71d21fde1736 100644
>--- a/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c
>+++ b/drivers/gpu/drm/xe/display/xe_hdcp_gsc.c
>@@ -36,8 +36,6 @@ bool intel_hdcp_gsc_check_status(struct drm_device *drm)
>         struct xe_tile *tile = xe_device_get_root_tile(xe);
>         struct xe_gt *gt = tile->media_gt;
>         struct xe_gsc *gsc = &gt->uc.gsc;
>-        bool ret = true;
>-        unsigned int fw_ref;
> 
>         if (!gsc || !xe_uc_fw_is_enabled(&gsc->fw)) {
>                 drm_dbg_kms(&xe->drm,
>@@ -45,22 +43,15 @@ bool intel_hdcp_gsc_check_status(struct drm_device *drm)
>                 return false;
>         }
> 
>-        xe_pm_runtime_get(xe);
>-        fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GSC);
>-        if (!fw_ref) {
>+        guard(xe_pm_runtime)(xe);
>+        CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GSC);
>+        if (!fw_ref.domains) {
>                 drm_dbg_kms(&xe->drm,
>                             "failed to get forcewake to check proxy status\n");
>-                ret = false;
>-                goto out;
>+                return false;
>         }
> 
>-        if (!xe_gsc_proxy_init_done(gsc))
>-                ret = false;
>-
>-        xe_force_wake_put(gt_to_fw(gt), fw_ref);
>-out:
>-        xe_pm_runtime_put(xe);
>-        return ret;
>+        return xe_gsc_proxy_init_done(gsc);
> }
> 
> /*This function helps allocate memory for the command that we will send to gsc cs */
>@@ -166,17 +157,15 @@ ssize_t intel_hdcp_gsc_msg_send(struct intel_hdcp_gsc_context *gsc_context,
>         u32 addr_out_off, addr_in_wr_off = 0;
>         int ret, tries = 0;
> 
>-        if (msg_in_len > max_msg_size || msg_out_len > max_msg_size) {
>-                ret = -ENOSPC;
>-                goto out;
>-        }
>+        if (msg_in_len > max_msg_size || msg_out_len > max_msg_size)
>+                return -ENOSPC;
> 
>         msg_size_in = msg_in_len + HDCP_GSC_HEADER_SIZE;
>         msg_size_out = msg_out_len + HDCP_GSC_HEADER_SIZE;
>         addr_out_off = PAGE_SIZE;
> 
>         host_session_id = xe_gsc_create_host_session_id();
>-        xe_pm_runtime_get_noresume(xe);
>+        guard(xe_pm_runtime_noresume)(xe);
>         addr_in_wr_off = xe_gsc_emit_header(xe, &gsc_context->hdcp_bo->vmap,
>                                             addr_in_wr_off, HECI_MEADDRESS_HDCP,
>                                             host_session_id, msg_in_len);
>@@ -201,13 +190,11 @@ ssize_t intel_hdcp_gsc_msg_send(struct intel_hdcp_gsc_context *gsc_context,
>         } while (++tries < 20);
> 
>         if (ret)
>-                goto out;
>+                return ret;
> 
>         xe_map_memcpy_from(xe, msg_out, &gsc_context->hdcp_bo->vmap,
>                            addr_out_off + HDCP_GSC_HEADER_SIZE,
>                            msg_out_len);
> 
>-out:
>-        xe_pm_runtime_put(xe);
>         return ret;
> }
>-- 
>2.51.1
>

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

* Re: [PATCH v3 01/27] drm/xe/forcewake: Add scope-based cleanup for forcewake
  2025-11-17 22:03   ` Gustavo Sousa
@ 2025-11-17 22:17     ` Gustavo Sousa
  0 siblings, 0 replies; 39+ messages in thread
From: Gustavo Sousa @ 2025-11-17 22:17 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper, Michal Wajdeczko

Quoting Gustavo Sousa (2025-11-17 19:03:21-03:00)
>Quoting Matt Roper (2025-11-14 18:43:37-03:00)
>>Since forcewake uses a reference counting get/put model, there are many
>>places where we need to be careful to drop the forcewake reference when
>>bailing out of a function early on an error path.  Add scope-based
>>cleanup options that can be used in place of explicit get/put to help
>>prevent mistakes in this area.
>>
>>Examples:
>>
>>   CLASS(xe_force_wake, fw_ref)(gt_to_fw(gt), XE_FW_GT);
>>
>>       Obtain forcewake on the XE_FW_GT domain and hold it until the
>>       end of the current block.  The wakeref will be dropped
>>       automatically when the current scope is exited by any means
>>       (return, break, reaching the end of the block, etc.).
>>
>>   xe_with_force_wake(fw_ref, gt_to_fw(ss->gt), XE_FORCEWAKE_ALL) {
>>        ...
>>   }
>>
>>       Hold all forcewake domains for the following block.  As with the
>>       CLASS usage, forcewake will be dropped automatically when the
>>       block is exited by any means.
>>
>>Use of these cleanup helpers should allow us to remove some ugly
>>goto-based error handling and help avoid mistakes in functions with lots
>>of early error exits.
>>
>>An 'xe_force_wake_release_only' class is also added for cases where a
>>forcewake reference is passed in from another function and the current
>>function is responsible for releasing it in every flow and error path.
>>
>>v2:
>> - Create a separate constructor that just wraps xe_force_wake_get for
>>   use in the class.  This eliminates the need to update the signature
>>   of xe_force_wake_get().  (Michal)
>>
>>v3:
>> - Wrap xe_with_force_wake's 'done' marker in __UNIQUE_ID.  (Gustavo)
>> - Add a note to xe_force_wake_get()'s kerneldoc explaining that
>>   scope-based cleanup is preferred when possible.  (Gustavo)
>> - Add an xe_force_wake_release_only class.  (Gustavo)
>>
>>Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
>>Cc: Gustavo Sousa <gustavo.sousa@intel.com>
>>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
>
>Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
>
>>---
>> drivers/gpu/drm/xe/xe_force_wake.c |  7 ++++++
>> drivers/gpu/drm/xe/xe_force_wake.h | 40 ++++++++++++++++++++++++++++++
>> 2 files changed, 47 insertions(+)
>>
>>diff --git a/drivers/gpu/drm/xe/xe_force_wake.c b/drivers/gpu/drm/xe/xe_force_wake.c
>>index c59a9b330697..76e054f314ee 100644
>>--- a/drivers/gpu/drm/xe/xe_force_wake.c
>>+++ b/drivers/gpu/drm/xe/xe_force_wake.c
>>@@ -166,6 +166,13 @@ static int domain_sleep_wait(struct xe_gt *gt,
>>  * xe_force_wake_ref_has_domain() function. Caller must call
>>  * xe_force_wake_put() function to decrease incremented refcounts.
>>  *
>>+ * When possible, scope-based forcewake (through CLASS(xe_force_wake, ...) or
>>+ * xe_with_force_wake()) should be used instead of direct calls to this
>>+ * function.  Direct usage of get/put should only be used when the function
>>+ * has goto-based flows that can interfere with scope-based cleanup, or when
>>+ * the lifetime of the forcewake reference does not match a specific scope
>>+ * (e.g., forcewake obtained in one function and released in a different one).
>>+ *
>>  * Return: opaque reference to woken domains or zero if none of requested
>>  * domains were awake.
>>  */
>>diff --git a/drivers/gpu/drm/xe/xe_force_wake.h b/drivers/gpu/drm/xe/xe_force_wake.h
>>index 0e3e84bfa51c..ffc4e103fe31 100644
>>--- a/drivers/gpu/drm/xe/xe_force_wake.h
>>+++ b/drivers/gpu/drm/xe/xe_force_wake.h
>>@@ -61,4 +61,44 @@ xe_force_wake_ref_has_domain(unsigned int fw_ref, enum xe_force_wake_domains dom
>>         return fw_ref & domain;
>> }
>> 
>>+struct xe_force_wake_ref {
>>+        struct xe_force_wake *fw;
>>+        unsigned int domains;
>>+};
>>+
>>+static struct xe_force_wake_ref
>>+xe_force_wake_constructor(struct xe_force_wake *fw, unsigned int domains)
>>+{
>>+        struct xe_force_wake_ref fw_ref = { .fw = fw };
>>+
>>+        fw_ref.domains = xe_force_wake_get(fw, domains);
>>+
>>+        return fw_ref;
>>+}
>>+
>>+DEFINE_CLASS(xe_force_wake, struct xe_force_wake_ref,
>>+             xe_force_wake_put(_T.fw, _T.domains),
>>+             xe_force_wake_constructor(fw, domains),
>>+             struct xe_force_wake *fw, unsigned int domains);
>>+
>>+/*
>>+ * Scoped helper for the forcewake class, using the same trick as scoped_guard()
>>+ * to bind the lifetime to the next statement/block.
>>+ */
>>+#define __xe_with_force_wake(ref, fw, domains, done) \
>>+        for (CLASS(xe_force_wake, ref)(fw, domains), *(done) = NULL; \
>>+             !(done); (done) = (void *)1)
>>+
>>+#define xe_with_force_wake(ref, fw, domains) \
>>+        __xe_with_force_wake(ref, fw, domains, __UNIQUE_ID(done))
>>+
>>+/*
>>+ * Used when xe_force_wake_constructor() has already been called by another
>>+ * function and the current function is responsible for releasing the forcewake
>>+ * reference in all possible cases and error paths.
>>+ */
>>+DEFINE_CLASS(xe_force_wake_release_only, struct xe_force_wake_ref,
>>+             xe_force_wake_put(_T.fw, _T.domains), fw_ref,

Hm... Should we have a NULL check on _T.fw here?

--
Gustavo Sousa

>>+             struct xe_force_wake_ref fw_ref);
>>+
>> #endif
>>-- 
>>2.51.1
>>

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

* Re: [PATCH v3 14/27] drm/xe: Return forcewake reference type from force_wake_get_any_engine()
  2025-11-14 21:43 ` [PATCH v3 14/27] drm/xe: Return forcewake reference type from force_wake_get_any_engine() Matt Roper
@ 2025-11-17 22:19   ` Gustavo Sousa
  0 siblings, 0 replies; 39+ messages in thread
From: Gustavo Sousa @ 2025-11-17 22:19 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper

Quoting Matt Roper (2025-11-14 18:43:50-03:00)
>Adjust the signature of force_wake_get_any_engine() such that it returns
>a 'struct xe_force_wake_ref' rather than a boolean success/failure.
>Failure cases are now recognized by inspecting the hardware engine
>returned by reference; a NULL hwe indicates that no engine's forcewake
>could be obtained.
>
>These changes will make it cleaner and easier to incorporate scope-based
>cleanup in force_wake_get_any_engine()'s caller in a future patch.
>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>

>---
> drivers/gpu/drm/xe/xe_drm_client.c | 38 +++++++++++++++---------------
> 1 file changed, 19 insertions(+), 19 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_drm_client.c b/drivers/gpu/drm/xe/xe_drm_client.c
>index f931ff9b1ec0..78551832723b 100644
>--- a/drivers/gpu/drm/xe/xe_drm_client.c
>+++ b/drivers/gpu/drm/xe/xe_drm_client.c
>@@ -285,32 +285,31 @@ static struct xe_hw_engine *any_engine(struct xe_device *xe)
>         return NULL;
> }
> 
>-static bool force_wake_get_any_engine(struct xe_device *xe,
>-                                      struct xe_hw_engine **phwe,
>-                                      unsigned int *pfw_ref)
>+/*
>+ * Pick any engine and grab its forcewake.  On error phwe will be NULL and
>+ * the returned forcewake reference will be invalid.  Callers should check
>+ * phwe against NULL.
>+ */
>+static struct xe_force_wake_ref force_wake_get_any_engine(struct xe_device *xe,
>+                                                          struct xe_hw_engine **phwe)
> {
>         enum xe_force_wake_domains domain;
>-        unsigned int fw_ref;
>+        struct xe_force_wake_ref fw_ref = {};
>         struct xe_hw_engine *hwe;
>-        struct xe_force_wake *fw;
>+
>+        *phwe = NULL;
> 
>         hwe = any_engine(xe);
>         if (!hwe)
>-                return false;
>+                return fw_ref;        /* will be invalid */
> 
>         domain = xe_hw_engine_to_fw_domain(hwe);
>-        fw = gt_to_fw(hwe->gt);
> 
>-        fw_ref = xe_force_wake_get(fw, domain);
>-        if (!xe_force_wake_ref_has_domain(fw_ref, domain)) {
>-                xe_force_wake_put(fw, fw_ref);
>-                return false;
>-        }
>+        fw_ref = xe_force_wake_constructor(gt_to_fw(hwe->gt), domain);
>+        if (xe_force_wake_ref_has_domain(fw_ref.domains, domain))
>+                *phwe = hwe;        /* valid forcewake */
> 
>-        *phwe = hwe;
>-        *pfw_ref = fw_ref;
>-
>-        return true;
>+        return fw_ref;
> }
> 
> static void show_run_ticks(struct drm_printer *p, struct drm_file *file)
>@@ -322,7 +321,7 @@ static void show_run_ticks(struct drm_printer *p, struct drm_file *file)
>         struct xe_hw_engine *hwe;
>         struct xe_exec_queue *q;
>         u64 gpu_timestamp;
>-        unsigned int fw_ref;
>+        struct xe_force_wake_ref fw_ref;
> 
>         /*
>          * RING_TIMESTAMP registers are inaccessible in VF mode.
>@@ -340,7 +339,8 @@ static void show_run_ticks(struct drm_printer *p, struct drm_file *file)
>                        !atomic_read(&xef->exec_queue.pending_removal));
> 
>         xe_pm_runtime_get(xe);
>-        if (!force_wake_get_any_engine(xe, &hwe, &fw_ref)) {
>+        fw_ref = force_wake_get_any_engine(xe, &hwe);
>+        if (!hwe) {
>                 xe_pm_runtime_put(xe);
>                 return;
>         }
>@@ -360,7 +360,7 @@ static void show_run_ticks(struct drm_printer *p, struct drm_file *file)
> 
>         gpu_timestamp = xe_hw_engine_read_timestamp(hwe);
> 
>-        xe_force_wake_put(gt_to_fw(hwe->gt), fw_ref);
>+        xe_force_wake_put(gt_to_fw(hwe->gt), fw_ref.domains);
>         xe_pm_runtime_put(xe);
> 
>         for (class = 0; class < XE_ENGINE_CLASS_MAX; class++) {
>-- 
>2.51.1
>

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

* Re: [PATCH v3 15/27] drm/xe/drm_client: Use scope-based cleanup
  2025-11-14 21:43 ` [PATCH v3 15/27] drm/xe/drm_client: Use scope-based cleanup Matt Roper
@ 2025-11-17 22:28   ` Gustavo Sousa
  0 siblings, 0 replies; 39+ messages in thread
From: Gustavo Sousa @ 2025-11-17 22:28 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper

Quoting Matt Roper (2025-11-14 18:43:51-03:00)
>Use scope-based cleanup for forcewake and runtime PM.
>
>v2:
> - Use xe_force_wake_release_only rather than a custom one-off class for
>   "any engine" forcewake.  (Gustavo)
>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>

>---
> drivers/gpu/drm/xe/xe_drm_client.c | 39 +++++++++++++-----------------
> 1 file changed, 17 insertions(+), 22 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_drm_client.c b/drivers/gpu/drm/xe/xe_drm_client.c
>index 78551832723b..2787bbb36141 100644
>--- a/drivers/gpu/drm/xe/xe_drm_client.c
>+++ b/drivers/gpu/drm/xe/xe_drm_client.c
>@@ -321,7 +321,6 @@ static void show_run_ticks(struct drm_printer *p, struct drm_file *file)
>         struct xe_hw_engine *hwe;
>         struct xe_exec_queue *q;
>         u64 gpu_timestamp;
>-        struct xe_force_wake_ref fw_ref;
> 
>         /*
>          * RING_TIMESTAMP registers are inaccessible in VF mode.
>@@ -338,30 +337,26 @@ static void show_run_ticks(struct drm_printer *p, struct drm_file *file)
>         wait_var_event(&xef->exec_queue.pending_removal,
>                        !atomic_read(&xef->exec_queue.pending_removal));
> 
>-        xe_pm_runtime_get(xe);
>-        fw_ref = force_wake_get_any_engine(xe, &hwe);
>-        if (!hwe) {
>-                xe_pm_runtime_put(xe);
>-                return;
>-        }
>-
>-        /* Accumulate all the exec queues from this client */
>-        mutex_lock(&xef->exec_queue.lock);
>-        xa_for_each(&xef->exec_queue.xa, i, q) {
>-                xe_exec_queue_get(q);
>-                mutex_unlock(&xef->exec_queue.lock);
>-
>-                xe_exec_queue_update_run_ticks(q);
>+        scoped_guard(xe_pm_runtime, xe) {
>+                CLASS(xe_force_wake_release_only, fw_ref)(force_wake_get_any_engine(xe, &hwe));
>+                if (!hwe)
>+                        return;
> 
>+                /* Accumulate all the exec queues from this client */
>                 mutex_lock(&xef->exec_queue.lock);
>-                xe_exec_queue_put(q);
>+                xa_for_each(&xef->exec_queue.xa, i, q) {
>+                        xe_exec_queue_get(q);
>+                        mutex_unlock(&xef->exec_queue.lock);
>+
>+                        xe_exec_queue_update_run_ticks(q);
>+
>+                        mutex_lock(&xef->exec_queue.lock);
>+                        xe_exec_queue_put(q);
>+                }
>+                mutex_unlock(&xef->exec_queue.lock);
>+
>+                gpu_timestamp = xe_hw_engine_read_timestamp(hwe);
>         }
>-        mutex_unlock(&xef->exec_queue.lock);
>-
>-        gpu_timestamp = xe_hw_engine_read_timestamp(hwe);
>-
>-        xe_force_wake_put(gt_to_fw(hwe->gt), fw_ref.domains);
>-        xe_pm_runtime_put(xe);
> 
>         for (class = 0; class < XE_ENGINE_CLASS_MAX; class++) {
>                 const char *class_name;
>-- 
>2.51.1
>

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

end of thread, other threads:[~2025-11-17 22:29 UTC | newest]

Thread overview: 39+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-14 21:43 [PATCH v3 00/27] Scope-based forcewake and runtime PM Matt Roper
2025-11-14 21:43 ` [PATCH v3 01/27] drm/xe/forcewake: Add scope-based cleanup for forcewake Matt Roper
2025-11-17 22:03   ` Gustavo Sousa
2025-11-17 22:17     ` Gustavo Sousa
2025-11-14 21:43 ` [PATCH v3 02/27] drm/xe/pm: Add scope-based cleanup helper for runtime PM Matt Roper
2025-11-17 22:04   ` Gustavo Sousa
2025-11-14 21:43 ` [PATCH v3 03/27] drm/xe/gt: Use scope-based cleanup Matt Roper
2025-11-14 21:43 ` [PATCH v3 04/27] drm/xe/gt_idle: " Matt Roper
2025-11-14 21:43 ` [PATCH v3 05/27] drm/xe/guc: " Matt Roper
2025-11-14 21:43 ` [PATCH v3 06/27] drm/xe/guc_pc: " Matt Roper
2025-11-14 21:43 ` [PATCH v3 07/27] drm/xe/mocs: " Matt Roper
2025-11-14 21:43 ` [PATCH v3 08/27] drm/xe/pat: Use scope-based forcewake Matt Roper
2025-11-14 21:43 ` [PATCH v3 09/27] drm/xe/pxp: Use scope-based cleanup Matt Roper
2025-11-14 21:43 ` [PATCH v3 10/27] drm/xe/gsc: " Matt Roper
2025-11-14 21:43 ` [PATCH v3 11/27] drm/xe/device: " Matt Roper
2025-11-14 21:43 ` [PATCH v3 12/27] drm/xe/devcoredump: " Matt Roper
2025-11-17 22:09   ` Gustavo Sousa
2025-11-14 21:43 ` [PATCH v3 13/27] drm/xe/display: Use scoped-cleanup Matt Roper
2025-11-17 22:11   ` Gustavo Sousa
2025-11-14 21:43 ` [PATCH v3 14/27] drm/xe: Return forcewake reference type from force_wake_get_any_engine() Matt Roper
2025-11-17 22:19   ` Gustavo Sousa
2025-11-14 21:43 ` [PATCH v3 15/27] drm/xe/drm_client: Use scope-based cleanup Matt Roper
2025-11-17 22:28   ` Gustavo Sousa
2025-11-14 21:43 ` [PATCH v3 16/27] drm/xe/gt_debugfs: " Matt Roper
2025-11-14 21:43 ` [PATCH v3 17/27] drm/xe/huc: Use scope-based forcewake Matt Roper
2025-11-14 21:43 ` [PATCH v3 18/27] drm/xe/query: " Matt Roper
2025-11-14 21:43 ` [PATCH v3 19/27] drm/xe/reg_sr: " Matt Roper
2025-11-14 21:43 ` [PATCH v3 20/27] drm/xe/vram: " Matt Roper
2025-11-14 21:43 ` [PATCH v3 21/27] drm/xe/bo: Use scope-based runtime PM Matt Roper
2025-11-14 21:43 ` [PATCH v3 22/27] drm/xe/ggtt: Use scope-based runtime pm Matt Roper
2025-11-14 21:43 ` [PATCH v3 23/27] drm/xe/hwmon: Use scope-based runtime PM Matt Roper
2025-11-14 21:44 ` [PATCH v3 24/27] drm/xe/sriov: " Matt Roper
2025-11-14 21:44 ` [PATCH v3 25/27] drm/xe/tests: " Matt Roper
2025-11-14 21:44 ` [PATCH v3 26/27] drm/xe/sysfs: Use scope-based runtime power management Matt Roper
2025-11-14 21:44 ` [PATCH v3 27/27] drm/xe/debugfs: Use scope-based runtime PM Matt Roper
2025-11-14 23:22 ` ✗ CI.checkpatch: warning for Scope-based forcewake and runtime PM (rev4) Patchwork
2025-11-14 23:23 ` ✓ CI.KUnit: success " Patchwork
2025-11-15  0:14 ` ✓ Xe.CI.BAT: " Patchwork
2025-11-15 11:18 ` ✗ Xe.CI.Full: failure " Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox