Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/12] PF: Improve VF control
@ 2024-08-09 16:51 Michal Wajdeczko
  2024-08-09 16:51 ` [PATCH 01/12] drm/xe/pf: Add function to sanitize VF resources Michal Wajdeczko
                   ` (22 more replies)
  0 siblings, 23 replies; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-09 16:51 UTC (permalink / raw)
  To: intel-xe; +Cc: Michal Wajdeczko, Lucas De Marchi, Piotr Piórkowski

Our initial VF control implementation was focused on providing
a very minimal support for the VF_STATE_NOTIFY events just to
meet GuC requirements, without tracking a VF state or doing any
expected actions (like cleanup in case of the FLR notification).

Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: Piotr Piórkowski <piotr.piorkowski@intel.com>

Michal Wajdeczko (12):
  drm/xe/pf: Add function to sanitize VF resources
  drm/xe/pf: Fix documentation formatting
  drm/xe/pf: Drop GuC notifications for non-existing VF
  drm/xe/pf: Improve VF control
  drm/xe/tests: Allow deferred function call during KUnit test
  drm/xe/tests: Add helper macro to detect if KUnit is running
  drm/xe/tests: Add helpers to call stubs out of KUnit context
  drm/xe/guc: Define stub for xe_guc_ct_send_recv()
  drm/xe/pf: Define stub for pf_sanitize_vf_resources()
  drm/xe/pf: Define stub for pf_send_vf_control_cmd()
  drm/xe/tests: Add KUnit tests for VF control state machines
  drm/xe/tests: Add KUnit tests for VF control GuC messages

 .../xe/tests/xe_gt_sriov_pf_control_kunit.c   | 1554 +++++++++++++++++
 drivers/gpu/drm/xe/tests/xe_kunit_helpers.c   |  148 ++
 drivers/gpu/drm/xe/tests/xe_kunit_helpers.h   |   38 +
 drivers/gpu/drm/xe/tests/xe_test.h            |   77 +
 drivers/gpu/drm/xe/xe_gt_sriov_pf.c           |    6 +
 drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c    |   86 +
 drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h    |    1 +
 .../gpu/drm/xe/xe_gt_sriov_pf_config_types.h  |    5 +
 drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c   | 1271 +++++++++++++-
 drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h   |    3 +
 .../gpu/drm/xe/xe_gt_sriov_pf_control_types.h |  114 ++
 drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h     |    6 +
 drivers/gpu/drm/xe/xe_guc_ct.c                |    2 +
 drivers/gpu/drm/xe/xe_guc_ct_types.h          |    5 +
 14 files changed, 3275 insertions(+), 41 deletions(-)
 create mode 100644 drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
 create mode 100644 drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h

-- 
2.43.0


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

* [PATCH 01/12] drm/xe/pf: Add function to sanitize VF resources
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
@ 2024-08-09 16:51 ` Michal Wajdeczko
  2024-08-16 12:58   ` Piotr Piórkowski
  2024-08-19 20:47   ` Lucas De Marchi
  2024-08-09 16:51 ` [PATCH 02/12] drm/xe/pf: Fix documentation formatting Michal Wajdeczko
                   ` (21 subsequent siblings)
  22 siblings, 2 replies; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-09 16:51 UTC (permalink / raw)
  To: intel-xe; +Cc: Michal Wajdeczko

On current platforms it is a PF driver responsibility to clear
some of the VF's resources during a VF FLR. Add simple function
that will clear configured VF resources (GGTT, LMEM). We will
start using this function soon.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
---
 drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c | 84 ++++++++++++++++++++++
 drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h |  1 +
 2 files changed, 85 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c
index 227527785afd..eba6793294f3 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c
@@ -29,6 +29,7 @@
 #include "xe_guc_submit.h"
 #include "xe_lmtt.h"
 #include "xe_map.h"
+#include "xe_migrate.h"
 #include "xe_sriov.h"
 #include "xe_ttm_vram_mgr.h"
 #include "xe_wopcm.h"
@@ -1893,6 +1894,89 @@ int xe_gt_sriov_pf_config_release(struct xe_gt *gt, unsigned int vfid, bool forc
 	return force ? 0 : err;
 }
 
+static void pf_sanitize_ggtt(struct xe_tile *tile, struct drm_mm_node *node, unsigned int vfid)
+{
+	struct xe_ggtt *ggtt = tile->mem.ggtt;
+
+	if (drm_mm_node_allocated(node))
+		xe_ggtt_assign(ggtt, node, vfid);
+}
+
+static int pf_sanitize_lmem(struct xe_tile *tile, struct xe_bo *bo, long timeout)
+{
+	struct xe_migrate *m = tile->migrate;
+	struct dma_fence *fence;
+	int err;
+
+	if (!bo)
+		return 0;
+
+	xe_bo_lock(bo, false);
+	fence = xe_migrate_clear(m, bo, bo->ttm.resource);
+	if (IS_ERR(fence)) {
+		err = PTR_ERR(fence);
+	} else if (!fence) {
+		err = -ENOMEM;
+	} else {
+		long ret = dma_fence_wait_timeout(fence, false, timeout);
+
+		err = ret > 0 ? 0 : ret < 0 ? ret : -ETIMEDOUT;
+		dma_fence_put(fence);
+		if (!err)
+			xe_gt_sriov_dbg_verbose(tile->primary_gt, "LMEM cleared in %dms\n",
+						jiffies_to_msecs(timeout - ret));
+	}
+	xe_bo_unlock(bo);
+
+	return err;
+}
+
+static int pf_sanitize_vf_resources(struct xe_gt *gt, u32 vfid, long timeout)
+{
+	struct xe_gt_sriov_config *config = pf_pick_vf_config(gt, vfid);
+	struct xe_tile *tile = gt_to_tile(gt);
+	struct xe_device *xe = gt_to_xe(gt);
+	int err = 0;
+
+	/*
+	 * Only GGTT and LMEM requires to be cleared by the PF.
+	 * GuC doorbell IDs and context IDs do not need any clearing.
+	 */
+	if (!xe_gt_is_media_type(gt)) {
+		pf_sanitize_ggtt(tile, &config->ggtt_region, vfid);
+		if (IS_DGFX(xe))
+			err = pf_sanitize_lmem(tile, config->lmem_obj, timeout);
+	}
+
+	return err;
+}
+
+/**
+ * xe_gt_sriov_pf_config_sanitize() - Sanitize VF's resources.
+ * @gt: the &xe_gt
+ * @vfid: the VF identifier (can't be PF)
+ * @timeout: maximum timeout to wait for completion in jiffies
+ *
+ * This function can only be called on PF.
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
+int xe_gt_sriov_pf_config_sanitize(struct xe_gt *gt, unsigned int vfid, long timeout)
+{
+	int err;
+
+	xe_gt_assert(gt, vfid != PFID);
+
+	mutex_lock(xe_gt_sriov_pf_master_mutex(gt));
+	err = pf_sanitize_vf_resources(gt, vfid, timeout);
+	mutex_unlock(xe_gt_sriov_pf_master_mutex(gt));
+
+	if (unlikely(err))
+		xe_gt_sriov_notice(gt, "VF%u resource sanitizing failed (%pe)\n",
+				   vfid, ERR_PTR(err));
+	return err;
+}
+
 /**
  * xe_gt_sriov_pf_config_push - Reprovision VF's configuration.
  * @gt: the &xe_gt
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h
index c0e6e4743dc2..42e64769f666 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h
@@ -50,6 +50,7 @@ int xe_gt_sriov_pf_config_set_threshold(struct xe_gt *gt, unsigned int vfid,
 					enum xe_guc_klv_threshold_index index, u32 value);
 
 int xe_gt_sriov_pf_config_set_fair(struct xe_gt *gt, unsigned int vfid, unsigned int num_vfs);
+int xe_gt_sriov_pf_config_sanitize(struct xe_gt *gt, unsigned int vfid, long timeout);
 int xe_gt_sriov_pf_config_release(struct xe_gt *gt, unsigned int vfid, bool force);
 int xe_gt_sriov_pf_config_push(struct xe_gt *gt, unsigned int vfid, bool refresh);
 
-- 
2.43.0


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

* [PATCH 02/12] drm/xe/pf: Fix documentation formatting
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
  2024-08-09 16:51 ` [PATCH 01/12] drm/xe/pf: Add function to sanitize VF resources Michal Wajdeczko
@ 2024-08-09 16:51 ` Michal Wajdeczko
  2024-08-16 12:59   ` Piotr Piórkowski
  2024-08-09 16:51 ` [PATCH 03/12] drm/xe/pf: Drop GuC notifications for non-existing VF Michal Wajdeczko
                   ` (20 subsequent siblings)
  22 siblings, 1 reply; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-09 16:51 UTC (permalink / raw)
  To: intel-xe; +Cc: Michal Wajdeczko

Current formatting of "The VF FLR Flow with GuC" only looks fine,
but it will not render properly when included in htmldocs due to:

  WARNING: Block quote ends without a blank line; unexpected unindent.
  CRITICAL: Missing matching underline for section title overline.

Fix that by adding proper indent and using list markup.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
---
 drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c | 54 +++++++++++----------
 1 file changed, 28 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
index ebf06e037750..d11839d9e7d4 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
@@ -153,33 +153,35 @@ int xe_gt_sriov_pf_control_trigger_flr(struct xe_gt *gt, unsigned int vfid)
 /**
  * DOC: The VF FLR Flow with GuC
  *
- *          PF                        GUC             PCI
- * ========================================================
- *          |                          |               |
- * (1)      |                         [ ] <----- FLR --|
- *          |                         [ ]              :
- * (2)     [ ] <-------- NOTIFY FLR --[ ]
- *         [ ]                         |
- * (3)     [ ]                         |
- *         [ ]                         |
- *         [ ]-- START FLR ---------> [ ]
- *          |                         [ ]
- * (4)      |                         [ ]
- *          |                         [ ]
- *         [ ] <--------- FLR DONE -- [ ]
- *         [ ]                         |
- * (5)     [ ]                         |
- *         [ ]                         |
- *         [ ]-- FINISH FLR --------> [ ]
- *          |                          |
+ * The VF FLR flow includes several steps::
  *
- * Step 1: PCI HW generates interrupt to the GuC about VF FLR
- * Step 2: GuC FW sends G2H notification to the PF about VF FLR
- * Step 2a: on some platforms G2H is only received from root GuC
- * Step 3: PF sends H2G request to the GuC to start VF FLR sequence
- * Step 3a: on some platforms PF must send H2G to all other GuCs
- * Step 4: GuC FW performs VF FLR cleanups and notifies the PF when done
- * Step 5: PF performs VF FLR cleanups and notifies the GuC FW when finished
+ *	         PF                        GUC             PCI
+ *	========================================================
+ *	         |                          |               |
+ *	(1)      |                         [ ] <----- FLR --|
+ *	         |                         [ ]              :
+ *	(2)     [ ] <-------- NOTIFY FLR --[ ]
+ *	        [ ]                         |
+ *	(3)     [ ]                         |
+ *	        [ ]                         |
+ *	        [ ]-- START FLR ---------> [ ]
+ *	         |                         [ ]
+ *	(4)      |                         [ ]
+ *	         |                         [ ]
+ *	        [ ] <--------- FLR DONE -- [ ]
+ *	        [ ]                         |
+ *	(5)     [ ]                         |
+ *	        [ ]                         |
+ *	        [ ]-- FINISH FLR --------> [ ]
+ *	         |                          |
+ *
+ * * Step 1: PCI HW generates interrupt to the GuC about VF FLR
+ * * Step 2: GuC FW sends G2H notification to the PF about VF FLR
+ * * Step 2a: on some platforms G2H is only received from root GuC
+ * * Step 3: PF sends H2G request to the GuC to start VF FLR sequence
+ * * Step 3a: on some platforms PF must send H2G to all other GuCs
+ * * Step 4: GuC FW performs VF FLR cleanups and notifies the PF when done
+ * * Step 5: PF performs VF FLR cleanups and notifies the GuC FW when finished
  */
 
 static bool needs_dispatch_flr(struct xe_device *xe)
-- 
2.43.0


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

* [PATCH 03/12] drm/xe/pf: Drop GuC notifications for non-existing VF
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
  2024-08-09 16:51 ` [PATCH 01/12] drm/xe/pf: Add function to sanitize VF resources Michal Wajdeczko
  2024-08-09 16:51 ` [PATCH 02/12] drm/xe/pf: Fix documentation formatting Michal Wajdeczko
@ 2024-08-09 16:51 ` Michal Wajdeczko
  2024-08-16 13:01   ` Piotr Piórkowski
  2024-08-09 16:51 ` [PATCH 04/12] drm/xe/pf: Improve VF control Michal Wajdeczko
                   ` (19 subsequent siblings)
  22 siblings, 1 reply; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-09 16:51 UTC (permalink / raw)
  To: intel-xe; +Cc: Michal Wajdeczko

It is unlikely that GuC will ever send a G2H notification with an
invalid VFID and it is currently harmless if that actually happen.
But in upcoming patches we will start using that VFID as an index
and we must be sure it is a valid to avoid a crash due to a buggy
firmware or a currupted G2H message.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
---
 drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
index d11839d9e7d4..ad447d867e51 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
@@ -8,6 +8,7 @@
 #include "xe_device.h"
 #include "xe_gt.h"
 #include "xe_gt_sriov_pf_control.h"
+#include "xe_gt_sriov_pf_helpers.h"
 #include "xe_gt_sriov_printk.h"
 #include "xe_guc_ct.h"
 #include "xe_sriov.h"
@@ -212,6 +213,11 @@ static void pf_handle_vf_flr_done(struct xe_gt *gt, u32 vfid)
 
 static int pf_handle_vf_event(struct xe_gt *gt, u32 vfid, u32 eventid)
 {
+	xe_gt_sriov_dbg_verbose(gt, "received VF%u event %#x\n", vfid, eventid);
+
+	if (vfid > xe_gt_sriov_pf_get_totalvfs(gt))
+		return -EPROTO;
+
 	switch (eventid) {
 	case GUC_PF_NOTIFY_VF_FLR:
 		pf_handle_vf_flr(gt, vfid);
-- 
2.43.0


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

* [PATCH 04/12] drm/xe/pf: Improve VF control
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (2 preceding siblings ...)
  2024-08-09 16:51 ` [PATCH 03/12] drm/xe/pf: Drop GuC notifications for non-existing VF Michal Wajdeczko
@ 2024-08-09 16:51 ` Michal Wajdeczko
  2024-08-16 13:06   ` Piotr Piórkowski
  2024-08-20  7:56   ` Piotr Piórkowski
  2024-08-09 16:51 ` [PATCH 05/12] drm/xe/tests: Allow deferred function call during KUnit test Michal Wajdeczko
                   ` (18 subsequent siblings)
  22 siblings, 2 replies; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-09 16:51 UTC (permalink / raw)
  To: intel-xe; +Cc: Michal Wajdeczko, Piotr Piórkowski

Our initial VF control implementation was focused on providing
a very minimal support for the VF_STATE_NOTIFY events just to
meet GuC requirements, without tracking a VF state or doing any
expected actions (like cleanup in case of the FLR notification).

Try to improve this by defining set of VF state machines, each
responsible for processing one activity (PAUSE, RESUME, STOP or
FLR). All required steps defined by the VF state machine are then
executed by the PF worker from the dedicated workqueue.

Any external requests or notifications simply try to transition
between the states to trigger a work and then wait for that work
to finish. Some predefined default timeouts are used to avoid
changing existing API calls, but it should be easy to extend the
control API to also accept specific timeout values.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Piotr Piórkowski <piotr.piorkowski@intel.com>
---
 drivers/gpu/drm/xe/xe_gt_sriov_pf.c           |    6 +
 drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c   | 1203 ++++++++++++++++-
 drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h   |    3 +
 .../gpu/drm/xe/xe_gt_sriov_pf_control_types.h |  107 ++
 drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h     |    6 +
 5 files changed, 1310 insertions(+), 15 deletions(-)
 create mode 100644 drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h

diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf.c
index ef239440963c..905f409db74b 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_pf.c
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf.c
@@ -9,6 +9,7 @@
 
 #include "xe_gt_sriov_pf.h"
 #include "xe_gt_sriov_pf_config.h"
+#include "xe_gt_sriov_pf_control.h"
 #include "xe_gt_sriov_pf_helpers.h"
 #include "xe_gt_sriov_pf_service.h"
 #include "xe_mmio.h"
@@ -57,6 +58,10 @@ int xe_gt_sriov_pf_init_early(struct xe_gt *gt)
 	if (err)
 		return err;
 
+	err = xe_gt_sriov_pf_control_init(gt);
+	if (err)
+		return err;
+
 	return 0;
 }
 
@@ -93,4 +98,5 @@ void xe_gt_sriov_pf_init_hw(struct xe_gt *gt)
 void xe_gt_sriov_pf_restart(struct xe_gt *gt)
 {
 	xe_gt_sriov_pf_config_restart(gt);
+	xe_gt_sriov_pf_control_restart(gt);
 }
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
index ad447d867e51..1ed7d49bef8c 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
@@ -3,12 +3,17 @@
  * Copyright © 2023-2024 Intel Corporation
  */
 
+#include <drm/drm_managed.h>
+
 #include "abi/guc_actions_sriov_abi.h"
 
 #include "xe_device.h"
 #include "xe_gt.h"
+#include "xe_gt_sriov_pf_config.h"
 #include "xe_gt_sriov_pf_control.h"
 #include "xe_gt_sriov_pf_helpers.h"
+#include "xe_gt_sriov_pf_monitor.h"
+#include "xe_gt_sriov_pf_service.h"
 #include "xe_gt_sriov_printk.h"
 #include "xe_guc_ct.h"
 #include "xe_sriov.h"
@@ -42,10 +47,6 @@ static int guc_action_vf_control_cmd(struct xe_guc *guc, u32 vfid, u32 cmd)
 	};
 	int ret;
 
-	/* XXX those two commands are now sent from the G2H handler */
-	if (cmd == GUC_PF_TRIGGER_VF_FLR_START || cmd == GUC_PF_TRIGGER_VF_FLR_FINISH)
-		return xe_guc_ct_send_g2h_handler(&guc->ct, request, ARRAY_SIZE(request));
-
 	ret = xe_guc_ct_send_block(&guc->ct, request, ARRAY_SIZE(request));
 	return ret > 0 ? -EPROTO : ret;
 }
@@ -55,6 +56,8 @@ static int pf_send_vf_control_cmd(struct xe_gt *gt, unsigned int vfid, u32 cmd)
 	int err;
 
 	xe_gt_assert(gt, vfid != PFID);
+	xe_gt_sriov_dbg_verbose(gt, "sending VF%u control command %s\n",
+				vfid, control_cmd_to_string(cmd));
 
 	err = guc_action_vf_control_cmd(&gt->uc.guc, vfid, cmd);
 	if (unlikely(err))
@@ -88,6 +91,457 @@ static int pf_send_vf_flr_finish(struct xe_gt *gt, unsigned int vfid)
 	return pf_send_vf_control_cmd(gt, vfid, GUC_PF_TRIGGER_VF_FLR_FINISH);
 }
 
+/**
+ * DOC: The VF state machine
+ *
+ * The simplified VF state machine could be presented as::
+ *
+ *	               pause--------------------------o
+ *	              /                               |
+ *	             /                                v
+ *	      (READY)<------------------resume-----(PAUSED)
+ *	         ^   \                             /    /
+ *	         |    \                           /    /
+ *	         |     stop---->(STOPPED)<----stop    /
+ *	         |                  /                /
+ *	         |                 /                /
+ *	         o--------<-----flr                /
+ *	          \                               /
+ *	           o------<--------------------flr
+ *
+ * Where:
+ *
+ * * READY - represents a state in which VF is fully operable
+ * * PAUSED - represents a state in which VF activity is temporarily suspended
+ * * STOPPED - represents a state in which VF activity is definitely halted
+ * * pause - represents a request to temporarily suspend VF activity
+ * * resume - represents a request to resume VF activity
+ * * stop - represents a request to definitely halt VF activity
+ * * flr - represents a request to perform VF FLR to restore VF activity
+ *
+ * However, each state transition requires additional steps that involves
+ * communication with GuC that might fail or be interrupted by other requests::
+ *
+ *	                   .................................WIP....
+ *	                   :                                      :
+ *	          pause--------------------->PAUSE_WIP----------------------------o
+ *	         /         :                /         \           :               |
+ *	        /          :    o----<---stop          flr--o     :               |
+ *	       /           :    |           \         /     |     :               V
+ *	 (READY)<---------------+------------RESUME_WIP<----+--<-----resume--(PAUSED)
+ *	  ^ \  \           :    |                           |     :          /   /
+ *	  |  \  \          :    |                           |     :         /   /
+ *	  |   \  \         :    |                           |     :        /   /
+ *	  |    \  \        :    o----<----------------------+--<-------stop   /
+ *	  |     \  \       :    |                           |     :          /
+ *	  |      \  \      :    V                           |     :         /
+ *	  |       \  stop----->STOP_WIP---------flr--->-----o     :        /
+ *	  |        \       :    |                           |     :       /
+ *	  |         \      :    |                           V     :      /
+ *	  |          flr--------+----->----------------->FLR_WIP<-----flr
+ *	  |                :    |                        /  ^     :
+ *	  |                :    |                       /   |     :
+ *	  o--------<-------:----+-----<----------------o    |     :
+ *	                   :    |                           |     :
+ *	                   :....|...........................|.....:
+ *	                        |                           |
+ *	                        V                           |
+ *	                     (STOPPED)--------------------flr
+ *
+ * For details about each internal WIP state machine see:
+ *
+ * * `The VF PAUSE state machine`_
+ * * `The VF RESUME state machine`_
+ * * `The VF STOP state machine`_
+ * * `The VF FLR state machine`_
+ */
+
+#ifdef CONFIG_DRM_XE_DEBUG_SRIOV
+static const char *control_bit_to_string(enum xe_gt_sriov_control_bits bit)
+{
+	switch (bit) {
+#define CASE2STR(_X) \
+	case XE_GT_SRIOV_STATE_##_X: return #_X
+	CASE2STR(WIP);
+	CASE2STR(FLR_WIP);
+	CASE2STR(FLR_SEND_START);
+	CASE2STR(FLR_WAIT_GUC);
+	CASE2STR(FLR_GUC_DONE);
+	CASE2STR(FLR_RESET_CONFIG);
+	CASE2STR(FLR_RESET_DATA);
+	CASE2STR(FLR_RESET_MMIO);
+	CASE2STR(FLR_SEND_FINISH);
+	CASE2STR(FLR_FAILED);
+	CASE2STR(PAUSE_WIP);
+	CASE2STR(PAUSE_SEND_PAUSE);
+	CASE2STR(PAUSE_WAIT_GUC);
+	CASE2STR(PAUSE_GUC_DONE);
+	CASE2STR(PAUSE_FAILED);
+	CASE2STR(PAUSED);
+	CASE2STR(RESUME_WIP);
+	CASE2STR(RESUME_SEND_RESUME);
+	CASE2STR(RESUME_FAILED);
+	CASE2STR(RESUMED);
+	CASE2STR(STOP_WIP);
+	CASE2STR(STOP_SEND_STOP);
+	CASE2STR(STOP_FAILED);
+	CASE2STR(STOPPED);
+	CASE2STR(MISMATCH);
+#undef  CASE2STR
+	default: return "?";
+	}
+}
+#endif
+
+static unsigned long pf_get_default_timeout(enum xe_gt_sriov_control_bits bit)
+{
+	switch (bit) {
+	case XE_GT_SRIOV_STATE_FLR_WAIT_GUC:
+	case XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC:
+		return HZ / 2;
+	case XE_GT_SRIOV_STATE_FLR_WIP:
+	case XE_GT_SRIOV_STATE_FLR_RESET_CONFIG:
+		return 5 * HZ;
+	default:
+		return HZ;
+	}
+}
+
+static unsigned long *pf_peek_vf_state(struct xe_gt *gt, unsigned int vfid)
+{
+	xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
+	xe_gt_assert(gt, vfid <= xe_gt_sriov_pf_get_totalvfs(gt));
+
+	return &gt->sriov.pf.vfs[vfid].control.state;
+}
+
+static bool pf_check_vf_state(struct xe_gt *gt, unsigned int vfid,
+			      enum xe_gt_sriov_control_bits bit)
+{
+	return test_bit(bit, pf_peek_vf_state(gt, vfid));
+}
+
+static void pf_dump_vf_state(struct xe_gt *gt, unsigned int vfid)
+{
+	unsigned long state = *pf_peek_vf_state(gt, vfid);
+	enum xe_gt_sriov_control_bits bit;
+
+	if (state) {
+		xe_gt_sriov_dbg_verbose(gt, "VF%u state %#lx%s%*pbl\n",
+					vfid, state, state ? " bits " : "",
+					(int)BITS_PER_LONG, &state);
+		for_each_set_bit(bit, &state, BITS_PER_LONG)
+			xe_gt_sriov_dbg_verbose(gt, "VF%u state %s(%d)\n",
+						vfid, control_bit_to_string(bit), bit);
+	} else {
+		xe_gt_sriov_dbg_verbose(gt, "VF%u state READY\n", vfid);
+	}
+}
+
+static bool pf_expect_vf_state(struct xe_gt *gt, unsigned int vfid,
+			       enum xe_gt_sriov_control_bits bit)
+{
+	bool result = pf_check_vf_state(gt, vfid, bit);
+
+	if (unlikely(!result))
+		pf_dump_vf_state(gt, vfid);
+
+	return result;
+}
+
+static bool pf_expect_vf_not_state(struct xe_gt *gt, unsigned int vfid,
+				   enum xe_gt_sriov_control_bits bit)
+{
+	bool result = !pf_check_vf_state(gt, vfid, bit);
+
+	if (unlikely(!result))
+		pf_dump_vf_state(gt, vfid);
+
+	return result;
+}
+
+static bool pf_enter_vf_state(struct xe_gt *gt, unsigned int vfid,
+			      enum xe_gt_sriov_control_bits bit)
+{
+	if (!test_and_set_bit(bit, pf_peek_vf_state(gt, vfid))) {
+		xe_gt_sriov_dbg_verbose(gt, "VF%u state %s(%d) enter\n",
+					vfid, control_bit_to_string(bit), bit);
+		return true;
+	}
+	return false;
+}
+
+static bool pf_exit_vf_state(struct xe_gt *gt, unsigned int vfid,
+			     enum xe_gt_sriov_control_bits bit)
+{
+	if (test_and_clear_bit(bit, pf_peek_vf_state(gt, vfid))) {
+		xe_gt_sriov_dbg_verbose(gt, "VF%u state %s(%d) exit\n",
+					vfid, control_bit_to_string(bit), bit);
+		return true;
+	}
+	return false;
+}
+
+static void pf_escape_vf_state(struct xe_gt *gt, unsigned int vfid,
+			       enum xe_gt_sriov_control_bits bit)
+{
+	if (pf_exit_vf_state(gt, vfid, bit))
+		xe_gt_sriov_dbg_verbose(gt, "VF%u state %s(%d) escaped by %ps\n",
+					vfid, control_bit_to_string(bit), bit,
+					__builtin_return_address(0));
+}
+
+static void pf_enter_vf_mismatch(struct xe_gt *gt, unsigned int vfid)
+{
+	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_MISMATCH)) {
+		xe_gt_sriov_dbg(gt, "VF%u state mismatch detected by %ps\n",
+				vfid, __builtin_return_address(0));
+		pf_dump_vf_state(gt, vfid);
+	}
+}
+
+static void pf_exit_vf_mismatch(struct xe_gt *gt, unsigned int vfid)
+{
+	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_MISMATCH))
+		xe_gt_sriov_dbg(gt, "VF%u state mismatch cleared by %ps\n",
+				vfid, __builtin_return_address(0));
+
+	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_FAILED);
+	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_FAILED);
+	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_FAILED);
+	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_FAILED);
+}
+
+#define pf_enter_vf_state_machine_bug(gt, vfid) ({	\
+	pf_enter_vf_mismatch((gt), (vfid));		\
+})
+
+static struct xe_gt_sriov_control_state *pf_pick_vf_control(struct xe_gt *gt, unsigned int vfid)
+{
+	xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
+	xe_gt_assert(gt, vfid <= xe_gt_sriov_pf_get_totalvfs(gt));
+
+	return &gt->sriov.pf.vfs[vfid].control;
+}
+
+static void pf_queue_control_worker(struct xe_gt *gt)
+{
+	struct xe_device *xe = gt_to_xe(gt);
+
+	xe_gt_assert(gt, IS_SRIOV_PF(xe));
+
+	queue_work(xe->sriov.wq, &gt->sriov.pf.control.worker);
+}
+
+static void pf_queue_vf(struct xe_gt *gt, unsigned int vfid)
+{
+	struct xe_gt_sriov_pf_control *pfc = &gt->sriov.pf.control;
+
+	xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
+
+	spin_lock(&pfc->lock);
+	list_move_tail(&gt->sriov.pf.vfs[vfid].control.link, &pfc->list);
+	spin_unlock(&pfc->lock);
+
+	pf_queue_control_worker(gt);
+}
+
+static void pf_exit_vf_flr_wip(struct xe_gt *gt, unsigned int vfid);
+static void pf_exit_vf_stop_wip(struct xe_gt *gt, unsigned int vfid);
+static void pf_exit_vf_pause_wip(struct xe_gt *gt, unsigned int vfid);
+static void pf_exit_vf_resume_wip(struct xe_gt *gt, unsigned int vfid);
+
+static bool pf_enter_vf_wip(struct xe_gt *gt, unsigned int vfid)
+{
+	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_WIP)) {
+		struct xe_gt_sriov_control_state *cs = pf_pick_vf_control(gt, vfid);
+
+		reinit_completion(&cs->done);
+		return true;
+	}
+	return false;
+}
+
+static void pf_exit_vf_wip(struct xe_gt *gt, unsigned int vfid)
+{
+	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_WIP)) {
+		struct xe_gt_sriov_control_state *cs = pf_pick_vf_control(gt, vfid);
+
+		pf_exit_vf_flr_wip(gt, vfid);
+		pf_exit_vf_stop_wip(gt, vfid);
+		pf_exit_vf_pause_wip(gt, vfid);
+		pf_exit_vf_resume_wip(gt, vfid);
+
+		complete_all(&cs->done);
+	}
+}
+
+static int pf_wait_vf_wip_done(struct xe_gt *gt, unsigned int vfid, unsigned long timeout)
+{
+	struct xe_gt_sriov_control_state *cs = pf_pick_vf_control(gt, vfid);
+
+	return wait_for_completion_timeout(&cs->done, timeout) ? 0 : -ETIMEDOUT;
+}
+
+static void pf_enter_vf_ready(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED);
+	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED);
+	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED);
+	pf_exit_vf_mismatch(gt, vfid);
+	pf_exit_vf_wip(gt, vfid);
+}
+
+/**
+ * DOC: The VF PAUSE state machine
+ *
+ * The VF PAUSE state machine looks like::
+ *
+ *	 (READY,RESUMED)<-------------<---------------------o---------o
+ *	    |                                                \         \
+ *	   pause                                              \         \
+ *	    |                                                  \         \
+ *	....V...........................PAUSE_WIP........       \         \
+ *	:    \                                          :        o         \
+ *	:     \   o------<-----busy                     :        |          \
+ *	:      \ /              /                       :        |           |
+ *	:       PAUSE_SEND_PAUSE ---failed--->----------o--->(PAUSE_FAILED)  |
+ *	:        |              \                       :        |           |
+ *	:      acked             rejected---->----------o--->(MISMATCH)     /
+ *	:        |                                      :                  /
+ *	:        v                                      :                 /
+ *	:       PAUSE_WAIT_GUC                          :                /
+ *	:        |                                      :               /
+ *	:       done                                    :              /
+ *	:        |                                      :             /
+ *	:        v                                      :            /
+ *	:       PAUSE_GUC_DONE                          o-----restart
+ *	:      /                                        :
+ *	:     /                                         :
+ *	:....o..............o...............o...........:
+ *	     |              |               |
+ *	  completed        flr             stop
+ *	     |              |               |
+ *	     V         .....V.....    ......V.....
+ *	 (PAUSED)      : FLR_WIP :    : STOP_WIP :
+ *	               :.........:    :..........:
+ *
+ * For the full state machine view, see `The VF state machine`_.
+ */
+
+static void pf_exit_vf_pause_wip(struct xe_gt *gt, unsigned int vfid)
+{
+	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WIP)) {
+		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE);
+		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC);
+		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_GUC_DONE);
+	}
+}
+
+static void pf_enter_vf_paused(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED))
+		pf_enter_vf_state_machine_bug(gt, vfid);
+
+	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED);
+	pf_exit_vf_mismatch(gt, vfid);
+	pf_exit_vf_wip(gt, vfid);
+}
+
+static void pf_enter_vf_pause_completed(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_enter_vf_paused(gt, vfid);
+}
+
+static void pf_enter_vf_pause_failed(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_FAILED);
+	pf_exit_vf_wip(gt, vfid);
+}
+
+static void pf_enter_vf_pause_rejected(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_enter_vf_mismatch(gt, vfid);
+	pf_enter_vf_pause_failed(gt, vfid);
+}
+
+static bool pf_exit_vf_pause_guc_done(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_GUC_DONE))
+		return false;
+
+	pf_enter_vf_pause_completed(gt, vfid);
+	return true;
+}
+
+static void pf_enter_vf_pause_guc_done(struct xe_gt *gt, unsigned int vfid)
+{
+	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_GUC_DONE))
+		pf_queue_vf(gt, vfid);
+}
+
+static void pf_enter_pause_wait_guc(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC))
+		pf_enter_vf_state_machine_bug(gt, vfid);
+}
+
+static bool pf_exit_pause_wait_guc(struct xe_gt *gt, unsigned int vfid)
+{
+	return pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC);
+}
+
+static void pf_enter_vf_pause_send_pause(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE))
+		pf_enter_vf_state_machine_bug(gt, vfid);
+
+	pf_queue_vf(gt, vfid);
+}
+
+static bool pf_exit_vf_pause_send_pause(struct xe_gt *gt, unsigned int vfid)
+{
+	int err;
+
+	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE))
+		return false;
+
+	/* GuC may actually send a PAUSE_DONE before we get a RESPONSE */
+	pf_enter_pause_wait_guc(gt, vfid);
+
+	err = pf_send_vf_pause(gt, vfid);
+	if (err) {
+		/* send failed, so we shouldn't expect PAUSE_DONE from GuC */
+		pf_exit_pause_wait_guc(gt, vfid);
+
+		if (err == -EBUSY)
+			pf_enter_vf_pause_send_pause(gt, vfid);
+		else if (err == -EIO)
+			pf_enter_vf_pause_rejected(gt, vfid);
+		else
+			pf_enter_vf_pause_failed(gt, vfid);
+	} else {
+		/*
+		 * we have already moved to WAIT_GUC, maybe even to GUC_DONE
+		 * but since GuC didn't complain, we may clear MISMATCH
+		 */
+		pf_exit_vf_mismatch(gt, vfid);
+	}
+
+	return true;
+}
+
+static bool pf_enter_vf_pause_wip(struct xe_gt *gt, unsigned int vfid)
+{
+	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WIP)) {
+		pf_enter_vf_wip(gt, vfid);
+		pf_enter_vf_pause_send_pause(gt, vfid);
+		return true;
+	}
+
+	return false;
+}
+
 /**
  * xe_gt_sriov_pf_control_pause_vf - Pause a VF.
  * @gt: the &xe_gt
@@ -99,7 +553,140 @@ static int pf_send_vf_flr_finish(struct xe_gt *gt, unsigned int vfid)
  */
 int xe_gt_sriov_pf_control_pause_vf(struct xe_gt *gt, unsigned int vfid)
 {
-	return pf_send_vf_pause(gt, vfid);
+	unsigned long timeout = pf_get_default_timeout(XE_GT_SRIOV_STATE_PAUSE_WIP);
+	int err;
+
+	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED)) {
+		xe_gt_sriov_dbg(gt, "VF%u is stopped!\n", vfid);
+		return -EPERM;
+	}
+
+	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED)) {
+		xe_gt_sriov_dbg(gt, "VF%u was already paused!\n", vfid);
+		return -ESTALE;
+	}
+
+	if (!pf_enter_vf_pause_wip(gt, vfid)) {
+		xe_gt_sriov_dbg(gt, "VF%u pause already in progress!\n", vfid);
+		return -EALREADY;
+	}
+
+	err = pf_wait_vf_wip_done(gt, vfid, timeout);
+	if (err) {
+		xe_gt_sriov_dbg(gt, "VF%u pause didn't finish in %u ms (%pe)\n",
+				vfid, jiffies_to_msecs(timeout), ERR_PTR(err));
+		return err;
+	}
+
+	if (pf_expect_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED)) {
+		xe_gt_sriov_info(gt, "VF%u paused!\n", vfid);
+		return 0;
+	}
+
+	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_FAILED)) {
+		xe_gt_sriov_dbg(gt, "VF%u pause failed!\n", vfid);
+		return -EIO;
+	}
+
+	xe_gt_sriov_dbg(gt, "VF%u pause was canceled!\n", vfid);
+	return -ECANCELED;
+}
+
+/**
+ * DOC: The VF RESUME state machine
+ *
+ * The VF RESUME state machine looks like::
+ *
+ *	 (PAUSED)<-----------------<------------------------o
+ *	    |                                                \
+ *	   resume                                             \
+ *	    |                                                  \
+ *	....V............................RESUME_WIP......       \
+ *	:    \                                          :        o
+ *	:     \   o-------<-----busy                    :        |
+ *	:      \ /                /                     :        |
+ *	:       RESUME_SEND_RESUME ---failed--->--------o--->(RESUME_FAILED)
+ *	:       /                \                      :        |
+ *	:    acked                rejected---->---------o--->(MISMATCH)
+ *	:     /                                         :
+ *	:....o..............o...............o.....o.....:
+ *	     |              |               |      \
+ *	  completed        flr            stop      restart-->(READY)
+ *	     |              |               |
+ *	     V         .....V.....    ......V.....
+ *	 (RESUMED)     : FLR_WIP :    : STOP_WIP :
+ *	               :.........:    :..........:
+ *
+ * For the full state machine view, see `The VF state machine`_.
+ */
+
+static void pf_exit_vf_resume_wip(struct xe_gt *gt, unsigned int vfid)
+{
+	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_WIP))
+		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_SEND_RESUME);
+}
+
+static void pf_enter_vf_resumed(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED);
+	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED);
+	pf_exit_vf_mismatch(gt, vfid);
+	pf_exit_vf_wip(gt, vfid);
+}
+
+static void pf_enter_vf_resume_completed(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_enter_vf_resumed(gt, vfid);
+}
+
+static void pf_enter_vf_resume_failed(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_FAILED);
+	pf_exit_vf_wip(gt, vfid);
+}
+
+static void pf_enter_vf_resume_rejected(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_enter_vf_mismatch(gt, vfid);
+	pf_enter_vf_resume_failed(gt, vfid);
+}
+
+static void pf_enter_vf_resume_send_resume(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_SEND_RESUME))
+		pf_enter_vf_state_machine_bug(gt, vfid);
+
+	pf_queue_vf(gt, vfid);
+}
+
+static bool pf_exit_vf_resume_send_resume(struct xe_gt *gt, unsigned int vfid)
+{
+	int err;
+
+	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_SEND_RESUME))
+		return false;
+
+	err = pf_send_vf_resume(gt, vfid);
+	if (err == -EBUSY)
+		pf_enter_vf_resume_send_resume(gt, vfid);
+	else if (err == -EIO)
+		pf_enter_vf_resume_rejected(gt, vfid);
+	else if (err)
+		pf_enter_vf_resume_failed(gt, vfid);
+	else
+		pf_enter_vf_resume_completed(gt, vfid);
+	return true;
+}
+
+static bool pf_enter_vf_resume_wip(struct xe_gt *gt, unsigned int vfid)
+{
+	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_WIP)) {
+		pf_enter_vf_wip(gt, vfid);
+		pf_enter_vf_resume_send_resume(gt, vfid);
+		return true;
+	}
+
+	return false;
 }
 
 /**
@@ -113,7 +700,133 @@ int xe_gt_sriov_pf_control_pause_vf(struct xe_gt *gt, unsigned int vfid)
  */
 int xe_gt_sriov_pf_control_resume_vf(struct xe_gt *gt, unsigned int vfid)
 {
-	return pf_send_vf_resume(gt, vfid);
+	int err;
+
+	if (!pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED)) {
+		xe_gt_sriov_dbg(gt, "VF%u is not paused!\n", vfid);
+		return -EPERM;
+	}
+
+	if (!pf_enter_vf_resume_wip(gt, vfid)) {
+		xe_gt_sriov_dbg(gt, "VF%u resume already in progress!\n", vfid);
+		return -EALREADY;
+	}
+
+	err = pf_wait_vf_wip_done(gt, vfid, 2 * HZ);
+	if (err)
+		return err;
+
+	if (pf_expect_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED)) {
+		xe_gt_sriov_info(gt, "VF%u resumed!\n", vfid);
+		return 0;
+	}
+
+	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_FAILED)) {
+		xe_gt_sriov_dbg(gt, "VF%u resume failed!\n", vfid);
+		return -EIO;
+	}
+
+	xe_gt_sriov_dbg(gt, "VF%u resume was canceled!\n", vfid);
+	return -ECANCELED;
+}
+
+/**
+ * DOC: The VF STOP state machine
+ *
+ * The VF STOP state machine looks like::
+ *
+ *	 (READY,PAUSED,RESUMED)<-------<--------------------o
+ *	    |                                                \
+ *	   stop                                               \
+ *	    |                                                  \
+ *	....V..............................STOP_WIP......       \
+ *	:    \                                          :        o
+ *	:     \   o----<----busy                        :        |
+ *	:      \ /            /                         :        |
+ *	:       STOP_SEND_STOP--------failed--->--------o--->(STOP_FAILED)
+ *	:       /             \                         :        |
+ *	:    acked             rejected-------->--------o--->(MISMATCH)
+ *	:     /                                         :
+ *	:....o..............o...............o...........:
+ *	     |              |               |
+ *	  completed        flr            restart
+ *	     |              |               |
+ *	     V         .....V.....          V
+ *	 (STOPPED)     : FLR_WIP :       (READY)
+ *	               :.........:
+ *
+ * For the full state machine view, see `The VF state machine`_.
+ */
+
+static void pf_exit_vf_stop_wip(struct xe_gt *gt, unsigned int vfid)
+{
+	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_WIP))
+		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_SEND_STOP);
+}
+
+static void pf_enter_vf_stopped(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED))
+		pf_enter_vf_state_machine_bug(gt, vfid);
+
+	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED);
+	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED);
+	pf_exit_vf_mismatch(gt, vfid);
+	pf_exit_vf_wip(gt, vfid);
+}
+
+static void pf_enter_vf_stop_completed(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_enter_vf_stopped(gt, vfid);
+}
+
+static void pf_enter_vf_stop_failed(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_FAILED);
+	pf_exit_vf_wip(gt, vfid);
+}
+
+static void pf_enter_vf_stop_rejected(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_enter_vf_mismatch(gt, vfid);
+	pf_enter_vf_stop_failed(gt, vfid);
+}
+
+static void pf_enter_vf_stop_send_stop(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_SEND_STOP))
+		pf_enter_vf_state_machine_bug(gt, vfid);
+
+	pf_queue_vf(gt, vfid);
+}
+
+static bool pf_exit_vf_stop_send_stop(struct xe_gt *gt, unsigned int vfid)
+{
+	int err;
+
+	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_SEND_STOP))
+		return false;
+
+	err = pf_send_vf_stop(gt, vfid);
+	if (err == -EBUSY)
+		pf_enter_vf_stop_send_stop(gt, vfid);
+	else if (err == -EIO)
+		pf_enter_vf_stop_rejected(gt, vfid);
+	else if (err)
+		pf_enter_vf_stop_failed(gt, vfid);
+	else
+		pf_enter_vf_stop_completed(gt, vfid);
+	return true;
+}
+
+static bool pf_enter_vf_stop_wip(struct xe_gt *gt, unsigned int vfid)
+{
+	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_WIP)) {
+		pf_enter_vf_wip(gt, vfid);
+		pf_enter_vf_stop_send_stop(gt, vfid);
+		return true;
+	}
+	return false;
 }
 
 /**
@@ -127,7 +840,279 @@ int xe_gt_sriov_pf_control_resume_vf(struct xe_gt *gt, unsigned int vfid)
  */
 int xe_gt_sriov_pf_control_stop_vf(struct xe_gt *gt, unsigned int vfid)
 {
-	return pf_send_vf_stop(gt, vfid);
+	int err;
+
+	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED)) {
+		xe_gt_sriov_dbg(gt, "VF%u was already stopped!\n", vfid);
+		return -ESTALE;
+	}
+
+	if (!pf_enter_vf_stop_wip(gt, vfid)) {
+		xe_gt_sriov_dbg(gt, "VF%u stop already in progress!\n", vfid);
+		return -EALREADY;
+	}
+
+	err = pf_wait_vf_wip_done(gt, vfid, 2 * HZ);
+	if (err)
+		return err;
+
+	if (pf_expect_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED)) {
+		xe_gt_sriov_info(gt, "VF%u stopped!\n", vfid);
+		return 0;
+	}
+
+	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_FAILED)) {
+		xe_gt_sriov_dbg(gt, "VF%u stop failed!\n", vfid);
+		return -EIO;
+	}
+
+	xe_gt_sriov_dbg(gt, "VF%u stop was canceled!\n", vfid);
+	return -ECANCELED;
+}
+
+/**
+ * DOC: The VF FLR state machine
+ *
+ * The VF FLR state machine looks like::
+ *
+ *	 (READY,PAUSED,STOPPED)<------------<--------------o
+ *	    |                                               \
+ *	   flr                                               \
+ *	    |                                                 \
+ *	....V..........................FLR_WIP...........      \
+ *	:    \                                          :       \
+ *	:     \   o----<----busy                        :        |
+ *	:      \ /            /                         :        |
+ *	:       FLR_SEND_START---failed----->-----------o--->(FLR_FAILED)<---o
+ *	:        |            \                         :        |           |
+ *	:      acked           rejected----->-----------o--->(MISMATCH)      |
+ *	:        |                                      :        ^           |
+ *	:        v                                      :        |           |
+ *	:       FLR_WAIT_GUC                            :        |           |
+ *	:        |                                      :        |           |
+ *	:       done                                    :        |           |
+ *	:        |                                      :        |           |
+ *	:        v                                      :        |           |
+ *	:       FLR_GUC_DONE                            :        |           |
+ *	:        |                                      :        |           |
+ *	:       FLR_RESET_CONFIG---failed--->-----------o--------+-----------o
+ *	:        |                                      :        |           |
+ *	:       FLR_RESET_DATA                          :        |           |
+ *	:        |                                      :        |           |
+ *	:       FLR_RESET_MMIO                          :        |           |
+ *	:        |                                      :        |           |
+ *	:        | o----<----busy                       :        |           |
+ *	:        |/            /                        :        |           |
+ *	:       FLR_SEND_FINISH----failed--->-----------o--------+-----------o
+ *	:       /             \                         :        |
+ *	:     acked            rejected----->-----------o--------o
+ *	:     /                                         :
+ *	:....o..............................o...........:
+ *	     |                              |
+ *	  completed                       restart
+ *	     |                             /
+ *	     V                            /
+ *	  (READY)<----------<------------o
+ *
+ * For the full state machine view, see `The VF state machine`_.
+ */
+
+static void pf_enter_vf_flr_send_start(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_START))
+		pf_enter_vf_state_machine_bug(gt, vfid);
+
+	pf_queue_vf(gt, vfid);
+}
+
+static void pf_enter_vf_flr_wip(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WIP)) {
+		xe_gt_sriov_dbg(gt, "VF%u FLR is already in progress\n", vfid);
+		return;
+	}
+
+	pf_enter_vf_wip(gt, vfid);
+	pf_enter_vf_flr_send_start(gt, vfid);
+}
+
+static void pf_exit_vf_flr_wip(struct xe_gt *gt, unsigned int vfid)
+{
+	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WIP)) {
+		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_FINISH);
+		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_MMIO);
+		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_DATA);
+		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_CONFIG);
+		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_GUC_DONE);
+		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WAIT_GUC);
+		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_START);
+	}
+}
+
+static void pf_enter_vf_flr_completed(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_enter_vf_ready(gt, vfid);
+}
+
+static void pf_enter_vf_flr_failed(struct xe_gt *gt, unsigned int vfid)
+{
+	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_FAILED))
+		xe_gt_sriov_notice(gt, "VF%u FLR failed!\n", vfid);
+	pf_exit_vf_wip(gt, vfid);
+}
+
+static void pf_enter_vf_flr_rejected(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_enter_vf_mismatch(gt, vfid);
+	pf_enter_vf_flr_failed(gt, vfid);
+}
+
+static void pf_enter_vf_flr_send_finish(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_FINISH))
+		pf_enter_vf_state_machine_bug(gt, vfid);
+
+	pf_queue_vf(gt, vfid);
+}
+
+static bool pf_exit_vf_flr_send_finish(struct xe_gt *gt, unsigned int vfid)
+{
+	int err;
+
+	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_FINISH))
+		return false;
+
+	err = pf_send_vf_flr_finish(gt, vfid);
+	if (err == -EBUSY)
+		pf_enter_vf_flr_send_finish(gt, vfid);
+	else if (err == -EIO)
+		pf_enter_vf_flr_rejected(gt, vfid);
+	else if (err)
+		pf_enter_vf_flr_failed(gt, vfid);
+	else
+		pf_enter_vf_flr_completed(gt, vfid);
+	return true;
+}
+
+static void pf_enter_vf_flr_reset_mmio(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_MMIO))
+		pf_enter_vf_state_machine_bug(gt, vfid);
+
+	pf_queue_vf(gt, vfid);
+}
+
+static bool pf_exit_vf_flr_reset_mmio(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_MMIO))
+		return false;
+
+	/* XXX: placeholder */
+
+	pf_enter_vf_flr_send_finish(gt, vfid);
+	return true;
+}
+
+static void pf_enter_vf_flr_reset_data(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_DATA))
+		pf_enter_vf_state_machine_bug(gt, vfid);
+
+	pf_queue_vf(gt, vfid);
+}
+
+static bool pf_exit_vf_flr_reset_data(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_DATA))
+		return false;
+
+	xe_gt_sriov_pf_service_reset(gt, vfid);
+	xe_gt_sriov_pf_monitor_flr(gt, vfid);
+
+	pf_enter_vf_flr_reset_mmio(gt, vfid);
+	return true;
+}
+
+static void pf_enter_vf_flr_reset_config(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_CONFIG))
+		pf_enter_vf_state_machine_bug(gt, vfid);
+
+	pf_queue_vf(gt, vfid);
+}
+
+static bool pf_exit_vf_flr_reset_config(struct xe_gt *gt, unsigned int vfid)
+{
+	unsigned long timeout = pf_get_default_timeout(XE_GT_SRIOV_STATE_FLR_RESET_CONFIG);
+	int err;
+
+	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_CONFIG))
+		return false;
+
+	err = xe_gt_sriov_pf_config_sanitize(gt, vfid, timeout);
+	if (err)
+		pf_enter_vf_flr_failed(gt, vfid);
+	else
+		pf_enter_vf_flr_reset_data(gt, vfid);
+	return true;
+}
+
+static void pf_enter_vf_flr_wait_guc(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WAIT_GUC))
+		pf_enter_vf_state_machine_bug(gt, vfid);
+}
+
+static bool pf_exit_vf_flr_wait_guc(struct xe_gt *gt, unsigned int vfid)
+{
+	return pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WAIT_GUC);
+}
+
+static bool pf_exit_vf_flr_send_start(struct xe_gt *gt, unsigned int vfid)
+{
+	int err;
+
+	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_START))
+		return false;
+
+	/* GuC may actually send a FLR_DONE before we get a RESPONSE */
+	pf_enter_vf_flr_wait_guc(gt, vfid);
+
+	err = pf_send_vf_flr_start(gt, vfid);
+	if (err) {
+		/* send failed, so we shouldn't expect FLR_DONE from GuC */
+		pf_exit_vf_flr_wait_guc(gt, vfid);
+
+		if (err == -EBUSY)
+			pf_enter_vf_flr_send_start(gt, vfid);
+		else if (err == -EIO)
+			pf_enter_vf_flr_rejected(gt, vfid);
+		else
+			pf_enter_vf_flr_failed(gt, vfid);
+	} else {
+		/*
+		 * we have already moved to WAIT_GUC, maybe even to GUC_DONE
+		 * but since GuC didn't complain, we may clear MISMATCH
+		 */
+		pf_exit_vf_mismatch(gt, vfid);
+	}
+
+	return true;
+}
+
+static bool pf_exit_vf_flr_guc_done(struct xe_gt *gt, unsigned int vfid)
+{
+	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_GUC_DONE))
+		return false;
+
+	pf_enter_vf_flr_reset_config(gt, vfid);
+	return true;
+}
+
+static void pf_enter_vf_flr_guc_done(struct xe_gt *gt, unsigned int vfid)
+{
+	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_GUC_DONE))
+		pf_queue_vf(gt, vfid);
 }
 
 /**
@@ -141,14 +1126,22 @@ int xe_gt_sriov_pf_control_stop_vf(struct xe_gt *gt, unsigned int vfid)
  */
 int xe_gt_sriov_pf_control_trigger_flr(struct xe_gt *gt, unsigned int vfid)
 {
+	unsigned long timeout = pf_get_default_timeout(XE_GT_SRIOV_STATE_FLR_WIP);
 	int err;
 
-	/* XXX pf_send_vf_flr_start() expects ct->lock */
-	mutex_lock(&gt->uc.guc.ct.lock);
-	err = pf_send_vf_flr_start(gt, vfid);
-	mutex_unlock(&gt->uc.guc.ct.lock);
+	pf_enter_vf_flr_wip(gt, vfid);
 
-	return err;
+	err = pf_wait_vf_wip_done(gt, vfid, timeout);
+	if (err) {
+		xe_gt_sriov_dbg(gt, "VF%u FLR didn't finish in %u ms (%pe)\n",
+				vfid, jiffies_to_msecs(timeout), ERR_PTR(err));
+		return err;
+	}
+
+	if (!pf_expect_vf_not_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_FAILED))
+		return -EIO;
+
+	return 0;
 }
 
 /**
@@ -200,15 +1193,32 @@ static void pf_handle_vf_flr(struct xe_gt *gt, u32 vfid)
 
 	if (needs_dispatch_flr(xe)) {
 		for_each_gt(gtit, xe, gtid)
-			pf_send_vf_flr_start(gtit, vfid);
+			pf_enter_vf_flr_wip(gtit, vfid);
 	} else {
-		pf_send_vf_flr_start(gt, vfid);
+		pf_enter_vf_flr_wip(gt, vfid);
 	}
 }
 
 static void pf_handle_vf_flr_done(struct xe_gt *gt, u32 vfid)
 {
-	pf_send_vf_flr_finish(gt, vfid);
+	if (!pf_exit_vf_flr_wait_guc(gt, vfid)) {
+		xe_gt_sriov_dbg(gt, "Received out of order 'VF%u FLR done'\n", vfid);
+		pf_enter_vf_mismatch(gt, vfid);
+		return;
+	}
+
+	pf_enter_vf_flr_guc_done(gt, vfid);
+}
+
+static void pf_handle_vf_pause_done(struct xe_gt *gt, u32 vfid)
+{
+	if (!pf_exit_pause_wait_guc(gt, vfid)) {
+		xe_gt_sriov_dbg(gt, "Received out of order 'VF%u PAUSE done'\n", vfid);
+		pf_enter_vf_mismatch(gt, vfid);
+		return;
+	}
+
+	pf_enter_vf_pause_guc_done(gt, vfid);
 }
 
 static int pf_handle_vf_event(struct xe_gt *gt, u32 vfid, u32 eventid)
@@ -226,6 +1236,7 @@ static int pf_handle_vf_event(struct xe_gt *gt, u32 vfid, u32 eventid)
 		pf_handle_vf_flr_done(gt, vfid);
 		break;
 	case GUC_PF_NOTIFY_VF_PAUSE_DONE:
+		pf_handle_vf_pause_done(gt, vfid);
 		break;
 	case GUC_PF_NOTIFY_VF_FIXUP_DONE:
 		break;
@@ -284,3 +1295,165 @@ int xe_gt_sriov_pf_control_process_guc2pf(struct xe_gt *gt, const u32 *msg, u32
 
 	return vfid ? pf_handle_vf_event(gt, vfid, eventid) : pf_handle_pf_event(gt, eventid);
 }
+
+static bool pf_process_vf_machine(struct xe_gt *gt, unsigned int vfid)
+{
+	if (pf_exit_vf_flr_send_start(gt, vfid))
+		return true;
+
+	if (pf_exit_vf_flr_send_start(gt, vfid))
+		return true;
+
+	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WAIT_GUC)) {
+		xe_gt_sriov_dbg_verbose(gt, "VF%u in %s\n", vfid,
+					control_bit_to_string(XE_GT_SRIOV_STATE_FLR_WAIT_GUC));
+		return false;
+	}
+
+	if (pf_exit_vf_flr_guc_done(gt, vfid))
+		return true;
+
+	if (pf_exit_vf_flr_reset_config(gt, vfid))
+		return true;
+
+	if (pf_exit_vf_flr_reset_data(gt, vfid))
+		return true;
+
+	if (pf_exit_vf_flr_reset_mmio(gt, vfid))
+		return true;
+
+	if (pf_exit_vf_flr_reset_mmio(gt, vfid))
+		return true;
+
+	if (pf_exit_vf_flr_send_finish(gt, vfid))
+		return true;
+
+	if (pf_exit_vf_stop_send_stop(gt, vfid))
+		return true;
+
+	if (pf_exit_vf_pause_send_pause(gt, vfid))
+		return true;
+
+	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC)) {
+		xe_gt_sriov_dbg_verbose(gt, "VF%u in %s\n", vfid,
+					control_bit_to_string(XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC));
+		return true;
+	}
+
+	if (pf_exit_vf_pause_guc_done(gt, vfid))
+		return true;
+
+	if (pf_exit_vf_resume_send_resume(gt, vfid))
+		return true;
+
+	return false;
+}
+
+static unsigned int pf_control_state_index(struct xe_gt *gt,
+					   struct xe_gt_sriov_control_state *cs)
+{
+	return container_of(cs, struct xe_gt_sriov_metadata, control) - gt->sriov.pf.vfs;
+}
+
+static void pf_worker_find_work(struct xe_gt *gt)
+{
+	struct xe_gt_sriov_pf_control *pfc = &gt->sriov.pf.control;
+	struct xe_gt_sriov_control_state *cs;
+	unsigned int vfid;
+	bool empty;
+	bool more;
+
+	spin_lock(&pfc->lock);
+	cs = list_first_entry_or_null(&pfc->list, struct xe_gt_sriov_control_state, link);
+	if (cs)
+		list_del_init(&cs->link);
+	empty = list_empty(&pfc->list);
+	spin_unlock(&pfc->lock);
+
+	if (!cs)
+		return;
+
+	/* VF metadata structures are indexed by the VFID */
+	vfid = pf_control_state_index(gt, cs);
+	xe_gt_assert(gt, vfid <= xe_gt_sriov_pf_get_totalvfs(gt));
+
+	more = pf_process_vf_machine(gt, vfid);
+	if (more)
+		pf_queue_vf(gt, vfid);
+	else if (!empty)
+		pf_queue_control_worker(gt);
+}
+
+static void control_worker_func(struct work_struct *w)
+{
+	struct xe_gt *gt = container_of(w, struct xe_gt, sriov.pf.control.worker);
+
+	xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
+	pf_worker_find_work(gt);
+}
+
+static void pf_stop_worker(struct xe_gt *gt)
+{
+	xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
+	cancel_work_sync(&gt->sriov.pf.control.worker);
+}
+
+static void control_fini_action(struct drm_device *dev, void *data)
+{
+	struct xe_gt *gt = data;
+
+	pf_stop_worker(gt);
+}
+
+/**
+ * xe_gt_sriov_pf_control_init() - Initialize PF's control data.
+ * @gt: the &xe_gt
+ *
+ * This function is for PF only.
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
+int xe_gt_sriov_pf_control_init(struct xe_gt *gt)
+{
+	struct xe_device *xe = gt_to_xe(gt);
+	unsigned int n, totalvfs;
+
+	xe_gt_assert(gt, IS_SRIOV_PF(xe));
+
+	totalvfs = xe_sriov_pf_get_totalvfs(xe);
+	for (n = 0; n <= totalvfs; n++) {
+		struct xe_gt_sriov_control_state *cs = pf_pick_vf_control(gt, n);
+
+		init_completion(&cs->done);
+		INIT_LIST_HEAD(&cs->link);
+	}
+
+	spin_lock_init(&gt->sriov.pf.control.lock);
+	INIT_LIST_HEAD(&gt->sriov.pf.control.list);
+	INIT_WORK(&gt->sriov.pf.control.worker, control_worker_func);
+
+	return drmm_add_action_or_reset(&xe->drm, control_fini_action, gt);
+}
+
+/**
+ * xe_gt_sriov_pf_control_restart() - Restart SR-IOV control data after a GT reset.
+ * @gt: the &xe_gt
+ *
+ * Any per-VF status maintained by the PF or any ongoing VF control activity
+ * performed by the PF must be reset or cancelled when the GT is reset.
+ *
+ * This function is for PF only.
+ */
+void xe_gt_sriov_pf_control_restart(struct xe_gt *gt)
+{
+	struct xe_device *xe = gt_to_xe(gt);
+	unsigned int n, totalvfs;
+
+	xe_gt_assert(gt, IS_SRIOV_PF(xe));
+
+	pf_stop_worker(gt);
+
+	totalvfs = xe_sriov_pf_get_totalvfs(xe);
+	for (n = 1; n <= totalvfs; n++)
+		pf_enter_vf_ready(gt, n);
+}
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h
index 405d1586f991..c85e64f099cc 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h
@@ -11,6 +11,9 @@
 
 struct xe_gt;
 
+int xe_gt_sriov_pf_control_init(struct xe_gt *gt);
+void xe_gt_sriov_pf_control_restart(struct xe_gt *gt);
+
 int xe_gt_sriov_pf_control_pause_vf(struct xe_gt *gt, unsigned int vfid);
 int xe_gt_sriov_pf_control_resume_vf(struct xe_gt *gt, unsigned int vfid);
 int xe_gt_sriov_pf_control_stop_vf(struct xe_gt *gt, unsigned int vfid);
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h
new file mode 100644
index 000000000000..11830aafea45
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h
@@ -0,0 +1,107 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2024 Intel Corporation
+ */
+
+#ifndef _XE_GT_SRIOV_PF_CONTROL_TYPES_H_
+#define _XE_GT_SRIOV_PF_CONTROL_TYPES_H_
+
+#include <linux/completion.h>
+#include <linux/spinlock.h>
+#include <linux/workqueue_types.h>
+
+/**
+ * enum xe_gt_sriov_control_bits - Various bits used by the PF to represent a VF state
+ *
+ * @XE_GT_SRIOV_STATE_WIP: indicates that some operations are in progress.
+ * @XE_GT_SRIOV_STATE_FLR_WIP: indicates that a VF FLR is in progress.
+ * @XE_GT_SRIOV_STATE_FLR_SEND_START: indicates that the PF wants to send a FLR START command.
+ * @XE_GT_SRIOV_STATE_FLR_WAIT_GUC: indicates that the PF awaits for a response from the GuC.
+ * @XE_GT_SRIOV_STATE_FLR_GUC_DONE: indicates that the PF has received a response from the GuC.
+ * @XE_GT_SRIOV_STATE_FLR_RESET_CONFIG: indicates that the PF needs to clear VF's resources.
+ * @XE_GT_SRIOV_STATE_FLR_RESET_DATA: indicates that the PF needs to clear VF's data.
+ * @XE_GT_SRIOV_STATE_FLR_RESET_MMIO: indicates that the PF needs to reset VF's registers.
+ * @XE_GT_SRIOV_STATE_FLR_SEND_FINISH: indicates that the PF wants to send a FLR FINISH message.
+ * @XE_GT_SRIOV_STATE_FLR_FAILED: indicates that VF FLR sequence failed.
+ * @XE_GT_SRIOV_STATE_PAUSE_WIP: indicates that a VF pause operation is in progress.
+ * @XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE: indicates that the PF is about to send a PAUSE command.
+ * @XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC: indicates that the PF awaits for a response from the GuC.
+ * @XE_GT_SRIOV_STATE_PAUSE_GUC_DONE: indicates that the PF has received a response from the GuC.
+ * @XE_GT_SRIOV_STATE_PAUSE_FAILED: indicates that a VF pause operation has failed.
+ * @XE_GT_SRIOV_STATE_PAUSED: indicates that the VF is paused.
+ * @XE_GT_SRIOV_STATE_RESUME_WIP: indicates the a VF resume operation is in progress.
+ * @XE_GT_SRIOV_STATE_RESUME_SEND_RESUME: indicates that the PF is about to send RESUME command.
+ * @XE_GT_SRIOV_STATE_RESUME_FAILED: indicates that a VF resume operation has failed.
+ * @XE_GT_SRIOV_STATE_RESUMED: indicates that the VF was resumed.
+ * @XE_GT_SRIOV_STATE_STOP_WIP: indicates that a VF stop operation is in progress.
+ * @XE_GT_SRIOV_STATE_STOP_SEND_STOP: indicates that the PF wants to send a STOP command.
+ * @XE_GT_SRIOV_STATE_STOP_FAILED: indicates that the VF stop operation has failed
+ * @XE_GT_SRIOV_STATE_STOPPED: indicates that the VF was stopped.
+ * @XE_GT_SRIOV_STATE_MISMATCH: indicates that the PF has detected a VF state mismatch.
+ */
+enum xe_gt_sriov_control_bits {
+	XE_GT_SRIOV_STATE_WIP = 1,
+
+	XE_GT_SRIOV_STATE_FLR_WIP,
+	XE_GT_SRIOV_STATE_FLR_SEND_START,
+	XE_GT_SRIOV_STATE_FLR_WAIT_GUC,
+	XE_GT_SRIOV_STATE_FLR_GUC_DONE,
+	XE_GT_SRIOV_STATE_FLR_RESET_CONFIG,
+	XE_GT_SRIOV_STATE_FLR_RESET_DATA,
+	XE_GT_SRIOV_STATE_FLR_RESET_MMIO,
+	XE_GT_SRIOV_STATE_FLR_SEND_FINISH,
+	XE_GT_SRIOV_STATE_FLR_FAILED,
+
+	XE_GT_SRIOV_STATE_PAUSE_WIP,
+	XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE,
+	XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC,
+	XE_GT_SRIOV_STATE_PAUSE_GUC_DONE,
+	XE_GT_SRIOV_STATE_PAUSE_FAILED,
+	XE_GT_SRIOV_STATE_PAUSED,
+
+	XE_GT_SRIOV_STATE_RESUME_WIP,
+	XE_GT_SRIOV_STATE_RESUME_SEND_RESUME,
+	XE_GT_SRIOV_STATE_RESUME_FAILED,
+	XE_GT_SRIOV_STATE_RESUMED,
+
+	XE_GT_SRIOV_STATE_STOP_WIP,
+	XE_GT_SRIOV_STATE_STOP_SEND_STOP,
+	XE_GT_SRIOV_STATE_STOP_FAILED,
+	XE_GT_SRIOV_STATE_STOPPED,
+
+	XE_GT_SRIOV_STATE_MISMATCH = BITS_PER_LONG - 1,
+};
+
+/**
+ * struct xe_gt_sriov_control_state - GT-level per-VF control state.
+ *
+ * Used by the PF driver to maintain per-VF control data.
+ */
+struct xe_gt_sriov_control_state {
+	/** @state: VF state bits */
+	unsigned long state;
+
+	/** @done: completion of async operations */
+	struct completion done;
+
+	/** @link: link into worker list */
+	struct list_head link;
+};
+
+/**
+ * struct xe_gt_sriov_pf_control - GT-level control data.
+ *
+ * Used by the PF driver to maintain its data.
+ */
+struct xe_gt_sriov_pf_control {
+	/** @worker: worker that executes a VF operations */
+	struct work_struct worker;
+
+	/** @list: list of VF entries that have a pending work */
+	struct list_head list;
+
+	/** @lock: protects VF pending list */
+	spinlock_t lock;
+};
+
+#endif
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h
index 40cbaea3ef44..28e1b130bf87 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h
@@ -9,6 +9,7 @@
 #include <linux/types.h>
 
 #include "xe_gt_sriov_pf_config_types.h"
+#include "xe_gt_sriov_pf_control_types.h"
 #include "xe_gt_sriov_pf_monitor_types.h"
 #include "xe_gt_sriov_pf_policy_types.h"
 #include "xe_gt_sriov_pf_service_types.h"
@@ -23,6 +24,9 @@ struct xe_gt_sriov_metadata {
 	/** @monitor: per-VF monitoring data. */
 	struct xe_gt_sriov_monitor monitor;
 
+	/** @control: per-VF control data. */
+	struct xe_gt_sriov_control_state control;
+
 	/** @version: negotiated VF/PF ABI version */
 	struct xe_gt_sriov_pf_service_version version;
 };
@@ -30,12 +34,14 @@ struct xe_gt_sriov_metadata {
 /**
  * struct xe_gt_sriov_pf - GT level PF virtualization data.
  * @service: service data.
+ * @control: control data.
  * @policy: policy data.
  * @spare: PF-only provisioning configuration.
  * @vfs: metadata for all VFs.
  */
 struct xe_gt_sriov_pf {
 	struct xe_gt_sriov_pf_service service;
+	struct xe_gt_sriov_pf_control control;
 	struct xe_gt_sriov_pf_policy policy;
 	struct xe_gt_sriov_spare_config spare;
 	struct xe_gt_sriov_metadata *vfs;
-- 
2.43.0


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

* [PATCH 05/12] drm/xe/tests: Allow deferred function call during KUnit test
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (3 preceding siblings ...)
  2024-08-09 16:51 ` [PATCH 04/12] drm/xe/pf: Improve VF control Michal Wajdeczko
@ 2024-08-09 16:51 ` Michal Wajdeczko
  2024-08-19 21:38   ` Lucas De Marchi
  2024-08-09 16:51 ` [PATCH 06/12] drm/xe/tests: Add helper macro to detect if KUnit is running Michal Wajdeczko
                   ` (17 subsequent siblings)
  22 siblings, 1 reply; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-09 16:51 UTC (permalink / raw)
  To: intel-xe; +Cc: Michal Wajdeczko, Lucas De Marchi

For some advanced test cases we might want to simulate external
activity that will stimulate function under test. Add set of
helper functions to implement such requirement. Usage example:

  static void foo(struct xe_device *xe)
  {
      WRITE_ONCE(xe->foo, 1);
  }

  static void foo_test(struct kunit *test)
  {
      struct xe_device *xe = test->priv;

      xe_kunit_helper_delayed_call(test, HZ / 2, foo, xe);

      KUNIT_EXPECT_EQ(test, 0, READ_ONCE(xe->foo));
      schedule_timeout_uninterruptible(HZ);
      KUNIT_EXPECT_EQ(test, 1, READ_ONCE(xe->foo));
  }

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
---
 drivers/gpu/drm/xe/tests/xe_kunit_helpers.c | 148 ++++++++++++++++++++
 drivers/gpu/drm/xe/tests/xe_kunit_helpers.h |  38 +++++
 2 files changed, 186 insertions(+)

diff --git a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
index bc5156966ce9..8fe1a0918b32 100644
--- a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
+++ b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
@@ -127,3 +127,151 @@ int xe_kunit_helper_xe_device_live_test_init(struct kunit *test)
 	return 0;
 }
 EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_xe_device_live_test_init);
+
+struct xe_kunit_call {
+	struct delayed_work work;
+	struct kunit *test;
+	struct {
+		int (*int_gt)(struct xe_gt *gt);
+		int (*int_gt_uint)(struct xe_gt *gt, unsigned int n);
+		void (*void_gt)(struct xe_gt *gt);
+		void (*void_gt_uint)(struct xe_gt *gt, unsigned int n);
+		void (*void_xe)(struct xe_device *xe);
+	} func;
+	struct {
+		struct xe_device *xe;
+		struct xe_gt *gt;
+		unsigned int n;
+	} args;
+};
+
+static void call_work_func(struct work_struct *work)
+{
+	struct xe_kunit_call *call = container_of(work, typeof(*call), work.work);
+
+	if (call->func.void_xe) {
+		kunit_info(call->test, "calling %ps(xe)\n", call->func.void_xe);
+		call->func.void_xe(call->args.xe);
+		kunit_info(call->test, "%ps(xe) completed\n", call->func.void_xe);
+	} else if (call->func.void_gt) {
+		kunit_info(call->test, "%ps(gt)\n", call->func.void_gt);
+		call->func.void_gt(call->args.gt);
+		kunit_info(call->test, "%ps(gt) completed\n", call->func.void_gt);
+	} else if (call->func.int_gt_uint) {
+		int ret;
+
+		kunit_info(call->test, "calling %ps(gt,%u)\n",
+			   call->func.int_gt_uint, call->args.n);
+		ret = call->func.int_gt_uint(call->args.gt, call->args.n);
+		if (ret < 0) {
+			kunit_info(call->test, "%ps(gt,%u) reported error %pe\n",
+				   call->func.int_gt_uint, call->args.n, ERR_PTR(ret));
+		} else {
+			kunit_info(call->test, "%ps(gt,%u) returned %d\n",
+				   call->func.int_gt_uint, call->args.n, ret);
+		}
+	}
+}
+
+static struct xe_kunit_call *prepare_call(struct kunit *test)
+{
+	struct xe_kunit_call *call;
+
+	call = kunit_kzalloc(test, sizeof(*call), GFP_KERNEL);
+	KUNIT_ASSERT_NOT_NULL(test, call);
+
+	INIT_DELAYED_WORK(&call->work, call_work_func);
+	call->test = test;
+
+	return call;
+}
+
+KUNIT_DEFINE_ACTION_WRAPPER(cancel_call, cancel_delayed_work_sync, struct delayed_work *);
+
+static void queue_call(struct kunit *test, struct xe_kunit_call *call, unsigned long delay)
+{
+	queue_delayed_work(system_wq, &call->work, delay);
+	KUNIT_ASSERT_EQ(test, 0, kunit_add_action_or_reset(test, cancel_call, &call->work));
+}
+
+/**
+ * xe_kunit_helper_delayed_call_void_xe_device - Queue a function call during KUnit test
+ * @test: the &kunit test case
+ * @delay: number of jiffies to wait before queueing
+ * @func: the &xe_device function to call
+ * @xe: the &xe_device argument
+ *
+ * This function uses KUNIT_ASSERT to detect any failures.
+ */
+void xe_kunit_helper_delayed_call_void_xe_device(struct kunit *test,
+						 unsigned long delay,
+						 void (*func)(struct xe_device *xe),
+						 struct xe_device *xe)
+{
+	struct xe_kunit_call *call = prepare_call(test);
+
+	KUNIT_ASSERT_NOT_NULL(test, func);
+	KUNIT_ASSERT_NOT_NULL(test, xe);
+
+	call->func.void_xe = func;
+	call->args.xe = xe;
+
+	return queue_call(test, call, delay);
+}
+EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_delayed_call_void_xe_device);
+
+/**
+ * xe_kunit_helper_delayed_call_void_xe_gt - Queue a function call during KUnit test
+ * @test: the &kunit test case
+ * @delay: number of jiffies to wait before queueing
+ * @func: the &xe_gt function to call
+ * @gt: the &xe_gt function argument
+ *
+ * This function uses KUNIT_ASSERT to detect any failures.
+ */
+void xe_kunit_helper_delayed_call_void_xe_gt(struct kunit *test,
+					     unsigned long delay,
+					     void (*func)(struct xe_gt *gt),
+					     struct xe_gt *gt)
+{
+	struct xe_kunit_call *call = prepare_call(test);
+
+	KUNIT_ASSERT_NOT_NULL(test, func);
+	KUNIT_ASSERT_NOT_NULL(test, gt);
+
+	call->func.void_gt = func;
+	call->args.gt = gt;
+
+	return queue_call(test, call, delay);
+}
+EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_delayed_call_void_xe_gt);
+
+/**
+ * xe_kunit_helper_delayed_call_int_xe_gt_uint - Queue a function call during KUnit test
+ * @test: the &kunit test case
+ * @delay: number of jiffies to wait before queueing
+ * @func: the &xe_gt function to call
+ * @gt: the &xe_gt function argument
+ * @n: the function argument
+ *
+ * This function uses KUNIT_ASSERT to detect any failures.
+ */
+void xe_kunit_helper_delayed_call_int_xe_gt_uint(struct kunit *test,
+						 unsigned long delay,
+						 int (*func)(struct xe_gt *gt,
+							     unsigned int vfid),
+						 struct xe_gt *gt,
+						 unsigned int n)
+{
+	struct xe_kunit_call *call = prepare_call(test);
+
+	KUNIT_ASSERT_NOT_NULL(test, func);
+	KUNIT_ASSERT_NOT_NULL(test, gt);
+
+	call->func.int_gt_uint = func;
+	call->args.gt = gt;
+	call->args.n = n;
+
+	return queue_call(test, call, delay);
+}
+EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_delayed_call_int_xe_gt_uint);
diff --git a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
index 83665f7b1254..ec5287947ee4 100644
--- a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
+++ b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
@@ -9,6 +9,7 @@
 struct device;
 struct kunit;
 struct xe_device;
+struct xe_gt;
 
 struct xe_device *xe_kunit_helper_alloc_xe_device(struct kunit *test,
 						  struct device *dev);
@@ -16,4 +17,41 @@ int xe_kunit_helper_xe_device_test_init(struct kunit *test);
 
 int xe_kunit_helper_xe_device_live_test_init(struct kunit *test);
 
+void xe_kunit_helper_delayed_call_void_xe_device(struct kunit *test,
+						 unsigned long delay,
+						 void (*func)(struct xe_device *xe),
+						 struct xe_device *xe);
+
+void xe_kunit_helper_delayed_call_void_xe_gt(struct kunit *test,
+					     unsigned long delay,
+					     void (*func)(struct xe_gt *gt),
+					     struct xe_gt *gt);
+
+void xe_kunit_helper_delayed_call_int_xe_gt_uint(struct kunit *test,
+						 unsigned long delay,
+						 int (*func)(struct xe_gt *gt,
+							     unsigned int vfid),
+						 struct xe_gt *gt,
+						 unsigned int n);
+
+/**
+ * xe_kunit_helper_delayed_call - Queue a function call during KUnit test
+ * @test: the &kunit test case
+ * @delay: number of jiffies to wait before queueing
+ * @func: the &xe_device or &xe_gt function to call
+ * @args: the &xe_device or &xe_gt and other function arguments
+ *
+ * This is a helper macro that compiles into dedicated function call based on
+ * the provided argument types.
+ */
+#define xe_kunit_helper_delayed_call(test, delay, func, args...)	\
+	_Generic(func,							\
+		 void (*)(struct xe_device *) :				\
+			xe_kunit_helper_delayed_call_void_xe_device,	\
+		 void (*)(struct xe_gt *) :				\
+			xe_kunit_helper_delayed_call_void_xe_gt,	\
+		 int (*)(struct xe_gt *, unsigned int) :		\
+			xe_kunit_helper_delayed_call_int_xe_gt_uint	\
+	)(test, delay, func, args)
+
 #endif
-- 
2.43.0


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

* [PATCH 06/12] drm/xe/tests: Add helper macro to detect if KUnit is running
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (4 preceding siblings ...)
  2024-08-09 16:51 ` [PATCH 05/12] drm/xe/tests: Allow deferred function call during KUnit test Michal Wajdeczko
@ 2024-08-09 16:51 ` Michal Wajdeczko
  2024-08-09 16:51 ` [PATCH 07/12] drm/xe/tests: Add helpers to call stubs out of KUnit context Michal Wajdeczko
                   ` (16 subsequent siblings)
  22 siblings, 0 replies; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-09 16:51 UTC (permalink / raw)
  To: intel-xe; +Cc: Michal Wajdeczko, Lucas De Marchi

In upcoming patch we will add some functionality that will be
used by the KUnit test code but outside of the KUnit context,
while still should be activated only when the KUnit test is
running. Add simple helper to hide implementation details.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
---
 drivers/gpu/drm/xe/tests/xe_test.h | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/gpu/drm/xe/tests/xe_test.h b/drivers/gpu/drm/xe/tests/xe_test.h
index 9c23ad9dba8d..b8fa409ce2b1 100644
--- a/drivers/gpu/drm/xe/tests/xe_test.h
+++ b/drivers/gpu/drm/xe/tests/xe_test.h
@@ -31,6 +31,7 @@ struct xe_test_priv {
 
 #define XE_TEST_DECLARE(x) x
 #define XE_TEST_ONLY(x) unlikely(x)
+#define XE_TEST_RUNNING() static_branch_unlikely(&kunit_running)
 
 /**
  * xe_cur_kunit_priv - Obtain the struct xe_test_priv pointed to by
@@ -57,6 +58,8 @@ xe_cur_kunit_priv(enum xe_test_priv_id id)
 
 #define XE_TEST_DECLARE(x)
 #define XE_TEST_ONLY(x) 0
+#define XE_TEST_RUNNING() false
+
 #define xe_cur_kunit_priv(_id) NULL
 
 #endif
-- 
2.43.0


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

* [PATCH 07/12] drm/xe/tests: Add helpers to call stubs out of KUnit context
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (5 preceding siblings ...)
  2024-08-09 16:51 ` [PATCH 06/12] drm/xe/tests: Add helper macro to detect if KUnit is running Michal Wajdeczko
@ 2024-08-09 16:51 ` Michal Wajdeczko
  2024-08-19 21:52   ` Lucas De Marchi
  2024-08-09 16:51 ` [PATCH 08/12] drm/xe/guc: Define stub for xe_guc_ct_send_recv() Michal Wajdeczko
                   ` (15 subsequent siblings)
  22 siblings, 1 reply; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-09 16:51 UTC (permalink / raw)
  To: intel-xe; +Cc: Michal Wajdeczko, Lucas De Marchi

The KUNIT_STATIC_STUB_REDIRECT() allows to redirect function call but will
work only if the caller is in a KUnit context. To allow implementation of
the more complex test cases, add helpers that allow calling stubs also out
of a KUnit context.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
---
 drivers/gpu/drm/xe/tests/xe_test.h | 74 ++++++++++++++++++++++++++++++
 1 file changed, 74 insertions(+)

diff --git a/drivers/gpu/drm/xe/tests/xe_test.h b/drivers/gpu/drm/xe/tests/xe_test.h
index b8fa409ce2b1..ffa8fa6c96f0 100644
--- a/drivers/gpu/drm/xe/tests/xe_test.h
+++ b/drivers/gpu/drm/xe/tests/xe_test.h
@@ -54,11 +54,85 @@ xe_cur_kunit_priv(enum xe_test_priv_id id)
 	return priv->id == id ? priv : NULL;
 }
 
+/**
+ * XE_TEST_REDIRECT() - Call a function stub if one exists.
+ * @stub: The pointer to the function stub
+ * @args: All of the arguments passed to this stub
+ *
+ * This is a function prologue which is used to allow calls to the current
+ * function to be redirected if a KUnit is running. If the stub is NULL or
+ * the KUnit is not running the function will continue execution as normal.
+ *
+ * Unlikely the KUNIT_STATIC_STUB_REDIRECT(), this redirection will work
+ * even if the caller is not in a KUnit context (like a worker thread).
+ *
+ * Example:
+ *
+ * .. code-block:: c
+ *
+ *	int (*stub)(int n);
+ *
+ *	int real_func(int n)
+ *	{
+ *		XE_TEST_REDIRECT(stub, n);
+ *		return n + 1;
+ *	}
+ *
+ *	int replacement_func(int n)
+ *	{
+ *		return n + 100;
+ *	}
+ *
+ *	void example_test(struct kunit *test)
+ *	{
+ *		stub = replacement_func;
+ *		KUNIT_EXPECT_EQ(test, real_func(1), 101);
+ *		KUNIT_EXPECT_EQ(test, real_func(1), 101);
+ *	}
+ */
+#define XE_TEST_REDIRECT(stub, args...)							\
+do {											\
+	typeof(stub) replacement = (stub);						\
+	if (XE_TEST_RUNNING()) {							\
+		if (unlikely(replacement)) {						\
+			pr_info(KUNIT_SUBTEST_INDENT "# %s: calling stub %ps\n",	\
+				__func__, replacement);					\
+			return replacement(args);					\
+		}									\
+	}										\
+} while (0)
+
+static inline void __nullify_pointer(void *data)
+{
+	void **ptr = data;
+
+	*ptr = NULL;
+}
+
+/**
+ * XE_TEST_ACTIVATE_STUB() - Setup a function stub.
+ * @test: Test case that wants to setup a function stub
+ * @stub: The function stub pointer
+ * @replacement: The replacement function
+ *
+ * This helper setups a function stub with the replacement function.
+ * It will also automatically restore stub to NULL at the test end.
+ */
+#define XE_TEST_ACTIVATE_STUB(test, stub, replacement)	({					\
+	typeof(test) __test = (test);								\
+	typeof(stub) *__ptr = &(stub);								\
+	typecheck_pointer(*__ptr);								\
+	*__ptr = (replacement);									\
+	kunit_info(__test, "activated stub %s with %ps\n", __stringify(stub), *__ptr);		\
+	kunit_add_action_or_reset(__test, __nullify_pointer, __ptr);				\
+})
+
 #else /* if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST) */
 
 #define XE_TEST_DECLARE(x)
 #define XE_TEST_ONLY(x) 0
 #define XE_TEST_RUNNING() false
+#define XE_TEST_REDIRECT(...) do { } while (0)
 
 #define xe_cur_kunit_priv(_id) NULL
 
-- 
2.43.0


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

* [PATCH 08/12] drm/xe/guc: Define stub for xe_guc_ct_send_recv()
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (6 preceding siblings ...)
  2024-08-09 16:51 ` [PATCH 07/12] drm/xe/tests: Add helpers to call stubs out of KUnit context Michal Wajdeczko
@ 2024-08-09 16:51 ` Michal Wajdeczko
  2024-08-09 16:51 ` [PATCH 09/12] drm/xe/pf: Define stub for pf_sanitize_vf_resources() Michal Wajdeczko
                   ` (14 subsequent siblings)
  22 siblings, 0 replies; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-09 16:51 UTC (permalink / raw)
  To: intel-xe; +Cc: Michal Wajdeczko

For some advanced KUnit test cases we may want to use replacement
function instead of the real xe_guc_ct_send_recv().

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
---
 drivers/gpu/drm/xe/xe_guc_ct.c       | 2 ++
 drivers/gpu/drm/xe/xe_guc_ct_types.h | 5 +++++
 2 files changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c
index beeeb120d1fc..30536f7021fc 100644
--- a/drivers/gpu/drm/xe/xe_guc_ct.c
+++ b/drivers/gpu/drm/xe/xe_guc_ct.c
@@ -938,6 +938,8 @@ int xe_guc_ct_send_recv(struct xe_guc_ct *ct, const u32 *action, u32 len,
 			u32 *response_buffer)
 {
 	KUNIT_STATIC_STUB_REDIRECT(xe_guc_ct_send_recv, ct, action, len, response_buffer);
+	XE_TEST_REDIRECT(ct->send_recv, ct, action, len, response_buffer);
+
 	return guc_ct_send_recv(ct, action, len, response_buffer, false);
 }
 
diff --git a/drivers/gpu/drm/xe/xe_guc_ct_types.h b/drivers/gpu/drm/xe/xe_guc_ct_types.h
index 761cb9031298..50c024b0227d 100644
--- a/drivers/gpu/drm/xe/xe_guc_ct_types.h
+++ b/drivers/gpu/drm/xe/xe_guc_ct_types.h
@@ -13,6 +13,7 @@
 #include <linux/xarray.h>
 
 #include "abi/guc_communication_ctb_abi.h"
+#include "tests/xe_test.h"
 
 struct xe_bo;
 
@@ -128,6 +129,10 @@ struct xe_guc_ct {
 	u32 msg[GUC_CTB_MSG_MAX_LEN];
 	/** @fast_msg: Message buffer */
 	u32 fast_msg[GUC_CTB_MSG_MAX_LEN];
+
+	XE_TEST_DECLARE(int (*send_recv)(struct xe_guc_ct *ct,
+					 const u32 *action, u32 len,
+					 u32 *response_buffer));
 };
 
 #endif
-- 
2.43.0


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

* [PATCH 09/12] drm/xe/pf: Define stub for pf_sanitize_vf_resources()
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (7 preceding siblings ...)
  2024-08-09 16:51 ` [PATCH 08/12] drm/xe/guc: Define stub for xe_guc_ct_send_recv() Michal Wajdeczko
@ 2024-08-09 16:51 ` Michal Wajdeczko
  2024-08-09 16:51 ` [PATCH 10/12] drm/xe/pf: Define stub for pf_send_vf_control_cmd() Michal Wajdeczko
                   ` (13 subsequent siblings)
  22 siblings, 0 replies; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-09 16:51 UTC (permalink / raw)
  To: intel-xe; +Cc: Michal Wajdeczko

For some advanced KUnit test cases we may want to use replacement
function instead of the pf_sanitize_vf_resources() which actually
implements the exported xe_gt_sriov_pf_config_sanitize() function.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
---
 drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c       | 2 ++
 drivers/gpu/drm/xe/xe_gt_sriov_pf_config_types.h | 5 +++++
 2 files changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c
index eba6793294f3..c77730d6e254 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c
@@ -1938,6 +1938,8 @@ static int pf_sanitize_vf_resources(struct xe_gt *gt, u32 vfid, long timeout)
 	struct xe_device *xe = gt_to_xe(gt);
 	int err = 0;
 
+	XE_TEST_REDIRECT(config->sanitize, gt, vfid, timeout);
+
 	/*
 	 * Only GGTT and LMEM requires to be cleared by the PF.
 	 * GuC doorbell IDs and context IDs do not need any clearing.
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config_types.h
index 7bc66656fcc7..99b4bc2b81bb 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config_types.h
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config_types.h
@@ -8,9 +8,11 @@
 
 #include <drm/drm_mm.h>
 
+#include "tests/xe_test.h"
 #include "xe_guc_klv_thresholds_set_types.h"
 
 struct xe_bo;
+struct xe_gt;
 
 /**
  * struct xe_gt_sriov_config - GT level per-VF configuration data.
@@ -36,6 +38,9 @@ struct xe_gt_sriov_config {
 	u32 preempt_timeout;
 	/** @thresholds: GuC thresholds for adverse events notifications. */
 	u32 thresholds[XE_GUC_KLV_NUM_THRESHOLDS];
+
+	/* private: */
+	XE_TEST_DECLARE(int (*sanitize)(struct xe_gt *gt, unsigned int vfid, long timeout));
 };
 
 /**
-- 
2.43.0


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

* [PATCH 10/12] drm/xe/pf: Define stub for pf_send_vf_control_cmd()
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (8 preceding siblings ...)
  2024-08-09 16:51 ` [PATCH 09/12] drm/xe/pf: Define stub for pf_sanitize_vf_resources() Michal Wajdeczko
@ 2024-08-09 16:51 ` Michal Wajdeczko
  2024-08-09 16:51 ` [PATCH 11/12] drm/xe/tests: Add KUnit tests for VF control state machines Michal Wajdeczko
                   ` (12 subsequent siblings)
  22 siblings, 0 replies; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-09 16:51 UTC (permalink / raw)
  To: intel-xe; +Cc: Michal Wajdeczko

For some advanced KUnit test cases we may want to use replacement
function instead of the real pf_send_vf_control_cmd().

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
---
 drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c       | 1 +
 drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h | 7 +++++++
 2 files changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
index 1ed7d49bef8c..e91c71d768ff 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
@@ -58,6 +58,7 @@ static int pf_send_vf_control_cmd(struct xe_gt *gt, unsigned int vfid, u32 cmd)
 	xe_gt_assert(gt, vfid != PFID);
 	xe_gt_sriov_dbg_verbose(gt, "sending VF%u control command %s\n",
 				vfid, control_cmd_to_string(cmd));
+	XE_TEST_REDIRECT(gt->sriov.pf.control.send_vf_control_cmd, gt, vfid, cmd);
 
 	err = guc_action_vf_control_cmd(&gt->uc.guc, vfid, cmd);
 	if (unlikely(err))
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h
index 11830aafea45..6d7a3c8cc38a 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h
@@ -10,6 +10,10 @@
 #include <linux/spinlock.h>
 #include <linux/workqueue_types.h>
 
+#include "tests/xe_test.h"
+
+struct xe_gt;
+
 /**
  * enum xe_gt_sriov_control_bits - Various bits used by the PF to represent a VF state
  *
@@ -102,6 +106,9 @@ struct xe_gt_sriov_pf_control {
 
 	/** @lock: protects VF pending list */
 	spinlock_t lock;
+
+	/* private: */
+	XE_TEST_DECLARE(int (*send_vf_control_cmd)(struct xe_gt *gt, unsigned int vfid, u32 cmd));
 };
 
 #endif
-- 
2.43.0


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

* [PATCH 11/12] drm/xe/tests: Add KUnit tests for VF control state machines
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (9 preceding siblings ...)
  2024-08-09 16:51 ` [PATCH 10/12] drm/xe/pf: Define stub for pf_send_vf_control_cmd() Michal Wajdeczko
@ 2024-08-09 16:51 ` Michal Wajdeczko
  2024-08-09 17:23   ` [PATCH v2 " Michal Wajdeczko
  2024-08-22 10:47   ` [PATCH " Piotr Piórkowski
  2024-08-09 16:51 ` [PATCH 12/12] drm/xe/tests: Add KUnit tests for VF control GuC messages Michal Wajdeczko
                   ` (11 subsequent siblings)
  22 siblings, 2 replies; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-09 16:51 UTC (permalink / raw)
  To: intel-xe; +Cc: Michal Wajdeczko, Lucas De Marchi

Add KUnit tests (~200) for all VF control state machines (FLR,
PAUSE, STOP and RESUME) to make sure they work as expected and
will not be broken while extending them with new functionality.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
---
Test file named according to the new best practices [1]
[1] https://lore.kernel.org/linux-hardening/20240724201354.make.730-kees@kernel.org/
---
 .../xe/tests/xe_gt_sriov_pf_control_kunit.c   | 1360 +++++++++++++++++
 drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c   |    7 +
 2 files changed, 1367 insertions(+)
 create mode 100644 drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c

diff --git a/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c b/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
new file mode 100644
index 000000000000..4252577b4bbd
--- /dev/null
+++ b/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
@@ -0,0 +1,1360 @@
+// SPDX-License-Identifier: GPL-2.0 AND MIT
+/*
+ * Copyright © 2024 Intel Corporation
+ */
+
+#include <kunit/test.h>
+#include <kunit/static_stub.h>
+
+#include "tests/xe_kunit_helpers.h"
+#include "tests/xe_pci_test.h"
+
+#include "xe_gt_sriov_pf.h"
+
+static const unsigned int DUT_NUM_VFS = 2;
+static const unsigned int VFUT1 = VFID(1);
+static const unsigned int VFUT2 = VFID(2);
+
+static void dump_state(void *arg)
+{
+	struct xe_gt *gt = arg;
+
+	pf_dump_vf_state(gt, VFUT1);
+}
+
+static unsigned long replacement_timeout(enum xe_gt_sriov_control_bits bit)
+{
+	return HZ;
+}
+
+static int pf_control_test_init(struct kunit *test)
+{
+	struct xe_pci_fake_data fake = {
+		.sriov_mode = XE_SRIOV_MODE_PF,
+		.platform = XE_TIGERLAKE, /* some random platform */
+		.subplatform = XE_SUBPLATFORM_NONE,
+	};
+	struct xe_device *xe;
+	struct xe_gt *gt;
+
+	test->priv = &fake;
+	xe_kunit_helper_xe_device_test_init(test);
+
+	xe = test->priv;
+	KUNIT_ASSERT_EQ(test, xe_sriov_init(xe), 0);
+
+	xe->sriov.pf.driver_max_vfs = DUT_NUM_VFS;
+	KUNIT_EXPECT_NE(test, xe_sriov_pf_get_totalvfs(xe), 0);
+
+	gt = xe_device_get_gt(xe, 0);
+	KUNIT_ASSERT_EQ(test, xe_gt_sriov_pf_init_early(gt), 0);
+
+	KUNIT_ASSERT_EQ(test, 0ul, *__pf_peek_vf_state(gt, VFUT1));
+	KUNIT_ASSERT_EQ(test, 0ul, *__pf_peek_vf_state(gt, VFUT2));
+
+	KUNIT_EXPECT_EQ(test, 0, kunit_add_action_or_reset(test, dump_state, gt));
+
+	kunit_activate_static_stub(test, pf_get_default_timeout, replacement_timeout);
+
+	test->priv = gt;
+	return 0;
+}
+
+static int sanitize_vf_resources_fail(struct xe_gt *gt, u32 vfid, long timeout)
+{
+	return -ETIMEDOUT;
+}
+
+static int send_vf_control_cmd_reject(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	return -EIO;
+}
+
+static int send_vf_control_cmd_fail(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	return -ENODEV;
+}
+
+static int send_vf_control_cmd_pass_no_reply(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	return 0;
+}
+
+static int send_vf_control_cmd_pass_and_reply(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	switch (cmd) {
+	case GUC_PF_TRIGGER_VF_PAUSE:
+		pf_handle_vf_event(gt, vfid, GUC_PF_NOTIFY_VF_PAUSE_DONE);
+		break;
+	case GUC_PF_TRIGGER_VF_FLR_START:
+		pf_handle_vf_event(gt, vfid, GUC_PF_NOTIFY_VF_FLR_DONE);
+		break;
+	case GUC_PF_TRIGGER_VF_RESUME:
+	case GUC_PF_TRIGGER_VF_STOP:
+	case GUC_PF_TRIGGER_VF_FLR_FINISH:
+		break;
+	default:
+		return -EPROTO;
+	}
+	return 0;
+}
+
+static int send_vf_control_cmd_busy_wait(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	schedule_timeout_interruptible(HZ / 20);
+	return -EBUSY;
+}
+
+static int send_vf_control_cmd_pass_but_reply_flr_only(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	return cmd == GUC_PF_TRIGGER_VF_FLR_START ?
+		send_vf_control_cmd_pass_and_reply(gt, vfid, cmd) :
+		send_vf_control_cmd_pass_no_reply(gt, vfid, cmd);
+}
+
+static int send_vf_control_cmd_busy_except_flr(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	return cmd == GUC_PF_TRIGGER_VF_FLR_START || cmd == GUC_PF_TRIGGER_VF_FLR_FINISH ?
+		send_vf_control_cmd_pass_and_reply(gt, vfid, cmd) :
+		send_vf_control_cmd_busy_wait(gt, vfid, cmd);
+}
+
+static int send_vf_control_cmd_busy_except_stop(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	return cmd == GUC_PF_TRIGGER_VF_STOP ?
+		send_vf_control_cmd_pass_and_reply(gt, vfid, cmd) :
+		send_vf_control_cmd_busy_wait(gt, vfid, cmd);
+}
+
+static int BUSY_MAGIC = 3;
+
+static int send_vf_control_cmd_busy_no_reply(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	static int counter;
+
+	return ++counter % BUSY_MAGIC ? -EBUSY : 0;
+}
+
+static int send_vf_control_cmd_busy_and_reply(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	static int counter;
+
+	return ++counter % BUSY_MAGIC ? -EBUSY :
+		send_vf_control_cmd_pass_and_reply(gt, vfid, cmd);
+}
+
+static const enum xe_gt_sriov_control_bits ready[] = {
+};
+
+static const enum xe_gt_sriov_control_bits flr_starting[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_FLR_WIP,
+	XE_GT_SRIOV_STATE_FLR_SEND_START,
+};
+
+static const enum xe_gt_sriov_control_bits flr_starting_paused[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_FLR_WIP,
+	XE_GT_SRIOV_STATE_FLR_SEND_START,
+	XE_GT_SRIOV_STATE_PAUSED,
+};
+
+static const enum xe_gt_sriov_control_bits flr_starting_stopped[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_FLR_WIP,
+	XE_GT_SRIOV_STATE_FLR_SEND_START,
+	XE_GT_SRIOV_STATE_STOPPED,
+};
+
+static const enum xe_gt_sriov_control_bits flr_waiting[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_FLR_WIP,
+	XE_GT_SRIOV_STATE_FLR_WAIT_GUC,
+};
+
+static const enum xe_gt_sriov_control_bits flr_guc_done[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_FLR_WIP,
+	XE_GT_SRIOV_STATE_FLR_GUC_DONE,
+};
+
+static const enum xe_gt_sriov_control_bits flr_resetting[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_FLR_WIP,
+	XE_GT_SRIOV_STATE_FLR_RESET_CONFIG,
+};
+
+static const enum xe_gt_sriov_control_bits flr_finishing[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_FLR_WIP,
+	XE_GT_SRIOV_STATE_FLR_SEND_FINISH,
+};
+
+static const enum xe_gt_sriov_control_bits flr_failed[] = {
+	XE_GT_SRIOV_STATE_FLR_FAILED,
+};
+
+static const enum xe_gt_sriov_control_bits stopping[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_STOP_WIP,
+	XE_GT_SRIOV_STATE_STOP_SEND_STOP,
+};
+
+static const enum xe_gt_sriov_control_bits stopping_paused[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_STOP_WIP,
+	XE_GT_SRIOV_STATE_STOP_SEND_STOP,
+	XE_GT_SRIOV_STATE_PAUSED,
+};
+
+static const enum xe_gt_sriov_control_bits stop_failed[] = {
+	XE_GT_SRIOV_STATE_STOP_FAILED,
+};
+
+static const enum xe_gt_sriov_control_bits stop_rejected[] = {
+	XE_GT_SRIOV_STATE_STOP_FAILED,
+	XE_GT_SRIOV_STATE_MISMATCH,
+};
+
+static const enum xe_gt_sriov_control_bits stopped[] = {
+	XE_GT_SRIOV_STATE_STOPPED,
+};
+
+static const enum xe_gt_sriov_control_bits pausing[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_PAUSE_WIP,
+	XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE,
+};
+
+static const enum xe_gt_sriov_control_bits pausing_wait_guc[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_PAUSE_WIP,
+	XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC,
+};
+
+static const enum xe_gt_sriov_control_bits pausing_guc_done[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_PAUSE_WIP,
+	XE_GT_SRIOV_STATE_PAUSE_GUC_DONE,
+};
+
+static const enum xe_gt_sriov_control_bits pause_failed[] = {
+	XE_GT_SRIOV_STATE_PAUSE_FAILED,
+};
+
+static const enum xe_gt_sriov_control_bits pause_rejected[] = {
+	XE_GT_SRIOV_STATE_PAUSE_FAILED,
+	XE_GT_SRIOV_STATE_MISMATCH,
+};
+
+static const enum xe_gt_sriov_control_bits paused[] = {
+	XE_GT_SRIOV_STATE_PAUSED,
+};
+
+static const enum xe_gt_sriov_control_bits resuming[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_PAUSED,
+	XE_GT_SRIOV_STATE_RESUME_WIP,
+	XE_GT_SRIOV_STATE_RESUME_SEND_RESUME,
+};
+
+static const enum xe_gt_sriov_control_bits resume_failed[] = {
+	XE_GT_SRIOV_STATE_PAUSED,
+	XE_GT_SRIOV_STATE_RESUME_FAILED,
+};
+
+static const enum xe_gt_sriov_control_bits resume_rejected[] = {
+	XE_GT_SRIOV_STATE_PAUSED,
+	XE_GT_SRIOV_STATE_RESUME_FAILED,
+	XE_GT_SRIOV_STATE_MISMATCH,
+};
+
+static const enum xe_gt_sriov_control_bits resumed[] = {
+	XE_GT_SRIOV_STATE_RESUMED,
+};
+
+static const enum xe_gt_sriov_control_bits mismatch[] = {
+	XE_GT_SRIOV_STATE_MISMATCH,
+};
+
+struct state_param {
+	const char *name;
+	const enum xe_gt_sriov_control_bits *bits;
+	size_t num_bits;
+};
+
+static void state_param_get_desc(struct state_param *p, char *desc)
+{
+	snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s", p->name);
+}
+
+#define MAKE_STATE_PARAM(X) { .name = #X, .bits = X, .num_bits = ARRAY_SIZE(X) }
+
+/*
+ * Due to the test case logic the all "must_pass" params include "_rejected" states
+ * since our "GuC" calls by default will not complain again about the INVALID_STATE
+ * thus our state machine is able to fully recover.
+ */
+
+static struct state_param flr_must_pass_from[] = {
+	MAKE_STATE_PARAM(ready),
+	MAKE_STATE_PARAM(flr_starting),
+	MAKE_STATE_PARAM(flr_starting_paused),
+	MAKE_STATE_PARAM(flr_starting_stopped),
+	MAKE_STATE_PARAM(flr_waiting),
+	MAKE_STATE_PARAM(flr_guc_done),
+	MAKE_STATE_PARAM(flr_resetting),
+	MAKE_STATE_PARAM(flr_finishing),
+	MAKE_STATE_PARAM(flr_failed),
+	MAKE_STATE_PARAM(stopping),
+	MAKE_STATE_PARAM(stop_failed),
+	MAKE_STATE_PARAM(stop_rejected),
+	MAKE_STATE_PARAM(stopped),
+	MAKE_STATE_PARAM(pausing),
+	MAKE_STATE_PARAM(pausing_wait_guc),
+	MAKE_STATE_PARAM(pausing_guc_done),
+	MAKE_STATE_PARAM(pause_failed),
+	MAKE_STATE_PARAM(pause_rejected),
+	MAKE_STATE_PARAM(paused),
+	MAKE_STATE_PARAM(resuming),
+	MAKE_STATE_PARAM(resume_failed),
+	MAKE_STATE_PARAM(resume_rejected),
+	MAKE_STATE_PARAM(resumed),
+	MAKE_STATE_PARAM(mismatch),
+};
+
+static struct state_param stop_must_pass_from[] = {
+	MAKE_STATE_PARAM(ready),
+	MAKE_STATE_PARAM(stop_failed),
+	MAKE_STATE_PARAM(stop_rejected),
+	MAKE_STATE_PARAM(pausing),
+	MAKE_STATE_PARAM(pausing_wait_guc),
+	MAKE_STATE_PARAM(pausing_guc_done),
+	MAKE_STATE_PARAM(pause_failed),
+	MAKE_STATE_PARAM(pause_rejected),
+	MAKE_STATE_PARAM(paused),
+	MAKE_STATE_PARAM(resuming),
+	MAKE_STATE_PARAM(resume_failed),
+	MAKE_STATE_PARAM(resume_rejected),
+	MAKE_STATE_PARAM(resumed),
+	MAKE_STATE_PARAM(mismatch),
+	MAKE_STATE_PARAM(flr_failed),
+};
+
+static struct state_param stop_must_cancel_from[] = {
+	MAKE_STATE_PARAM(flr_starting),
+	MAKE_STATE_PARAM(flr_starting_paused),
+	MAKE_STATE_PARAM(flr_waiting),
+	MAKE_STATE_PARAM(flr_guc_done),
+	MAKE_STATE_PARAM(flr_resetting),
+	MAKE_STATE_PARAM(flr_finishing),
+};
+
+static struct state_param stop_must_fail_from[] = {
+	MAKE_STATE_PARAM(stopping),
+	MAKE_STATE_PARAM(stopping_paused),
+	MAKE_STATE_PARAM(stopped),
+	MAKE_STATE_PARAM(flr_starting_stopped),
+};
+
+static struct state_param pause_must_pass_from[] = {
+	MAKE_STATE_PARAM(ready),
+	MAKE_STATE_PARAM(pause_failed),
+	MAKE_STATE_PARAM(pause_rejected),
+	MAKE_STATE_PARAM(resumed),
+	MAKE_STATE_PARAM(mismatch),
+	MAKE_STATE_PARAM(stop_failed),
+	MAKE_STATE_PARAM(stop_rejected),
+	MAKE_STATE_PARAM(flr_failed),
+};
+
+static struct state_param pause_must_cancel_from[] = {
+	MAKE_STATE_PARAM(flr_starting),
+	MAKE_STATE_PARAM(flr_waiting),
+	MAKE_STATE_PARAM(flr_guc_done),
+	MAKE_STATE_PARAM(flr_resetting),
+	MAKE_STATE_PARAM(flr_finishing),
+	MAKE_STATE_PARAM(stopping),
+};
+
+static struct state_param pause_must_fail_from[] = {
+	MAKE_STATE_PARAM(pausing),
+	MAKE_STATE_PARAM(pausing_wait_guc),
+	MAKE_STATE_PARAM(pausing_guc_done),
+	MAKE_STATE_PARAM(paused),
+	MAKE_STATE_PARAM(resuming),
+	MAKE_STATE_PARAM(resume_failed),
+	MAKE_STATE_PARAM(resume_rejected),
+	MAKE_STATE_PARAM(stopped),
+};
+
+static struct state_param resume_must_pass_from[] = {
+	MAKE_STATE_PARAM(paused),
+	MAKE_STATE_PARAM(resume_failed),
+	MAKE_STATE_PARAM(resume_rejected),
+};
+
+static struct state_param resume_must_cancel_from[] = {
+	MAKE_STATE_PARAM(flr_starting_paused),
+	MAKE_STATE_PARAM(stopping_paused),
+};
+
+static struct state_param resume_must_fail_from[] = {
+	MAKE_STATE_PARAM(ready),
+	MAKE_STATE_PARAM(pausing),
+	MAKE_STATE_PARAM(pausing_wait_guc),
+	MAKE_STATE_PARAM(pausing_guc_done),
+	MAKE_STATE_PARAM(pause_failed),
+	MAKE_STATE_PARAM(pause_rejected),
+	MAKE_STATE_PARAM(resuming),
+	MAKE_STATE_PARAM(resumed),
+	MAKE_STATE_PARAM(stopping),
+	MAKE_STATE_PARAM(stop_failed),
+	MAKE_STATE_PARAM(stop_rejected),
+	MAKE_STATE_PARAM(stopped),
+	MAKE_STATE_PARAM(flr_starting),
+	MAKE_STATE_PARAM(flr_waiting),
+	MAKE_STATE_PARAM(flr_guc_done),
+	MAKE_STATE_PARAM(flr_resetting),
+	MAKE_STATE_PARAM(flr_finishing),
+	MAKE_STATE_PARAM(flr_failed),
+	MAKE_STATE_PARAM(mismatch),
+};
+
+KUNIT_ARRAY_PARAM(flr_must_pass_from, flr_must_pass_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(stop_must_pass_from, stop_must_pass_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(stop_must_fail_from, stop_must_fail_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(stop_must_cancel_from, stop_must_cancel_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(pause_must_pass_from, pause_must_pass_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(pause_must_fail_from, pause_must_fail_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(pause_must_cancel_from, pause_must_cancel_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(resume_must_pass_from, resume_must_pass_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(resume_must_fail_from, resume_must_fail_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(resume_must_cancel_from, resume_must_cancel_from, state_param_get_desc);
+
+static int mimic_pf_handle_vf_flr_done(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_handle_vf_flr_done(gt, vfid);
+	return 0;
+}
+
+static int mimic_pf_handle_vf_pause_done(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_handle_vf_pause_done(gt, vfid);
+	return 0;
+}
+
+static void prepare_state(struct kunit *test, unsigned int vfid,
+			  const enum xe_gt_sriov_control_bits *bits, size_t num_bits)
+{
+	struct xe_gt *gt = test->priv;
+	size_t n;
+
+	for (n = 0; n < num_bits; n++) {
+		enum xe_gt_sriov_control_bits bit = bits[n];
+
+		KUNIT_ASSERT_TRUE(test, pf_enter_vf_state(gt, vfid, bit));
+
+		if (bit == XE_GT_SRIOV_STATE_WIP) {
+			pf_queue_vf(gt, vfid);
+		} else if (bit == XE_GT_SRIOV_STATE_FLR_WAIT_GUC) {
+			xe_kunit_helper_delayed_call(test, HZ / 100,
+						     mimic_pf_handle_vf_flr_done, gt, vfid);
+		} else if (bit == XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC) {
+			xe_kunit_helper_delayed_call(test, HZ / 100,
+						     mimic_pf_handle_vf_pause_done, gt, vfid);
+		}
+	}
+}
+
+static void prepare_state_from_param(struct kunit *test)
+{
+	const struct state_param *p = test->param_value;
+
+	prepare_state(test, VFUT1, p->bits, p->num_bits);
+}
+
+static void expect_not_pausing(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_GUC_DONE));
+}
+
+static void expect_not_in_pause(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	expect_not_pausing(test);
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
+}
+
+static void expect_not_resuming(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_SEND_RESUME));
+}
+
+static void expect_not_in_resume(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	expect_not_resuming(test);
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
+}
+
+static void expect_not_stopping(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_WIP));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_SEND_STOP));
+}
+
+static void expect_not_in_stop(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	expect_not_stopping(test);
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
+}
+
+static void expect_not_in_flr(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_SEND_START));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WAIT_GUC));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_GUC_DONE));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_SEND_FINISH));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+}
+
+static void expect_not_in_wip(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void expect_not_in_mismatch(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+}
+
+static void try_flr_vf(struct kunit *test, bool mimic_busy, bool late_reply)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      mimic_busy ? late_reply ? send_vf_control_cmd_busy_no_reply :
+			      send_vf_control_cmd_busy_and_reply :
+			      late_reply ? send_vf_control_cmd_pass_no_reply :
+			      send_vf_control_cmd_pass_and_reply);
+
+	if (late_reply)
+		xe_kunit_helper_delayed_call(test, HZ / 10,
+					     mimic_pf_handle_vf_flr_done, gt, VFUT1);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+
+	expect_not_in_flr(test);
+	expect_not_in_pause(test);
+	expect_not_in_resume(test);
+	expect_not_in_stop(test);
+	expect_not_in_mismatch(test);
+	expect_not_in_wip(test);
+}
+
+static void flr_vf_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_flr_vf(test, false, false);
+}
+
+static void flr_vf_needs_retry_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_flr_vf(test, true, false);
+}
+
+static void flr_vf_needs_retry_late_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_flr_vf(test, true, true);
+}
+
+static void flr_vf_fails_on_send(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_fail);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
+	KUNIT_EXPECT_NE(test, err, -ECANCELED);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void flr_vf_fails_on_reset(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.vfs[VFUT1].config.sanitize,
+			      sanitize_vf_resources_fail);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
+	KUNIT_EXPECT_NE(test, err, -ECANCELED);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void flr_vf_rejected_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_reject);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
+	KUNIT_EXPECT_NE(test, err, -ECANCELED);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void flr_vf_unconfirmed_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_no_reply);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+	KUNIT_EXPECT_EQ(test, err, -ETIMEDOUT);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+}
+
+static void flr_vf_confirmed_early_continue_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, flr_starting, ARRAY_SIZE(flr_starting));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_no_reply);
+
+	pf_handle_vf_flr_done(gt, VFUT1);
+
+	/*
+	 * make sure SEND_START completes;
+	 * successful reply from cmd_pass_no_reply should exit mismatch state
+	 */
+	flush_work(&gt->sriov.pf.control.worker);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+}
+
+static void flr_vf_confirmed_early_reject_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, flr_starting, ARRAY_SIZE(flr_starting));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_reject);
+
+	pf_handle_vf_flr_done(gt, VFUT1);
+
+	/*
+	 * make sure SEND_START completes;
+	 * error from send_vf_control_cmd_reject should keep mismatch state
+	 */
+	flush_work(&gt->sriov.pf.control.worker);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void flr_vf_confirmed_twice_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, flr_guc_done, ARRAY_SIZE(flr_guc_done));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_no_reply);
+
+	pf_handle_vf_flr_done(gt, VFUT1);
+
+	/* this is fully recoverable */
+	KUNIT_EXPECT_EQ(test, 0, pf_wait_vf_wip_done(gt, VFUT1, HZ));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+}
+
+static void flr_vf_confirmed_too_late_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, flr_failed, ARRAY_SIZE(flr_failed));
+
+	pf_handle_vf_flr_done(gt, VFUT1);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void flr_vf_unsolicited_confirmation_from_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+
+	pf_handle_vf_flr_done(gt, VFUT1);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+}
+
+static void flr_vf_wrong_confirmation_from_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, flr_waiting, ARRAY_SIZE(flr_waiting));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	pf_handle_vf_pause_done(gt, VFUT1);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+}
+
+static void flr_vf_canceled_by_restart(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_busy_wait);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10, xe_gt_sriov_pf_control_restart, gt);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+	expect_not_in_flr(test);
+}
+
+static void try_stop_vf(struct kunit *test, bool mimic_busy)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      mimic_busy ? send_vf_control_cmd_busy_and_reply :
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
+	expect_not_stopping(test);
+	expect_not_in_pause(test);
+	expect_not_in_resume(test);
+	expect_not_in_mismatch(test);
+}
+
+static void stop_vf_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_stop_vf(test, false);
+}
+
+static void stop_vf_needs_retry_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_stop_vf(test, true);
+}
+
+static void stop_vf_refused_from(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	prepare_state_from_param(test);
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+	KUNIT_EXPECT_NE(test, err, -ECANCELED);
+
+	KUNIT_EXPECT_TRUE(test, err == -EALREADY ||
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
+}
+
+static void stop_vf_fails_on_send(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_fail);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
+	KUNIT_EXPECT_NE(test, err, -ECANCELED);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
+	expect_not_stopping(test);
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void stop_vf_rejected_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_reject);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
+	KUNIT_EXPECT_NE(test, err, -ECANCELED);
+
+	expect_not_stopping(test);
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void stop_vf_canceled_from(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state_from_param(test);
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
+}
+
+static void stop_vf_canceled_by_restart(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_busy_except_flr);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10, xe_gt_sriov_pf_control_restart, gt);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+	expect_not_in_stop(test);
+}
+
+static void stop_vf_canceled_by_flr(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_busy_except_flr);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10,
+				     xe_gt_sriov_pf_control_trigger_flr, gt, VFUT1);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+	expect_not_in_stop(test);
+}
+
+static void try_pause_vf(struct kunit *test, bool mimic_busy)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      mimic_busy ? send_vf_control_cmd_busy_and_reply :
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
+	expect_not_pausing(test);
+	expect_not_in_mismatch(test);
+}
+
+static void pause_vf_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_pause_vf(test, false);
+}
+
+static void pause_vf_needs_retry_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_pause_vf(test, true);
+}
+
+static void pause_vf_canceled_from(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state_from_param(test);
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	expect_not_in_pause(test);
+}
+
+static void pause_vf_refused_from(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	prepare_state_from_param(test);
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	KUNIT_EXPECT_NE(test, err, -ECANCELED);
+
+	KUNIT_EXPECT_TRUE(test, err == -EALREADY ||
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
+}
+
+static void pause_vf_rejected_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_reject);
+
+	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void pause_vf_fails_on_send(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_fail);
+
+	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void pause_vf_unconfirmed_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_no_reply);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	KUNIT_EXPECT_EQ(test, err, -ETIMEDOUT);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
+}
+
+static void pause_vf_canceled_by_restart(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_no_reply);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10, xe_gt_sriov_pf_control_restart, gt);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	expect_not_in_pause(test);
+}
+
+static void pause_vf_canceled_by_flr(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_but_reply_flr_only);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10,
+				     xe_gt_sriov_pf_control_trigger_flr, gt, VFUT1);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	expect_not_in_pause(test);
+}
+
+static void pause_vf_canceled_by_stop(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_no_reply);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10,
+				     xe_gt_sriov_pf_control_stop_vf, gt, VFUT1);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	expect_not_in_pause(test);
+}
+
+static void try_resume_vf(struct kunit *test, bool mimic_busy)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      mimic_busy ? send_vf_control_cmd_busy_and_reply :
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
+	expect_not_resuming(test);
+	expect_not_in_pause(test);
+	expect_not_in_mismatch(test);
+	expect_not_in_wip(test);
+}
+
+static void resume_vf_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_resume_vf(test, false);
+}
+
+static void resume_vf_needs_retry_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_resume_vf(test, true);
+}
+
+static void resume_vf_fails_on_send(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_fail);
+
+	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
+
+	expect_not_resuming(test);
+	expect_not_in_mismatch(test);
+	expect_not_in_wip(test);
+}
+
+static void resume_vf_rejected_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_reject);
+
+	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
+
+	expect_not_resuming(test);
+	expect_not_in_wip(test);
+}
+
+static void resume_vf_canceled_from(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state_from_param(test);
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
+	expect_not_resuming(test);
+}
+
+static void resume_vf_refused_from(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	prepare_state_from_param(test);
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+	KUNIT_EXPECT_NE(test, err, -EIO);
+
+	KUNIT_EXPECT_TRUE(test, err == -EALREADY ||
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
+}
+
+static void resume_vf_canceled_by_restart(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_busy_except_flr);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10, xe_gt_sriov_pf_control_restart, gt);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
+}
+
+static void resume_vf_canceled_by_flr(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_busy_except_flr);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10,
+				     xe_gt_sriov_pf_control_trigger_flr, gt, VFUT1);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
+}
+
+static void resume_vf_canceled_by_stop(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_busy_except_stop);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10,
+				     xe_gt_sriov_pf_control_stop_vf, gt, VFUT1);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
+}
+
+static void basic_pause_and_resume_vf(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_ASSERT_EQ(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+}
+
+static void basic_pause_and_stop_vf(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_ASSERT_EQ(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+}
+
+static void basic_stop_and_flr_vf(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+}
+
+static void basic_flr_and_flr_vf(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+}
+
+static void basic_flr_vfs(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT2));
+}
+
+static struct kunit_case pf_control_test_cases[] = {
+	KUNIT_CASE(basic_pause_and_resume_vf),
+	KUNIT_CASE(basic_pause_and_stop_vf),
+	KUNIT_CASE(basic_stop_and_flr_vf),
+	KUNIT_CASE(basic_flr_and_flr_vf),
+	KUNIT_CASE(basic_flr_vfs),
+
+	KUNIT_CASE_PARAM(flr_vf_from, flr_must_pass_from_gen_params),
+	KUNIT_CASE_PARAM(flr_vf_needs_retry_from, flr_must_pass_from_gen_params),
+	KUNIT_CASE_PARAM(flr_vf_needs_retry_late_from, flr_must_pass_from_gen_params),
+	KUNIT_CASE(flr_vf_fails_on_send),
+	KUNIT_CASE(flr_vf_fails_on_reset),
+	KUNIT_CASE(flr_vf_rejected_by_guc),
+	KUNIT_CASE_SLOW(flr_vf_unconfirmed_by_guc),
+	KUNIT_CASE(flr_vf_confirmed_early_continue_by_guc),
+	KUNIT_CASE(flr_vf_confirmed_early_reject_by_guc),
+	KUNIT_CASE(flr_vf_confirmed_twice_by_guc),
+	KUNIT_CASE(flr_vf_confirmed_too_late_by_guc),
+	KUNIT_CASE(flr_vf_wrong_confirmation_from_guc),
+	KUNIT_CASE(flr_vf_unsolicited_confirmation_from_guc),
+	KUNIT_CASE(flr_vf_canceled_by_restart),
+
+	KUNIT_CASE_PARAM(stop_vf_from, stop_must_pass_from_gen_params),
+	KUNIT_CASE_PARAM(stop_vf_needs_retry_from, stop_must_pass_from_gen_params),
+	KUNIT_CASE_PARAM(stop_vf_refused_from, stop_must_fail_from_gen_params),
+	KUNIT_CASE_PARAM(stop_vf_canceled_from, stop_must_cancel_from_gen_params),
+	KUNIT_CASE(stop_vf_fails_on_send),
+	KUNIT_CASE(stop_vf_rejected_by_guc),
+	KUNIT_CASE(stop_vf_canceled_by_flr),
+	KUNIT_CASE(stop_vf_canceled_by_restart),
+
+	KUNIT_CASE_PARAM(pause_vf_from, pause_must_pass_from_gen_params),
+	KUNIT_CASE_PARAM(pause_vf_needs_retry_from, pause_must_pass_from_gen_params),
+	KUNIT_CASE_PARAM(pause_vf_refused_from, pause_must_fail_from_gen_params),
+	KUNIT_CASE_PARAM(pause_vf_canceled_from, pause_must_cancel_from_gen_params),
+	KUNIT_CASE(pause_vf_fails_on_send),
+	KUNIT_CASE(pause_vf_rejected_by_guc),
+	KUNIT_CASE_SLOW(pause_vf_unconfirmed_by_guc),
+	KUNIT_CASE(pause_vf_canceled_by_flr),
+	KUNIT_CASE(pause_vf_canceled_by_stop),
+	KUNIT_CASE(pause_vf_canceled_by_restart),
+
+	KUNIT_CASE_PARAM(resume_vf_from, resume_must_pass_from_gen_params),
+	KUNIT_CASE_PARAM(resume_vf_needs_retry_from, resume_must_pass_from_gen_params),
+	KUNIT_CASE_PARAM(resume_vf_refused_from, resume_must_fail_from_gen_params),
+	KUNIT_CASE_PARAM(resume_vf_canceled_from, resume_must_cancel_from_gen_params),
+	KUNIT_CASE(resume_vf_fails_on_send),
+	KUNIT_CASE(resume_vf_rejected_by_guc),
+	KUNIT_CASE(resume_vf_canceled_by_flr),
+	KUNIT_CASE(resume_vf_canceled_by_stop),
+	KUNIT_CASE(resume_vf_canceled_by_restart),
+
+	{}
+};
+
+static struct kunit_suite pf_control_suite = {
+	.name = "pf_control",
+	.test_cases = pf_control_test_cases,
+	.init = pf_control_test_init,
+};
+
+kunit_test_suite(pf_control_suite);
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
index e91c71d768ff..4863d79f72e0 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
@@ -4,6 +4,7 @@
  */
 
 #include <drm/drm_managed.h>
+#include <kunit/static_stub.h>
 
 #include "abi/guc_actions_sriov_abi.h"
 
@@ -196,6 +197,8 @@ static const char *control_bit_to_string(enum xe_gt_sriov_control_bits bit)
 
 static unsigned long pf_get_default_timeout(enum xe_gt_sriov_control_bits bit)
 {
+	KUNIT_STATIC_STUB_REDIRECT(pf_get_default_timeout, bit);
+
 	switch (bit) {
 	case XE_GT_SRIOV_STATE_FLR_WAIT_GUC:
 	case XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC:
@@ -1458,3 +1461,7 @@ void xe_gt_sriov_pf_control_restart(struct xe_gt *gt)
 	for (n = 1; n <= totalvfs; n++)
 		pf_enter_vf_ready(gt, n);
 }
+
+#if IS_BUILTIN(CONFIG_DRM_XE_KUNIT_TEST)
+#include "tests/xe_gt_sriov_pf_control_kunit.c"
+#endif
-- 
2.43.0


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

* [PATCH 12/12] drm/xe/tests: Add KUnit tests for VF control GuC messages
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (10 preceding siblings ...)
  2024-08-09 16:51 ` [PATCH 11/12] drm/xe/tests: Add KUnit tests for VF control state machines Michal Wajdeczko
@ 2024-08-09 16:51 ` Michal Wajdeczko
  2024-08-23 13:18   ` Piotr Piórkowski
  2024-08-09 16:57 ` ✓ CI.Patch_applied: success for PF: Improve VF control Patchwork
                   ` (10 subsequent siblings)
  22 siblings, 1 reply; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-09 16:51 UTC (permalink / raw)
  To: intel-xe; +Cc: Michal Wajdeczko, Lucas De Marchi

Add KUnit tests (~50) to cover all possible VF control messages
that could be seen by the PF, either expected or corrupted.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
---
 .../xe/tests/xe_gt_sriov_pf_control_kunit.c   | 194 ++++++++++++++++++
 1 file changed, 194 insertions(+)

diff --git a/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c b/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
index 4252577b4bbd..194fcf5687d1 100644
--- a/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
+++ b/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
@@ -1358,3 +1358,197 @@ static struct kunit_suite pf_control_suite = {
 };
 
 kunit_test_suite(pf_control_suite);
+
+#define PREP_MSG_0_VF_STATE_NOTIFY(mbz)							\
+	FIELD_PREP_CONST(GUC_HXG_MSG_0_ORIGIN, GUC_HXG_ORIGIN_GUC) |			\
+	FIELD_PREP_CONST(GUC_HXG_MSG_0_TYPE, GUC_HXG_TYPE_EVENT) |			\
+	FIELD_PREP_CONST(GUC_HXG_EVENT_MSG_0_DATA0, (mbz)) |				\
+	FIELD_PREP_CONST(GUC_HXG_EVENT_MSG_0_ACTION, GUC_ACTION_GUC2PF_VF_STATE_NOTIFY)
+
+#define PREP_MSG_VF_STATE_NOTIFY(mbz, vfid, e)						\
+	PREP_MSG_0_VF_STATE_NOTIFY(mbz),						\
+	FIELD_PREP_CONST(GUC2PF_VF_STATE_NOTIFY_EVENT_MSG_1_VFID, (vfid)),		\
+	FIELD_PREP_CONST(GUC2PF_VF_STATE_NOTIFY_EVENT_MSG_2_EVENT, (e))
+
+static const u32 msg_pf_enable[] = {
+	PREP_MSG_VF_STATE_NOTIFY(0, 0, GUC_PF_NOTIFY_VF_ENABLE),
+};
+
+static const u32 msg_vf_flr[] = {
+	PREP_MSG_VF_STATE_NOTIFY(0, VFUT1, GUC_PF_NOTIFY_VF_FLR),
+};
+
+static const u32 msg_vf_flr_done[] = {
+	PREP_MSG_VF_STATE_NOTIFY(0, VFUT1, GUC_PF_NOTIFY_VF_FLR_DONE),
+};
+
+static const u32 msg_vf_pause_done[] = {
+	PREP_MSG_VF_STATE_NOTIFY(0, VFUT1, GUC_PF_NOTIFY_VF_PAUSE_DONE),
+};
+
+static const u32 msg_vf_fixup[] = {
+	PREP_MSG_VF_STATE_NOTIFY(0, VFUT1, GUC_PF_NOTIFY_VF_FIXUP_DONE),
+};
+
+static const u32 msg_pf_bad_mbz[] = {
+	PREP_MSG_VF_STATE_NOTIFY(1, 0, GUC_PF_NOTIFY_VF_ENABLE),
+};
+
+static const u32 msg_pf_invalid_event[] = {
+	PREP_MSG_VF_STATE_NOTIFY(0, 0, 0),
+};
+
+static const u32 msg_pf_unknown_event[] = {
+	PREP_MSG_VF_STATE_NOTIFY(0, 0, GUC_PF_NOTIFY_VF_ENABLE + 1),
+};
+
+static const u32 msg_vf_bad_mbz[] = {
+	PREP_MSG_VF_STATE_NOTIFY(1, VFUT1, GUC_PF_NOTIFY_VF_FLR),
+};
+
+static const u32 msg_vf_bad_vfid[] = {
+	PREP_MSG_VF_STATE_NOTIFY(0, VFID(DUT_NUM_VFS + 1), GUC_PF_NOTIFY_VF_FLR),
+};
+
+static const u32 msg_vf_invalid_event[] = {
+	PREP_MSG_VF_STATE_NOTIFY(0, VFUT1, 0),
+};
+
+static const u32 msg_vf_unknown_event[] = {
+	PREP_MSG_VF_STATE_NOTIFY(0, VFUT1, GUC_PF_NOTIFY_VF_FIXUP_DONE + 1),
+};
+
+static const u32 msg_no_data[GUC_HXG_EVENT_MSG_MIN_LEN] = {
+	PREP_MSG_0_VF_STATE_NOTIFY(0),
+	/* only header, missing both VFID and EVENT data */
+};
+
+static const u32 msg_pf_too_short[GUC2PF_VF_STATE_NOTIFY_EVENT_MSG_LEN - 1] = {
+	PREP_MSG_0_VF_STATE_NOTIFY(0),
+	PFID,
+	/* missing EVENT data */
+};
+
+static const u32 msg_pf_too_long[GUC2PF_VF_STATE_NOTIFY_EVENT_MSG_LEN + 1] = {
+	PREP_MSG_VF_STATE_NOTIFY(0, 0, GUC_PF_NOTIFY_VF_ENABLE),
+	0, /* unexpected extra DATA */
+};
+
+static const u32 msg_vf_too_short[GUC2PF_VF_STATE_NOTIFY_EVENT_MSG_LEN - 1] = {
+	PREP_MSG_0_VF_STATE_NOTIFY(0),
+	VFUT1,
+	/* missing EVENT data */
+};
+
+static const u32 msg_vf_too_long[GUC2PF_VF_STATE_NOTIFY_EVENT_MSG_LEN + 1] = {
+	PREP_MSG_VF_STATE_NOTIFY(0, VFUT1, GUC_PF_NOTIFY_VF_FLR),
+	0, /* unexpected extra DATA */
+};
+
+struct msg_param {
+	const char *name;
+	const u32 *msg;
+	size_t len;
+};
+
+static void msg_param_get_desc(struct msg_param *p, char *desc)
+{
+	snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s", p->name);
+}
+
+#define MAKE_MSG_PARAM(X) { .name = #X, .msg = X, .len = ARRAY_SIZE(X) }
+
+#define LIST_MSG_PARAM_VALID			\
+	MAKE_MSG_PARAM(msg_pf_enable),		\
+	MAKE_MSG_PARAM(msg_vf_flr),		\
+	MAKE_MSG_PARAM(msg_vf_flr_done),	\
+	MAKE_MSG_PARAM(msg_vf_pause_done),	\
+	MAKE_MSG_PARAM(msg_vf_fixup)
+
+#define LIST_MSG_PARAM_INVALID			\
+	MAKE_MSG_PARAM(msg_no_data),		\
+	MAKE_MSG_PARAM(msg_pf_too_long),	\
+	MAKE_MSG_PARAM(msg_pf_too_short),	\
+	MAKE_MSG_PARAM(msg_pf_bad_mbz),		\
+	MAKE_MSG_PARAM(msg_pf_invalid_event),	\
+	MAKE_MSG_PARAM(msg_pf_unknown_event),	\
+	MAKE_MSG_PARAM(msg_vf_too_long),	\
+	MAKE_MSG_PARAM(msg_vf_too_short),	\
+	MAKE_MSG_PARAM(msg_vf_bad_mbz),		\
+	MAKE_MSG_PARAM(msg_vf_bad_vfid),	\
+	MAKE_MSG_PARAM(msg_vf_invalid_event),	\
+	MAKE_MSG_PARAM(msg_vf_unknown_event)
+
+static struct msg_param valid_messages[] = {
+	LIST_MSG_PARAM_VALID,
+};
+
+static struct msg_param invalid_messages[] = {
+	LIST_MSG_PARAM_INVALID,
+};
+
+static struct msg_param all_messages[] = {
+	LIST_MSG_PARAM_VALID,
+	LIST_MSG_PARAM_INVALID,
+};
+
+KUNIT_ARRAY_PARAM(valid_messages, valid_messages, msg_param_get_desc);
+KUNIT_ARRAY_PARAM(invalid_messages, invalid_messages, msg_param_get_desc);
+KUNIT_ARRAY_PARAM(all_messages, all_messages, msg_param_get_desc);
+
+static void xe_rejects_all_g2h(struct kunit *test)
+{
+	struct xe_device *xe = (xe_kunit_helper_xe_device_test_init(test), test->priv);
+	struct xe_gt *gt = xe_device_get_gt(xe, 0);
+	const struct msg_param *p = test->param_value;
+
+	KUNIT_EXPECT_FALSE(test, IS_SRIOV_PF(xe));
+	KUNIT_EXPECT_EQ(test, -EPROTO, xe_gt_sriov_pf_control_process_guc2pf(gt, p->msg, p->len));
+}
+
+static void vf_rejects_all_g2h(struct kunit *test)
+{
+	struct xe_device *xe = (xe_kunit_helper_xe_device_test_init(test), test->priv);
+	struct xe_gt *gt = xe_device_get_gt(xe, 0);
+	const struct msg_param *p = test->param_value;
+
+	KUNIT_EXPECT_FALSE(test, IS_SRIOV(xe));
+	xe->sriov.__mode = XE_SRIOV_MODE_VF;
+
+	KUNIT_EXPECT_TRUE(test, IS_SRIOV_VF(xe));
+	KUNIT_EXPECT_EQ(test, -EPROTO, xe_gt_sriov_pf_control_process_guc2pf(gt, p->msg, p->len));
+}
+
+static void pf_rejects_malformed_g2h(struct kunit *test)
+{
+	struct xe_gt *gt = (pf_control_test_init(test), test->priv);
+	const struct msg_param *p = test->param_value;
+
+	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_process_guc2pf(gt, p->msg, p->len));
+}
+
+static void pf_accepts_valid_g2h(struct kunit *test)
+{
+	struct xe_gt *gt = (pf_control_test_init(test), test->priv);
+	const struct msg_param *p = test->param_value;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_no_reply);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_process_guc2pf(gt, p->msg, p->len));
+}
+
+static struct kunit_case pf_control_guc_test_cases[] = {
+	KUNIT_CASE_PARAM(xe_rejects_all_g2h, all_messages_gen_params),
+	KUNIT_CASE_PARAM(vf_rejects_all_g2h, all_messages_gen_params),
+	KUNIT_CASE_PARAM(pf_rejects_malformed_g2h, invalid_messages_gen_params),
+	KUNIT_CASE_PARAM(pf_accepts_valid_g2h, valid_messages_gen_params),
+	{}
+};
+
+static struct kunit_suite pf_control_guc_suite = {
+	.name = "pf_control_guc",
+	.test_cases = pf_control_guc_test_cases,
+};
+
+kunit_test_suite(pf_control_guc_suite);
-- 
2.43.0


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

* ✓ CI.Patch_applied: success for PF: Improve VF control
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (11 preceding siblings ...)
  2024-08-09 16:51 ` [PATCH 12/12] drm/xe/tests: Add KUnit tests for VF control GuC messages Michal Wajdeczko
@ 2024-08-09 16:57 ` Patchwork
  2024-08-09 16:58 ` ✗ CI.checkpatch: warning " Patchwork
                   ` (9 subsequent siblings)
  22 siblings, 0 replies; 47+ messages in thread
From: Patchwork @ 2024-08-09 16:57 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

== Series Details ==

Series: PF: Improve VF control
URL   : https://patchwork.freedesktop.org/series/137095/
State : success

== Summary ==

=== Applying kernel patches on branch 'drm-tip' with base: ===
Base commit: fecad563ec6f drm-tip: 2024y-08m-09d-16h-02m-57s UTC integration manifest
=== git am output follows ===
Applying: drm/xe/pf: Add function to sanitize VF resources
Applying: drm/xe/pf: Fix documentation formatting
Applying: drm/xe/pf: Drop GuC notifications for non-existing VF
Applying: drm/xe/pf: Improve VF control
Applying: drm/xe/tests: Allow deferred function call during KUnit test
Applying: drm/xe/tests: Add helper macro to detect if KUnit is running
Applying: drm/xe/tests: Add helpers to call stubs out of KUnit context
Applying: drm/xe/guc: Define stub for xe_guc_ct_send_recv()
Applying: drm/xe/pf: Define stub for pf_sanitize_vf_resources()
Applying: drm/xe/pf: Define stub for pf_send_vf_control_cmd()
Applying: drm/xe/tests: Add KUnit tests for VF control state machines
Applying: drm/xe/tests: Add KUnit tests for VF control GuC messages



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

* ✗ CI.checkpatch: warning for PF: Improve VF control
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (12 preceding siblings ...)
  2024-08-09 16:57 ` ✓ CI.Patch_applied: success for PF: Improve VF control Patchwork
@ 2024-08-09 16:58 ` Patchwork
  2024-08-09 16:58 ` ✗ CI.KUnit: failure " Patchwork
                   ` (8 subsequent siblings)
  22 siblings, 0 replies; 47+ messages in thread
From: Patchwork @ 2024-08-09 16:58 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

== Series Details ==

Series: PF: Improve VF control
URL   : https://patchwork.freedesktop.org/series/137095/
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
dc547930fbb1350eaf6bde84653b9ac973a411db
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit fd73c71c97fffd2bec57fd1668b358dabbc67ba7
Author: Michal Wajdeczko <michal.wajdeczko@intel.com>
Date:   Fri Aug 9 18:51:59 2024 +0200

    drm/xe/tests: Add KUnit tests for VF control GuC messages
    
    Add KUnit tests (~50) to cover all possible VF control messages
    that could be seen by the PF, either expected or corrupted.
    
    Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
    Cc: Lucas De Marchi <lucas.demarchi@intel.com>
+ /mt/dim checkpatch fecad563ec6fa0d6c38ecd36d660a663ad390ea1 drm-intel
b5c32521ec62 drm/xe/pf: Add function to sanitize VF resources
7a34bbd55e9b drm/xe/pf: Fix documentation formatting
12c0de5efa95 drm/xe/pf: Drop GuC notifications for non-existing VF
26c80196d378 drm/xe/pf: Improve VF control
-:1368: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#1368: 
new file mode 100644

total: 0 errors, 1 warnings, 0 checks, 1449 lines checked
6badbd614dff drm/xe/tests: Allow deferred function call during KUnit test
-:228: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'func' - possible side-effects?
#228: FILE: drivers/gpu/drm/xe/tests/xe_kunit_helpers.h:47:
+#define xe_kunit_helper_delayed_call(test, delay, func, args...)	\
+	_Generic(func,							\
+		 void (*)(struct xe_device *) :				\
+			xe_kunit_helper_delayed_call_void_xe_device,	\
+		 void (*)(struct xe_gt *) :				\
+			xe_kunit_helper_delayed_call_void_xe_gt,	\
+		 int (*)(struct xe_gt *, unsigned int) :		\
+			xe_kunit_helper_delayed_call_int_xe_gt_uint	\
+	)(test, delay, func, args)

-:229: CHECK:CAMELCASE: Avoid CamelCase: <_Generic>
#229: FILE: drivers/gpu/drm/xe/tests/xe_kunit_helpers.h:48:
+	_Generic(func,							\

-:230: CHECK:SPACING: No space is necessary after a cast
#230: FILE: drivers/gpu/drm/xe/tests/xe_kunit_helpers.h:49:
+		 void (*)(struct xe_device *) :				\

-:232: CHECK:SPACING: No space is necessary after a cast
#232: FILE: drivers/gpu/drm/xe/tests/xe_kunit_helpers.h:51:
+		 void (*)(struct xe_gt *) :				\

total: 0 errors, 0 warnings, 4 checks, 199 lines checked
4efcd1651e1e drm/xe/tests: Add helper macro to detect if KUnit is running
715a4af91bf4 drm/xe/tests: Add helpers to call stubs out of KUnit context
-:58: WARNING:MACRO_WITH_FLOW_CONTROL: Macros with flow control statements should be avoided
#58: FILE: drivers/gpu/drm/xe/tests/xe_test.h:93:
+#define XE_TEST_REDIRECT(stub, args...)							\
+do {											\
+	typeof(stub) replacement = (stub);						\
+	if (XE_TEST_RUNNING()) {							\
+		if (unlikely(replacement)) {						\
+			pr_info(KUNIT_SUBTEST_INDENT "# %s: calling stub %ps\n",	\
+				__func__, replacement);					\
+			return replacement(args);					\
+		}									\
+	}										\
+} while (0)

total: 0 errors, 1 warnings, 0 checks, 85 lines checked
2155fe82e6cd drm/xe/guc: Define stub for xe_guc_ct_send_recv()
d056743a5124 drm/xe/pf: Define stub for pf_sanitize_vf_resources()
1dc5182fd47d drm/xe/pf: Define stub for pf_send_vf_control_cmd()
a298f3076b50 drm/xe/tests: Add KUnit tests for VF control state machines
-:14: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#14: 
new file mode 100644

-:309: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'X' - possible side-effects?
#309: FILE: drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:291:
+#define MAKE_STATE_PARAM(X) { .name = #X, .bits = X, .num_bits = ARRAY_SIZE(X) }

total: 0 errors, 1 warnings, 1 checks, 1382 lines checked
fd73c71c97ff drm/xe/tests: Add KUnit tests for VF control GuC messages
-:21: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#21: FILE: drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:1362:
+#define PREP_MSG_0_VF_STATE_NOTIFY(mbz)							\
+	FIELD_PREP_CONST(GUC_HXG_MSG_0_ORIGIN, GUC_HXG_ORIGIN_GUC) |			\
+	FIELD_PREP_CONST(GUC_HXG_MSG_0_TYPE, GUC_HXG_TYPE_EVENT) |			\
+	FIELD_PREP_CONST(GUC_HXG_EVENT_MSG_0_DATA0, (mbz)) |				\
+	FIELD_PREP_CONST(GUC_HXG_EVENT_MSG_0_ACTION, GUC_ACTION_GUC2PF_VF_STATE_NOTIFY)

-:27: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#27: FILE: drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:1368:
+#define PREP_MSG_VF_STATE_NOTIFY(mbz, vfid, e)						\
+	PREP_MSG_0_VF_STATE_NOTIFY(mbz),						\
+	FIELD_PREP_CONST(GUC2PF_VF_STATE_NOTIFY_EVENT_MSG_1_VFID, (vfid)),		\
+	FIELD_PREP_CONST(GUC2PF_VF_STATE_NOTIFY_EVENT_MSG_2_EVENT, (e))

-:118: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'X' - possible side-effects?
#118: FILE: drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:1459:
+#define MAKE_MSG_PARAM(X) { .name = #X, .msg = X, .len = ARRAY_SIZE(X) }

-:120: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#120: FILE: drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:1461:
+#define LIST_MSG_PARAM_VALID			\
+	MAKE_MSG_PARAM(msg_pf_enable),		\
+	MAKE_MSG_PARAM(msg_vf_flr),		\
+	MAKE_MSG_PARAM(msg_vf_flr_done),	\
+	MAKE_MSG_PARAM(msg_vf_pause_done),	\
+	MAKE_MSG_PARAM(msg_vf_fixup)

-:127: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#127: FILE: drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:1468:
+#define LIST_MSG_PARAM_INVALID			\
+	MAKE_MSG_PARAM(msg_no_data),		\
+	MAKE_MSG_PARAM(msg_pf_too_long),	\
+	MAKE_MSG_PARAM(msg_pf_too_short),	\
+	MAKE_MSG_PARAM(msg_pf_bad_mbz),		\
+	MAKE_MSG_PARAM(msg_pf_invalid_event),	\
+	MAKE_MSG_PARAM(msg_pf_unknown_event),	\
+	MAKE_MSG_PARAM(msg_vf_too_long),	\
+	MAKE_MSG_PARAM(msg_vf_too_short),	\
+	MAKE_MSG_PARAM(msg_vf_bad_mbz),		\
+	MAKE_MSG_PARAM(msg_vf_bad_vfid),	\
+	MAKE_MSG_PARAM(msg_vf_invalid_event),	\
+	MAKE_MSG_PARAM(msg_vf_unknown_event)

total: 4 errors, 0 warnings, 1 checks, 197 lines checked



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

* ✗ CI.KUnit: failure for PF: Improve VF control
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (13 preceding siblings ...)
  2024-08-09 16:58 ` ✗ CI.checkpatch: warning " Patchwork
@ 2024-08-09 16:58 ` Patchwork
  2024-08-09 17:28 ` ✓ CI.Patch_applied: success for PF: Improve VF control (rev2) Patchwork
                   ` (7 subsequent siblings)
  22 siblings, 0 replies; 47+ messages in thread
From: Patchwork @ 2024-08-09 16:58 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

== Series Details ==

Series: PF: Improve VF control
URL   : https://patchwork.freedesktop.org/series/137095/
State : failure

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
ERROR:root:../lib/iomap.c:156:5: warning: no previous prototype for ‘ioread64_lo_hi’ [-Wmissing-prototypes]
  156 | u64 ioread64_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:163:5: warning: no previous prototype for ‘ioread64_hi_lo’ [-Wmissing-prototypes]
  163 | u64 ioread64_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:170:5: warning: no previous prototype for ‘ioread64be_lo_hi’ [-Wmissing-prototypes]
  170 | u64 ioread64be_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:178:5: warning: no previous prototype for ‘ioread64be_hi_lo’ [-Wmissing-prototypes]
  178 | u64 ioread64be_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:264:6: warning: no previous prototype for ‘iowrite64_lo_hi’ [-Wmissing-prototypes]
  264 | void iowrite64_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:272:6: warning: no previous prototype for ‘iowrite64_hi_lo’ [-Wmissing-prototypes]
  272 | void iowrite64_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:280:6: warning: no previous prototype for ‘iowrite64be_lo_hi’ [-Wmissing-prototypes]
  280 | void iowrite64be_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~
../lib/iomap.c:288:6: warning: no previous prototype for ‘iowrite64be_hi_lo’ [-Wmissing-prototypes]
  288 | void iowrite64be_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~
In file included from ../include/kunit/static_stub.h:18,
                 from ../drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c:7:
../drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c: In function ‘pf_control_test_init’:
../drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:52:30: error: implicit declaration of function ‘__pf_peek_vf_state’; did you mean ‘pf_peek_vf_state’? [-Werror=implicit-function-declaration]
   52 |  KUNIT_ASSERT_EQ(test, 0ul, *__pf_peek_vf_state(gt, VFUT1));
      |                              ^~~~~~~~~~~~~~~~~~
../include/kunit/test.h:725:15: note: in definition of macro ‘KUNIT_BASE_BINARY_ASSERTION’
  725 |  const typeof(right) __right = (right);           \
      |               ^~~~~
../include/kunit/test.h:1299:2: note: in expansion of macro ‘KUNIT_BINARY_INT_ASSERTION’
 1299 |  KUNIT_BINARY_INT_ASSERTION(test,           \
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~
../include/kunit/test.h:1296:2: note: in expansion of macro ‘KUNIT_ASSERT_EQ_MSG’
 1296 |  KUNIT_ASSERT_EQ_MSG(test, left, right, NULL)
      |  ^~~~~~~~~~~~~~~~~~~
../drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:52:2: note: in expansion of macro ‘KUNIT_ASSERT_EQ’
   52 |  KUNIT_ASSERT_EQ(test, 0ul, *__pf_peek_vf_state(gt, VFUT1));
      |  ^~~~~~~~~~~~~~~
../drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:52:29: error: invalid type argument of unary ‘*’ (have ‘int’)
   52 |  KUNIT_ASSERT_EQ(test, 0ul, *__pf_peek_vf_state(gt, VFUT1));
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../include/kunit/test.h:725:15: note: in definition of macro ‘KUNIT_BASE_BINARY_ASSERTION’
  725 |  const typeof(right) __right = (right);           \
      |               ^~~~~
../include/kunit/test.h:1299:2: note: in expansion of macro ‘KUNIT_BINARY_INT_ASSERTION’
 1299 |  KUNIT_BINARY_INT_ASSERTION(test,           \
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~
../include/kunit/test.h:1296:2: note: in expansion of macro ‘KUNIT_ASSERT_EQ_MSG’
 1296 |  KUNIT_ASSERT_EQ_MSG(test, left, right, NULL)
      |  ^~~~~~~~~~~~~~~~~~~
../drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:52:2: note: in expansion of macro ‘KUNIT_ASSERT_EQ’
   52 |  KUNIT_ASSERT_EQ(test, 0ul, *__pf_peek_vf_state(gt, VFUT1));
      |  ^~~~~~~~~~~~~~~
../drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:52:29: error: invalid type argument of unary ‘*’ (have ‘int’)
   52 |  KUNIT_ASSERT_EQ(test, 0ul, *__pf_peek_vf_state(gt, VFUT1));
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../include/kunit/test.h:725:33: note: in definition of macro ‘KUNIT_BASE_BINARY_ASSERTION’
  725 |  const typeof(right) __right = (right);           \
      |                                 ^~~~~
../include/kunit/test.h:1299:2: note: in expansion of macro ‘KUNIT_BINARY_INT_ASSERTION’
 1299 |  KUNIT_BINARY_INT_ASSERTION(test,           \
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~
../include/kunit/test.h:1296:2: note: in expansion of macro ‘KUNIT_ASSERT_EQ_MSG’
 1296 |  KUNIT_ASSERT_EQ_MSG(test, left, right, NULL)
      |  ^~~~~~~~~~~~~~~~~~~
../drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:52:2: note: in expansion of macro ‘KUNIT_ASSERT_EQ’
   52 |  KUNIT_ASSERT_EQ(test, 0ul, *__pf_peek_vf_state(gt, VFUT1));
      |  ^~~~~~~~~~~~~~~
../drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:53:29: error: invalid type argument of unary ‘*’ (have ‘int’)
   53 |  KUNIT_ASSERT_EQ(test, 0ul, *__pf_peek_vf_state(gt, VFUT2));
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../include/kunit/test.h:725:15: note: in definition of macro ‘KUNIT_BASE_BINARY_ASSERTION’
  725 |  const typeof(right) __right = (right);           \
      |               ^~~~~
../include/kunit/test.h:1299:2: note: in expansion of macro ‘KUNIT_BINARY_INT_ASSERTION’
 1299 |  KUNIT_BINARY_INT_ASSERTION(test,           \
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~
../include/kunit/test.h:1296:2: note: in expansion of macro ‘KUNIT_ASSERT_EQ_MSG’
 1296 |  KUNIT_ASSERT_EQ_MSG(test, left, right, NULL)
      |  ^~~~~~~~~~~~~~~~~~~
../drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:53:2: note: in expansion of macro ‘KUNIT_ASSERT_EQ’
   53 |  KUNIT_ASSERT_EQ(test, 0ul, *__pf_peek_vf_state(gt, VFUT2));
      |  ^~~~~~~~~~~~~~~
../drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:53:29: error: invalid type argument of unary ‘*’ (have ‘int’)
   53 |  KUNIT_ASSERT_EQ(test, 0ul, *__pf_peek_vf_state(gt, VFUT2));
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../include/kunit/test.h:725:33: note: in definition of macro ‘KUNIT_BASE_BINARY_ASSERTION’
  725 |  const typeof(right) __right = (right);           \
      |                                 ^~~~~
../include/kunit/test.h:1299:2: note: in expansion of macro ‘KUNIT_BINARY_INT_ASSERTION’
 1299 |  KUNIT_BINARY_INT_ASSERTION(test,           \
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~
../include/kunit/test.h:1296:2: note: in expansion of macro ‘KUNIT_ASSERT_EQ_MSG’
 1296 |  KUNIT_ASSERT_EQ_MSG(test, left, right, NULL)
      |  ^~~~~~~~~~~~~~~~~~~
../drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:53:2: note: in expansion of macro ‘KUNIT_ASSERT_EQ’
   53 |  KUNIT_ASSERT_EQ(test, 0ul, *__pf_peek_vf_state(gt, VFUT2));
      |  ^~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
make[7]: *** [../scripts/Makefile.build:244: drivers/gpu/drm/xe/xe_gt_sriov_pf_control.o] Error 1
make[7]: *** Waiting for unfinished jobs....
make[6]: *** [../scripts/Makefile.build:485: drivers/gpu/drm/xe] Error 2
make[5]: *** [../scripts/Makefile.build:485: drivers/gpu/drm] Error 2
make[4]: *** [../scripts/Makefile.build:485: drivers/gpu] Error 2
make[3]: *** [../scripts/Makefile.build:485: drivers] Error 2
make[2]: *** [/kernel/Makefile:1925: .] Error 2
make[1]: *** [/kernel/Makefile:224: __sub-make] Error 2
make: *** [Makefile:224: __sub-make] Error 2

[16:58:13] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[16:58:17] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make ARCH=um O=.kunit --jobs=48
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel



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

* [PATCH v2 11/12] drm/xe/tests: Add KUnit tests for VF control state machines
  2024-08-09 16:51 ` [PATCH 11/12] drm/xe/tests: Add KUnit tests for VF control state machines Michal Wajdeczko
@ 2024-08-09 17:23   ` Michal Wajdeczko
  2024-08-22 10:51     ` Piotr Piórkowski
  2024-08-22 10:47   ` [PATCH " Piotr Piórkowski
  1 sibling, 1 reply; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-09 17:23 UTC (permalink / raw)
  To: intel-xe; +Cc: Michal Wajdeczko, Lucas De Marchi

Add KUnit tests (~200) for all VF control state machines (FLR,
PAUSE, STOP and RESUME) to make sure they work as expected and
will not be broken while extending them with new functionality.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
---
Test file named according to the new best practices [1]
[1] https://lore.kernel.org/linux-hardening/20240724201354.make.730-kees@kernel.org/
---
v2: fix kunit build break due last-minute change in .c
---
 .../xe/tests/xe_gt_sriov_pf_control_kunit.c   | 1360 +++++++++++++++++
 drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c   |    7 +
 2 files changed, 1367 insertions(+)
 create mode 100644 drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c

diff --git a/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c b/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
new file mode 100644
index 000000000000..3061099ad35a
--- /dev/null
+++ b/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
@@ -0,0 +1,1360 @@
+// SPDX-License-Identifier: GPL-2.0 AND MIT
+/*
+ * Copyright © 2024 Intel Corporation
+ */
+
+#include <kunit/test.h>
+#include <kunit/static_stub.h>
+
+#include "tests/xe_kunit_helpers.h"
+#include "tests/xe_pci_test.h"
+
+#include "xe_gt_sriov_pf.h"
+
+static const unsigned int DUT_NUM_VFS = 2;
+static const unsigned int VFUT1 = VFID(1);
+static const unsigned int VFUT2 = VFID(2);
+
+static void dump_state(void *arg)
+{
+	struct xe_gt *gt = arg;
+
+	pf_dump_vf_state(gt, VFUT1);
+}
+
+static unsigned long replacement_timeout(enum xe_gt_sriov_control_bits bit)
+{
+	return HZ;
+}
+
+static int pf_control_test_init(struct kunit *test)
+{
+	struct xe_pci_fake_data fake = {
+		.sriov_mode = XE_SRIOV_MODE_PF,
+		.platform = XE_TIGERLAKE, /* some random platform */
+		.subplatform = XE_SUBPLATFORM_NONE,
+	};
+	struct xe_device *xe;
+	struct xe_gt *gt;
+
+	test->priv = &fake;
+	xe_kunit_helper_xe_device_test_init(test);
+
+	xe = test->priv;
+	KUNIT_ASSERT_EQ(test, xe_sriov_init(xe), 0);
+
+	xe->sriov.pf.driver_max_vfs = DUT_NUM_VFS;
+	KUNIT_EXPECT_NE(test, xe_sriov_pf_get_totalvfs(xe), 0);
+
+	gt = xe_device_get_gt(xe, 0);
+	KUNIT_ASSERT_EQ(test, xe_gt_sriov_pf_init_early(gt), 0);
+
+	KUNIT_ASSERT_EQ(test, 0ul, *pf_peek_vf_state(gt, VFUT1));
+	KUNIT_ASSERT_EQ(test, 0ul, *pf_peek_vf_state(gt, VFUT2));
+
+	KUNIT_EXPECT_EQ(test, 0, kunit_add_action_or_reset(test, dump_state, gt));
+
+	kunit_activate_static_stub(test, pf_get_default_timeout, replacement_timeout);
+
+	test->priv = gt;
+	return 0;
+}
+
+static int sanitize_vf_resources_fail(struct xe_gt *gt, u32 vfid, long timeout)
+{
+	return -ETIMEDOUT;
+}
+
+static int send_vf_control_cmd_reject(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	return -EIO;
+}
+
+static int send_vf_control_cmd_fail(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	return -ENODEV;
+}
+
+static int send_vf_control_cmd_pass_no_reply(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	return 0;
+}
+
+static int send_vf_control_cmd_pass_and_reply(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	switch (cmd) {
+	case GUC_PF_TRIGGER_VF_PAUSE:
+		pf_handle_vf_event(gt, vfid, GUC_PF_NOTIFY_VF_PAUSE_DONE);
+		break;
+	case GUC_PF_TRIGGER_VF_FLR_START:
+		pf_handle_vf_event(gt, vfid, GUC_PF_NOTIFY_VF_FLR_DONE);
+		break;
+	case GUC_PF_TRIGGER_VF_RESUME:
+	case GUC_PF_TRIGGER_VF_STOP:
+	case GUC_PF_TRIGGER_VF_FLR_FINISH:
+		break;
+	default:
+		return -EPROTO;
+	}
+	return 0;
+}
+
+static int send_vf_control_cmd_busy_wait(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	schedule_timeout_interruptible(HZ / 20);
+	return -EBUSY;
+}
+
+static int send_vf_control_cmd_pass_but_reply_flr_only(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	return cmd == GUC_PF_TRIGGER_VF_FLR_START ?
+		send_vf_control_cmd_pass_and_reply(gt, vfid, cmd) :
+		send_vf_control_cmd_pass_no_reply(gt, vfid, cmd);
+}
+
+static int send_vf_control_cmd_busy_except_flr(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	return cmd == GUC_PF_TRIGGER_VF_FLR_START || cmd == GUC_PF_TRIGGER_VF_FLR_FINISH ?
+		send_vf_control_cmd_pass_and_reply(gt, vfid, cmd) :
+		send_vf_control_cmd_busy_wait(gt, vfid, cmd);
+}
+
+static int send_vf_control_cmd_busy_except_stop(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	return cmd == GUC_PF_TRIGGER_VF_STOP ?
+		send_vf_control_cmd_pass_and_reply(gt, vfid, cmd) :
+		send_vf_control_cmd_busy_wait(gt, vfid, cmd);
+}
+
+static int BUSY_MAGIC = 3;
+
+static int send_vf_control_cmd_busy_no_reply(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	static int counter;
+
+	return ++counter % BUSY_MAGIC ? -EBUSY : 0;
+}
+
+static int send_vf_control_cmd_busy_and_reply(struct xe_gt *gt, unsigned int vfid, u32 cmd)
+{
+	static int counter;
+
+	return ++counter % BUSY_MAGIC ? -EBUSY :
+		send_vf_control_cmd_pass_and_reply(gt, vfid, cmd);
+}
+
+static const enum xe_gt_sriov_control_bits ready[] = {
+};
+
+static const enum xe_gt_sriov_control_bits flr_starting[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_FLR_WIP,
+	XE_GT_SRIOV_STATE_FLR_SEND_START,
+};
+
+static const enum xe_gt_sriov_control_bits flr_starting_paused[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_FLR_WIP,
+	XE_GT_SRIOV_STATE_FLR_SEND_START,
+	XE_GT_SRIOV_STATE_PAUSED,
+};
+
+static const enum xe_gt_sriov_control_bits flr_starting_stopped[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_FLR_WIP,
+	XE_GT_SRIOV_STATE_FLR_SEND_START,
+	XE_GT_SRIOV_STATE_STOPPED,
+};
+
+static const enum xe_gt_sriov_control_bits flr_waiting[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_FLR_WIP,
+	XE_GT_SRIOV_STATE_FLR_WAIT_GUC,
+};
+
+static const enum xe_gt_sriov_control_bits flr_guc_done[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_FLR_WIP,
+	XE_GT_SRIOV_STATE_FLR_GUC_DONE,
+};
+
+static const enum xe_gt_sriov_control_bits flr_resetting[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_FLR_WIP,
+	XE_GT_SRIOV_STATE_FLR_RESET_CONFIG,
+};
+
+static const enum xe_gt_sriov_control_bits flr_finishing[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_FLR_WIP,
+	XE_GT_SRIOV_STATE_FLR_SEND_FINISH,
+};
+
+static const enum xe_gt_sriov_control_bits flr_failed[] = {
+	XE_GT_SRIOV_STATE_FLR_FAILED,
+};
+
+static const enum xe_gt_sriov_control_bits stopping[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_STOP_WIP,
+	XE_GT_SRIOV_STATE_STOP_SEND_STOP,
+};
+
+static const enum xe_gt_sriov_control_bits stopping_paused[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_STOP_WIP,
+	XE_GT_SRIOV_STATE_STOP_SEND_STOP,
+	XE_GT_SRIOV_STATE_PAUSED,
+};
+
+static const enum xe_gt_sriov_control_bits stop_failed[] = {
+	XE_GT_SRIOV_STATE_STOP_FAILED,
+};
+
+static const enum xe_gt_sriov_control_bits stop_rejected[] = {
+	XE_GT_SRIOV_STATE_STOP_FAILED,
+	XE_GT_SRIOV_STATE_MISMATCH,
+};
+
+static const enum xe_gt_sriov_control_bits stopped[] = {
+	XE_GT_SRIOV_STATE_STOPPED,
+};
+
+static const enum xe_gt_sriov_control_bits pausing[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_PAUSE_WIP,
+	XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE,
+};
+
+static const enum xe_gt_sriov_control_bits pausing_wait_guc[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_PAUSE_WIP,
+	XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC,
+};
+
+static const enum xe_gt_sriov_control_bits pausing_guc_done[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_PAUSE_WIP,
+	XE_GT_SRIOV_STATE_PAUSE_GUC_DONE,
+};
+
+static const enum xe_gt_sriov_control_bits pause_failed[] = {
+	XE_GT_SRIOV_STATE_PAUSE_FAILED,
+};
+
+static const enum xe_gt_sriov_control_bits pause_rejected[] = {
+	XE_GT_SRIOV_STATE_PAUSE_FAILED,
+	XE_GT_SRIOV_STATE_MISMATCH,
+};
+
+static const enum xe_gt_sriov_control_bits paused[] = {
+	XE_GT_SRIOV_STATE_PAUSED,
+};
+
+static const enum xe_gt_sriov_control_bits resuming[] = {
+	XE_GT_SRIOV_STATE_WIP,
+	XE_GT_SRIOV_STATE_PAUSED,
+	XE_GT_SRIOV_STATE_RESUME_WIP,
+	XE_GT_SRIOV_STATE_RESUME_SEND_RESUME,
+};
+
+static const enum xe_gt_sriov_control_bits resume_failed[] = {
+	XE_GT_SRIOV_STATE_PAUSED,
+	XE_GT_SRIOV_STATE_RESUME_FAILED,
+};
+
+static const enum xe_gt_sriov_control_bits resume_rejected[] = {
+	XE_GT_SRIOV_STATE_PAUSED,
+	XE_GT_SRIOV_STATE_RESUME_FAILED,
+	XE_GT_SRIOV_STATE_MISMATCH,
+};
+
+static const enum xe_gt_sriov_control_bits resumed[] = {
+	XE_GT_SRIOV_STATE_RESUMED,
+};
+
+static const enum xe_gt_sriov_control_bits mismatch[] = {
+	XE_GT_SRIOV_STATE_MISMATCH,
+};
+
+struct state_param {
+	const char *name;
+	const enum xe_gt_sriov_control_bits *bits;
+	size_t num_bits;
+};
+
+static void state_param_get_desc(struct state_param *p, char *desc)
+{
+	snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s", p->name);
+}
+
+#define MAKE_STATE_PARAM(X) { .name = #X, .bits = X, .num_bits = ARRAY_SIZE(X) }
+
+/*
+ * Due to the test case logic the all "must_pass" params include "_rejected" states
+ * since our "GuC" calls by default will not complain again about the INVALID_STATE
+ * thus our state machine is able to fully recover.
+ */
+
+static struct state_param flr_must_pass_from[] = {
+	MAKE_STATE_PARAM(ready),
+	MAKE_STATE_PARAM(flr_starting),
+	MAKE_STATE_PARAM(flr_starting_paused),
+	MAKE_STATE_PARAM(flr_starting_stopped),
+	MAKE_STATE_PARAM(flr_waiting),
+	MAKE_STATE_PARAM(flr_guc_done),
+	MAKE_STATE_PARAM(flr_resetting),
+	MAKE_STATE_PARAM(flr_finishing),
+	MAKE_STATE_PARAM(flr_failed),
+	MAKE_STATE_PARAM(stopping),
+	MAKE_STATE_PARAM(stop_failed),
+	MAKE_STATE_PARAM(stop_rejected),
+	MAKE_STATE_PARAM(stopped),
+	MAKE_STATE_PARAM(pausing),
+	MAKE_STATE_PARAM(pausing_wait_guc),
+	MAKE_STATE_PARAM(pausing_guc_done),
+	MAKE_STATE_PARAM(pause_failed),
+	MAKE_STATE_PARAM(pause_rejected),
+	MAKE_STATE_PARAM(paused),
+	MAKE_STATE_PARAM(resuming),
+	MAKE_STATE_PARAM(resume_failed),
+	MAKE_STATE_PARAM(resume_rejected),
+	MAKE_STATE_PARAM(resumed),
+	MAKE_STATE_PARAM(mismatch),
+};
+
+static struct state_param stop_must_pass_from[] = {
+	MAKE_STATE_PARAM(ready),
+	MAKE_STATE_PARAM(stop_failed),
+	MAKE_STATE_PARAM(stop_rejected),
+	MAKE_STATE_PARAM(pausing),
+	MAKE_STATE_PARAM(pausing_wait_guc),
+	MAKE_STATE_PARAM(pausing_guc_done),
+	MAKE_STATE_PARAM(pause_failed),
+	MAKE_STATE_PARAM(pause_rejected),
+	MAKE_STATE_PARAM(paused),
+	MAKE_STATE_PARAM(resuming),
+	MAKE_STATE_PARAM(resume_failed),
+	MAKE_STATE_PARAM(resume_rejected),
+	MAKE_STATE_PARAM(resumed),
+	MAKE_STATE_PARAM(mismatch),
+	MAKE_STATE_PARAM(flr_failed),
+};
+
+static struct state_param stop_must_cancel_from[] = {
+	MAKE_STATE_PARAM(flr_starting),
+	MAKE_STATE_PARAM(flr_starting_paused),
+	MAKE_STATE_PARAM(flr_waiting),
+	MAKE_STATE_PARAM(flr_guc_done),
+	MAKE_STATE_PARAM(flr_resetting),
+	MAKE_STATE_PARAM(flr_finishing),
+};
+
+static struct state_param stop_must_fail_from[] = {
+	MAKE_STATE_PARAM(stopping),
+	MAKE_STATE_PARAM(stopping_paused),
+	MAKE_STATE_PARAM(stopped),
+	MAKE_STATE_PARAM(flr_starting_stopped),
+};
+
+static struct state_param pause_must_pass_from[] = {
+	MAKE_STATE_PARAM(ready),
+	MAKE_STATE_PARAM(pause_failed),
+	MAKE_STATE_PARAM(pause_rejected),
+	MAKE_STATE_PARAM(resumed),
+	MAKE_STATE_PARAM(mismatch),
+	MAKE_STATE_PARAM(stop_failed),
+	MAKE_STATE_PARAM(stop_rejected),
+	MAKE_STATE_PARAM(flr_failed),
+};
+
+static struct state_param pause_must_cancel_from[] = {
+	MAKE_STATE_PARAM(flr_starting),
+	MAKE_STATE_PARAM(flr_waiting),
+	MAKE_STATE_PARAM(flr_guc_done),
+	MAKE_STATE_PARAM(flr_resetting),
+	MAKE_STATE_PARAM(flr_finishing),
+	MAKE_STATE_PARAM(stopping),
+};
+
+static struct state_param pause_must_fail_from[] = {
+	MAKE_STATE_PARAM(pausing),
+	MAKE_STATE_PARAM(pausing_wait_guc),
+	MAKE_STATE_PARAM(pausing_guc_done),
+	MAKE_STATE_PARAM(paused),
+	MAKE_STATE_PARAM(resuming),
+	MAKE_STATE_PARAM(resume_failed),
+	MAKE_STATE_PARAM(resume_rejected),
+	MAKE_STATE_PARAM(stopped),
+};
+
+static struct state_param resume_must_pass_from[] = {
+	MAKE_STATE_PARAM(paused),
+	MAKE_STATE_PARAM(resume_failed),
+	MAKE_STATE_PARAM(resume_rejected),
+};
+
+static struct state_param resume_must_cancel_from[] = {
+	MAKE_STATE_PARAM(flr_starting_paused),
+	MAKE_STATE_PARAM(stopping_paused),
+};
+
+static struct state_param resume_must_fail_from[] = {
+	MAKE_STATE_PARAM(ready),
+	MAKE_STATE_PARAM(pausing),
+	MAKE_STATE_PARAM(pausing_wait_guc),
+	MAKE_STATE_PARAM(pausing_guc_done),
+	MAKE_STATE_PARAM(pause_failed),
+	MAKE_STATE_PARAM(pause_rejected),
+	MAKE_STATE_PARAM(resuming),
+	MAKE_STATE_PARAM(resumed),
+	MAKE_STATE_PARAM(stopping),
+	MAKE_STATE_PARAM(stop_failed),
+	MAKE_STATE_PARAM(stop_rejected),
+	MAKE_STATE_PARAM(stopped),
+	MAKE_STATE_PARAM(flr_starting),
+	MAKE_STATE_PARAM(flr_waiting),
+	MAKE_STATE_PARAM(flr_guc_done),
+	MAKE_STATE_PARAM(flr_resetting),
+	MAKE_STATE_PARAM(flr_finishing),
+	MAKE_STATE_PARAM(flr_failed),
+	MAKE_STATE_PARAM(mismatch),
+};
+
+KUNIT_ARRAY_PARAM(flr_must_pass_from, flr_must_pass_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(stop_must_pass_from, stop_must_pass_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(stop_must_fail_from, stop_must_fail_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(stop_must_cancel_from, stop_must_cancel_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(pause_must_pass_from, pause_must_pass_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(pause_must_fail_from, pause_must_fail_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(pause_must_cancel_from, pause_must_cancel_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(resume_must_pass_from, resume_must_pass_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(resume_must_fail_from, resume_must_fail_from, state_param_get_desc);
+KUNIT_ARRAY_PARAM(resume_must_cancel_from, resume_must_cancel_from, state_param_get_desc);
+
+static int mimic_pf_handle_vf_flr_done(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_handle_vf_flr_done(gt, vfid);
+	return 0;
+}
+
+static int mimic_pf_handle_vf_pause_done(struct xe_gt *gt, unsigned int vfid)
+{
+	pf_handle_vf_pause_done(gt, vfid);
+	return 0;
+}
+
+static void prepare_state(struct kunit *test, unsigned int vfid,
+			  const enum xe_gt_sriov_control_bits *bits, size_t num_bits)
+{
+	struct xe_gt *gt = test->priv;
+	size_t n;
+
+	for (n = 0; n < num_bits; n++) {
+		enum xe_gt_sriov_control_bits bit = bits[n];
+
+		KUNIT_ASSERT_TRUE(test, pf_enter_vf_state(gt, vfid, bit));
+
+		if (bit == XE_GT_SRIOV_STATE_WIP) {
+			pf_queue_vf(gt, vfid);
+		} else if (bit == XE_GT_SRIOV_STATE_FLR_WAIT_GUC) {
+			xe_kunit_helper_delayed_call(test, HZ / 100,
+						     mimic_pf_handle_vf_flr_done, gt, vfid);
+		} else if (bit == XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC) {
+			xe_kunit_helper_delayed_call(test, HZ / 100,
+						     mimic_pf_handle_vf_pause_done, gt, vfid);
+		}
+	}
+}
+
+static void prepare_state_from_param(struct kunit *test)
+{
+	const struct state_param *p = test->param_value;
+
+	prepare_state(test, VFUT1, p->bits, p->num_bits);
+}
+
+static void expect_not_pausing(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_GUC_DONE));
+}
+
+static void expect_not_in_pause(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	expect_not_pausing(test);
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
+}
+
+static void expect_not_resuming(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_SEND_RESUME));
+}
+
+static void expect_not_in_resume(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	expect_not_resuming(test);
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
+}
+
+static void expect_not_stopping(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_WIP));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_SEND_STOP));
+}
+
+static void expect_not_in_stop(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	expect_not_stopping(test);
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
+}
+
+static void expect_not_in_flr(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_SEND_START));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WAIT_GUC));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_GUC_DONE));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_SEND_FINISH));
+	KUNIT_EXPECT_TRUE(test,
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+}
+
+static void expect_not_in_wip(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void expect_not_in_mismatch(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+}
+
+static void try_flr_vf(struct kunit *test, bool mimic_busy, bool late_reply)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      mimic_busy ? late_reply ? send_vf_control_cmd_busy_no_reply :
+			      send_vf_control_cmd_busy_and_reply :
+			      late_reply ? send_vf_control_cmd_pass_no_reply :
+			      send_vf_control_cmd_pass_and_reply);
+
+	if (late_reply)
+		xe_kunit_helper_delayed_call(test, HZ / 10,
+					     mimic_pf_handle_vf_flr_done, gt, VFUT1);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+
+	expect_not_in_flr(test);
+	expect_not_in_pause(test);
+	expect_not_in_resume(test);
+	expect_not_in_stop(test);
+	expect_not_in_mismatch(test);
+	expect_not_in_wip(test);
+}
+
+static void flr_vf_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_flr_vf(test, false, false);
+}
+
+static void flr_vf_needs_retry_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_flr_vf(test, true, false);
+}
+
+static void flr_vf_needs_retry_late_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_flr_vf(test, true, true);
+}
+
+static void flr_vf_fails_on_send(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_fail);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
+	KUNIT_EXPECT_NE(test, err, -ECANCELED);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void flr_vf_fails_on_reset(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.vfs[VFUT1].config.sanitize,
+			      sanitize_vf_resources_fail);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
+	KUNIT_EXPECT_NE(test, err, -ECANCELED);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void flr_vf_rejected_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_reject);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
+	KUNIT_EXPECT_NE(test, err, -ECANCELED);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void flr_vf_unconfirmed_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_no_reply);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+	KUNIT_EXPECT_EQ(test, err, -ETIMEDOUT);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+}
+
+static void flr_vf_confirmed_early_continue_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, flr_starting, ARRAY_SIZE(flr_starting));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_no_reply);
+
+	pf_handle_vf_flr_done(gt, VFUT1);
+
+	/*
+	 * make sure SEND_START completes;
+	 * successful reply from cmd_pass_no_reply should exit mismatch state
+	 */
+	flush_work(&gt->sriov.pf.control.worker);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+}
+
+static void flr_vf_confirmed_early_reject_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, flr_starting, ARRAY_SIZE(flr_starting));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_reject);
+
+	pf_handle_vf_flr_done(gt, VFUT1);
+
+	/*
+	 * make sure SEND_START completes;
+	 * error from send_vf_control_cmd_reject should keep mismatch state
+	 */
+	flush_work(&gt->sriov.pf.control.worker);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void flr_vf_confirmed_twice_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, flr_guc_done, ARRAY_SIZE(flr_guc_done));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_no_reply);
+
+	pf_handle_vf_flr_done(gt, VFUT1);
+
+	/* this is fully recoverable */
+	KUNIT_EXPECT_EQ(test, 0, pf_wait_vf_wip_done(gt, VFUT1, HZ));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+}
+
+static void flr_vf_confirmed_too_late_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, flr_failed, ARRAY_SIZE(flr_failed));
+
+	pf_handle_vf_flr_done(gt, VFUT1);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void flr_vf_unsolicited_confirmation_from_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+
+	pf_handle_vf_flr_done(gt, VFUT1);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
+}
+
+static void flr_vf_wrong_confirmation_from_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, flr_waiting, ARRAY_SIZE(flr_waiting));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	pf_handle_vf_pause_done(gt, VFUT1);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+}
+
+static void flr_vf_canceled_by_restart(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_busy_wait);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10, xe_gt_sriov_pf_control_restart, gt);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+	expect_not_in_flr(test);
+}
+
+static void try_stop_vf(struct kunit *test, bool mimic_busy)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      mimic_busy ? send_vf_control_cmd_busy_and_reply :
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
+	expect_not_stopping(test);
+	expect_not_in_pause(test);
+	expect_not_in_resume(test);
+	expect_not_in_mismatch(test);
+}
+
+static void stop_vf_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_stop_vf(test, false);
+}
+
+static void stop_vf_needs_retry_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_stop_vf(test, true);
+}
+
+static void stop_vf_refused_from(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	prepare_state_from_param(test);
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+	KUNIT_EXPECT_NE(test, err, -ECANCELED);
+
+	KUNIT_EXPECT_TRUE(test, err == -EALREADY ||
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
+}
+
+static void stop_vf_fails_on_send(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_fail);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
+	KUNIT_EXPECT_NE(test, err, -ECANCELED);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
+	expect_not_stopping(test);
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void stop_vf_rejected_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_reject);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
+	KUNIT_EXPECT_NE(test, err, -ECANCELED);
+
+	expect_not_stopping(test);
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void stop_vf_canceled_from(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state_from_param(test);
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
+}
+
+static void stop_vf_canceled_by_restart(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_busy_except_flr);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10, xe_gt_sriov_pf_control_restart, gt);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+	expect_not_in_stop(test);
+}
+
+static void stop_vf_canceled_by_flr(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_busy_except_flr);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10,
+				     xe_gt_sriov_pf_control_trigger_flr, gt, VFUT1);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+	expect_not_in_stop(test);
+}
+
+static void try_pause_vf(struct kunit *test, bool mimic_busy)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      mimic_busy ? send_vf_control_cmd_busy_and_reply :
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
+	expect_not_pausing(test);
+	expect_not_in_mismatch(test);
+}
+
+static void pause_vf_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_pause_vf(test, false);
+}
+
+static void pause_vf_needs_retry_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_pause_vf(test, true);
+}
+
+static void pause_vf_canceled_from(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state_from_param(test);
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	expect_not_in_pause(test);
+}
+
+static void pause_vf_refused_from(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	prepare_state_from_param(test);
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	KUNIT_EXPECT_NE(test, err, -ECANCELED);
+
+	KUNIT_EXPECT_TRUE(test, err == -EALREADY ||
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
+}
+
+static void pause_vf_rejected_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_reject);
+
+	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void pause_vf_fails_on_send(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_fail);
+
+	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
+}
+
+static void pause_vf_unconfirmed_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_no_reply);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	KUNIT_EXPECT_EQ(test, err, -ETIMEDOUT);
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
+}
+
+static void pause_vf_canceled_by_restart(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_no_reply);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10, xe_gt_sriov_pf_control_restart, gt);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	expect_not_in_pause(test);
+}
+
+static void pause_vf_canceled_by_flr(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_but_reply_flr_only);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10,
+				     xe_gt_sriov_pf_control_trigger_flr, gt, VFUT1);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	expect_not_in_pause(test);
+}
+
+static void pause_vf_canceled_by_stop(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_no_reply);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10,
+				     xe_gt_sriov_pf_control_stop_vf, gt, VFUT1);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	expect_not_in_pause(test);
+}
+
+static void try_resume_vf(struct kunit *test, bool mimic_busy)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      mimic_busy ? send_vf_control_cmd_busy_and_reply :
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
+	expect_not_resuming(test);
+	expect_not_in_pause(test);
+	expect_not_in_mismatch(test);
+	expect_not_in_wip(test);
+}
+
+static void resume_vf_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_resume_vf(test, false);
+}
+
+static void resume_vf_needs_retry_from(struct kunit *test)
+{
+	prepare_state_from_param(test);
+	try_resume_vf(test, true);
+}
+
+static void resume_vf_fails_on_send(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_fail);
+
+	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
+
+	expect_not_resuming(test);
+	expect_not_in_mismatch(test);
+	expect_not_in_wip(test);
+}
+
+static void resume_vf_rejected_by_guc(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_reject);
+
+	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
+
+	expect_not_resuming(test);
+	expect_not_in_wip(test);
+}
+
+static void resume_vf_canceled_from(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state_from_param(test);
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
+	expect_not_resuming(test);
+}
+
+static void resume_vf_refused_from(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+	int err;
+
+	prepare_state_from_param(test);
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+	KUNIT_EXPECT_NE(test, err, -EIO);
+
+	KUNIT_EXPECT_TRUE(test, err == -EALREADY ||
+			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
+}
+
+static void resume_vf_canceled_by_restart(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_busy_except_flr);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10, xe_gt_sriov_pf_control_restart, gt);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
+}
+
+static void resume_vf_canceled_by_flr(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_busy_except_flr);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10,
+				     xe_gt_sriov_pf_control_trigger_flr, gt, VFUT1);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
+}
+
+static void resume_vf_canceled_by_stop(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_busy_except_stop);
+
+	xe_kunit_helper_delayed_call(test, HZ / 10,
+				     xe_gt_sriov_pf_control_stop_vf, gt, VFUT1);
+
+	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
+	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
+}
+
+static void basic_pause_and_resume_vf(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_ASSERT_EQ(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
+}
+
+static void basic_pause_and_stop_vf(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_ASSERT_EQ(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+}
+
+static void basic_stop_and_flr_vf(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+}
+
+static void basic_flr_and_flr_vf(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+}
+
+static void basic_flr_vfs(struct kunit *test)
+{
+	struct xe_gt *gt = test->priv;
+
+	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
+			      send_vf_control_cmd_pass_and_reply);
+
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
+	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT2));
+}
+
+static struct kunit_case pf_control_test_cases[] = {
+	KUNIT_CASE(basic_pause_and_resume_vf),
+	KUNIT_CASE(basic_pause_and_stop_vf),
+	KUNIT_CASE(basic_stop_and_flr_vf),
+	KUNIT_CASE(basic_flr_and_flr_vf),
+	KUNIT_CASE(basic_flr_vfs),
+
+	KUNIT_CASE_PARAM(flr_vf_from, flr_must_pass_from_gen_params),
+	KUNIT_CASE_PARAM(flr_vf_needs_retry_from, flr_must_pass_from_gen_params),
+	KUNIT_CASE_PARAM(flr_vf_needs_retry_late_from, flr_must_pass_from_gen_params),
+	KUNIT_CASE(flr_vf_fails_on_send),
+	KUNIT_CASE(flr_vf_fails_on_reset),
+	KUNIT_CASE(flr_vf_rejected_by_guc),
+	KUNIT_CASE_SLOW(flr_vf_unconfirmed_by_guc),
+	KUNIT_CASE(flr_vf_confirmed_early_continue_by_guc),
+	KUNIT_CASE(flr_vf_confirmed_early_reject_by_guc),
+	KUNIT_CASE(flr_vf_confirmed_twice_by_guc),
+	KUNIT_CASE(flr_vf_confirmed_too_late_by_guc),
+	KUNIT_CASE(flr_vf_wrong_confirmation_from_guc),
+	KUNIT_CASE(flr_vf_unsolicited_confirmation_from_guc),
+	KUNIT_CASE(flr_vf_canceled_by_restart),
+
+	KUNIT_CASE_PARAM(stop_vf_from, stop_must_pass_from_gen_params),
+	KUNIT_CASE_PARAM(stop_vf_needs_retry_from, stop_must_pass_from_gen_params),
+	KUNIT_CASE_PARAM(stop_vf_refused_from, stop_must_fail_from_gen_params),
+	KUNIT_CASE_PARAM(stop_vf_canceled_from, stop_must_cancel_from_gen_params),
+	KUNIT_CASE(stop_vf_fails_on_send),
+	KUNIT_CASE(stop_vf_rejected_by_guc),
+	KUNIT_CASE(stop_vf_canceled_by_flr),
+	KUNIT_CASE(stop_vf_canceled_by_restart),
+
+	KUNIT_CASE_PARAM(pause_vf_from, pause_must_pass_from_gen_params),
+	KUNIT_CASE_PARAM(pause_vf_needs_retry_from, pause_must_pass_from_gen_params),
+	KUNIT_CASE_PARAM(pause_vf_refused_from, pause_must_fail_from_gen_params),
+	KUNIT_CASE_PARAM(pause_vf_canceled_from, pause_must_cancel_from_gen_params),
+	KUNIT_CASE(pause_vf_fails_on_send),
+	KUNIT_CASE(pause_vf_rejected_by_guc),
+	KUNIT_CASE_SLOW(pause_vf_unconfirmed_by_guc),
+	KUNIT_CASE(pause_vf_canceled_by_flr),
+	KUNIT_CASE(pause_vf_canceled_by_stop),
+	KUNIT_CASE(pause_vf_canceled_by_restart),
+
+	KUNIT_CASE_PARAM(resume_vf_from, resume_must_pass_from_gen_params),
+	KUNIT_CASE_PARAM(resume_vf_needs_retry_from, resume_must_pass_from_gen_params),
+	KUNIT_CASE_PARAM(resume_vf_refused_from, resume_must_fail_from_gen_params),
+	KUNIT_CASE_PARAM(resume_vf_canceled_from, resume_must_cancel_from_gen_params),
+	KUNIT_CASE(resume_vf_fails_on_send),
+	KUNIT_CASE(resume_vf_rejected_by_guc),
+	KUNIT_CASE(resume_vf_canceled_by_flr),
+	KUNIT_CASE(resume_vf_canceled_by_stop),
+	KUNIT_CASE(resume_vf_canceled_by_restart),
+
+	{}
+};
+
+static struct kunit_suite pf_control_suite = {
+	.name = "pf_control",
+	.test_cases = pf_control_test_cases,
+	.init = pf_control_test_init,
+};
+
+kunit_test_suite(pf_control_suite);
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
index e91c71d768ff..4863d79f72e0 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
@@ -4,6 +4,7 @@
  */
 
 #include <drm/drm_managed.h>
+#include <kunit/static_stub.h>
 
 #include "abi/guc_actions_sriov_abi.h"
 
@@ -196,6 +197,8 @@ static const char *control_bit_to_string(enum xe_gt_sriov_control_bits bit)
 
 static unsigned long pf_get_default_timeout(enum xe_gt_sriov_control_bits bit)
 {
+	KUNIT_STATIC_STUB_REDIRECT(pf_get_default_timeout, bit);
+
 	switch (bit) {
 	case XE_GT_SRIOV_STATE_FLR_WAIT_GUC:
 	case XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC:
@@ -1458,3 +1461,7 @@ void xe_gt_sriov_pf_control_restart(struct xe_gt *gt)
 	for (n = 1; n <= totalvfs; n++)
 		pf_enter_vf_ready(gt, n);
 }
+
+#if IS_BUILTIN(CONFIG_DRM_XE_KUNIT_TEST)
+#include "tests/xe_gt_sriov_pf_control_kunit.c"
+#endif
-- 
2.43.0


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

* ✓ CI.Patch_applied: success for PF: Improve VF control (rev2)
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (14 preceding siblings ...)
  2024-08-09 16:58 ` ✗ CI.KUnit: failure " Patchwork
@ 2024-08-09 17:28 ` Patchwork
  2024-08-09 17:29 ` ✗ CI.checkpatch: warning " Patchwork
                   ` (6 subsequent siblings)
  22 siblings, 0 replies; 47+ messages in thread
From: Patchwork @ 2024-08-09 17:28 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

== Series Details ==

Series: PF: Improve VF control (rev2)
URL   : https://patchwork.freedesktop.org/series/137095/
State : success

== Summary ==

=== Applying kernel patches on branch 'drm-tip' with base: ===
Base commit: 13384fb5b1e7 drm-tip: 2024y-08m-09d-16h-57m-03s UTC integration manifest
=== git am output follows ===
Applying: drm/xe/pf: Add function to sanitize VF resources
Applying: drm/xe/pf: Fix documentation formatting
Applying: drm/xe/pf: Drop GuC notifications for non-existing VF
Applying: drm/xe/pf: Improve VF control
Applying: drm/xe/tests: Allow deferred function call during KUnit test
Applying: drm/xe/tests: Add helper macro to detect if KUnit is running
Applying: drm/xe/tests: Add helpers to call stubs out of KUnit context
Applying: drm/xe/guc: Define stub for xe_guc_ct_send_recv()
Applying: drm/xe/pf: Define stub for pf_sanitize_vf_resources()
Applying: drm/xe/pf: Define stub for pf_send_vf_control_cmd()
Applying: drm/xe/tests: Add KUnit tests for VF control state machines
Applying: drm/xe/tests: Add KUnit tests for VF control GuC messages



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

* ✗ CI.checkpatch: warning for PF: Improve VF control (rev2)
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (15 preceding siblings ...)
  2024-08-09 17:28 ` ✓ CI.Patch_applied: success for PF: Improve VF control (rev2) Patchwork
@ 2024-08-09 17:29 ` Patchwork
  2024-08-09 17:30 ` ✓ CI.KUnit: success " Patchwork
                   ` (5 subsequent siblings)
  22 siblings, 0 replies; 47+ messages in thread
From: Patchwork @ 2024-08-09 17:29 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

== Series Details ==

Series: PF: Improve VF control (rev2)
URL   : https://patchwork.freedesktop.org/series/137095/
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
dc547930fbb1350eaf6bde84653b9ac973a411db
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 212c7364eedabdf4b150159217ed04cddfbe3938
Author: Michal Wajdeczko <michal.wajdeczko@intel.com>
Date:   Fri Aug 9 18:51:59 2024 +0200

    drm/xe/tests: Add KUnit tests for VF control GuC messages
    
    Add KUnit tests (~50) to cover all possible VF control messages
    that could be seen by the PF, either expected or corrupted.
    
    Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
    Cc: Lucas De Marchi <lucas.demarchi@intel.com>
+ /mt/dim checkpatch 13384fb5b1e76e7012902cc10b1e49023358dc1d drm-intel
0a484014e46f drm/xe/pf: Add function to sanitize VF resources
9f652709710d drm/xe/pf: Fix documentation formatting
8578b29fcb67 drm/xe/pf: Drop GuC notifications for non-existing VF
e279e187175d drm/xe/pf: Improve VF control
-:1368: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#1368: 
new file mode 100644

total: 0 errors, 1 warnings, 0 checks, 1449 lines checked
e040e86a370b drm/xe/tests: Allow deferred function call during KUnit test
-:228: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'func' - possible side-effects?
#228: FILE: drivers/gpu/drm/xe/tests/xe_kunit_helpers.h:47:
+#define xe_kunit_helper_delayed_call(test, delay, func, args...)	\
+	_Generic(func,							\
+		 void (*)(struct xe_device *) :				\
+			xe_kunit_helper_delayed_call_void_xe_device,	\
+		 void (*)(struct xe_gt *) :				\
+			xe_kunit_helper_delayed_call_void_xe_gt,	\
+		 int (*)(struct xe_gt *, unsigned int) :		\
+			xe_kunit_helper_delayed_call_int_xe_gt_uint	\
+	)(test, delay, func, args)

-:229: CHECK:CAMELCASE: Avoid CamelCase: <_Generic>
#229: FILE: drivers/gpu/drm/xe/tests/xe_kunit_helpers.h:48:
+	_Generic(func,							\

-:230: CHECK:SPACING: No space is necessary after a cast
#230: FILE: drivers/gpu/drm/xe/tests/xe_kunit_helpers.h:49:
+		 void (*)(struct xe_device *) :				\

-:232: CHECK:SPACING: No space is necessary after a cast
#232: FILE: drivers/gpu/drm/xe/tests/xe_kunit_helpers.h:51:
+		 void (*)(struct xe_gt *) :				\

total: 0 errors, 0 warnings, 4 checks, 199 lines checked
98602ffea42f drm/xe/tests: Add helper macro to detect if KUnit is running
04c60e3bd72b drm/xe/tests: Add helpers to call stubs out of KUnit context
-:58: WARNING:MACRO_WITH_FLOW_CONTROL: Macros with flow control statements should be avoided
#58: FILE: drivers/gpu/drm/xe/tests/xe_test.h:93:
+#define XE_TEST_REDIRECT(stub, args...)							\
+do {											\
+	typeof(stub) replacement = (stub);						\
+	if (XE_TEST_RUNNING()) {							\
+		if (unlikely(replacement)) {						\
+			pr_info(KUNIT_SUBTEST_INDENT "# %s: calling stub %ps\n",	\
+				__func__, replacement);					\
+			return replacement(args);					\
+		}									\
+	}										\
+} while (0)

total: 0 errors, 1 warnings, 0 checks, 85 lines checked
c0262a6eb9dd drm/xe/guc: Define stub for xe_guc_ct_send_recv()
d5ec33588fae drm/xe/pf: Define stub for pf_sanitize_vf_resources()
9af0ff056bee drm/xe/pf: Define stub for pf_send_vf_control_cmd()
218db1d2315c drm/xe/tests: Add KUnit tests for VF control state machines
-:14: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#14: 
new file mode 100644

-:309: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'X' - possible side-effects?
#309: FILE: drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:291:
+#define MAKE_STATE_PARAM(X) { .name = #X, .bits = X, .num_bits = ARRAY_SIZE(X) }

total: 0 errors, 1 warnings, 1 checks, 1382 lines checked
212c7364eeda drm/xe/tests: Add KUnit tests for VF control GuC messages
-:21: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#21: FILE: drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:1362:
+#define PREP_MSG_0_VF_STATE_NOTIFY(mbz)							\
+	FIELD_PREP_CONST(GUC_HXG_MSG_0_ORIGIN, GUC_HXG_ORIGIN_GUC) |			\
+	FIELD_PREP_CONST(GUC_HXG_MSG_0_TYPE, GUC_HXG_TYPE_EVENT) |			\
+	FIELD_PREP_CONST(GUC_HXG_EVENT_MSG_0_DATA0, (mbz)) |				\
+	FIELD_PREP_CONST(GUC_HXG_EVENT_MSG_0_ACTION, GUC_ACTION_GUC2PF_VF_STATE_NOTIFY)

-:27: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#27: FILE: drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:1368:
+#define PREP_MSG_VF_STATE_NOTIFY(mbz, vfid, e)						\
+	PREP_MSG_0_VF_STATE_NOTIFY(mbz),						\
+	FIELD_PREP_CONST(GUC2PF_VF_STATE_NOTIFY_EVENT_MSG_1_VFID, (vfid)),		\
+	FIELD_PREP_CONST(GUC2PF_VF_STATE_NOTIFY_EVENT_MSG_2_EVENT, (e))

-:118: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'X' - possible side-effects?
#118: FILE: drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:1459:
+#define MAKE_MSG_PARAM(X) { .name = #X, .msg = X, .len = ARRAY_SIZE(X) }

-:120: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#120: FILE: drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:1461:
+#define LIST_MSG_PARAM_VALID			\
+	MAKE_MSG_PARAM(msg_pf_enable),		\
+	MAKE_MSG_PARAM(msg_vf_flr),		\
+	MAKE_MSG_PARAM(msg_vf_flr_done),	\
+	MAKE_MSG_PARAM(msg_vf_pause_done),	\
+	MAKE_MSG_PARAM(msg_vf_fixup)

-:127: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#127: FILE: drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c:1468:
+#define LIST_MSG_PARAM_INVALID			\
+	MAKE_MSG_PARAM(msg_no_data),		\
+	MAKE_MSG_PARAM(msg_pf_too_long),	\
+	MAKE_MSG_PARAM(msg_pf_too_short),	\
+	MAKE_MSG_PARAM(msg_pf_bad_mbz),		\
+	MAKE_MSG_PARAM(msg_pf_invalid_event),	\
+	MAKE_MSG_PARAM(msg_pf_unknown_event),	\
+	MAKE_MSG_PARAM(msg_vf_too_long),	\
+	MAKE_MSG_PARAM(msg_vf_too_short),	\
+	MAKE_MSG_PARAM(msg_vf_bad_mbz),		\
+	MAKE_MSG_PARAM(msg_vf_bad_vfid),	\
+	MAKE_MSG_PARAM(msg_vf_invalid_event),	\
+	MAKE_MSG_PARAM(msg_vf_unknown_event)

total: 4 errors, 0 warnings, 1 checks, 197 lines checked



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

* ✓ CI.KUnit: success for PF: Improve VF control (rev2)
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (16 preceding siblings ...)
  2024-08-09 17:29 ` ✗ CI.checkpatch: warning " Patchwork
@ 2024-08-09 17:30 ` Patchwork
  2024-08-09 17:42 ` ✓ CI.Build: " Patchwork
                   ` (4 subsequent siblings)
  22 siblings, 0 replies; 47+ messages in thread
From: Patchwork @ 2024-08-09 17:30 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

== Series Details ==

Series: PF: Improve VF control (rev2)
URL   : https://patchwork.freedesktop.org/series/137095/
State : success

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[17:29:08] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[17:29:12] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make ARCH=um O=.kunit --jobs=48
../lib/iomap.c:156:5: warning: no previous prototype for ‘ioread64_lo_hi’ [-Wmissing-prototypes]
  156 | u64 ioread64_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:163:5: warning: no previous prototype for ‘ioread64_hi_lo’ [-Wmissing-prototypes]
  163 | u64 ioread64_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:170:5: warning: no previous prototype for ‘ioread64be_lo_hi’ [-Wmissing-prototypes]
  170 | u64 ioread64be_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:178:5: warning: no previous prototype for ‘ioread64be_hi_lo’ [-Wmissing-prototypes]
  178 | u64 ioread64be_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:264:6: warning: no previous prototype for ‘iowrite64_lo_hi’ [-Wmissing-prototypes]
  264 | void iowrite64_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:272:6: warning: no previous prototype for ‘iowrite64_hi_lo’ [-Wmissing-prototypes]
  272 | void iowrite64_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:280:6: warning: no previous prototype for ‘iowrite64be_lo_hi’ [-Wmissing-prototypes]
  280 | void iowrite64be_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~
../lib/iomap.c:288:6: warning: no previous prototype for ‘iowrite64be_hi_lo’ [-Wmissing-prototypes]
  288 | void iowrite64be_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~

[17:29:39] Starting KUnit Kernel (1/1)...
[17:29:39] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[17:29:39] =================== guc_dbm (7 subtests) ===================
[17:29:39] [PASSED] test_empty
[17:29:39] [PASSED] test_default
[17:29:39] ======================== test_size  ========================
[17:29:39] [PASSED] 4
[17:29:39] [PASSED] 8
[17:29:39] [PASSED] 32
[17:29:39] [PASSED] 256
[17:29:39] ==================== [PASSED] test_size ====================
[17:29:39] ======================= test_reuse  ========================
[17:29:39] [PASSED] 4
[17:29:39] [PASSED] 8
[17:29:39] [PASSED] 32
[17:29:39] [PASSED] 256
[17:29:39] =================== [PASSED] test_reuse ====================
[17:29:39] =================== test_range_overlap  ====================
[17:29:39] [PASSED] 4
[17:29:39] [PASSED] 8
[17:29:39] [PASSED] 32
[17:29:39] [PASSED] 256
[17:29:39] =============== [PASSED] test_range_overlap ================
[17:29:39] =================== test_range_compact  ====================
[17:29:39] [PASSED] 4
[17:29:39] [PASSED] 8
[17:29:39] [PASSED] 32
[17:29:39] [PASSED] 256
[17:29:39] =============== [PASSED] test_range_compact ================
[17:29:39] ==================== test_range_spare  =====================
[17:29:39] [PASSED] 4
[17:29:39] [PASSED] 8
[17:29:39] [PASSED] 32
[17:29:39] [PASSED] 256
[17:29:39] ================ [PASSED] test_range_spare =================
[17:29:39] ===================== [PASSED] guc_dbm =====================
[17:29:39] =================== guc_idm (6 subtests) ===================
[17:29:39] [PASSED] bad_init
[17:29:39] [PASSED] no_init
[17:29:39] [PASSED] init_fini
[17:29:39] [PASSED] check_used
[17:29:39] [PASSED] check_quota
[17:29:39] [PASSED] check_all
[17:29:39] ===================== [PASSED] guc_idm =====================
[17:29:39] ================== no_relay (3 subtests) ===================
[17:29:39] [PASSED] xe_drops_guc2pf_if_not_ready
[17:29:39] [PASSED] xe_drops_guc2vf_if_not_ready
[17:29:39] [PASSED] xe_rejects_send_if_not_ready
[17:29:39] ==================== [PASSED] no_relay =====================
[17:29:39] ================== pf_relay (14 subtests) ==================
[17:29:39] [PASSED] pf_rejects_guc2pf_too_short
[17:29:39] [PASSED] pf_rejects_guc2pf_too_long
[17:29:39] [PASSED] pf_rejects_guc2pf_no_payload
[17:29:39] [PASSED] pf_fails_no_payload
[17:29:39] [PASSED] pf_fails_bad_origin
[17:29:39] [PASSED] pf_fails_bad_type
[17:29:39] [PASSED] pf_txn_reports_error
[17:29:39] [PASSED] pf_txn_sends_pf2guc
[17:29:39] [PASSED] pf_sends_pf2guc
[17:29:39] [SKIPPED] pf_loopback_nop
[17:29:39] [SKIPPED] pf_loopback_echo
[17:29:39] [SKIPPED] pf_loopback_fail
[17:29:39] [SKIPPED] pf_loopback_busy
[17:29:39] [SKIPPED] pf_loopback_retry
[17:29:39] ==================== [PASSED] pf_relay =====================
[17:29:39] ================== vf_relay (3 subtests) ===================
[17:29:39] [PASSED] vf_rejects_guc2vf_too_short
[17:29:39] [PASSED] vf_rejects_guc2vf_too_long
[17:29:39] [PASSED] vf_rejects_guc2vf_no_payload
[17:29:39] ==================== [PASSED] vf_relay =====================
[17:29:39] =============== pf_control_guc (4 subtests) ================
[17:29:39] =================== xe_rejects_all_g2h  ====================
[17:29:39] [PASSED] msg_pf_enable
[17:29:39] [PASSED] msg_vf_flr
[17:29:39] [PASSED] msg_vf_flr_done
[17:29:39] [PASSED] msg_vf_pause_done
[17:29:39] [PASSED] msg_vf_fixup
[17:29:39] [PASSED] msg_no_data
[17:29:39] [PASSED] msg_pf_too_long
[17:29:39] [PASSED] msg_pf_too_short
[17:29:39] [PASSED] msg_pf_bad_mbz
[17:29:39] [PASSED] msg_pf_invalid_event
[17:29:39] [PASSED] msg_pf_unknown_event
[17:29:39] [PASSED] msg_vf_too_long
[17:29:39] [PASSED] msg_vf_too_short
[17:29:39] [PASSED] msg_vf_bad_mbz
[17:29:39] [PASSED] msg_vf_bad_vfid
[17:29:39] [PASSED] msg_vf_invalid_event
[17:29:39] [PASSED] msg_vf_unknown_event
[17:29:39] =============== [PASSED] xe_rejects_all_g2h ================
[17:29:39] =================== vf_rejects_all_g2h  ====================
[17:29:39] [PASSED] msg_pf_enable
[17:29:39] [PASSED] msg_vf_flr
[17:29:39] [PASSED] msg_vf_flr_done
[17:29:39] [PASSED] msg_vf_pause_done
[17:29:39] [PASSED] msg_vf_fixup
[17:29:39] [PASSED] msg_no_data
[17:29:39] [PASSED] msg_pf_too_long
[17:29:39] [PASSED] msg_pf_too_short
[17:29:39] [PASSED] msg_pf_bad_mbz
[17:29:39] [PASSED] msg_pf_invalid_event
[17:29:39] [PASSED] msg_pf_unknown_event
[17:29:39] [PASSED] msg_vf_too_long
[17:29:39] [PASSED] msg_vf_too_short
[17:29:39] [PASSED] msg_vf_bad_mbz
[17:29:39] [PASSED] msg_vf_bad_vfid
[17:29:39] [PASSED] msg_vf_invalid_event
[17:29:39] [PASSED] msg_vf_unknown_event
[17:29:39] =============== [PASSED] vf_rejects_all_g2h ================
[17:29:39] ================ pf_rejects_malformed_g2h  =================
[17:29:39] [PASSED] msg_no_data
[17:29:39] [PASSED] msg_pf_too_long
[17:29:39] [PASSED] msg_pf_too_short
[17:29:39] [PASSED] msg_pf_bad_mbz
[17:29:39] [PASSED] msg_pf_invalid_event
[17:29:39] [PASSED] msg_pf_unknown_event
[17:29:39] [PASSED] msg_vf_too_long
[17:29:39] [PASSED] msg_vf_too_short
[17:29:39] [PASSED] msg_vf_bad_mbz
[17:29:39] [PASSED] msg_vf_bad_vfid
[17:29:39] [PASSED] msg_vf_invalid_event
[17:29:39] [PASSED] msg_vf_unknown_event
[17:29:39] ============ [PASSED] pf_rejects_malformed_g2h =============
[17:29:39] ================== pf_accepts_valid_g2h  ===================
[17:29:39] [PASSED] msg_pf_enable
[17:29:39] [PASSED] msg_vf_flr
[17:29:39] [PASSED] msg_vf_flr_done
[17:29:39] [PASSED] msg_vf_pause_done
[17:29:39] [PASSED] msg_vf_fixup
[17:29:39] ============== [PASSED] pf_accepts_valid_g2h ===============
[17:29:39] ================= [PASSED] pf_control_guc ==================
[17:29:39] ================= pf_control (46 subtests) =================
[17:29:39] [PASSED] basic_pause_and_resume_vf
[17:29:39] [PASSED] basic_pause_and_stop_vf
[17:29:39] [PASSED] basic_stop_and_flr_vf
[17:29:39] [PASSED] basic_flr_and_flr_vf
[17:29:39] [PASSED] basic_flr_vfs
[17:29:39] ======================= flr_vf_from  =======================
[17:29:39] [PASSED] ready
[17:29:39] [PASSED] flr_starting
[17:29:39] [PASSED] flr_starting_paused
[17:29:39] [PASSED] flr_starting_stopped
[17:29:39] [PASSED] flr_waiting
[17:29:39] [PASSED] flr_guc_done
[17:29:39] [PASSED] flr_resetting
[17:29:39] [PASSED] flr_finishing
[17:29:39] [PASSED] flr_failed
[17:29:39] [PASSED] stopping
[17:29:39] [PASSED] stop_failed
[17:29:39] [PASSED] stop_rejected
[17:29:39] [PASSED] stopped
[17:29:39] [PASSED] pausing
[17:29:39] [PASSED] pausing_wait_guc
[17:29:39] [PASSED] pausing_guc_done
[17:29:39] [PASSED] pause_failed
[17:29:39] [PASSED] pause_rejected
[17:29:39] [PASSED] paused
[17:29:39] [PASSED] resuming
[17:29:39] [PASSED] resume_failed
[17:29:39] [PASSED] resume_rejected
[17:29:39] [PASSED] resumed
[17:29:39] [PASSED] mismatch
[17:29:39] =================== [PASSED] flr_vf_from ===================
[17:29:39] ================= flr_vf_needs_retry_from  =================
[17:29:39] [PASSED] ready
[17:29:39] [PASSED] flr_starting
[17:29:39] [PASSED] flr_starting_paused
[17:29:39] [PASSED] flr_starting_stopped
[17:29:39] [PASSED] flr_waiting
[17:29:39] [PASSED] flr_guc_done
[17:29:39] [PASSED] flr_resetting
[17:29:39] [PASSED] flr_finishing
[17:29:39] [PASSED] flr_failed
[17:29:39] [PASSED] stopping
[17:29:39] [PASSED] stop_failed
[17:29:39] [PASSED] stop_rejected
[17:29:39] [PASSED] stopped
[17:29:39] [PASSED] pausing
[17:29:39] [PASSED] pausing_wait_guc
[17:29:39] [PASSED] pausing_guc_done
[17:29:39] [PASSED] pause_failed
[17:29:39] [PASSED] pause_rejected
[17:29:39] [PASSED] paused
[17:29:39] [PASSED] resuming
[17:29:39] [PASSED] resume_failed
[17:29:39] [PASSED] resume_rejected
[17:29:39] [PASSED] resumed
[17:29:39] [PASSED] mismatch
[17:29:39] ============= [PASSED] flr_vf_needs_retry_from =============
[17:29:39] ============== flr_vf_needs_retry_late_from  ===============
[17:29:39] [PASSED] ready
[17:29:39] [PASSED] flr_starting
[17:29:39] [PASSED] flr_starting_paused
[17:29:39] [PASSED] flr_starting_stopped
[17:29:39] [PASSED] flr_waiting
[17:29:39] [PASSED] flr_guc_done
[17:29:39] [PASSED] flr_resetting
[17:29:39] [PASSED] flr_finishing
[17:29:39] [PASSED] flr_failed
[17:29:40] [PASSED] stopping
[17:29:40] [PASSED] stop_failed
[17:29:40] [PASSED] stop_rejected
[17:29:40] [PASSED] stopped
[17:29:40] [PASSED] pausing
[17:29:40] [PASSED] pausing_wait_guc
[17:29:40] [PASSED] pausing_guc_done
[17:29:40] [PASSED] pause_failed
[17:29:40] [PASSED] pause_rejected
[17:29:40] [PASSED] paused
[17:29:41] [PASSED] resuming
[17:29:41] [PASSED] resume_failed
[17:29:41] [PASSED] resume_rejected
[17:29:41] [PASSED] resumed
[17:29:41] [PASSED] mismatch
[17:29:41] ========== [PASSED] flr_vf_needs_retry_late_from ===========
[17:29:41] [PASSED] flr_vf_fails_on_send
[17:29:41] [PASSED] flr_vf_fails_on_reset
[17:29:41] [PASSED] flr_vf_rejected_by_guc
[17:29:42] [PASSED] flr_vf_unconfirmed_by_guc
[17:29:42] [PASSED] flr_vf_confirmed_early_continue_by_guc
[17:29:42] [PASSED] flr_vf_confirmed_early_reject_by_guc
[17:29:42] [PASSED] flr_vf_confirmed_twice_by_guc
[17:29:42] [PASSED] flr_vf_confirmed_too_late_by_guc
[17:29:42] [PASSED] flr_vf_wrong_confirmation_from_guc
[17:29:42] [PASSED] flr_vf_unsolicited_confirmation_from_guc
[17:29:42] [PASSED] flr_vf_canceled_by_restart
[17:29:42] ====================== stop_vf_from  =======================
[17:29:42] [PASSED] ready
[17:29:42] [PASSED] stop_failed
[17:29:42] [PASSED] stop_rejected
[17:29:42] [PASSED] pausing
[17:29:42] [PASSED] pausing_wait_guc
[17:29:42] [PASSED] pausing_guc_done
[17:29:42] [PASSED] pause_failed
[17:29:42] [PASSED] pause_rejected
[17:29:42] [PASSED] paused
[17:29:42] [PASSED] resuming
[17:29:42] [PASSED] resume_failed
[17:29:42] [PASSED] resume_rejected
[17:29:42] [PASSED] resumed
[17:29:42] [PASSED] mismatch
[17:29:42] [PASSED] flr_failed
[17:29:42] ================== [PASSED] stop_vf_from ===================
[17:29:42] ================ stop_vf_needs_retry_from  =================
[17:29:42] [PASSED] ready
[17:29:42] [PASSED] stop_failed
[17:29:42] [PASSED] stop_rejected
[17:29:42] [PASSED] pausing
[17:29:42] [PASSED] pausing_wait_guc
[17:29:42] [PASSED] pausing_guc_done
[17:29:42] [PASSED] pause_failed
[17:29:42] [PASSED] pause_rejected
[17:29:42] [PASSED] paused
[17:29:42] [PASSED] resuming
[17:29:42] [PASSED] resume_failed
[17:29:42] [PASSED] resume_rejected
[17:29:42] [PASSED] resumed
[17:29:42] [PASSED] mismatch
[17:29:42] [PASSED] flr_failed
[17:29:42] ============ [PASSED] stop_vf_needs_retry_from =============
[17:29:42] ================== stop_vf_refused_from  ===================
[17:29:42] [PASSED] stopping
[17:29:42] [PASSED] stopping_paused
[17:29:42] [PASSED] stopped
[17:29:42] [PASSED] flr_starting_stopped
[17:29:42] ============== [PASSED] stop_vf_refused_from ===============
[17:29:42] ================== stop_vf_canceled_from  ==================
[17:29:42] [PASSED] flr_starting
[17:29:42] [PASSED] flr_starting_paused
[17:29:42] [PASSED] flr_waiting
[17:29:42] [PASSED] flr_guc_done
[17:29:42] [PASSED] flr_resetting
[17:29:42] [PASSED] flr_finishing
[17:29:42] ============== [PASSED] stop_vf_canceled_from ==============
[17:29:42] [PASSED] stop_vf_fails_on_send
[17:29:42] [PASSED] stop_vf_rejected_by_guc
[17:29:42] [PASSED] stop_vf_canceled_by_flr
[17:29:42] [PASSED] stop_vf_canceled_by_restart
[17:29:42] ====================== pause_vf_from  ======================
[17:29:42] [PASSED] ready
[17:29:42] [PASSED] pause_failed
[17:29:42] [PASSED] pause_rejected
[17:29:42] [PASSED] resumed
[17:29:43] [PASSED] mismatch
[17:29:43] [PASSED] stop_failed
[17:29:43] [PASSED] stop_rejected
[17:29:43] [PASSED] flr_failed
[17:29:43] ================== [PASSED] pause_vf_from ==================
[17:29:43] ================ pause_vf_needs_retry_from  ================
[17:29:43] [PASSED] ready
[17:29:43] [PASSED] pause_failed
[17:29:43] [PASSED] pause_rejected
[17:29:43] [PASSED] resumed
[17:29:43] [PASSED] mismatch
[17:29:43] [PASSED] stop_failed
[17:29:43] [PASSED] stop_rejected
[17:29:43] [PASSED] flr_failed
[17:29:43] ============ [PASSED] pause_vf_needs_retry_from ============
[17:29:43] ================== pause_vf_refused_from  ==================
[17:29:43] [PASSED] pausing
[17:29:43] [PASSED] pausing_wait_guc
[17:29:43] [PASSED] pausing_guc_done
[17:29:43] [PASSED] paused
[17:29:43] [PASSED] resuming
[17:29:43] [PASSED] resume_failed
[17:29:43] [PASSED] resume_rejected
[17:29:43] [PASSED] stopped
[17:29:43] ============== [PASSED] pause_vf_refused_from ==============
[17:29:43] ================= pause_vf_canceled_from  ==================
[17:29:43] [PASSED] flr_starting
[17:29:43] [PASSED] flr_waiting
[17:29:43] [PASSED] flr_guc_done
[17:29:43] [PASSED] flr_resetting
[17:29:43] [PASSED] flr_finishing
[17:29:43] [PASSED] stopping
[17:29:43] ============= [PASSED] pause_vf_canceled_from ==============
[17:29:43] [PASSED] pause_vf_fails_on_send
[17:29:43] [PASSED] pause_vf_rejected_by_guc
[17:29:44] [PASSED] pause_vf_unconfirmed_by_guc
[17:29:44] [PASSED] pause_vf_canceled_by_flr
[17:29:44] [PASSED] pause_vf_canceled_by_stop
[17:29:44] [PASSED] pause_vf_canceled_by_restart
[17:29:44] ===================== resume_vf_from  ======================
[17:29:44] [PASSED] paused
[17:29:44] [PASSED] resume_failed
[17:29:44] [PASSED] resume_rejected
[17:29:44] ================= [PASSED] resume_vf_from ==================
[17:29:44] =============== resume_vf_needs_retry_from  ================
[17:29:44] [PASSED] paused
[17:29:44] [PASSED] resume_failed
[17:29:44] [PASSED] resume_rejected
[17:29:44] =========== [PASSED] resume_vf_needs_retry_from ============
[17:29:44] ================= resume_vf_refused_from  ==================
[17:29:44] [PASSED] ready
[17:29:44] [PASSED] pausing
[17:29:44] [PASSED] pausing_wait_guc
[17:29:44] [PASSED] pausing_guc_done
[17:29:44] [PASSED] pause_failed
[17:29:44] [PASSED] pause_rejected
[17:29:44] [PASSED] resuming
[17:29:44] [PASSED] resumed
[17:29:44] [PASSED] stopping
[17:29:44] [PASSED] stop_failed
[17:29:44] [PASSED] stop_rejected
[17:29:44] [PASSED] stopped
[17:29:44] [PASSED] flr_starting
[17:29:44] [PASSED] flr_waiting
[17:29:44] [PASSED] flr_guc_done
[17:29:44] [PASSED] flr_resetting
[17:29:44] [PASSED] flr_finishing
[17:29:44] [PASSED] flr_failed
[17:29:44] [PASSED] mismatch
[17:29:44] ============= [PASSED] resume_vf_refused_from ==============
[17:29:44] ================= resume_vf_canceled_from  =================
[17:29:44] [PASSED] flr_starting_paused
stty: 'standard input': Inappropriate ioctl for device
[17:29:44] [PASSED] stopping_paused
[17:29:44] ============= [PASSED] resume_vf_canceled_from =============
[17:29:44] [PASSED] resume_vf_fails_on_send
[17:29:44] [PASSED] resume_vf_rejected_by_guc
[17:29:44] [PASSED] resume_vf_canceled_by_flr
[17:29:44] [PASSED] resume_vf_canceled_by_stop
[17:29:44] [PASSED] resume_vf_canceled_by_restart
[17:29:44] =================== [PASSED] pf_control ====================
[17:29:44] ================= pf_service (11 subtests) =================
[17:29:44] [PASSED] pf_negotiate_any
[17:29:44] [PASSED] pf_negotiate_base_match
[17:29:44] [PASSED] pf_negotiate_base_newer
[17:29:44] [PASSED] pf_negotiate_base_next
[17:29:44] [SKIPPED] pf_negotiate_base_older
[17:29:44] [PASSED] pf_negotiate_base_prev
[17:29:44] [PASSED] pf_negotiate_latest_match
[17:29:44] [PASSED] pf_negotiate_latest_newer
[17:29:44] [PASSED] pf_negotiate_latest_next
[17:29:44] [SKIPPED] pf_negotiate_latest_older
[17:29:44] [SKIPPED] pf_negotiate_latest_prev
[17:29:44] =================== [PASSED] pf_service ====================
[17:29:44] ===================== lmtt (1 subtest) =====================
[17:29:44] ======================== test_ops  =========================
[17:29:44] [PASSED] 2-level
[17:29:44] [PASSED] multi-level
[17:29:44] ==================== [PASSED] test_ops =====================
[17:29:44] ====================== [PASSED] lmtt =======================
[17:29:44] =================== xe_mocs (2 subtests) ===================
[17:29:44] ================ xe_live_mocs_kernel_kunit  ================
[17:29:44] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[17:29:44] ================ xe_live_mocs_reset_kunit  =================
[17:29:44] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[17:29:44] ==================== [SKIPPED] xe_mocs =====================
[17:29:44] ================= xe_migrate (2 subtests) ==================
[17:29:44] ================= xe_migrate_sanity_kunit  =================
[17:29:44] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[17:29:44] ================== xe_validate_ccs_kunit  ==================
[17:29:44] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[17:29:44] =================== [SKIPPED] xe_migrate ===================
[17:29:44] ================== xe_dma_buf (1 subtest) ==================
[17:29:44] ==================== xe_dma_buf_kunit  =====================
[17:29:44] ================ [SKIPPED] xe_dma_buf_kunit ================
[17:29:44] =================== [SKIPPED] xe_dma_buf ===================
[17:29:44] ==================== xe_bo (2 subtests) ====================
[17:29:44] ================== xe_ccs_migrate_kunit  ===================
[17:29:44] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[17:29:44] ==================== xe_bo_evict_kunit  ====================
[17:29:44] =============== [SKIPPED] xe_bo_evict_kunit ================
[17:29:44] ===================== [SKIPPED] xe_bo ======================
[17:29:44] ==================== args (11 subtests) ====================
[17:29:44] [PASSED] count_args_test
[17:29:44] [PASSED] call_args_example
[17:29:44] [PASSED] call_args_test
[17:29:44] [PASSED] drop_first_arg_example
[17:29:44] [PASSED] drop_first_arg_test
[17:29:44] [PASSED] first_arg_example
[17:29:44] [PASSED] first_arg_test
[17:29:44] [PASSED] last_arg_example
[17:29:44] [PASSED] last_arg_test
[17:29:44] [PASSED] pick_arg_example
[17:29:44] [PASSED] sep_comma_example
[17:29:44] ====================== [PASSED] args =======================
[17:29:44] =================== xe_pci (2 subtests) ====================
[17:29:44] [PASSED] xe_gmdid_graphics_ip
[17:29:44] [PASSED] xe_gmdid_media_ip
[17:29:44] ===================== [PASSED] xe_pci ======================
[17:29:44] =================== xe_rtp (2 subtests) ====================
[17:29:44] =============== xe_rtp_process_to_sr_tests  ================
[17:29:44] [PASSED] coalesce-same-reg
[17:29:44] [PASSED] no-match-no-add
[17:29:44] [PASSED] match-or
[17:29:44] [PASSED] match-or-xfail
[17:29:44] [PASSED] no-match-no-add-multiple-rules
[17:29:44] [PASSED] two-regs-two-entries
[17:29:44] [PASSED] clr-one-set-other
[17:29:44] [PASSED] set-field
[17:29:44] [PASSED] conflict-duplicate
[17:29:44] [PASSED] conflict-not-disjoint
[17:29:44] [PASSED] conflict-reg-type
[17:29:44] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[17:29:44] ================== xe_rtp_process_tests  ===================
[17:29:44] [PASSED] active1
[17:29:44] [PASSED] active2
[17:29:44] [PASSED] active-inactive
[17:29:44] [PASSED] inactive-active
[17:29:44] [PASSED] inactive-1st_or_active-inactive
[17:29:44] [PASSED] inactive-2nd_or_active-inactive
[17:29:44] [PASSED] inactive-last_or_active-inactive
[17:29:44] [PASSED] inactive-no_or_active-inactive
[17:29:44] ============== [PASSED] xe_rtp_process_tests ===============
[17:29:44] ===================== [PASSED] xe_rtp ======================
[17:29:44] ==================== xe_wa (1 subtest) =====================
[17:29:44] ======================== xe_wa_gt  =========================
[17:29:44] [PASSED] TIGERLAKE (B0)
[17:29:44] [PASSED] DG1 (A0)
[17:29:44] [PASSED] DG1 (B0)
[17:29:44] [PASSED] ALDERLAKE_S (A0)
[17:29:44] [PASSED] ALDERLAKE_S (B0)
[17:29:44] [PASSED] ALDERLAKE_S (C0)
[17:29:44] [PASSED] ALDERLAKE_S (D0)
[17:29:44] [PASSED] ALDERLAKE_P (A0)
[17:29:44] [PASSED] ALDERLAKE_P (B0)
[17:29:44] [PASSED] ALDERLAKE_P (C0)
[17:29:44] [PASSED] ALDERLAKE_S_RPLS (D0)
[17:29:44] [PASSED] ALDERLAKE_P_RPLU (E0)
[17:29:44] [PASSED] DG2_G10 (C0)
[17:29:44] [PASSED] DG2_G11 (B1)
[17:29:44] [PASSED] DG2_G12 (A1)
[17:29:44] [PASSED] METEORLAKE (g:A0, m:A0)
[17:29:44] [PASSED] METEORLAKE (g:A0, m:A0)
[17:29:44] [PASSED] METEORLAKE (g:A0, m:A0)
[17:29:44] [PASSED] LUNARLAKE (g:A0, m:A0)
[17:29:44] [PASSED] LUNARLAKE (g:B0, m:A0)
[17:29:44] [PASSED] BATTLEMAGE (g:A0, m:A1)
[17:29:44] ==================== [PASSED] xe_wa_gt =====================
[17:29:44] ====================== [PASSED] xe_wa ======================
[17:29:44] ============================================================
[17:29:44] Testing complete. Ran 372 tests: passed: 357, skipped: 15
[17:29:44] Elapsed time: 36.531s total, 4.160s configuring, 26.484s building, 5.852s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[17:29:44] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[17:29:46] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make ARCH=um O=.kunit --jobs=48
../lib/iomap.c:156:5: warning: no previous prototype for ‘ioread64_lo_hi’ [-Wmissing-prototypes]
  156 | u64 ioread64_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:163:5: warning: no previous prototype for ‘ioread64_hi_lo’ [-Wmissing-prototypes]
  163 | u64 ioread64_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:170:5: warning: no previous prototype for ‘ioread64be_lo_hi’ [-Wmissing-prototypes]
  170 | u64 ioread64be_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:178:5: warning: no previous prototype for ‘ioread64be_hi_lo’ [-Wmissing-prototypes]
  178 | u64 ioread64be_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:264:6: warning: no previous prototype for ‘iowrite64_lo_hi’ [-Wmissing-prototypes]
  264 | void iowrite64_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:272:6: warning: no previous prototype for ‘iowrite64_hi_lo’ [-Wmissing-prototypes]
  272 | void iowrite64_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:280:6: warning: no previous prototype for ‘iowrite64be_lo_hi’ [-Wmissing-prototypes]
  280 | void iowrite64be_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~
../lib/iomap.c:288:6: warning: no previous prototype for ‘iowrite64be_hi_lo’ [-Wmissing-prototypes]
  288 | void iowrite64be_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~

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

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

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



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

* ✓ CI.Build: success for PF: Improve VF control (rev2)
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (17 preceding siblings ...)
  2024-08-09 17:30 ` ✓ CI.KUnit: success " Patchwork
@ 2024-08-09 17:42 ` Patchwork
  2024-08-09 17:44 ` ✗ CI.Hooks: failure " Patchwork
                   ` (3 subsequent siblings)
  22 siblings, 0 replies; 47+ messages in thread
From: Patchwork @ 2024-08-09 17:42 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

== Series Details ==

Series: PF: Improve VF control (rev2)
URL   : https://patchwork.freedesktop.org/series/137095/
State : success

== Summary ==

lib/modules/6.11.0-rc2-xe/kernel/sound/core/seq/
lib/modules/6.11.0-rc2-xe/kernel/sound/core/seq/snd-seq.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/core/snd-seq-device.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/core/snd-hwdep.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/core/snd.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/core/snd-pcm.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/core/snd-compress.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/core/snd-timer.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soundcore.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/intel/
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/intel/atom/
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/intel/atom/snd-soc-sst-atom-hifi2-platform.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/intel/atom/sst/
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/intel/atom/sst/snd-intel-sst-acpi.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/intel/atom/sst/snd-intel-sst-core.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/intel/common/
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/intel/common/snd-soc-acpi-intel-match.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/amd/
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/amd/snd-acp-config.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/intel/
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/intel/snd-sof-pci-intel-tgl.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/intel/snd-sof-intel-hda-mlink.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/intel/snd-sof-pci-intel-cnl.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/intel/snd-sof-pci-intel-lnl.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/intel/snd-sof-intel-hda-common.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/intel/snd-sof-intel-hda-generic.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/intel/snd-sof-intel-hda.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/intel/snd-sof-pci-intel-mtl.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/amd/
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/amd/snd-sof-amd-renoir.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/amd/snd-sof-amd-acp.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/snd-sof-utils.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/snd-sof-pci.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/snd-sof.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/snd-sof-probes.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/xtensa/
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/sof/xtensa/snd-sof-xtensa-dsp.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/snd-soc-core.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/snd-soc-acpi.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/codecs/
lib/modules/6.11.0-rc2-xe/kernel/sound/soc/codecs/snd-soc-hdac-hda.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/hda/
lib/modules/6.11.0-rc2-xe/kernel/sound/hda/snd-intel-sdw-acpi.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/hda/ext/
lib/modules/6.11.0-rc2-xe/kernel/sound/hda/ext/snd-hda-ext-core.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/hda/snd-intel-dspcfg.ko
lib/modules/6.11.0-rc2-xe/kernel/sound/hda/snd-hda-core.ko
lib/modules/6.11.0-rc2-xe/kernel/arch/
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/kernel/
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/kernel/msr.ko
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/kernel/cpuid.ko
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/crypto/
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/crypto/sha512-ssse3.ko
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/crypto/crct10dif-pclmul.ko
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/crypto/ghash-clmulni-intel.ko
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/crypto/sha1-ssse3.ko
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/crypto/crc32-pclmul.ko
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/crypto/sha256-ssse3.ko
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/crypto/aesni-intel.ko
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/crypto/polyval-clmulni.ko
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/events/
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/events/intel/
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/events/intel/intel-cstate.ko
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/events/rapl.ko
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/kvm/
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/kvm/kvm.ko
lib/modules/6.11.0-rc2-xe/kernel/arch/x86/kvm/kvm-intel.ko
lib/modules/6.11.0-rc2-xe/kernel/crypto/
lib/modules/6.11.0-rc2-xe/kernel/crypto/crypto_simd.ko
lib/modules/6.11.0-rc2-xe/kernel/crypto/cmac.ko
lib/modules/6.11.0-rc2-xe/kernel/crypto/ccm.ko
lib/modules/6.11.0-rc2-xe/kernel/crypto/cryptd.ko
lib/modules/6.11.0-rc2-xe/kernel/crypto/polyval-generic.ko
lib/modules/6.11.0-rc2-xe/kernel/crypto/async_tx/
lib/modules/6.11.0-rc2-xe/kernel/crypto/async_tx/async_xor.ko
lib/modules/6.11.0-rc2-xe/kernel/crypto/async_tx/async_tx.ko
lib/modules/6.11.0-rc2-xe/kernel/crypto/async_tx/async_memcpy.ko
lib/modules/6.11.0-rc2-xe/kernel/crypto/async_tx/async_pq.ko
lib/modules/6.11.0-rc2-xe/kernel/crypto/async_tx/async_raid6_recov.ko
lib/modules/6.11.0-rc2-xe/build
lib/modules/6.11.0-rc2-xe/modules.alias.bin
lib/modules/6.11.0-rc2-xe/modules.builtin
lib/modules/6.11.0-rc2-xe/modules.softdep
lib/modules/6.11.0-rc2-xe/modules.alias
lib/modules/6.11.0-rc2-xe/modules.order
lib/modules/6.11.0-rc2-xe/modules.symbols
lib/modules/6.11.0-rc2-xe/modules.dep.bin
+ mv kernel-nodebug.tar.gz ..
+ cd ..
+ rm -rf archive
++ date +%s
+ echo -e '\e[0Ksection_end:1723225330:package_x86_64_nodebug\r\e[0K'
+ sync
^[[0Ksection_end:1723225330:package_x86_64_nodebug
^[[0K
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel



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

* ✗ CI.Hooks: failure for PF: Improve VF control (rev2)
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (18 preceding siblings ...)
  2024-08-09 17:42 ` ✓ CI.Build: " Patchwork
@ 2024-08-09 17:44 ` Patchwork
  2024-08-09 17:46 ` ✓ CI.checksparse: success " Patchwork
                   ` (2 subsequent siblings)
  22 siblings, 0 replies; 47+ messages in thread
From: Patchwork @ 2024-08-09 17:44 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

== Series Details ==

Series: PF: Improve VF control (rev2)
URL   : https://patchwork.freedesktop.org/series/137095/
State : failure

== Summary ==

run-parts: executing /workspace/ci/hooks/00-showenv
+ export
+ grep -Ei '(^|\W)CI_'
declare -x CI_KERNEL_BUILD_DIR="/workspace/kernel/build64-default"
declare -x CI_KERNEL_SRC_DIR="/workspace/kernel"
declare -x CI_TOOLS_SRC_DIR="/workspace/ci"
declare -x CI_WORKSPACE_DIR="/workspace"
run-parts: executing /workspace/ci/hooks/10-build-W1
+ SRC_DIR=/workspace/kernel
+ RESTORE_DISPLAY_CONFIG=0
+ '[' -n /workspace/kernel/build64-default ']'
+ BUILD_DIR=/workspace/kernel/build64-default
+ cd /workspace/kernel
++ nproc
+ make -j48 O=/workspace/kernel/build64-default modules_prepare
make[1]: Entering directory '/workspace/kernel/build64-default'
  GEN     Makefile
  UPD     include/generated/compile.h
  UPD     include/config/kernel.release
mkdir -p /workspace/kernel/build64-default/tools/objtool && make O=/workspace/kernel/build64-default subdir=tools/objtool --no-print-directory -C objtool 
  UPD     include/generated/utsrelease.h
  CALL    ../scripts/checksyscalls.sh
  HOSTCC  /workspace/kernel/build64-default/tools/objtool/fixdep.o
  HOSTLD  /workspace/kernel/build64-default/tools/objtool/fixdep-in.o
  LINK    /workspace/kernel/build64-default/tools/objtool/fixdep
  INSTALL libsubcmd_headers
  CC      /workspace/kernel/build64-default/tools/objtool/libsubcmd/exec-cmd.o
  CC      /workspace/kernel/build64-default/tools/objtool/libsubcmd/help.o
  CC      /workspace/kernel/build64-default/tools/objtool/libsubcmd/pager.o
  CC      /workspace/kernel/build64-default/tools/objtool/libsubcmd/parse-options.o
  CC      /workspace/kernel/build64-default/tools/objtool/libsubcmd/run-command.o
  CC      /workspace/kernel/build64-default/tools/objtool/libsubcmd/sigchain.o
  CC      /workspace/kernel/build64-default/tools/objtool/libsubcmd/subcmd-config.o
  LD      /workspace/kernel/build64-default/tools/objtool/libsubcmd/libsubcmd-in.o
  AR      /workspace/kernel/build64-default/tools/objtool/libsubcmd/libsubcmd.a
  CC      /workspace/kernel/build64-default/tools/objtool/weak.o
  CC      /workspace/kernel/build64-default/tools/objtool/check.o
  CC      /workspace/kernel/build64-default/tools/objtool/special.o
  CC      /workspace/kernel/build64-default/tools/objtool/builtin-check.o
  CC      /workspace/kernel/build64-default/tools/objtool/elf.o
  CC      /workspace/kernel/build64-default/tools/objtool/orc_gen.o
  CC      /workspace/kernel/build64-default/tools/objtool/objtool.o
  CC      /workspace/kernel/build64-default/tools/objtool/orc_dump.o
  CC      /workspace/kernel/build64-default/tools/objtool/libstring.o
  CC      /workspace/kernel/build64-default/tools/objtool/libctype.o
  CC      /workspace/kernel/build64-default/tools/objtool/str_error_r.o
  CC      /workspace/kernel/build64-default/tools/objtool/librbtree.o
  CC      /workspace/kernel/build64-default/tools/objtool/arch/x86/special.o
  CC      /workspace/kernel/build64-default/tools/objtool/arch/x86/decode.o
  CC      /workspace/kernel/build64-default/tools/objtool/arch/x86/orc.o
  LD      /workspace/kernel/build64-default/tools/objtool/arch/x86/objtool-in.o
  LD      /workspace/kernel/build64-default/tools/objtool/objtool-in.o
  LINK    /workspace/kernel/build64-default/tools/objtool/objtool
make[1]: Leaving directory '/workspace/kernel/build64-default'
++ nproc
+ make -j48 O=/workspace/kernel/build64-default W=1 drivers/gpu/drm/xe
make[1]: Entering directory '/workspace/kernel/build64-default'
make[2]: Nothing to be done for 'drivers/gpu/drm/xe'.
make[1]: Leaving directory '/workspace/kernel/build64-default'
run-parts: executing /workspace/ci/hooks/11-build-32b
+++ realpath /workspace/ci/hooks/11-build-32b
++ dirname /workspace/ci/hooks/11-build-32b
+ THIS_SCRIPT_DIR=/workspace/ci/hooks
+ SRC_DIR=/workspace/kernel
+ TOOLS_SRC_DIR=/workspace/ci
+ '[' -n /workspace/kernel/build64-default ']'
+ BUILD_DIR=/workspace/kernel/build64-default
+ BUILD_DIR=/workspace/kernel/build64-default/build32
+ cd /workspace/kernel
+ mkdir -p /workspace/kernel/build64-default/build32
++ nproc
+ make -j48 ARCH=i386 O=/workspace/kernel/build64-default/build32 defconfig
make[1]: Entering directory '/workspace/kernel/build64-default/build32'
  GEN     Makefile
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/confdata.o
  HOSTCC  scripts/kconfig/expr.o
  LEX     scripts/kconfig/lexer.lex.c
  YACC    scripts/kconfig/parser.tab.[ch]
  HOSTCC  scripts/kconfig/menu.o
  HOSTCC  scripts/kconfig/preprocess.o
  HOSTCC  scripts/kconfig/symbol.o
  HOSTCC  scripts/kconfig/util.o
  HOSTCC  scripts/kconfig/lexer.lex.o
  HOSTCC  scripts/kconfig/parser.tab.o
  HOSTLD  scripts/kconfig/conf
*** Default configuration is based on 'i386_defconfig'
#
# configuration written to .config
#
make[1]: Leaving directory '/workspace/kernel/build64-default/build32'
+ cd /workspace/kernel/build64-default/build32
+ /workspace/kernel/scripts/kconfig/merge_config.sh .config /workspace/ci/kernel/10-xe.fragment
Using .config as base
Merging /workspace/ci/kernel/10-xe.fragment
Value of CONFIG_DRM_XE is redefined by fragment /workspace/ci/kernel/10-xe.fragment:
Previous value: # CONFIG_DRM_XE is not set
New value: CONFIG_DRM_XE=m

Value of CONFIG_SND_DEBUG is redefined by fragment /workspace/ci/kernel/10-xe.fragment:
Previous value: # CONFIG_SND_DEBUG is not set
New value: CONFIG_SND_DEBUG=y

Value of CONFIG_SND_HDA_INTEL is redefined by fragment /workspace/ci/kernel/10-xe.fragment:
Previous value: CONFIG_SND_HDA_INTEL=y
New value: CONFIG_SND_HDA_INTEL=m

Value of CONFIG_SND_HDA_CODEC_HDMI is redefined by fragment /workspace/ci/kernel/10-xe.fragment:
Previous value: # CONFIG_SND_HDA_CODEC_HDMI is not set
New value: CONFIG_SND_HDA_CODEC_HDMI=m

  GEN     Makefile

WARNING: unmet direct dependencies detected for FB_IOMEM_HELPERS
  Depends on [n]: HAS_IOMEM [=y] && FB_CORE [=n]
  Selected by [m]:
  - DRM_XE_DISPLAY [=y] && HAS_IOMEM [=y] && DRM [=y] && DRM_XE [=m] && DRM_XE [=m]=m [=m]
#
# configuration written to .config
#
Value requested for CONFIG_HAVE_UID16 not in final .config
Requested value:  CONFIG_HAVE_UID16=y
Actual value:     

Value requested for CONFIG_UID16 not in final .config
Requested value:  CONFIG_UID16=y
Actual value:     

Value requested for CONFIG_X86_32 not in final .config
Requested value:  CONFIG_X86_32=y
Actual value:     

Value requested for CONFIG_OUTPUT_FORMAT not in final .config
Requested value:  CONFIG_OUTPUT_FORMAT="elf32-i386"
Actual value:     CONFIG_OUTPUT_FORMAT="elf64-x86-64"

Value requested for CONFIG_ARCH_MMAP_RND_BITS_MIN not in final .config
Requested value:  CONFIG_ARCH_MMAP_RND_BITS_MIN=8
Actual value:     CONFIG_ARCH_MMAP_RND_BITS_MIN=28

Value requested for CONFIG_ARCH_MMAP_RND_BITS_MAX not in final .config
Requested value:  CONFIG_ARCH_MMAP_RND_BITS_MAX=16
Actual value:     CONFIG_ARCH_MMAP_RND_BITS_MAX=32

Value requested for CONFIG_PGTABLE_LEVELS not in final .config
Requested value:  CONFIG_PGTABLE_LEVELS=2
Actual value:     CONFIG_PGTABLE_LEVELS=5

Value requested for CONFIG_X86_BIGSMP not in final .config
Requested value:  # CONFIG_X86_BIGSMP is not set
Actual value:     

Value requested for CONFIG_X86_INTEL_QUARK not in final .config
Requested value:  # CONFIG_X86_INTEL_QUARK is not set
Actual value:     

Value requested for CONFIG_X86_RDC321X not in final .config
Requested value:  # CONFIG_X86_RDC321X is not set
Actual value:     

Value requested for CONFIG_X86_32_NON_STANDARD not in final .config
Requested value:  # CONFIG_X86_32_NON_STANDARD is not set
Actual value:     

Value requested for CONFIG_X86_32_IRIS not in final .config
Requested value:  # CONFIG_X86_32_IRIS is not set
Actual value:     

Value requested for CONFIG_M486SX not in final .config
Requested value:  # CONFIG_M486SX is not set
Actual value:     

Value requested for CONFIG_M486 not in final .config
Requested value:  # CONFIG_M486 is not set
Actual value:     

Value requested for CONFIG_M586 not in final .config
Requested value:  # CONFIG_M586 is not set
Actual value:     

Value requested for CONFIG_M586TSC not in final .config
Requested value:  # CONFIG_M586TSC is not set
Actual value:     

Value requested for CONFIG_M586MMX not in final .config
Requested value:  # CONFIG_M586MMX is not set
Actual value:     

Value requested for CONFIG_M686 not in final .config
Requested value:  CONFIG_M686=y
Actual value:     

Value requested for CONFIG_MPENTIUMII not in final .config
Requested value:  # CONFIG_MPENTIUMII is not set
Actual value:     

Value requested for CONFIG_MPENTIUMIII not in final .config
Requested value:  # CONFIG_MPENTIUMIII is not set
Actual value:     

Value requested for CONFIG_MPENTIUMM not in final .config
Requested value:  # CONFIG_MPENTIUMM is not set
Actual value:     

Value requested for CONFIG_MPENTIUM4 not in final .config
Requested value:  # CONFIG_MPENTIUM4 is not set
Actual value:     

Value requested for CONFIG_MK6 not in final .config
Requested value:  # CONFIG_MK6 is not set
Actual value:     

Value requested for CONFIG_MK7 not in final .config
Requested value:  # CONFIG_MK7 is not set
Actual value:     

Value requested for CONFIG_MCRUSOE not in final .config
Requested value:  # CONFIG_MCRUSOE is not set
Actual value:     

Value requested for CONFIG_MEFFICEON not in final .config
Requested value:  # CONFIG_MEFFICEON is not set
Actual value:     

Value requested for CONFIG_MWINCHIPC6 not in final .config
Requested value:  # CONFIG_MWINCHIPC6 is not set
Actual value:     

Value requested for CONFIG_MWINCHIP3D not in final .config
Requested value:  # CONFIG_MWINCHIP3D is not set
Actual value:     

Value requested for CONFIG_MELAN not in final .config
Requested value:  # CONFIG_MELAN is not set
Actual value:     

Value requested for CONFIG_MGEODEGX1 not in final .config
Requested value:  # CONFIG_MGEODEGX1 is not set
Actual value:     

Value requested for CONFIG_MGEODE_LX not in final .config
Requested value:  # CONFIG_MGEODE_LX is not set
Actual value:     

Value requested for CONFIG_MCYRIXIII not in final .config
Requested value:  # CONFIG_MCYRIXIII is not set
Actual value:     

Value requested for CONFIG_MVIAC3_2 not in final .config
Requested value:  # CONFIG_MVIAC3_2 is not set
Actual value:     

Value requested for CONFIG_MVIAC7 not in final .config
Requested value:  # CONFIG_MVIAC7 is not set
Actual value:     

Value requested for CONFIG_X86_GENERIC not in final .config
Requested value:  # CONFIG_X86_GENERIC is not set
Actual value:     

Value requested for CONFIG_X86_INTERNODE_CACHE_SHIFT not in final .config
Requested value:  CONFIG_X86_INTERNODE_CACHE_SHIFT=5
Actual value:     CONFIG_X86_INTERNODE_CACHE_SHIFT=6

Value requested for CONFIG_X86_L1_CACHE_SHIFT not in final .config
Requested value:  CONFIG_X86_L1_CACHE_SHIFT=5
Actual value:     CONFIG_X86_L1_CACHE_SHIFT=6

Value requested for CONFIG_X86_USE_PPRO_CHECKSUM not in final .config
Requested value:  CONFIG_X86_USE_PPRO_CHECKSUM=y
Actual value:     

Value requested for CONFIG_X86_MINIMUM_CPU_FAMILY not in final .config
Requested value:  CONFIG_X86_MINIMUM_CPU_FAMILY=6
Actual value:     CONFIG_X86_MINIMUM_CPU_FAMILY=64

Value requested for CONFIG_CPU_SUP_TRANSMETA_32 not in final .config
Requested value:  CONFIG_CPU_SUP_TRANSMETA_32=y
Actual value:     

Value requested for CONFIG_CPU_SUP_VORTEX_32 not in final .config
Requested value:  CONFIG_CPU_SUP_VORTEX_32=y
Actual value:     

Value requested for CONFIG_HPET_TIMER not in final .config
Requested value:  # CONFIG_HPET_TIMER is not set
Actual value:     CONFIG_HPET_TIMER=y

Value requested for CONFIG_NR_CPUS_RANGE_END not in final .config
Requested value:  CONFIG_NR_CPUS_RANGE_END=8
Actual value:     CONFIG_NR_CPUS_RANGE_END=512

Value requested for CONFIG_NR_CPUS_DEFAULT not in final .config
Requested value:  CONFIG_NR_CPUS_DEFAULT=8
Actual value:     CONFIG_NR_CPUS_DEFAULT=64

Value requested for CONFIG_X86_ANCIENT_MCE not in final .config
Requested value:  # CONFIG_X86_ANCIENT_MCE is not set
Actual value:     

Value requested for CONFIG_X86_LEGACY_VM86 not in final .config
Requested value:  # CONFIG_X86_LEGACY_VM86 is not set
Actual value:     

Value requested for CONFIG_X86_ESPFIX32 not in final .config
Requested value:  CONFIG_X86_ESPFIX32=y
Actual value:     

Value requested for CONFIG_TOSHIBA not in final .config
Requested value:  # CONFIG_TOSHIBA is not set
Actual value:     

Value requested for CONFIG_X86_REBOOTFIXUPS not in final .config
Requested value:  # CONFIG_X86_REBOOTFIXUPS is not set
Actual value:     

Value requested for CONFIG_MICROCODE_INITRD32 not in final .config
Requested value:  CONFIG_MICROCODE_INITRD32=y
Actual value:     

Value requested for CONFIG_NOHIGHMEM not in final .config
Requested value:  # CONFIG_NOHIGHMEM is not set
Actual value:     

Value requested for CONFIG_HIGHMEM4G not in final .config
Requested value:  CONFIG_HIGHMEM4G=y
Actual value:     

Value requested for CONFIG_HIGHMEM64G not in final .config
Requested value:  # CONFIG_HIGHMEM64G is not set
Actual value:     

Value requested for CONFIG_VMSPLIT_3G not in final .config
Requested value:  CONFIG_VMSPLIT_3G=y
Actual value:     

Value requested for CONFIG_VMSPLIT_3G_OPT not in final .config
Requested value:  # CONFIG_VMSPLIT_3G_OPT is not set
Actual value:     

Value requested for CONFIG_VMSPLIT_2G not in final .config
Requested value:  # CONFIG_VMSPLIT_2G is not set
Actual value:     

Value requested for CONFIG_VMSPLIT_2G_OPT not in final .config
Requested value:  # CONFIG_VMSPLIT_2G_OPT is not set
Actual value:     

Value requested for CONFIG_VMSPLIT_1G not in final .config
Requested value:  # CONFIG_VMSPLIT_1G is not set
Actual value:     

Value requested for CONFIG_PAGE_OFFSET not in final .config
Requested value:  CONFIG_PAGE_OFFSET=0xC0000000
Actual value:     

Value requested for CONFIG_HIGHMEM not in final .config
Requested value:  CONFIG_HIGHMEM=y
Actual value:     

Value requested for CONFIG_X86_PAE not in final .config
Requested value:  # CONFIG_X86_PAE is not set
Actual value:     

Value requested for CONFIG_ARCH_FLATMEM_ENABLE not in final .config
Requested value:  CONFIG_ARCH_FLATMEM_ENABLE=y
Actual value:     

Value requested for CONFIG_ARCH_SELECT_MEMORY_MODEL not in final .config
Requested value:  CONFIG_ARCH_SELECT_MEMORY_MODEL=y
Actual value:     

Value requested for CONFIG_ILLEGAL_POINTER_VALUE not in final .config
Requested value:  CONFIG_ILLEGAL_POINTER_VALUE=0
Actual value:     CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000

Value requested for CONFIG_HIGHPTE not in final .config
Requested value:  # CONFIG_HIGHPTE is not set
Actual value:     

Value requested for CONFIG_COMPAT_VDSO not in final .config
Requested value:  # CONFIG_COMPAT_VDSO is not set
Actual value:     

Value requested for CONFIG_FUNCTION_PADDING_CFI not in final .config
Requested value:  CONFIG_FUNCTION_PADDING_CFI=0
Actual value:     CONFIG_FUNCTION_PADDING_CFI=11

Value requested for CONFIG_FUNCTION_PADDING_BYTES not in final .config
Requested value:  CONFIG_FUNCTION_PADDING_BYTES=4
Actual value:     CONFIG_FUNCTION_PADDING_BYTES=16

Value requested for CONFIG_APM not in final .config
Requested value:  # CONFIG_APM is not set
Actual value:     

Value requested for CONFIG_X86_POWERNOW_K6 not in final .config
Requested value:  # CONFIG_X86_POWERNOW_K6 is not set
Actual value:     

Value requested for CONFIG_X86_POWERNOW_K7 not in final .config
Requested value:  # CONFIG_X86_POWERNOW_K7 is not set
Actual value:     

Value requested for CONFIG_X86_GX_SUSPMOD not in final .config
Requested value:  # CONFIG_X86_GX_SUSPMOD is not set
Actual value:     

Value requested for CONFIG_X86_SPEEDSTEP_ICH not in final .config
Requested value:  # CONFIG_X86_SPEEDSTEP_ICH is not set
Actual value:     

Value requested for CONFIG_X86_SPEEDSTEP_SMI not in final .config
Requested value:  # CONFIG_X86_SPEEDSTEP_SMI is not set
Actual value:     

Value requested for CONFIG_X86_CPUFREQ_NFORCE2 not in final .config
Requested value:  # CONFIG_X86_CPUFREQ_NFORCE2 is not set
Actual value:     

Value requested for CONFIG_X86_LONGRUN not in final .config
Requested value:  # CONFIG_X86_LONGRUN is not set
Actual value:     

Value requested for CONFIG_X86_LONGHAUL not in final .config
Requested value:  # CONFIG_X86_LONGHAUL is not set
Actual value:     

Value requested for CONFIG_X86_E_POWERSAVER not in final .config
Requested value:  # CONFIG_X86_E_POWERSAVER is not set
Actual value:     

Value requested for CONFIG_PCI_GOBIOS not in final .config
Requested value:  # CONFIG_PCI_GOBIOS is not set
Actual value:     

Value requested for CONFIG_PCI_GOMMCONFIG not in final .config
Requested value:  # CONFIG_PCI_GOMMCONFIG is not set
Actual value:     

Value requested for CONFIG_PCI_GODIRECT not in final .config
Requested value:  # CONFIG_PCI_GODIRECT is not set
Actual value:     

Value requested for CONFIG_PCI_GOANY not in final .config
Requested value:  CONFIG_PCI_GOANY=y
Actual value:     

Value requested for CONFIG_PCI_BIOS not in final .config
Requested value:  CONFIG_PCI_BIOS=y
Actual value:     

Value requested for CONFIG_ISA not in final .config
Requested value:  # CONFIG_ISA is not set
Actual value:     

Value requested for CONFIG_SCx200 not in final .config
Requested value:  # CONFIG_SCx200 is not set
Actual value:     

Value requested for CONFIG_OLPC not in final .config
Requested value:  # CONFIG_OLPC is not set
Actual value:     

Value requested for CONFIG_ALIX not in final .config
Requested value:  # CONFIG_ALIX is not set
Actual value:     

Value requested for CONFIG_NET5501 not in final .config
Requested value:  # CONFIG_NET5501 is not set
Actual value:     

Value requested for CONFIG_GEOS not in final .config
Requested value:  # CONFIG_GEOS is not set
Actual value:     

Value requested for CONFIG_COMPAT_32 not in final .config
Requested value:  CONFIG_COMPAT_32=y
Actual value:     

Value requested for CONFIG_HAVE_ATOMIC_IOMAP not in final .config
Requested value:  CONFIG_HAVE_ATOMIC_IOMAP=y
Actual value:     

Value requested for CONFIG_ARCH_32BIT_OFF_T not in final .config
Requested value:  CONFIG_ARCH_32BIT_OFF_T=y
Actual value:     

Value requested for CONFIG_ARCH_WANT_IPC_PARSE_VERSION not in final .config
Requested value:  CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
Actual value:     

Value requested for CONFIG_MODULES_USE_ELF_REL not in final .config
Requested value:  CONFIG_MODULES_USE_ELF_REL=y
Actual value:     

Value requested for CONFIG_ARCH_MMAP_RND_BITS not in final .config
Requested value:  CONFIG_ARCH_MMAP_RND_BITS=8
Actual value:     CONFIG_ARCH_MMAP_RND_BITS=28

Value requested for CONFIG_CLONE_BACKWARDS not in final .config
Requested value:  CONFIG_CLONE_BACKWARDS=y
Actual value:     

Value requested for CONFIG_OLD_SIGSUSPEND3 not in final .config
Requested value:  CONFIG_OLD_SIGSUSPEND3=y
Actual value:     

Value requested for CONFIG_OLD_SIGACTION not in final .config
Requested value:  CONFIG_OLD_SIGACTION=y
Actual value:     

Value requested for CONFIG_ARCH_SPLIT_ARG64 not in final .config
Requested value:  CONFIG_ARCH_SPLIT_ARG64=y
Actual value:     

Value requested for CONFIG_FUNCTION_ALIGNMENT not in final .config
Requested value:  CONFIG_FUNCTION_ALIGNMENT=4
Actual value:     CONFIG_FUNCTION_ALIGNMENT=16

Value requested for CONFIG_SELECT_MEMORY_MODEL not in final .config
Requested value:  CONFIG_SELECT_MEMORY_MODEL=y
Actual value:     

Value requested for CONFIG_FLATMEM_MANUAL not in final .config
Requested value:  CONFIG_FLATMEM_MANUAL=y
Actual value:     

Value requested for CONFIG_SPARSEMEM_MANUAL not in final .config
Requested value:  # CONFIG_SPARSEMEM_MANUAL is not set
Actual value:     

Value requested for CONFIG_FLATMEM not in final .config
Requested value:  CONFIG_FLATMEM=y
Actual value:     

Value requested for CONFIG_SPARSEMEM_STATIC not in final .config
Requested value:  CONFIG_SPARSEMEM_STATIC=y
Actual value:     

Value requested for CONFIG_BOUNCE not in final .config
Requested value:  CONFIG_BOUNCE=y
Actual value:     

Value requested for CONFIG_KMAP_LOCAL not in final .config
Requested value:  CONFIG_KMAP_LOCAL=y
Actual value:     

Value requested for CONFIG_HOTPLUG_PCI_COMPAQ not in final .config
Requested value:  # CONFIG_HOTPLUG_PCI_COMPAQ is not set
Actual value:     

Value requested for CONFIG_HOTPLUG_PCI_IBM not in final .config
Requested value:  # CONFIG_HOTPLUG_PCI_IBM is not set
Actual value:     

Value requested for CONFIG_EFI_CAPSULE_QUIRK_QUARK_CSH not in final .config
Requested value:  CONFIG_EFI_CAPSULE_QUIRK_QUARK_CSH=y
Actual value:     

Value requested for CONFIG_PCH_PHUB not in final .config
Requested value:  # CONFIG_PCH_PHUB is not set
Actual value:     

Value requested for CONFIG_SCSI_NSP32 not in final .config
Requested value:  # CONFIG_SCSI_NSP32 is not set
Actual value:     

Value requested for CONFIG_PATA_CS5520 not in final .config
Requested value:  # CONFIG_PATA_CS5520 is not set
Actual value:     

Value requested for CONFIG_PATA_CS5530 not in final .config
Requested value:  # CONFIG_PATA_CS5530 is not set
Actual value:     

Value requested for CONFIG_PATA_CS5535 not in final .config
Requested value:  # CONFIG_PATA_CS5535 is not set
Actual value:     

Value requested for CONFIG_PATA_CS5536 not in final .config
Requested value:  # CONFIG_PATA_CS5536 is not set
Actual value:     

Value requested for CONFIG_PATA_SC1200 not in final .config
Requested value:  # CONFIG_PATA_SC1200 is not set
Actual value:     

Value requested for CONFIG_PCH_GBE not in final .config
Requested value:  # CONFIG_PCH_GBE is not set
Actual value:     

Value requested for CONFIG_INPUT_WISTRON_BTNS not in final .config
Requested value:  # CONFIG_INPUT_WISTRON_BTNS is not set
Actual value:     

Value requested for CONFIG_SERIAL_TIMBERDALE not in final .config
Requested value:  # CONFIG_SERIAL_TIMBERDALE is not set
Actual value:     

Value requested for CONFIG_SERIAL_PCH_UART not in final .config
Requested value:  # CONFIG_SERIAL_PCH_UART is not set
Actual value:     

Value requested for CONFIG_HW_RANDOM_GEODE not in final .config
Requested value:  CONFIG_HW_RANDOM_GEODE=y
Actual value:     

Value requested for CONFIG_SONYPI not in final .config
Requested value:  # CONFIG_SONYPI is not set
Actual value:     

Value requested for CONFIG_PC8736x_GPIO not in final .config
Requested value:  # CONFIG_PC8736x_GPIO is not set
Actual value:     

Value requested for CONFIG_NSC_GPIO not in final .config
Requested value:  # CONFIG_NSC_GPIO is not set
Actual value:     

Value requested for CONFIG_I2C_EG20T not in final .config
Requested value:  # CONFIG_I2C_EG20T is not set
Actual value:     

Value requested for CONFIG_SCx200_ACB not in final .config
Requested value:  # CONFIG_SCx200_ACB is not set
Actual value:     

Value requested for CONFIG_PTP_1588_CLOCK_PCH not in final .config
Requested value:  # CONFIG_PTP_1588_CLOCK_PCH is not set
Actual value:     

Value requested for CONFIG_SBC8360_WDT not in final .config
Requested value:  # CONFIG_SBC8360_WDT is not set
Actual value:     

Value requested for CONFIG_SBC7240_WDT not in final .config
Requested value:  # CONFIG_SBC7240_WDT is not set
Actual value:     

Value requested for CONFIG_MFD_CS5535 not in final .config
Requested value:  # CONFIG_MFD_CS5535 is not set
Actual value:     

Value requested for CONFIG_AGP_ALI not in final .config
Requested value:  # CONFIG_AGP_ALI is not set
Actual value:     

Value requested for CONFIG_AGP_ATI not in final .config
Requested value:  # CONFIG_AGP_ATI is not set
Actual value:     

Value requested for CONFIG_AGP_AMD not in final .config
Requested value:  # CONFIG_AGP_AMD is not set
Actual value:     

Value requested for CONFIG_AGP_NVIDIA not in final .config
Requested value:  # CONFIG_AGP_NVIDIA is not set
Actual value:     

Value requested for CONFIG_AGP_SWORKS not in final .config
Requested value:  # CONFIG_AGP_SWORKS is not set
Actual value:     

Value requested for CONFIG_AGP_EFFICEON not in final .config
Requested value:  # CONFIG_AGP_EFFICEON is not set
Actual value:     

Value requested for CONFIG_SND_PCM not in final .config
Requested value:  CONFIG_SND_PCM=y
Actual value:     CONFIG_SND_PCM=m

Value requested for CONFIG_SND_HWDEP not in final .config
Requested value:  CONFIG_SND_HWDEP=y
Actual value:     CONFIG_SND_HWDEP=m

Value requested for CONFIG_SND_DYNAMIC_MINORS not in final .config
Requested value:  # CONFIG_SND_DYNAMIC_MINORS is not set
Actual value:     CONFIG_SND_DYNAMIC_MINORS=y

Value requested for CONFIG_SND_CS5530 not in final .config
Requested value:  # CONFIG_SND_CS5530 is not set
Actual value:     

Value requested for CONFIG_SND_CS5535AUDIO not in final .config
Requested value:  # CONFIG_SND_CS5535AUDIO is not set
Actual value:     

Value requested for CONFIG_SND_SIS7019 not in final .config
Requested value:  # CONFIG_SND_SIS7019 is not set
Actual value:     

Value requested for CONFIG_SND_HDA not in final .config
Requested value:  CONFIG_SND_HDA=y
Actual value:     CONFIG_SND_HDA=m

Value requested for CONFIG_SND_HDA_CORE not in final .config
Requested value:  CONFIG_SND_HDA_CORE=y
Actual value:     CONFIG_SND_HDA_CORE=m

Value requested for CONFIG_SND_INTEL_DSP_CONFIG not in final .config
Requested value:  CONFIG_SND_INTEL_DSP_CONFIG=y
Actual value:     CONFIG_SND_INTEL_DSP_CONFIG=m

Value requested for CONFIG_SND_INTEL_SOUNDWIRE_ACPI not in final .config
Requested value:  CONFIG_SND_INTEL_SOUNDWIRE_ACPI=y
Actual value:     CONFIG_SND_INTEL_SOUNDWIRE_ACPI=m

Value requested for CONFIG_LEDS_OT200 not in final .config
Requested value:  # CONFIG_LEDS_OT200 is not set
Actual value:     

Value requested for CONFIG_PCH_DMA not in final .config
Requested value:  # CONFIG_PCH_DMA is not set
Actual value:     

Value requested for CONFIG_CLKSRC_I8253 not in final .config
Requested value:  CONFIG_CLKSRC_I8253=y
Actual value:     

Value requested for CONFIG_MAILBOX not in final .config
Requested value:  # CONFIG_MAILBOX is not set
Actual value:     CONFIG_MAILBOX=y

Value requested for CONFIG_CRYPTO_SERPENT_SSE2_586 not in final .config
Requested value:  # CONFIG_CRYPTO_SERPENT_SSE2_586 is not set
Actual value:     

Value requested for CONFIG_CRYPTO_TWOFISH_586 not in final .config
Requested value:  # CONFIG_CRYPTO_TWOFISH_586 is not set
Actual value:     

Value requested for CONFIG_CRYPTO_DEV_GEODE not in final .config
Requested value:  # CONFIG_CRYPTO_DEV_GEODE is not set
Actual value:     

Value requested for CONFIG_CRYPTO_DEV_HIFN_795X not in final .config
Requested value:  # CONFIG_CRYPTO_DEV_HIFN_795X is not set
Actual value:     

Value requested for CONFIG_CRYPTO_LIB_POLY1305_RSIZE not in final .config
Requested value:  CONFIG_CRYPTO_LIB_POLY1305_RSIZE=1
Actual value:     CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11

Value requested for CONFIG_AUDIT_GENERIC not in final .config
Requested value:  CONFIG_AUDIT_GENERIC=y
Actual value:     

Value requested for CONFIG_GENERIC_VDSO_32 not in final .config
Requested value:  CONFIG_GENERIC_VDSO_32=y
Actual value:     

Value requested for CONFIG_DEBUG_KMAP_LOCAL not in final .config
Requested value:  # CONFIG_DEBUG_KMAP_LOCAL is not set
Actual value:     

Value requested for CONFIG_DEBUG_HIGHMEM not in final .config
Requested value:  # CONFIG_DEBUG_HIGHMEM is not set
Actual value:     

Value requested for CONFIG_HAVE_DEBUG_STACKOVERFLOW not in final .config
Requested value:  CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
Actual value:     

Value requested for CONFIG_DEBUG_STACKOVERFLOW not in final .config
Requested value:  # CONFIG_DEBUG_STACKOVERFLOW is not set
Actual value:     

Value requested for CONFIG_HAVE_FUNCTION_GRAPH_TRACER not in final .config
Requested value:  CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
Actual value:     

Value requested for CONFIG_HAVE_FUNCTION_GRAPH_RETVAL not in final .config
Requested value:  CONFIG_HAVE_FUNCTION_GRAPH_RETVAL=y
Actual value:     

Value requested for CONFIG_DRM_KUNIT_TEST not in final .config
Requested value:  CONFIG_DRM_KUNIT_TEST=m
Actual value:     

Value requested for CONFIG_DRM_XE_WERROR not in final .config
Requested value:  CONFIG_DRM_XE_WERROR=y
Actual value:     

Value requested for CONFIG_DRM_XE_DEBUG not in final .config
Requested value:  CONFIG_DRM_XE_DEBUG=y
Actual value:     

Value requested for CONFIG_DRM_XE_DEBUG_MEM not in final .config
Requested value:  CONFIG_DRM_XE_DEBUG_MEM=y
Actual value:     

Value requested for CONFIG_DRM_XE_KUNIT_TEST not in final .config
Requested value:  CONFIG_DRM_XE_KUNIT_TEST=m
Actual value:     

++ nproc
+ make -j48 ARCH=i386 olddefconfig
  GEN     Makefile

WARNING: unmet direct dependencies detected for FB_IOMEM_HELPERS
  Depends on [n]: HAS_IOMEM [=y] && FB_CORE [=n]
  Selected by [m]:
  - DRM_XE_DISPLAY [=y] && HAS_IOMEM [=y] && DRM [=y] && DRM_XE [=m] && DRM_XE [=m]=m [=m]
#
# configuration written to .config
#
++ nproc
+ make -j48 ARCH=i386
  SYNC    include/config/auto.conf.cmd
  GEN     Makefile

WARNING: unmet direct dependencies detected for FB_IOMEM_HELPERS
  Depends on [n]: HAS_IOMEM [=y] && FB_CORE [=n]
  Selected by [m]:
  - DRM_XE_DISPLAY [=y] && HAS_IOMEM [=y] && DRM [=y] && DRM_XE [=m] && DRM_XE [=m]=m [=m]

WARNING: unmet direct dependencies detected for FB_IOMEM_HELPERS
  Depends on [n]: HAS_IOMEM [=y] && FB_CORE [=n]
  Selected by [m]:
  - DRM_XE_DISPLAY [=y] && HAS_IOMEM [=y] && DRM [=y] && DRM_XE [=m] && DRM_XE [=m]=m [=m]

WARNING: unmet direct dependencies detected for FB_IOMEM_HELPERS
  Depends on [n]: HAS_IOMEM [=y] && FB_CORE [=n]
  Selected by [m]:
  - DRM_XE_DISPLAY [=y] && HAS_IOMEM [=y] && DRM [=y] && DRM_XE [=m] && DRM_XE [=m]=m [=m]
  GEN     Makefile
  UPD     include/generated/uapi/linux/version.h
  WRAP    arch/x86/include/generated/uapi/asm/bpf_perf_event.h
  WRAP    arch/x86/include/generated/uapi/asm/errno.h
  WRAP    arch/x86/include/generated/uapi/asm/fcntl.h
  WRAP    arch/x86/include/generated/uapi/asm/ioctl.h
  WRAP    arch/x86/include/generated/uapi/asm/ioctls.h
  WRAP    arch/x86/include/generated/uapi/asm/ipcbuf.h
  WRAP    arch/x86/include/generated/uapi/asm/param.h
  WRAP    arch/x86/include/generated/uapi/asm/poll.h
  WRAP    arch/x86/include/generated/uapi/asm/resource.h
  WRAP    arch/x86/include/generated/uapi/asm/socket.h
  WRAP    arch/x86/include/generated/uapi/asm/sockios.h
  WRAP    arch/x86/include/generated/uapi/asm/termbits.h
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_32.h
  WRAP    arch/x86/include/generated/uapi/asm/termios.h
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_64.h
  WRAP    arch/x86/include/generated/uapi/asm/types.h
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_x32.h
  SYSTBL  arch/x86/include/generated/asm/syscalls_32.h
  UPD     include/generated/compile.h
  WRAP    arch/x86/include/generated/asm/early_ioremap.h
  HOSTCC  arch/x86/tools/relocs_32.o
  WRAP    arch/x86/include/generated/asm/mcs_spinlock.h
  HOSTCC  arch/x86/tools/relocs_64.o
  WRAP    arch/x86/include/generated/asm/irq_regs.h
  WRAP    arch/x86/include/generated/asm/kmap_size.h
  HOSTCC  arch/x86/tools/relocs_common.o
  WRAP    arch/x86/include/generated/asm/local64.h
  WRAP    arch/x86/include/generated/asm/mmiowb.h
  WRAP    arch/x86/include/generated/asm/module.lds.h
  WRAP    arch/x86/include/generated/asm/rwonce.h
  WRAP    arch/x86/include/generated/asm/unaligned.h
  HOSTCC  scripts/kallsyms
  HOSTCC  scripts/sorttable
  HOSTCC  scripts/asn1_compiler
  HOSTCC  scripts/selinux/genheaders/genheaders
  HOSTCC  scripts/selinux/mdp/mdp
  HOSTLD  arch/x86/tools/relocs
  UPD     include/config/kernel.release
  UPD     include/generated/utsrelease.h
  CC      scripts/mod/empty.o
  HOSTCC  scripts/mod/mk_elfconfig
  CC      scripts/mod/devicetable-offsets.s
  UPD     scripts/mod/devicetable-offsets.h
  MKELF   scripts/mod/elfconfig.h
  HOSTCC  scripts/mod/modpost.o
  HOSTCC  scripts/mod/file2alias.o
  HOSTCC  scripts/mod/sumversion.o
  HOSTCC  scripts/mod/symsearch.o
  HOSTLD  scripts/mod/modpost
  CC      kernel/bounds.s
  CHKSHA1 /workspace/kernel/include/linux/atomic/atomic-arch-fallback.h
  CHKSHA1 /workspace/kernel/include/linux/atomic/atomic-instrumented.h
  CHKSHA1 /workspace/kernel/include/linux/atomic/atomic-long.h
  UPD     include/generated/timeconst.h
  UPD     include/generated/bounds.h
  CC      arch/x86/kernel/asm-offsets.s
  UPD     include/generated/asm-offsets.h
  CALL    /workspace/kernel/scripts/checksyscalls.sh
  LDS     scripts/module.lds
  CC      ipc/util.o
  CC      ipc/msgutil.o
  CC      ipc/msg.o
  CC      ipc/sem.o
  HOSTCC  usr/gen_init_cpio
  CC      ipc/shm.o
  CC      ipc/syscall.o
  CC      certs/system_keyring.o
  CC      init/main.o
  CC      ipc/ipc_sysctl.o
  CC      ipc/mqueue.o
  CC      security/commoncap.o
  CC      security/lsm_syscalls.o
  CC      io_uring/io_uring.o
  UPD     init/utsversion-tmp.h
  CC      ipc/namespace.o
  AS      arch/x86/lib/atomic64_cx8_32.o
  CC      security/min_addr.o
  CC      ipc/mq_sysctl.o
  CC      arch/x86/video/video-common.o
  CC      block/bdev.o
  CC      arch/x86/pci/i386.o
  CC      arch/x86/power/cpu.o
  AS      arch/x86/lib/checksum_32.o
  CC      init/do_mounts.o
  CC      io_uring/opdef.o
  CC      mm/filemap.o
  GEN     security/selinux/flask.h security/selinux/av_permissions.h
  CC      arch/x86/realmode/init.o
  CC      security/integrity/iint.o
  AR      virt/lib/built-in.a
  CC      block/partitions/core.o
  CC      security/keys/gc.o
  AR      arch/x86/crypto/built-in.a
  CC      net/core/sock.o
  CC      lib/math/div64.o
  AR      drivers/cache/built-in.a
  AS      arch/x86/realmode/rm/header.o
  CC      security/selinux/avc.o
  AR      virt/built-in.a
  CC      sound/core/seq/seq.o
  CC      fs/notify/dnotify/dnotify.o
  AR      sound/isa/ad1816a/built-in.a
  CC      arch/x86/mm/pat/set_memory.o
  AR      sound/i2c/other/built-in.a
  AR      sound/drivers/opl3/built-in.a
  CC      arch/x86/kernel/fpu/init.o
  CC      arch/x86/mm/init.o
  CC      arch/x86/events/amd/core.o
  CC      arch/x86/lib/cmdline.o
  AR      sound/i2c/built-in.a
  AS      arch/x86/lib/cmpxchg8b_emu.o
  AR      sound/isa/ad1848/built-in.a
  AS      arch/x86/realmode/rm/trampoline_32.o
  AR      sound/drivers/opl4/built-in.a
  AR      arch/x86/platform/atom/built-in.a
  CC      arch/x86/entry/vdso/vma.o
  AR      drivers/irqchip/built-in.a
  AR      arch/x86/platform/ce4100/built-in.a
  CC      arch/x86/kernel/fpu/bugs.o
  AR      sound/isa/cs423x/built-in.a
  CC      arch/x86/pci/init.o
  AR      sound/drivers/mpu401/built-in.a
  AS      arch/x86/realmode/rm/stack.o
  CC      kernel/sched/core.o
  CC      arch/x86/platform/efi/memmap.o
  AR      sound/isa/es1688/built-in.a
  AR      drivers/bus/mhi/built-in.a
  AR      sound/drivers/vx/built-in.a
  AR      drivers/bus/built-in.a
  AR      sound/isa/galaxy/built-in.a
  AS      arch/x86/realmode/rm/reboot.o
  CC      crypto/asymmetric_keys/asymmetric_type.o
  AR      sound/drivers/pcsp/built-in.a
  AR      sound/drivers/built-in.a
  AS      arch/x86/realmode/rm/wakeup_asm.o
  AR      sound/isa/gus/built-in.a
  AR      drivers/pwm/built-in.a
  CC      lib/math/gcd.o
  CC      arch/x86/lib/cpu.o
  AR      sound/isa/msnd/built-in.a
  CC      security/security.o
  CC      security/lsm_audit.o
  AR      sound/isa/opti9xx/built-in.a
  CC      arch/x86/realmode/rm/wakemain.o
  CC      drivers/pci/msi/pcidev_msi.o
  AR      sound/isa/sb/built-in.a
  AR      sound/isa/wavefront/built-in.a
  AR      sound/isa/wss/built-in.a
  CC      lib/math/lcm.o
  AR      sound/isa/built-in.a
  HOSTCC  certs/extract-cert
  CC      arch/x86/realmode/rm/video-mode.o
  CC      lib/math/int_log.o
  GEN     usr/initramfs_data.cpio
  COPY    usr/initramfs_inc_data
  AS      usr/initramfs_data.o
  CC      lib/math/int_pow.o
  CC      drivers/pci/msi/api.o
  AR      usr/built-in.a
  CC      arch/x86/kernel/fpu/core.o
  AR      arch/x86/platform/geode/built-in.a
  AR      sound/pci/ac97/built-in.a
  AS      arch/x86/realmode/rm/copy.o
  AR      sound/ppc/built-in.a
  CC      lib/math/int_sqrt.o
  AR      sound/pci/ali5451/built-in.a
  AS      arch/x86/realmode/rm/bioscall.o
  AR      sound/pci/asihpi/built-in.a
  AR      sound/arm/built-in.a
  AR      sound/pci/au88x0/built-in.a
  CC      arch/x86/realmode/rm/regs.o
  AR      sound/pci/aw2/built-in.a
  AR      sound/sh/built-in.a
  AR      sound/pci/ctxfi/built-in.a
  CC      fs/nfs_common/nfsacl.o
  CC      arch/x86/kernel/fpu/regset.o
  AR      sound/pci/ca0106/built-in.a
  CC      lib/math/reciprocal_div.o
  CC      arch/x86/realmode/rm/video-vga.o
  AR      sound/pci/cs46xx/built-in.a
  CERT    certs/x509_certificate_list
  CC      arch/x86/lib/delay.o
  CERT    certs/signing_key.x509
  AR      sound/pci/cs5535audio/built-in.a
  AS      certs/system_certificates.o
  AR      sound/pci/lola/built-in.a
  AR      sound/pci/lx6464es/built-in.a
  CC      sound/core/seq/seq_lock.o
  CC      fs/nfs_common/grace.o
  AR      sound/pci/echoaudio/built-in.a
  AR      certs/built-in.a
  CC      block/fops.o
  CC      sound/core/seq/seq_clientmgr.o
  CC      lib/math/rational.o
  AR      sound/pci/emu10k1/built-in.a
  AR      arch/x86/video/built-in.a
  AS      arch/x86/lib/getuser.o
  CC      arch/x86/realmode/rm/video-vesa.o
  AR      sound/pci/hda/built-in.a
  CC [M]  sound/pci/hda/hda_bind.o
  AR      sound/pci/ice1712/built-in.a
  CC      security/device_cgroup.o
  AR      sound/pci/korg1212/built-in.a
  CC      sound/core/seq/seq_memory.o
  CC      fs/iomap/trace.o
  CC      arch/x86/pci/pcbios.o
  CC      sound/core/seq/seq_queue.o
  CC      drivers/video/console/dummycon.o
  CC      fs/quota/dquot.o
  CC      arch/x86/realmode/rm/video-bios.o
  CC      security/integrity/integrity_audit.o
  CC      arch/x86/entry/vdso/extable.o
  AR      fs/notify/dnotify/built-in.a
  CC      security/keys/key.o
  CC      crypto/asymmetric_keys/restrict.o
  CC      fs/proc/task_mmu.o
  CC      fs/notify/inotify/inotify_fsnotify.o
  CC      security/keys/keyring.o
  CC      block/partitions/msdos.o
  GEN     arch/x86/lib/inat-tables.c
  PASYMS  arch/x86/realmode/rm/pasyms.h
  CC      arch/x86/platform/efi/quirks.o
  CC      arch/x86/power/hibernate_32.o
  LDS     arch/x86/realmode/rm/realmode.lds
  LD      arch/x86/realmode/rm/realmode.elf
  RELOCS  arch/x86/realmode/rm/realmode.relocs
  OBJCOPY arch/x86/realmode/rm/realmode.bin
  AS      arch/x86/realmode/rmpiggy.o
  AR      arch/x86/realmode/built-in.a
  CC      arch/x86/lib/insn-eval.o
  CC      fs/notify/inotify/inotify_user.o
  CC      drivers/pci/msi/msi.o
  CC      sound/core/seq/seq_fifo.o
  AR      lib/math/built-in.a
  CC      lib/zlib_inflate/inffast.o
  CC      lib/crypto/mpi/generic_mpih-lshift.o
  CC      lib/crypto/memneq.o
  CC      arch/x86/mm/pat/memtype.o
  CC      block/bio.o
  CC      init/do_mounts_initrd.o
  CC      init/initramfs.o
  CC      security/selinux/hooks.o
  CC      arch/x86/events/amd/lbr.o
  CC      security/selinux/selinuxfs.o
  CC      lib/zlib_inflate/inflate.o
  CC      crypto/asymmetric_keys/signature.o
  CC      drivers/video/console/vgacon.o
  CC      lib/crypto/mpi/generic_mpih-mul1.o
  AR      fs/nfs_common/built-in.a
  AR      drivers/idle/built-in.a
  CC      block/elevator.o
  CC      security/selinux/netlink.o
  CC      arch/x86/pci/mmconfig_32.o
  CC      lib/zlib_deflate/deflate.o
  CC [M]  sound/pci/hda/hda_codec.o
  CC      arch/x86/pci/direct.o
  CC      kernel/locking/mutex.o
  CC      init/calibrate.o
  AR      security/integrity/built-in.a
  CC      init/init_task.o
  CC      block/blk-core.o
  CC      lib/zlib_inflate/infutil.o
  AS      arch/x86/power/hibernate_asm_32.o
  AR      drivers/char/ipmi/built-in.a
  CC      sound/core/seq/seq_prioq.o
  CC      arch/x86/power/hibernate.o
  LDS     arch/x86/entry/vdso/vdso32/vdso32.lds
  AR      ipc/built-in.a
  AS      arch/x86/entry/vdso/vdso32/note.o
  CC [M]  sound/pci/hda/hda_jack.o
  CC      net/ethernet/eth.o
  AS      arch/x86/entry/vdso/vdso32/system_call.o
  CC      kernel/sched/fair.o
  CC      sound/core/seq/seq_timer.o
  CC      arch/x86/kernel/fpu/signal.o
  AS      arch/x86/entry/vdso/vdso32/sigreturn.o
  CC      arch/x86/kernel/fpu/xstate.o
  CC      block/partitions/efi.o
  CC      arch/x86/entry/vdso/vdso32/vclock_gettime.o
  CC [M]  sound/pci/hda/hda_auto_parser.o
  CC      crypto/asymmetric_keys/public_key.o
  CC      arch/x86/platform/efi/efi.o
  CC      block/blk-sysfs.o
  CC      drivers/pci/msi/irqdomain.o
  CC      arch/x86/lib/insn.o
  CC      lib/crypto/utils.o
  AR      fs/notify/inotify/built-in.a
  CC      lib/crypto/chacha.o
  CC      fs/notify/fsnotify.o
  AR      fs/notify/fanotify/built-in.a
  CC      lib/zlib_inflate/inftrees.o
  CC      init/version.o
  CC      lib/crypto/mpi/generic_mpih-mul2.o
  CC      fs/iomap/iter.o
  CC      arch/x86/mm/pat/memtype_interval.o
  CC      arch/x86/entry/vdso/vdso32/vgetcpu.o
  CC      security/selinux/nlmsgtab.o
  CC      lib/zlib_inflate/inflate_syms.o
  CC      kernel/sched/build_policy.o
  CC      security/keys/keyctl.o
  CC      security/keys/permission.o
  CC      arch/x86/lib/kaslr.o
  CC      arch/x86/events/amd/ibs.o
  CC      fs/kernfs/mount.o
  CC      arch/x86/pci/mmconfig-shared.o
  CC      arch/x86/lib/memcpy_32.o
  CC      fs/sysfs/file.o
  AR      init/built-in.a
  CC      mm/mempool.o
  CC      fs/sysfs/dir.o
  CC      arch/x86/pci/fixup.o
  CC      lib/zlib_deflate/deftree.o
  AR      sound/synth/emux/built-in.a
  AR      sound/synth/built-in.a
  AR      drivers/video/console/built-in.a
  AR      sound/usb/misc/built-in.a
  CC      drivers/video/backlight/backlight.o
  AR      sound/usb/usx2y/built-in.a
  AR      sound/usb/caiaq/built-in.a
  AR      sound/usb/6fire/built-in.a
  AR      sound/usb/hiface/built-in.a
  CC      sound/core/seq/seq_system.o
  AS      arch/x86/lib/memmove_32.o
  AR      arch/x86/power/built-in.a
  AR      sound/usb/bcd2000/built-in.a
  AR      sound/usb/built-in.a
  AR      sound/firewire/built-in.a
  CC      arch/x86/lib/misc.o
  ASN.1   crypto/asymmetric_keys/x509.asn1.[ch]
  ASN.1   crypto/asymmetric_keys/x509_akid.asn1.[ch]
  CC      mm/oom_kill.o
  HOSTCC  arch/x86/entry/vdso/vdso2c
  CC      crypto/asymmetric_keys/x509_loader.o
  CC      crypto/asymmetric_keys/x509_public_key.o
  AR      lib/zlib_inflate/built-in.a
  CC      fs/sysfs/symlink.o
  CC      arch/x86/lib/pc-conf-reg.o
  CC      fs/proc/inode.o
  CC      fs/devpts/inode.o
  AR      drivers/pci/msi/built-in.a
  CC      lib/crypto/mpi/generic_mpih-mul3.o
  CC      fs/proc/root.o
  CC      drivers/pci/pcie/portdrv.o
  AR      arch/x86/mm/pat/built-in.a
  CC      arch/x86/mm/init_32.o
  CC      kernel/locking/semaphore.o
  AS      arch/x86/lib/putuser.o
  CC      kernel/locking/rwsem.o
  CC      drivers/pci/pcie/rcec.o
  AR      block/partitions/built-in.a
  AS      arch/x86/lib/retpoline.o
  CC      fs/notify/notification.o
  CC      drivers/pci/pcie/aspm.o
  CC      arch/x86/lib/string_32.o
  ASN.1   crypto/asymmetric_keys/pkcs7.asn1.[ch]
  CC      fs/proc/base.o
  CC      arch/x86/platform/efi/efi_32.o
  AS      arch/x86/platform/efi/efi_stub_32.o
  CC      block/blk-flush.o
  CC      fs/quota/quota_v2.o
  CC      block/blk-settings.o
  CC      arch/x86/platform/efi/runtime-map.o
  CC      fs/iomap/buffered-io.o
  CC      arch/x86/entry/vdso/vdso32-setup.o
  CC      block/blk-ioc.o
  CC      arch/x86/lib/strstr_32.o
  CC      kernel/locking/percpu-rwsem.o
  CC      lib/zlib_deflate/deflate_syms.o
  CC      arch/x86/lib/usercopy.o
  AR      arch/x86/kernel/fpu/built-in.a
  AR      net/ethernet/built-in.a
  CC      arch/x86/kernel/cpu/mce/core.o
  CC      arch/x86/kernel/acpi/boot.o
  CC      arch/x86/events/intel/core.o
  CC      sound/core/seq/seq_ports.o
  CC      arch/x86/kernel/acpi/sleep.o
  CC      arch/x86/events/intel/bts.o
  CC      fs/kernfs/inode.o
  CC      arch/x86/events/intel/ds.o
  CC      crypto/asymmetric_keys/pkcs7_trust.o
  CC      mm/fadvise.o
  CC      arch/x86/mm/fault.o
  VDSO    arch/x86/entry/vdso/vdso32.so.dbg
  CC      net/core/request_sock.o
  OBJCOPY arch/x86/entry/vdso/vdso32.so
  VDSO2C  arch/x86/entry/vdso/vdso-image-32.c
  CC      arch/x86/entry/vdso/vdso-image-32.o
  CC      fs/sysfs/mount.o
  CC      arch/x86/lib/usercopy_32.o
  AR      drivers/video/backlight/built-in.a
  CC      arch/x86/pci/acpi.o
  AR      drivers/video/fbdev/core/built-in.a
  CC      security/keys/process_keys.o
  AR      lib/zlib_deflate/built-in.a
  AR      drivers/video/fbdev/omap/built-in.a
  CC      lib/crypto/mpi/generic_mpih-rshift.o
  CC      mm/maccess.o
  AR      drivers/video/fbdev/omap2/omapfb/dss/built-in.a
  CC      arch/x86/pci/legacy.o
  AR      drivers/video/fbdev/omap2/omapfb/displays/built-in.a
  AR      drivers/video/fbdev/omap2/omapfb/built-in.a
  AR      drivers/video/fbdev/omap2/built-in.a
  CC      arch/x86/lib/msr-smp.o
  AR      drivers/video/fbdev/built-in.a
  AR      fs/devpts/built-in.a
  CC      kernel/sched/build_utility.o
  CC      fs/notify/group.o
  CC      drivers/video/aperture.o
  CC      fs/notify/mark.o
  CC      arch/x86/events/amd/uncore.o
  CC      fs/notify/fdinfo.o
  CC      crypto/asymmetric_keys/pkcs7_verify.o
  AS      arch/x86/kernel/acpi/wakeup_32.o
  CC [M]  sound/pci/hda/hda_sysfs.o
  CC      io_uring/kbuf.o
  AR      arch/x86/entry/vdso/built-in.a
  AR      arch/x86/entry/vsyscall/built-in.a
  CC      fs/netfs/buffered_read.o
  CC      fs/quota/quota_tree.o
  AS      arch/x86/entry/entry.o
  CC [M]  sound/pci/hda/hda_controller.o
  CC      block/blk-map.o
  AS      arch/x86/entry/entry_32.o
  CC      kernel/locking/spinlock.o
  AR      arch/x86/platform/efi/built-in.a
  CC      arch/x86/entry/syscall_32.o
  AR      arch/x86/platform/iris/built-in.a
  CC      arch/x86/platform/intel/iosf_mbi.o
  CC      arch/x86/entry/common.o
  CC      sound/core/sound.o
  CC      arch/x86/lib/cache-smp.o
  CC      drivers/pci/pcie/pme.o
  CC      arch/x86/kernel/acpi/cstate.o
  CC      arch/x86/mm/ioremap.o
  CC      sound/core/seq/seq_info.o
  CC      sound/core/seq/seq_dummy.o
  CC      fs/kernfs/dir.o
  CC      arch/x86/lib/msr.o
  CC      arch/x86/events/intel/knc.o
  AS      arch/x86/entry/thunk.o
  CC      lib/crypto/mpi/generic_mpih-sub1.o
  CC      crypto/asymmetric_keys/x509.asn1.o
  CC      kernel/locking/osq_lock.o
  CC      drivers/acpi/acpica/dsargs.o
  CC      fs/netfs/buffered_write.o
  AR      drivers/acpi/pmic/built-in.a
  CC      crypto/asymmetric_keys/x509_akid.asn1.o
  CC      crypto/asymmetric_keys/x509_cert_parser.o
  CC      crypto/asymmetric_keys/pkcs7.asn1.o
  CC [M]  sound/pci/hda/hda_proc.o
  CC      mm/page-writeback.o
  CC      arch/x86/events/intel/lbr.o
  CC      drivers/acpi/dptf/int340x_thermal.o
  CC      fs/sysfs/group.o
  CC      arch/x86/pci/irq.o
  CC [M]  sound/pci/hda/hda_hwdep.o
  CC      arch/x86/kernel/cpu/mtrr/mtrr.o
  AR      arch/x86/net/built-in.a
  CC      fs/netfs/direct_read.o
  CC      kernel/locking/qspinlock.o
  CC      net/core/skbuff.o
  CC      drivers/video/cmdline.o
  CC      kernel/locking/rtmutex_api.o
  AR      arch/x86/kernel/acpi/built-in.a
  CC      fs/ext4/balloc.o
  CC      arch/x86/kernel/apic/apic.o
  CC      arch/x86/kernel/kprobes/core.o
  CC      drivers/acpi/acpica/dscontrol.o
  AR      sound/core/seq/built-in.a
  CC      fs/ext4/bitmap.o
  CC      sound/core/init.o
  CC      fs/quota/quota.o
  AR      arch/x86/platform/intel/built-in.a
  AR      fs/notify/built-in.a
  CC      fs/quota/kqid.o
  CC      security/keys/request_key.o
  AR      arch/x86/platform/intel-mid/built-in.a
  AR      arch/x86/platform/intel-quark/built-in.a
  AR      arch/x86/platform/olpc/built-in.a
  CC      fs/quota/netlink.o
  AR      arch/x86/platform/scx200/built-in.a
  AR      arch/x86/platform/ts5500/built-in.a
  AR      drivers/pci/pcie/built-in.a
  CC      lib/crypto/mpi/generic_mpih-add1.o
  AR      drivers/acpi/dptf/built-in.a
  CC      lib/crypto/mpi/ec.o
  AR      drivers/pci/pwrctl/built-in.a
  AR      arch/x86/platform/uv/built-in.a
  CC      crypto/asymmetric_keys/pkcs7_parser.o
  AR      arch/x86/platform/built-in.a
  AR      arch/x86/events/amd/built-in.a
  CC      drivers/pci/hotplug/pci_hotplug_core.o
  CC      lib/crypto/mpi/mpicoder.o
  CC      block/blk-merge.o
  CC      fs/proc/generic.o
  CC      arch/x86/mm/extable.o
  CC      io_uring/rsrc.o
  CC      fs/ext4/block_validity.o
  AR      sound/pci/mixart/built-in.a
  CC      arch/x86/kernel/cpu/mce/severity.o
  AR      fs/sysfs/built-in.a
  CC      fs/kernfs/file.o
  CC      kernel/power/qos.o
  CC      fs/proc/array.o
  CC      drivers/acpi/acpica/dsdebug.o
  AR      sound/pci/nm256/built-in.a
  AS      arch/x86/lib/msr-reg.o
  CC      fs/iomap/direct-io.o
  CC      fs/proc/fd.o
  CC      arch/x86/kernel/cpu/mtrr/if.o
  CC      arch/x86/lib/msr-reg-export.o
  CC      security/selinux/netif.o
  AR      arch/x86/entry/built-in.a
  CC      crypto/api.o
  CC      fs/jbd2/transaction.o
  CC      crypto/cipher.o
  CC      arch/x86/kernel/cpu/mtrr/generic.o
  CC      drivers/video/nomodeset.o
  CC      fs/jbd2/commit.o
  CC      fs/proc/proc_tty.o
  AS      arch/x86/lib/hweight.o
  CC      arch/x86/events/zhaoxin/core.o
  CC      arch/x86/lib/iomem.o
  CC      fs/netfs/direct_write.o
  CC [M]  sound/pci/hda/patch_hdmi.o
  AR      crypto/asymmetric_keys/built-in.a
  CC      fs/kernfs/symlink.o
  CC      kernel/power/main.o
  CC      fs/jbd2/recovery.o
  CC      crypto/compress.o
  CC      drivers/acpi/acpica/dsfield.o
  CC      arch/x86/pci/common.o
  CC      kernel/locking/qrwlock.o
  CC      arch/x86/pci/early.o
  CC      fs/proc/cmdline.o
  CC      arch/x86/kernel/kprobes/opt.o
  CC      sound/core/memory.o
  CC      security/keys/request_key_auth.o
  CC      drivers/pci/hotplug/acpi_pcihp.o
  CC      drivers/video/hdmi.o
  CC      fs/proc/consoles.o
  CC      sound/core/control.o
  CC      fs/iomap/fiemap.o
  CC      arch/x86/lib/atomic64_32.o
  AR      fs/quota/built-in.a
  CC      arch/x86/mm/mmap.o
  CC      arch/x86/events/core.o
  CC      arch/x86/kernel/cpu/mce/genpool.o
  CC      fs/ext4/dir.o
  CC      crypto/algapi.o
  CC      arch/x86/lib/inat.o
  CC      lib/crypto/mpi/mpi-add.o
  CC      drivers/acpi/acpica/dsinit.o
  CC      kernel/power/console.o
  CC      fs/proc/cpuinfo.o
  AR      kernel/locking/built-in.a
  CC      fs/ext4/ext4_jbd2.o
  AR      arch/x86/lib/built-in.a
  CC      kernel/printk/printk.o
  AR      arch/x86/lib/lib.a
  CC      fs/ext4/extents.o
  CC      fs/ext4/extents_status.o
  CC      mm/folio-compat.o
  CC      fs/ext4/file.o
  AR      fs/kernfs/built-in.a
  CC      fs/ext4/fsmap.o
  CC      fs/ext4/fsync.o
  CC      arch/x86/kernel/cpu/microcode/core.o
  CC      kernel/printk/printk_safe.o
  CC      arch/x86/kernel/cpu/microcode/intel.o
  CC      arch/x86/kernel/cpu/microcode/amd.o
  AR      arch/x86/events/zhaoxin/built-in.a
  CC      arch/x86/kernel/cpu/mtrr/cleanup.o
  CC      arch/x86/events/intel/p4.o
  CC      arch/x86/events/intel/p6.o
  CC      arch/x86/kernel/cpu/cacheinfo.o
  CC      arch/x86/kernel/cpu/scattered.o
  CC      io_uring/notif.o
  CC      fs/netfs/io.o
  CC      arch/x86/pci/bus_numa.o
  AR      arch/x86/virt/svm/built-in.a
  CC      security/selinux/netnode.o
  AR      arch/x86/virt/vmx/built-in.a
  CC      security/keys/user_defined.o
  AR      arch/x86/virt/built-in.a
  CC      fs/netfs/iterator.o
  CC      block/blk-timeout.o
  CC      drivers/acpi/acpica/dsmethod.o
  CC      arch/x86/kernel/cpu/mce/intel.o
  CC      arch/x86/kernel/apic/apic_common.o
  CC      arch/x86/mm/pgtable.o
  AR      drivers/pci/hotplug/built-in.a
  AR      drivers/video/built-in.a
  CC      lib/crypto/mpi/mpi-bit.o
  CC      fs/iomap/seek.o
  AR      drivers/pci/controller/dwc/built-in.a
  CC      fs/iomap/swapfile.o
  AR      arch/x86/kernel/kprobes/built-in.a
  CC      fs/proc/devices.o
  AR      drivers/pci/controller/mobiveil/built-in.a
  CC      drivers/pnp/pnpacpi/core.o
  LDS     arch/x86/kernel/vmlinux.lds
  AR      drivers/pci/controller/plda/built-in.a
  AR      drivers/amba/built-in.a
  AR      drivers/pci/controller/built-in.a
  CC      drivers/pnp/pnpacpi/rsparser.o
  AR      drivers/pci/switch/built-in.a
  CC      drivers/pci/access.o
  CC      lib/crypto/mpi/mpi-cmp.o
  CC      security/selinux/netport.o
  CC      sound/core/misc.o
  CC      kernel/power/process.o
  CC      mm/readahead.o
  CC      fs/ext4/hash.o
  CC      drivers/acpi/x86/apple.o
  CC      fs/jbd2/checkpoint.o
  CC      drivers/acpi/acpica/dsmthdat.o
  CC      arch/x86/kernel/apic/apic_noop.o
  AR      drivers/clk/actions/built-in.a
  AR      drivers/clk/analogbits/built-in.a
  CC      drivers/acpi/x86/cmos_rtc.o
  AR      drivers/clk/bcm/built-in.a
  CC      security/keys/proc.o
  AR      drivers/clk/imgtec/built-in.a
  CC      arch/x86/kernel/cpu/mtrr/amd.o
  CC      arch/x86/kernel/cpu/mtrr/cyrix.o
  CC      arch/x86/pci/amd_bus.o
  AR      drivers/clk/imx/built-in.a
  CC      crypto/scatterwalk.o
  AR      drivers/clk/ingenic/built-in.a
  AR      drivers/clk/mediatek/built-in.a
  CC      arch/x86/events/intel/pt.o
  CC      arch/x86/kernel/cpu/mce/amd.o
  AR      drivers/clk/microchip/built-in.a
  AR      drivers/clk/mstar/built-in.a
  AR      arch/x86/kernel/cpu/microcode/built-in.a
  CC      drivers/dma/dw/core.o
  CC      drivers/dma/dw/dw.o
  AR      drivers/clk/mvebu/built-in.a
  CC      drivers/dma/dw/idma32.o
  AR      drivers/clk/ralink/built-in.a
  CC      fs/ext4/ialloc.o
  AR      drivers/clk/renesas/built-in.a
  CC      arch/x86/mm/physaddr.o
  CC      block/blk-lib.o
  AR      drivers/clk/socfpga/built-in.a
  AR      drivers/clk/sophgo/built-in.a
  CC      fs/proc/interrupts.o
  AR      drivers/clk/sprd/built-in.a
  CC      fs/proc/loadavg.o
  CC [M]  sound/pci/hda/hda_eld.o
  AR      drivers/clk/starfive/built-in.a
  AR      kernel/sched/built-in.a
  CC      drivers/acpi/tables.o
  AR      drivers/clk/sunxi-ng/built-in.a
  CC      arch/x86/mm/tlb.o
  CC      lib/crypto/mpi/mpi-sub-ui.o
  CC      lib/lzo/lzo1x_compress.o
  CC      lib/lz4/lz4_decompress.o
  AR      drivers/clk/ti/built-in.a
  CC      drivers/acpi/acpica/dsobject.o
  AR      fs/iomap/built-in.a
  CC      lib/lzo/lzo1x_decompress_safe.o
  AR      drivers/clk/versatile/built-in.a
  CC      arch/x86/events/intel/uncore.o
  AR      drivers/clk/xilinx/built-in.a
  CC      arch/x86/kernel/apic/ipi.o
  CC      block/blk-mq.o
  AR      drivers/clk/built-in.a
  CC      drivers/acpi/acpica/dsopcode.o
  CC      kernel/power/suspend.o
  CC      io_uring/tctx.o
  CC      sound/core/device.o
  CC      fs/netfs/locking.o
  CC      drivers/pci/bus.o
  CC      arch/x86/events/probe.o
  AR      drivers/pnp/pnpacpi/built-in.a
  CC      drivers/pnp/core.o
  CC      drivers/acpi/x86/lpss.o
  CC      fs/jbd2/revoke.o
  CC      arch/x86/kernel/cpu/mtrr/centaur.o
  CC      drivers/dma/dw/acpi.o
  CC      security/keys/sysctl.o
  CC      crypto/proc.o
  CC      lib/zstd/zstd_decompress_module.o
  CC      arch/x86/mm/cpu_entry_area.o
  CC      lib/zstd/decompress/huf_decompress.o
  CC      lib/xz/xz_dec_syms.o
  CC      mm/swap.o
  CC      lib/zstd/decompress/zstd_ddict.o
  AR      arch/x86/pci/built-in.a
  CC      drivers/acpi/x86/s2idle.o
  AR      lib/lzo/built-in.a
  CC      lib/xz/xz_dec_stream.o
  CC      arch/x86/events/intel/uncore_nhmex.o
  CC      fs/proc/meminfo.o
  CC      lib/xz/xz_dec_lzma2.o
  CC      security/selinux/status.o
  CC      lib/dim/dim.o
  CC      drivers/acpi/acpica/dspkginit.o
  CC      kernel/power/hibernate.o
  CC      lib/crypto/mpi/mpi-div.o
  CC      arch/x86/kernel/apic/vector.o
  CC      arch/x86/events/utils.o
  CC      drivers/acpi/acpica/dsutils.o
  CC      sound/core/info.o
  CC      drivers/acpi/acpica/dswexec.o
  CC      arch/x86/mm/maccess.o
  CC      lib/dim/net_dim.o
  CC      kernel/printk/nbcon.o
  CC      kernel/power/snapshot.o
  CC [M]  sound/pci/hda/hda_intel.o
  CC      security/keys/keyctl_pkey.o
  CC      mm/truncate.o
  CC      arch/x86/kernel/cpu/mtrr/legacy.o
  CC      drivers/acpi/osi.o
  CC      fs/ext4/indirect.o
  CC      fs/ext4/inline.o
  CC      crypto/aead.o
  CC      kernel/printk/printk_ringbuffer.o
  CC      drivers/pci/probe.o
  CC      drivers/pnp/card.o
  CC      lib/xz/xz_dec_bcj.o
  AR      drivers/dma/dw/built-in.a
  CC      drivers/pnp/driver.o
  CC      drivers/dma/hsu/hsu.o
  CC      drivers/pci/host-bridge.o
  AR      drivers/dma/idxd/built-in.a
  CC      drivers/acpi/x86/utils.o
  CC      sound/core/isadma.o
  CC      sound/core/vmaster.o
  CC      io_uring/filetable.o
  CC      fs/netfs/main.o
  CC      arch/x86/mm/pgprot.o
  CC      drivers/acpi/acpica/dswload.o
  CC      fs/ext4/inode.o
  AR      lib/lz4/built-in.a
  CC      fs/jbd2/journal.o
  AS      arch/x86/kernel/head_32.o
  CC      drivers/acpi/acpica/dswload2.o
  CC      fs/proc/stat.o
  CC      lib/crypto/mpi/mpi-inv.o
  CC      kernel/printk/sysctl.o
  CC      arch/x86/kernel/head32.o
  AR      arch/x86/kernel/cpu/mtrr/built-in.a
  CC      lib/fonts/fonts.o
  CC      arch/x86/kernel/ebda.o
  CC      arch/x86/kernel/cpu/mce/threshold.o
  CC      arch/x86/mm/pgtable_32.o
  CC      kernel/power/swap.o
  AR      lib/xz/built-in.a
  CC      arch/x86/kernel/apic/init.o
  CC      arch/x86/kernel/cpu/topology_common.o
  CC      lib/zstd/decompress/zstd_decompress.o
  CC      drivers/pnp/resource.o
  CC      fs/ext4/ioctl.o
  CC      arch/x86/mm/iomap_32.o
  CC      io_uring/rw.o
  AR      kernel/printk/built-in.a
  CC      drivers/acpi/x86/blacklist.o
  AR      security/keys/built-in.a
  CC      io_uring/net.o
  CC      lib/fonts/font_8x16.o
  CC      sound/core/ctljack.o
  CC      sound/core/jack.o
  CC      arch/x86/events/rapl.o
  CC      arch/x86/kernel/platform-quirks.o
  CC      drivers/pnp/manager.o
  CC      drivers/acpi/acpica/dswscope.o
  CC      security/selinux/ss/ebitmap.o
  CC      lib/dim/rdma_dim.o
  CC      arch/x86/events/intel/uncore_snb.o
  CC      arch/x86/kernel/cpu/topology_ext.o
  CC      sound/core/timer.o
  CC      crypto/geniv.o
  CC      kernel/irq/irqdesc.o
  CC      kernel/rcu/update.o
  CC      net/core/datagram.o
  AR      drivers/dma/hsu/built-in.a
  AR      drivers/dma/mediatek/built-in.a
  AR      drivers/dma/qcom/built-in.a
  CC      fs/proc/uptime.o
  AR      drivers/dma/stm32/built-in.a
  AR      kernel/livepatch/built-in.a
  CC      kernel/irq/handle.o
  CC      lib/zstd/decompress/zstd_decompress_block.o
  AR      drivers/dma/ti/built-in.a
  CC      arch/x86/events/intel/uncore_snbep.o
  CC      lib/crypto/mpi/mpi-mod.o
  AR      drivers/dma/xilinx/built-in.a
  CC      mm/vmscan.o
  AR      lib/fonts/built-in.a
  CC      drivers/dma/dmaengine.o
  CC      net/core/stream.o
  CC      lib/zstd/zstd_common_module.o
  CC      arch/x86/kernel/apic/hw_nmi.o
  AR      drivers/acpi/x86/built-in.a
  CC      crypto/lskcipher.o
  CC      drivers/acpi/acpica/dswstate.o
  CC      arch/x86/events/intel/uncore_discovery.o
  CC      lib/zstd/common/debug.o
  CC      drivers/dma/virt-dma.o
  CC      lib/zstd/common/entropy_common.o
  CC      arch/x86/kernel/process_32.o
  AR      lib/dim/built-in.a
  CC      kernel/dma/mapping.o
  CC      arch/x86/mm/hugetlbpage.o
  CC      kernel/dma/direct.o
  CC      drivers/dma/acpi-dma.o
  CC      sound/core/hrtimer.o
  CC      arch/x86/kernel/cpu/topology_amd.o
  CC      lib/crypto/aes.o
  CC      arch/x86/events/intel/cstate.o
  CC      drivers/acpi/osl.o
  LD [M]  sound/pci/hda/snd-hda-codec.o
  LD [M]  sound/pci/hda/snd-hda-codec-hdmi.o
  LD [M]  sound/pci/hda/snd-hda-intel.o
  CC      drivers/pnp/support.o
  AR      sound/pci/oxygen/built-in.a
  AR      sound/pci/pcxhr/built-in.a
  CC      drivers/pnp/interface.o
  AR      sound/pci/riptide/built-in.a
  AR      sound/pci/rme9652/built-in.a
  AR      sound/pci/trident/built-in.a
  CC      fs/proc/util.o
  CC      drivers/pnp/quirks.o
  AR      sound/pci/ymfpci/built-in.a
  CC      drivers/acpi/acpica/evevent.o
  AR      arch/x86/kernel/cpu/mce/built-in.a
  AR      sound/pci/vx222/built-in.a
  CC      arch/x86/kernel/cpu/common.o
  CC      drivers/pci/remove.o
  AR      sound/pci/built-in.a
  CC      arch/x86/kernel/cpu/rdrand.o
  CC      kernel/irq/manage.o
  CC      fs/ext4/mballoc.o
  CC      lib/crypto/mpi/mpi-mul.o
  CC      fs/ext4/migrate.o
  CC      lib/crypto/arc4.o
  AR      sound/sparc/built-in.a
  CC      arch/x86/kernel/cpu/match.o
  CC      crypto/skcipher.o
  CC      kernel/power/user.o
  CC      arch/x86/kernel/apic/io_apic.o
  CC      kernel/power/poweroff.o
  CC      kernel/irq/spurious.o
  CC      arch/x86/mm/dump_pagetables.o
  CC      fs/netfs/misc.o
  CC      fs/netfs/objects.o
  CC      security/selinux/ss/hashtab.o
  CC      drivers/acpi/acpica/evgpe.o
  CC      arch/x86/mm/highmem_32.o
  AR      sound/spi/built-in.a
  CC      drivers/acpi/acpica/evgpeblk.o
  AR      sound/parisc/built-in.a
  AR      net/802/built-in.a
  CC      kernel/rcu/sync.o
  CC      lib/zstd/common/error_private.o
  CC      sound/core/seq_device.o
  CC      lib/crypto/gf128mul.o
  CC      lib/crypto/blake2s.o
  CC      lib/crypto/blake2s-generic.o
  CC      security/selinux/ss/symtab.o
  CC      fs/proc/version.o
  CC      fs/netfs/write_collect.o
  CC      fs/netfs/write_issue.o
  CC      security/selinux/ss/sidtab.o
  CC      net/core/scm.o
  CC      lib/crypto/sha1.o
  CC      arch/x86/kernel/signal.o
  CC      fs/ext4/mmp.o
  AR      drivers/dma/built-in.a
  CC      arch/x86/kernel/cpu/bugs.o
  AR      drivers/soc/apple/built-in.a
  CC      lib/crypto/mpi/mpih-cmp.o
  AR      drivers/soc/aspeed/built-in.a
  AR      drivers/soc/bcm/built-in.a
  CC      net/sched/sch_generic.o
  CC      drivers/pci/pci.o
  AR      drivers/soc/fsl/built-in.a
  CC      fs/proc/softirqs.o
  CC      kernel/dma/ops_helpers.o
  AR      drivers/soc/fujitsu/built-in.a
  CC      net/sched/sch_mq.o
  AR      drivers/soc/hisilicon/built-in.a
  CC      arch/x86/kernel/apic/msi.o
  AR      drivers/soc/imx/built-in.a
  AR      drivers/soc/ixp4xx/built-in.a
  AR      drivers/soc/loongson/built-in.a
  CC      arch/x86/kernel/cpu/aperfmperf.o
  CC      arch/x86/kernel/apic/probe_32.o
  AR      drivers/soc/mediatek/built-in.a
  CC      io_uring/poll.o
  CC      drivers/pnp/system.o
  AR      drivers/soc/microchip/built-in.a
  CC      drivers/acpi/utils.o
  CC      lib/argv_split.o
  AR      drivers/soc/nuvoton/built-in.a
  CC      drivers/acpi/acpica/evgpeinit.o
  CC      lib/crypto/sha256.o
  AR      drivers/soc/pxa/built-in.a
  AR      drivers/soc/amlogic/built-in.a
  CC      block/blk-mq-tag.o
  AR      drivers/soc/qcom/built-in.a
  AR      drivers/soc/renesas/built-in.a
  AR      kernel/power/built-in.a
  AR      drivers/soc/rockchip/built-in.a
  CC      kernel/irq/resend.o
  CC      kernel/irq/chip.o
  AR      drivers/soc/sunxi/built-in.a
  AR      drivers/soc/ti/built-in.a
  AR      drivers/soc/xilinx/built-in.a
  CC [M]  sound/core/hwdep.o
  CC      net/netlink/af_netlink.o
  AR      drivers/soc/built-in.a
  AR      sound/pcmcia/vx/built-in.a
  AR      arch/x86/mm/built-in.a
  CC      lib/zstd/common/fse_decompress.o
  AR      sound/pcmcia/pdaudiocf/built-in.a
  CC      fs/proc/namespaces.o
  CC      lib/zstd/common/zstd_common.o
  CC      fs/ext4/move_extent.o
  AR      sound/pcmcia/built-in.a
  CC      fs/ext4/namei.o
  CC      fs/proc/self.o
  CC      fs/ext4/page-io.o
  CC      fs/ext4/readpage.o
  CC      lib/crypto/mpi/mpih-div.o
  CC      kernel/rcu/srcutree.o
  AR      fs/jbd2/built-in.a
  CC      kernel/rcu/tree.o
  CC      fs/ramfs/inode.o
  CC      fs/proc/thread_self.o
  AR      drivers/pnp/built-in.a
  CC      drivers/acpi/acpica/evgpeutil.o
  CC      crypto/seqiv.o
  CC      fs/proc/proc_sysctl.o
  CC      crypto/echainiv.o
  CC      fs/ext4/resize.o
  CC      kernel/irq/dummychip.o
  CC      kernel/irq/devres.o
  CC      kernel/dma/dummy.o
  CC      fs/hugetlbfs/inode.o
  CC      drivers/virtio/virtio.o
  CC      kernel/dma/remap.o
  CC      drivers/virtio/virtio_ring.o
  CC      arch/x86/kernel/cpu/cpuid-deps.o
  CC      kernel/rcu/rcu_segcblist.o
  CC      drivers/tty/vt/vt_ioctl.o
  CC      net/core/gen_stats.o
  CC      drivers/tty/hvc/hvc_console.o
  CC      drivers/tty/vt/vc_screen.o
  AR      lib/zstd/built-in.a
  CC      lib/crypto/mpi/mpih-mul.o
  AR      arch/x86/events/intel/built-in.a
  CC      arch/x86/events/msr.o
  CC      drivers/acpi/acpica/evglock.o
  CC      net/sched/sch_frag.o
  CC      arch/x86/kernel/cpu/umwait.o
  CC [M]  sound/core/pcm.o
  CC      net/sched/sch_api.o
  CC      net/sched/sch_blackhole.o
  CC      kernel/irq/autoprobe.o
  CC      kernel/irq/irqdomain.o
  CC      security/selinux/ss/avtab.o
  AR      drivers/tty/ipwireless/built-in.a
  CC      drivers/tty/serial/8250/8250_core.o
  CC      drivers/char/hw_random/core.o
  CC      drivers/tty/serial/8250/8250_platform.o
  CC      security/selinux/ss/policydb.o
  AR      arch/x86/kernel/apic/built-in.a
  CC      security/selinux/ss/services.o
  CC      arch/x86/kernel/signal_32.o
  CC      crypto/ahash.o
  CC      block/blk-stat.o
  CC      arch/x86/kernel/traps.o
  CC      drivers/tty/serial/serial_core.o
  AR      fs/netfs/built-in.a
  CC      security/selinux/ss/conditional.o
  CC      drivers/char/agp/backend.o
  CC      security/selinux/ss/mls.o
  CC      fs/ramfs/file-mmu.o
  CC      security/selinux/ss/context.o
  AR      sound/mips/built-in.a
  CC      mm/shrinker.o
  CC      drivers/acpi/acpica/evhandler.o
  AR      kernel/dma/built-in.a
  CC      block/blk-mq-sysfs.o
  CC      drivers/char/hw_random/intel-rng.o
  CC      drivers/char/hw_random/amd-rng.o
  CC      drivers/acpi/acpica/evmisc.o
  CC      kernel/irq/proc.o
  CC      lib/crypto/mpi/mpi-pow.o
  AR      arch/x86/events/built-in.a
  CC      net/sched/cls_api.o
  CC      net/sched/act_api.o
  AR      drivers/tty/hvc/built-in.a
  MKCAP   arch/x86/kernel/cpu/capflags.c
  CC      drivers/tty/tty_io.o
  CC      drivers/tty/n_tty.o
  CC      io_uring/eventfd.o
  CC      drivers/tty/vt/selection.o
  CC      drivers/acpi/acpica/evregion.o
  CC      net/core/gen_estimator.o
  CC      security/selinux/netlabel.o
  CC      drivers/acpi/acpica/evrgnini.o
  CC      drivers/char/hw_random/geode-rng.o
  AR      fs/hugetlbfs/built-in.a
  AR      net/bpf/built-in.a
  CC [M]  sound/core/pcm_native.o
  CC [M]  sound/core/pcm_lib.o
  AR      fs/ramfs/built-in.a
  CC      fs/proc/proc_net.o
  CC [M]  sound/core/pcm_misc.o
  CC      net/ethtool/ioctl.o
  CC      drivers/char/agp/generic.o
  CC      net/netfilter/core.o
  CC      drivers/acpi/acpica/evsci.o
  CC      net/netfilter/nf_log.o
  CC      drivers/virtio/virtio_anchor.o
  CC      drivers/virtio/virtio_pci_modern_dev.o
  CC      drivers/tty/tty_ioctl.o
  CC      drivers/tty/serial/8250/8250_pnp.o
  CC      drivers/char/hw_random/via-rng.o
  CC      crypto/shash.o
  CC      fs/ext4/super.o
  CC      kernel/irq/migration.o
  CC      mm/shmem.o
  CC      drivers/acpi/acpica/evxface.o
  CC      mm/util.o
  CC [M]  sound/core/pcm_memory.o
  CC      mm/mmzone.o
  CC      block/blk-mq-cpumap.o
  CC      lib/crypto/mpi/mpiutil.o
  CC      block/blk-mq-sched.o
  CC      mm/vmstat.o
  CC      net/ethtool/common.o
  CC      fs/ext4/symlink.o
  CC      io_uring/uring_cmd.o
  CC      io_uring/openclose.o
  CC      net/ethtool/netlink.o
  AR      drivers/char/hw_random/built-in.a
  CC      drivers/tty/serial/serial_base_bus.o
  CC      drivers/tty/serial/serial_ctrl.o
  CC      drivers/tty/vt/keyboard.o
  CC      net/netlink/genetlink.o
  CC [M]  sound/core/memalloc.o
  AR      drivers/iommu/amd/built-in.a
  AR      drivers/iommu/intel/built-in.a
  CC      kernel/irq/cpuhotplug.o
  CC      drivers/pci/pci-driver.o
  AR      drivers/iommu/arm/arm-smmu/built-in.a
  AR      drivers/iommu/arm/arm-smmu-v3/built-in.a
  CC      net/core/net_namespace.o
  AR      drivers/iommu/arm/built-in.a
  CC      fs/proc/kcore.o
  AR      drivers/iommu/iommufd/built-in.a
  CC      drivers/tty/serial/8250/8250_rsa.o
  CC      drivers/iommu/iommu.o
  CC      drivers/acpi/acpica/evxfevnt.o
  CC      mm/backing-dev.o
  CC      drivers/virtio/virtio_pci_legacy_dev.o
  CC      drivers/virtio/virtio_pci_modern.o
  CC      drivers/virtio/virtio_pci_common.o
  CC      drivers/virtio/virtio_pci_legacy.o
  CC      drivers/char/agp/isoch.o
  CC      arch/x86/kernel/idt.o
  CC      crypto/akcipher.o
  AR      lib/crypto/mpi/built-in.a
  AR      lib/crypto/built-in.a
  CC      lib/bug.o
  CC      arch/x86/kernel/irq.o
  CC [M]  sound/core/pcm_timer.o
  LD [M]  sound/core/snd-hwdep.o
  CC      fs/proc/vmcore.o
  CC      fs/proc/kmsg.o
  CC      net/ipv4/route.o
  CC      net/ipv4/netfilter/nf_defrag_ipv4.o
  CC      drivers/acpi/acpica/evxfgpe.o
  CC      drivers/acpi/acpica/evxfregn.o
  CC      net/xfrm/xfrm_policy.o
  CC      drivers/acpi/acpica/exconcat.o
  CC      net/netfilter/nf_queue.o
  CC      drivers/iommu/iommu-traces.o
  CC      io_uring/sqpoll.o
  CC      block/ioctl.o
  CC      kernel/irq/pm.o
  CC      net/ethtool/bitset.o
  CC      net/ethtool/strset.o
  CC      drivers/char/mem.o
  CC      drivers/char/random.o
  CC      drivers/tty/serial/8250/8250_port.o
  CC      fs/fat/cache.o
  AR      security/selinux/built-in.a
  AR      security/built-in.a
  CC      drivers/tty/serial/8250/8250_dma.o
  CC      fs/fat/dir.o
  CC      drivers/char/agp/amd64-agp.o
  CC      drivers/char/agp/intel-agp.o
  CC      fs/fat/fatent.o
  CC      drivers/virtio/virtio_pci_admin_legacy_io.o
  CC      net/core/secure_seq.o
  CC      fs/ext4/sysfs.o
  CC      fs/ext4/xattr.o
  CC      mm/mm_init.o
  CC      drivers/acpi/acpica/exconfig.o
  CC      net/ethtool/linkinfo.o
  CC      io_uring/xattr.o
  CC      lib/buildid.o
  CC      io_uring/nop.o
  CC      lib/clz_tab.o
  CC      arch/x86/kernel/cpu/powerflags.o
  CC      fs/fat/file.o
  CC      crypto/sig.o
  CC      drivers/pci/search.o
  CC      crypto/kpp.o
  ASN.1   crypto/rsapubkey.asn1.[ch]
  CC      lib/cmdline.o
  CC      drivers/tty/vt/vt.o
  COPY    drivers/tty/vt/defkeymap.c
  ASN.1   crypto/rsaprivkey.asn1.[ch]
  CC      drivers/tty/vt/consolemap.o
  CC      mm/percpu.o
  CC      net/netfilter/nf_sockopt.o
  CC      kernel/irq/msi.o
  CC      drivers/acpi/acpica/exconvrt.o
  CC      fs/proc/page.o
  CC      block/genhd.o
  CC      net/netlink/policy.o
  CC      net/sched/sch_fifo.o
  AR      sound/core/built-in.a
  LD [M]  sound/core/snd-pcm.o
  CC      net/sched/cls_cgroup.o
  CC      net/sched/ematch.o
  AR      sound/soc/built-in.a
  CC      net/ipv4/netfilter/nf_reject_ipv4.o
  CC      drivers/virtio/virtio_input.o
  AR      sound/atmel/built-in.a
  CC      drivers/virtio/virtio_dma_buf.o
  AR      sound/hda/built-in.a
  CC      drivers/tty/serial/8250/8250_dwlib.o
  CC [M]  sound/hda/hda_bus_type.o
  CC      net/unix/af_unix.o
  CC      drivers/char/agp/intel-gtt.o
  CC      net/ipv6/netfilter/ip6_tables.o
  CC      lib/cpumask.o
  AR      kernel/rcu/built-in.a
  CC [M]  sound/hda/hdac_bus.o
  CC      drivers/iommu/iommu-sysfs.o
  CC      lib/ctype.o
  CC      drivers/tty/tty_ldisc.o
  CC      drivers/pci/rom.o
  CC      net/ipv6/netfilter/ip6table_filter.o
  CC      drivers/char/misc.o
  CC      net/ipv6/netfilter/ip6table_mangle.o
  CC      drivers/acpi/acpica/excreate.o
  CC      net/ipv6/netfilter/nf_defrag_ipv6_hooks.o
  CC      fs/fat/inode.o
  HOSTCC  drivers/tty/vt/conmakehash
  CC      net/ethtool/linkmodes.o
  CC      fs/ext4/xattr_hurd.o
  CC      crypto/rsa.o
  CC      crypto/rsa_helper.o
  CC      drivers/char/virtio_console.o
  CC      net/netfilter/utils.o
  CC      arch/x86/kernel/irq_32.o
  AR      drivers/gpu/host1x/built-in.a
  CC      drivers/char/hpet.o
  CC      net/core/flow_dissector.o
  AR      fs/proc/built-in.a
  AR      drivers/gpu/vga/built-in.a
  CC      net/unix/garbage.o
  CC      net/ethtool/rss.o
  CC      io_uring/fs.o
  CC      net/unix/sysctl_net_unix.o
  CC      kernel/entry/common.o
  CC      kernel/module/main.o
  CC      drivers/acpi/acpica/exdebug.o
  CC      drivers/acpi/acpica/exdump.o
  CC      lib/dec_and_lock.o
  AR      drivers/gpu/drm/tests/built-in.a
  CC      lib/decompress.o
  AR      drivers/gpu/drm/arm/built-in.a
  AR      drivers/virtio/built-in.a
  CC      lib/decompress_bunzip2.o
  CC      drivers/gpu/drm/display/drm_display_helper_mod.o
  CC      fs/fat/misc.o
  CC      drivers/iommu/dma-iommu.o
  CC      kernel/module/strict_rwx.o
  AR      net/netlink/built-in.a
  CC      drivers/acpi/reboot.o
  CC      drivers/tty/serial/8250/8250_pcilib.o
  CC      drivers/pci/setup-res.o
  CC [M]  sound/hda/hdac_device.o
  CC      drivers/pci/irq.o
  CC      lib/decompress_inflate.o
  CC      lib/decompress_unlz4.o
  CC      kernel/irq/affinity.o
  AR      drivers/char/agp/built-in.a
  CC      fs/fat/nfs.o
  CC      fs/fat/namei_vfat.o
  CC      crypto/rsa-pkcs1pad.o
  CC      fs/fat/namei_msdos.o
  AR      net/sched/built-in.a
  CC      drivers/tty/serial/8250/8250_early.o
  CC      net/packet/af_packet.o
  CC      drivers/acpi/acpica/exfield.o
  CC      drivers/char/nvram.o
  CC      block/ioprio.o
  CC      drivers/gpu/drm/display/drm_dp_dual_mode_helper.o
  CC      block/badblocks.o
  CC      net/ipv4/netfilter/ip_tables.o
  CC      fs/ext4/xattr_trusted.o
  CC      fs/ext4/xattr_user.o
  CC      block/blk-rq-qos.o
  CC      drivers/connector/cn_queue.o
  CC      drivers/tty/tty_buffer.o
  CC      block/disk-events.o
  CC      kernel/irq/matrix.o
  CC      block/blk-ia-ranges.o
  CC      io_uring/splice.o
  AR      net/dsa/built-in.a
  CC      drivers/tty/tty_port.o
  CC      drivers/tty/serial/serial_port.o
  CC      lib/decompress_unlzma.o
  CC      drivers/acpi/acpica/exfldio.o
  CC      net/sunrpc/auth_gss/auth_gss.o
  AR      net/wireless/tests/built-in.a
  CC      net/wireless/core.o
  CC      net/wireless/sysfs.o
  CC      net/sunrpc/auth_gss/gss_generic_token.o
  CC      net/ethtool/linkstate.o
  CC      net/ipv4/inetpeer.o
  AR      net/mac80211/tests/built-in.a
  CC      net/netfilter/nfnetlink.o
  CC      net/mac80211/main.o
  CC      kernel/entry/syscall_user_dispatch.o
  CC      net/ipv6/netfilter/nf_conntrack_reasm.o
  CC      drivers/pci/vpd.o
  CC      net/ipv6/netfilter/nf_reject_ipv6.o
  CC      net/xfrm/xfrm_state.o
  CC      drivers/pci/setup-bus.o
  CC      drivers/pci/vc.o
  CC      drivers/tty/serial/8250/8250_exar.o
  CC      drivers/tty/vt/defkeymap.o
  CC      crypto/acompress.o
  CC      mm/slab_common.o
  AR      drivers/char/built-in.a
  CONMK   drivers/tty/vt/consolemap_deftbl.c
  CC      drivers/tty/serial/8250/8250_lpss.o
  CC [M]  sound/hda/hdac_sysfs.o
  CC      net/ipv4/protocol.o
  CC      drivers/gpu/drm/display/drm_dp_helper.o
  CC      drivers/tty/vt/consolemap_deftbl.o
  CC      block/early-lookup.o
  AR      drivers/tty/vt/built-in.a
  CC      block/bounce.o
  CC      drivers/acpi/acpica/exmisc.o
  CC      net/netfilter/nfnetlink_log.o
  CC      fs/ext4/fast_commit.o
  CC      drivers/iommu/iova.o
  CC      kernel/module/kmod.o
  CC      net/xfrm/xfrm_hash.o
  CC      net/netfilter/nf_conntrack_core.o
  CC      block/bsg.o
  CC      block/blk-cgroup.o
  CC      net/ipv4/ip_input.o
  AR      fs/fat/built-in.a
  AR      net/unix/built-in.a
  CC      drivers/gpu/drm/display/drm_dp_mst_topology.o
  CC      net/ethtool/debug.o
  AR      kernel/entry/built-in.a
  CC      net/ethtool/wol.o
  CC      fs/ext4/orphan.o
  CC      lib/decompress_unlzo.o
  CC      fs/ext4/acl.o
  CC      arch/x86/kernel/cpu/topology.o
  CC      io_uring/sync.o
  CC      drivers/connector/connector.o
  CC      drivers/acpi/acpica/exmutex.o
  CC      drivers/pci/mmap.o
  CC      net/core/sysctl_net_core.o
  CC      net/ethtool/features.o
  CC      drivers/gpu/drm/ttm/ttm_tt.o
  CC      net/ipv4/netfilter/iptable_filter.o
  CC      net/ipv4/netfilter/iptable_mangle.o
  AR      kernel/irq/built-in.a
  CC      net/ethtool/privflags.o
  CC      crypto/scompress.o
  CC      drivers/connector/cn_proc.o
  CC      net/sunrpc/auth_gss/gss_mech_switch.o
  CC      net/sunrpc/auth_gss/svcauth_gss.o
  CC      drivers/tty/serial/8250/8250_mid.o
  CC      net/xfrm/xfrm_input.o
  CC [M]  sound/hda/hdac_regmap.o
  CC      drivers/gpu/drm/ttm/ttm_bo.o
  CC      lib/decompress_unxz.o
  CC      drivers/acpi/acpica/exnames.o
  CC      drivers/gpu/drm/ttm/ttm_bo_util.o
  CC      arch/x86/kernel/cpu/proc.o
  CC      drivers/gpu/drm/ttm/ttm_bo_vm.o
  CC      drivers/gpu/drm/ttm/ttm_module.o
  CC      kernel/module/tree_lookup.o
  AR      drivers/iommu/built-in.a
  CC      net/ipv6/netfilter/ip6t_ipv6header.o
  CC      kernel/module/kallsyms.o
  CC      net/ethtool/rings.o
  CC      drivers/acpi/nvs.o
  CC      fs/isofs/namei.o
  CC      net/netlabel/netlabel_user.o
  CC      drivers/gpu/drm/display/drm_dsc_helper.o
  CC      io_uring/msg_ring.o
  CC      drivers/pci/devres.o
  CC      arch/x86/kernel/cpu/feat_ctl.o
  CC      drivers/acpi/acpica/exoparg1.o
  CC      drivers/gpu/drm/display/drm_hdcp_helper.o
  CC      lib/decompress_unzstd.o
  CC      net/ethtool/channels.o
  CC      drivers/pci/proc.o
  CC      crypto/algboss.o
  CC      drivers/tty/serial/8250/8250_pci.o
  CC      net/netfilter/nf_conntrack_standalone.o
  CC [M]  sound/hda/hdac_controller.o
  CC      net/core/dev.o
  CC      mm/compaction.o
  CC      net/ipv4/netfilter/ipt_REJECT.o
  CC      block/blk-ioprio.o
  CC [M]  net/ipv4/netfilter/iptable_nat.o
  CC      kernel/module/procfs.o
  CC      drivers/acpi/acpica/exoparg2.o
  CC      fs/isofs/inode.o
  CC      fs/isofs/dir.o
  CC      drivers/gpu/drm/ttm/ttm_execbuf_util.o
  CC      net/sunrpc/auth_gss/gss_rpc_upcall.o
  CC      fs/isofs/util.o
  CC      net/ipv4/ip_fragment.o
  CC      net/sunrpc/auth_gss/gss_rpc_xdr.o
  CC      drivers/gpu/drm/display/drm_hdmi_helper.o
  CC      arch/x86/kernel/cpu/intel.o
  CC      fs/isofs/rock.o
  CC      drivers/acpi/acpica/exoparg3.o
  CC      fs/isofs/export.o
  CC      drivers/gpu/drm/ttm/ttm_range_manager.o
  AR      drivers/connector/built-in.a
  CC      drivers/base/power/sysfs.o
  CC      drivers/base/firmware_loader/builtin/main.o
  CC      lib/dump_stack.o
  CC      net/ethtool/coalesce.o
  CC      drivers/gpu/drm/display/drm_scdc_helper.o
  CC      net/netlabel/netlabel_kapi.o
  CC      fs/isofs/joliet.o
  AR      net/packet/built-in.a
  CC      net/sunrpc/auth_gss/trace.o
  CC      net/ipv6/netfilter/ip6t_REJECT.o
  CC      lib/earlycpio.o
  CC      fs/ext4/xattr_security.o
  CC      drivers/acpi/acpica/exoparg6.o
  CC      io_uring/advise.o
  CC      io_uring/epoll.o
  CC      kernel/module/sysfs.o
  CC      drivers/acpi/acpica/exprep.o
  AR      drivers/base/firmware_loader/builtin/built-in.a
  CC      drivers/block/loop.o
  CC      drivers/base/firmware_loader/main.o
  CC      drivers/pci/pci-sysfs.o
  CC      net/sunrpc/clnt.o
  CC      drivers/block/virtio_blk.o
  CC      block/blk-iolatency.o
  CC      fs/isofs/compress.o
  CC      net/xfrm/xfrm_output.o
  CC      crypto/testmgr.o
  CC      drivers/gpu/drm/ttm/ttm_resource.o
  CC      net/ipv6/af_inet6.o
  CC [M]  sound/hda/hdac_stream.o
  CC      net/xfrm/xfrm_sysctl.o
  CC      net/ipv6/anycast.o
  CC      drivers/base/power/generic_ops.o
  CC      net/wireless/radiotap.o
  CC      drivers/pci/slot.o
  CC      lib/extable.o
  CC      drivers/tty/serial/8250/8250_pericom.o
  CC      net/ethtool/pause.o
  CC      net/netfilter/nf_conntrack_expect.o
  AR      net/ipv4/netfilter/built-in.a
  CC      net/netfilter/nf_conntrack_helper.o
  CC      drivers/acpi/acpica/exregion.o
  CC      drivers/acpi/acpica/exresnte.o
  CC      net/mac80211/status.o
  CC      io_uring/statx.o
  CC      io_uring/timeout.o
  CC      lib/flex_proportions.o
  CC      net/ethtool/eee.o
  CC      drivers/pci/pci-acpi.o
  CC      drivers/tty/tty_mutex.o
  CC      arch/x86/kernel/cpu/tsx.o
  CC      mm/show_mem.o
  AR      kernel/module/built-in.a
  CC      kernel/time/time.o
  CC      drivers/base/power/common.o
  CC      net/sunrpc/auth_gss/gss_krb5_mech.o
  AR      drivers/misc/eeprom/built-in.a
  CC      net/sunrpc/auth_gss/gss_krb5_seal.o
  AR      drivers/misc/cb710/built-in.a
  CC      crypto/cmac.o
  AR      drivers/misc/ti-st/built-in.a
  AR      drivers/misc/lis3lv02d/built-in.a
  CC      net/sunrpc/auth_gss/gss_krb5_unseal.o
  CC      net/ipv4/ip_forward.o
  CC      drivers/acpi/acpica/exresolv.o
  AR      drivers/misc/cardreader/built-in.a
  CC      drivers/acpi/acpica/exresop.o
  AR      drivers/misc/keba/built-in.a
  CC      crypto/hmac.o
  CC      drivers/base/power/qos.o
  AR      drivers/misc/built-in.a
  CC      lib/idr.o
  AR      sound/x86/built-in.a
  CC      drivers/acpi/wakeup.o
  CC      net/sunrpc/xprt.o
  AR      fs/isofs/built-in.a
  AR      drivers/gpu/drm/display/built-in.a
  CC      net/xfrm/xfrm_replay.o
  CC      block/blk-iocost.o
  AR      drivers/tty/serial/8250/built-in.a
  AR      drivers/base/firmware_loader/built-in.a
  CC      drivers/tty/serial/earlycon.o
  CC      net/netfilter/nf_conntrack_proto.o
  CC      net/ipv6/ip6_output.o
  CC      net/netlabel/netlabel_domainhash.o
  CC      drivers/gpu/drm/ttm/ttm_pool.o
  CC [M]  sound/hda/array.o
  CC      arch/x86/kernel/cpu/intel_epb.o
  CC      net/xfrm/xfrm_device.o
  CC      block/mq-deadline.o
  CC      drivers/base/regmap/regmap.o
  AR      net/ipv6/netfilter/built-in.a
  AR      drivers/base/test/built-in.a
  CC      drivers/base/component.o
  CC      net/wireless/util.o
  CC      block/kyber-iosched.o
  CC      drivers/acpi/acpica/exserial.o
  CC      drivers/base/regmap/regcache.o
  CC      drivers/acpi/acpica/exstore.o
  AR      drivers/gpu/drm/renesas/rcar-du/built-in.a
  CC      drivers/gpu/drm/i915/i915_config.o
  AR      drivers/gpu/drm/renesas/rz-du/built-in.a
  CC      drivers/gpu/drm/i915/i915_driver.o
  CC      io_uring/fdinfo.o
  AR      drivers/block/built-in.a
  AR      drivers/gpu/drm/renesas/built-in.a
  CC      lib/irq_regs.o
  AR      drivers/gpu/drm/omapdrm/built-in.a
  CC      io_uring/cancel.o
  CC      net/ethtool/tsinfo.o
  CC      drivers/acpi/sleep.o
  CC      io_uring/waitid.o
  CC      net/wireless/reg.o
  CC      crypto/crypto_null.o
  AR      fs/ext4/built-in.a
  CC      net/wireless/scan.o
  CC      crypto/md5.o
  AR      drivers/gpu/drm/tilcdc/built-in.a
  CC      mm/shmem_quota.o
  CC      lib/is_single_threaded.o
  CC      fs/nfs/client.o
  CC      lib/klist.o
  CC      drivers/pci/iomap.o
  CC      arch/x86/kernel/cpu/amd.o
  CC      net/core/dev_addr_lists.o
  CC      lib/kobject.o
  CC      drivers/base/core.o
  CC      drivers/pci/quirks.o
  CC      mm/interval_tree.o
  CC      io_uring/register.o
  CC      kernel/time/timer.o
  CC      net/core/dst.o
  CC      drivers/acpi/acpica/exstoren.o
  CC      drivers/acpi/acpica/exstorob.o
  AR      drivers/tty/serial/built-in.a
  CC [M]  sound/hda/hdmi_chmap.o
  CC      drivers/tty/tty_ldsem.o
  CC      lib/kobject_uevent.o
  CC      drivers/gpu/drm/ttm/ttm_device.o
  CC      drivers/base/bus.o
  CC      drivers/gpu/drm/virtio/virtgpu_drv.o
  CC      drivers/gpu/drm/ttm/ttm_sys_manager.o
  CC      drivers/gpu/drm/ttm/ttm_agp_backend.o
  CC      crypto/sha256_generic.o
  CC      net/ipv4/ip_options.o
  CC      net/sunrpc/auth_gss/gss_krb5_wrap.o
  CC      drivers/base/power/runtime.o
  CC      drivers/acpi/acpica/exsystem.o
  CC      net/ipv4/ip_output.o
  CC      net/xfrm/xfrm_nat_keepalive.o
  CC      net/wireless/nl80211.o
  CC      kernel/time/hrtimer.o
  CC      net/netlabel/netlabel_addrlist.o
  CC      drivers/tty/tty_baudrate.o
  CC      drivers/base/regmap/regcache-rbtree.o
  CC      net/netfilter/nf_conntrack_proto_generic.o
  CC      drivers/base/dd.o
  CC      io_uring/truncate.o
  CC      net/ethtool/cabletest.o
  CC      net/xfrm/xfrm_algo.o
  CC      net/wireless/mlme.o
  CC      mm/list_lru.o
  CC      kernel/futex/core.o
  CC      drivers/acpi/acpica/extrace.o
  CC      arch/x86/kernel/cpu/hygon.o
  CC      kernel/cgroup/cgroup.o
  CC      drivers/tty/tty_jobctrl.o
  CC      mm/workingset.o
  CC      net/wireless/ibss.o
  CC      drivers/gpu/drm/virtio/virtgpu_kms.o
  CC [M]  sound/hda/trace.o
  CC      crypto/sha512_generic.o
  CC      block/blk-mq-pci.o
  AR      drivers/gpu/drm/ttm/built-in.a
  CC      net/xfrm/xfrm_user.o
  CC      drivers/tty/n_null.o
  CC      kernel/futex/syscalls.o
  CC      block/blk-mq-virtio.o
  CC      net/sunrpc/auth_gss/gss_krb5_crypto.o
  CC      drivers/acpi/acpica/exutils.o
  CC      drivers/gpu/drm/i915/i915_drm_client.o
  CC      lib/logic_pio.o
  CC      drivers/gpu/drm/virtio/virtgpu_gem.o
  CC      arch/x86/kernel/cpu/centaur.o
  CC      io_uring/memmap.o
  CC      drivers/base/power/wakeirq.o
  CC      io_uring/io-wq.o
  CC      net/sunrpc/socklib.o
  CC      fs/nfs/dir.o
  CC      kernel/cgroup/rstat.o
  CC      net/netlabel/netlabel_mgmt.o
  CC      net/mac80211/driver-ops.o
  CC      io_uring/futex.o
  CC      drivers/acpi/device_sysfs.o
  CC      arch/x86/kernel/cpu/transmeta.o
  CC      net/netfilter/nf_conntrack_proto_tcp.o
  CC      drivers/acpi/acpica/hwacpi.o
  CC      net/mac80211/sta_info.o
  CC      kernel/futex/pi.o
  CC      mm/debug.o
  CC      drivers/acpi/device_pm.o
  CC      net/ethtool/tunnels.o
  CC      kernel/futex/requeue.o
  CC      drivers/tty/pty.o
  CC      drivers/gpu/drm/i915/i915_getparam.o
  CC      crypto/sha3_generic.o
  CC      net/ipv6/ip6_input.o
  CC      kernel/trace/trace_clock.o
  CC      net/ipv6/addrconf.o
  CC      mm/gup.o
  CC      drivers/pci/pci-label.o
  CC      block/blk-mq-debugfs.o
  CC      drivers/base/power/main.o
  CC      lib/maple_tree.o
  CC      kernel/time/timekeeping.o
  CC [M]  sound/hda/hdac_component.o
  CC      drivers/acpi/acpica/hwesleep.o
  CC      drivers/base/regmap/regcache-flat.o
  CC      kernel/futex/waitwake.o
  CC      drivers/gpu/drm/virtio/virtgpu_vram.o
  CC      drivers/acpi/proc.o
  CC      arch/x86/kernel/cpu/zhaoxin.o
  CC      drivers/gpu/drm/virtio/virtgpu_display.o
  CC      kernel/trace/ring_buffer.o
  CC      drivers/base/syscore.o
  CC      net/sunrpc/auth_gss/gss_krb5_keys.o
  CC      crypto/ecb.o
  CC      drivers/acpi/acpica/hwgpe.o
  CC      drivers/gpu/drm/virtio/virtgpu_vq.o
  CC      crypto/cbc.o
  CC      drivers/acpi/acpica/hwregs.o
  CC [M]  sound/hda/hdac_i915.o
  CC      net/ipv4/ip_sockglue.o
  CC [M]  sound/hda/intel-dsp-config.o
  CC      kernel/trace/trace.o
  CC      drivers/tty/tty_audit.o
  CC      net/wireless/sme.o
  CC      arch/x86/kernel/cpu/vortex.o
  CC      net/core/netevent.o
  CC      drivers/base/regmap/regcache-maple.o
  CC      drivers/pci/vgaarb.o
  CC      drivers/gpu/drm/i915/i915_ioctl.o
  CC      drivers/base/regmap/regmap-debugfs.o
  CC      crypto/ctr.o
  CC      net/netlabel/netlabel_unlabeled.o
  CC      io_uring/napi.o
  AR      kernel/futex/built-in.a
  CC      block/blk-pm.o
  CC      net/ethtool/fec.o
  CC      kernel/time/ntp.o
  CC      drivers/acpi/bus.o
  CC      crypto/gcm.o
  CC      kernel/bpf/core.o
  CC      drivers/acpi/acpica/hwsleep.o
  CC      kernel/events/core.o
  CC      kernel/fork.o
  CC      kernel/events/ring_buffer.o
  CC      arch/x86/kernel/cpu/perfctr-watchdog.o
  CC [M]  sound/hda/intel-nhlt.o
  CC      net/netfilter/nf_conntrack_proto_udp.o
  CC      crypto/ccm.o
  AR      net/sunrpc/auth_gss/built-in.a
  CC      drivers/tty/sysrq.o
  CC      net/sunrpc/xprtsock.o
  CC      drivers/acpi/acpica/hwvalid.o
  CC [M]  sound/hda/intel-sdw-acpi.o
  CC      net/netfilter/nf_conntrack_proto_icmp.o
  CC      net/ipv6/addrlabel.o
  CC      drivers/acpi/glue.o
  CC      fs/nfs/file.o
  CC      drivers/gpu/drm/i915/i915_irq.o
  AR      drivers/base/regmap/built-in.a
  AR      net/xfrm/built-in.a
  CC      drivers/base/driver.o
  CC      net/ipv4/inet_hashtables.o
  CC      block/holder.o
  CC      drivers/base/power/wakeup.o
  CC      lib/memcat_p.o
  CC      drivers/gpu/drm/i915/i915_mitigations.o
  CC      net/wireless/chan.o
  CC      net/wireless/ethtool.o
  CC      drivers/gpu/drm/virtio/virtgpu_fence.o
  CC      net/ipv4/inet_timewait_sock.o
  CC      kernel/time/clocksource.o
  CC      drivers/acpi/acpica/hwxface.o
  CC      arch/x86/kernel/cpu/vmware.o
  CC      mm/mmap_lock.o
  AR      drivers/pci/built-in.a
  CC      lib/nmi_backtrace.o
  CC      net/core/neighbour.o
  LD [M]  sound/hda/snd-hda-core.o
  LD [M]  sound/hda/snd-intel-dspcfg.o
  CC      fs/nfs/getroot.o
  CC      drivers/acpi/scan.o
  LD [M]  sound/hda/snd-intel-sdw-acpi.o
  AR      sound/xen/built-in.a
  AR      sound/virtio/built-in.a
  CC      sound/sound_core.o
  CC      net/ethtool/eeprom.o
  CC      net/ipv6/route.o
  AR      drivers/gpu/drm/imx/built-in.a
  CC      sound/last.o
  CC      net/ethtool/stats.o
  CC      net/rfkill/core.o
  AR      drivers/gpu/drm/i2c/built-in.a
  CC      drivers/base/class.o
  CC      drivers/acpi/acpica/hwxfsleep.o
  CC      net/netlabel/netlabel_cipso_v4.o
  CC      crypto/aes_generic.o
  CC      kernel/trace/trace_output.o
  AR      drivers/tty/built-in.a
  CC      kernel/trace/trace_seq.o
  CC      crypto/crc32c_generic.o
  AR      block/built-in.a
  AR      io_uring/built-in.a
  CC      net/netlabel/netlabel_calipso.o
  CC      drivers/base/platform.o
  CC      net/ethtool/phc_vclocks.o
  CC      arch/x86/kernel/cpu/hypervisor.o
  CC      arch/x86/kernel/cpu/mshyperv.o
  CC      net/ethtool/mm.o
  CC      fs/nfs/inode.o
  AR      sound/built-in.a
  CC      drivers/acpi/acpica/hwpci.o
  CC      net/netfilter/nf_conntrack_extend.o
  CC      drivers/gpu/drm/virtio/virtgpu_object.o
  CC      net/ethtool/module.o
  CC      fs/nfs/super.o
  CC      mm/highmem.o
  CC      arch/x86/kernel/cpu/debugfs.o
  CC      kernel/time/jiffies.o
  CC      drivers/acpi/acpica/nsaccess.o
  CC      drivers/base/cpu.o
  CC      kernel/cgroup/namespace.o
  CC      drivers/base/firmware.o
  CC      drivers/gpu/drm/virtio/virtgpu_debugfs.o
  CC      drivers/base/init.o
  CC      net/ipv4/inet_connection_sock.o
  CC      kernel/trace/trace_stat.o
  CC      arch/x86/kernel/cpu/capflags.o
  CC      net/ipv6/ip6_fib.o
  CC      net/ipv6/ipv6_sockglue.o
  CC      kernel/cgroup/cgroup-v1.o
  CC      net/rfkill/input.o
  CC      crypto/authenc.o
  CC      arch/x86/kernel/dumpstack_32.o
  CC      drivers/gpu/drm/i915/i915_module.o
  CC      drivers/base/power/wakeup_stats.o
  CC      drivers/acpi/acpica/nsalloc.o
  CC      kernel/time/timer_list.o
  CC      kernel/time/timeconv.o
  CC      kernel/exec_domain.o
  CC      mm/memory.o
  CC      drivers/base/power/trace.o
  AR      drivers/gpu/drm/panel/built-in.a
  CC      net/ipv4/tcp.o
  CC      net/ethtool/cmis_fw_update.o
  AR      arch/x86/kernel/cpu/built-in.a
  CC      kernel/panic.o
  CC      net/netfilter/nf_conntrack_acct.o
  CC      kernel/cgroup/freezer.o
  CC      kernel/cgroup/legacy_freezer.o
  CC      net/ethtool/cmis_cdb.o
  AR      net/netlabel/built-in.a
  CC      net/ethtool/pse-pd.o
  AR      kernel/bpf/built-in.a
  CC      lib/objpool.o
  CC      drivers/gpu/drm/virtio/virtgpu_plane.o
  CC      mm/mincore.o
  CC      drivers/acpi/acpica/nsarguments.o
  CC      drivers/gpu/drm/i915/i915_params.o
  CC      crypto/authencesn.o
  CC      kernel/cpu.o
  AR      net/rfkill/built-in.a
  CC      net/9p/mod.o
  CC      net/9p/client.o
  CC      net/dns_resolver/dns_key.o
  CC      net/handshake/alert.o
  CC      net/devres.o
  CC      net/handshake/genl.o
  CC      arch/x86/kernel/time.o
  CC      kernel/time/timecounter.o
  CC      net/mac80211/wep.o
  CC      net/mac80211/aead_api.o
  CC      net/handshake/netlink.o
  CC      net/mac80211/wpa.o
  CC      kernel/time/alarmtimer.o
  CC      drivers/acpi/acpica/nsconvert.o
  CC      kernel/trace/trace_printk.o
  CC      lib/plist.o
  CC      drivers/gpu/drm/i915/i915_pci.o
  CC      drivers/gpu/drm/i915/i915_scatterlist.o
  CC      drivers/gpu/drm/virtio/virtgpu_ioctl.o
  AR      drivers/base/power/built-in.a
  CC      drivers/gpu/drm/virtio/virtgpu_prime.o
  CC      drivers/base/map.o
  CC      drivers/acpi/mipi-disco-img.o
  CC      net/socket.o
  CC      arch/x86/kernel/ioport.o
  CC      net/sysctl_net.o
  CC      kernel/exit.o
  CC      drivers/gpu/drm/virtio/virtgpu_trace_points.o
  CC      net/dns_resolver/dns_query.o
  CC      net/ethtool/plca.o
  CC      fs/nfs/io.o
  CC      drivers/acpi/acpica/nsdump.o
  CC      net/netfilter/nf_conntrack_seqadj.o
  CC      fs/nfs/direct.o
  CC      drivers/gpu/drm/i915/i915_suspend.o
  CC      kernel/cgroup/pids.o
  CC      kernel/events/callchain.o
  CC      kernel/cgroup/rdma.o
  CC      net/mac80211/scan.o
  CC      drivers/gpu/drm/virtio/virtgpu_submit.o
  CC      net/core/rtnetlink.o
  CC      drivers/base/devres.o
  CC      net/core/utils.o
  CC      drivers/base/attribute_container.o
  CC      fs/nfs/pagelist.o
  CC      crypto/lzo.o
  CC      drivers/acpi/acpica/nseval.o
  CC      net/ipv6/ndisc.o
  CC      kernel/trace/pid_list.o
  CC      net/ipv6/udp.o
  CC      net/wireless/mesh.o
  CC      net/core/link_watch.o
  CC      net/core/filter.o
  CC      lib/radix-tree.o
  CC      kernel/cgroup/cpuset.o
  CC      drivers/base/transport_class.o
  CC      net/9p/error.o
  AR      drivers/gpu/drm/bridge/analogix/built-in.a
  CC      kernel/trace/trace_sched_switch.o
  AR      drivers/gpu/drm/bridge/cadence/built-in.a
  CC      arch/x86/kernel/dumpstack.o
  AR      drivers/gpu/drm/bridge/imx/built-in.a
  CC      kernel/time/posix-timers.o
  CC      kernel/trace/trace_nop.o
  CC      net/handshake/request.o
  AR      drivers/gpu/drm/bridge/synopsys/built-in.a
  AR      net/dns_resolver/built-in.a
  CC      net/handshake/tlshd.o
  AR      drivers/gpu/drm/bridge/built-in.a
  CC      kernel/cgroup/misc.o
  CC      kernel/time/posix-cpu-timers.o
  CC      net/sunrpc/sched.o
  CC      kernel/time/posix-clock.o
  CC      drivers/acpi/acpica/nsinit.o
  CC      net/sunrpc/auth.o
  CC      drivers/base/topology.o
  CC      crypto/lzo-rle.o
  CC      crypto/rng.o
  CC      kernel/events/hw_breakpoint.o
  AR      drivers/gpu/drm/hisilicon/built-in.a
  AR      drivers/gpu/drm/mxsfb/built-in.a
  AR      drivers/gpu/drm/tiny/built-in.a
  AR      drivers/gpu/drm/xlnx/built-in.a
  AR      drivers/gpu/drm/gud/built-in.a
  AR      drivers/gpu/drm/solomon/built-in.a
  CC      net/9p/protocol.o
  CC      kernel/events/uprobes.o
  AR      drivers/gpu/drm/virtio/built-in.a
  CC      net/mac80211/offchannel.o
  CC      net/9p/trans_common.o
  CC      net/mac80211/ht.o
  CC      crypto/drbg.o
  CC      drivers/gpu/drm/i915/i915_switcheroo.o
  AR      net/ethtool/built-in.a
  CC      drivers/gpu/drm/i915/i915_sysfs.o
  CC      net/ipv4/tcp_input.o
  CC      kernel/time/itimer.o
  CC      drivers/acpi/acpica/nsload.o
  CC      net/netfilter/nf_conntrack_proto_icmpv6.o
  CC      net/ipv4/tcp_output.o
  CC      kernel/cgroup/debug.o
  CC [M]  drivers/gpu/drm/scheduler/sched_main.o
  CC      net/core/sock_diag.o
  CC      lib/ratelimit.o
  CC      net/ipv6/udplite.o
  CC      drivers/gpu/drm/i915/i915_utils.o
  CC      arch/x86/kernel/nmi.o
  CC      kernel/trace/blktrace.o
  CC      drivers/base/container.o
  CC      kernel/time/clockevents.o
  CC      drivers/acpi/acpica/nsnames.o
  CC      fs/nfs/read.o
  CC      drivers/acpi/acpica/nsobject.o
  CC      lib/rbtree.o
  CC      crypto/jitterentropy.o
  CC      crypto/jitterentropy-kcapi.o
  CC      drivers/gpu/drm/i915/intel_clock_gating.o
  CC      kernel/time/tick-common.o
  CC      net/9p/trans_fd.o
  CC      net/netfilter/nf_conntrack_netlink.o
  CC      drivers/base/property.o
  CC      net/mac80211/agg-tx.o
  CC      net/netfilter/nf_conntrack_ftp.o
  CC      crypto/ghash-generic.o
  CC      net/ipv4/tcp_timer.o
  CC      net/core/dev_ioctl.o
  CC      drivers/acpi/acpica/nsparse.o
  CC      lib/seq_buf.o
  CC      drivers/gpu/drm/i915/intel_device_info.o
  CC      drivers/base/cacheinfo.o
  CC      net/handshake/trace.o
  CC      mm/mlock.o
  CC      drivers/base/swnode.o
  CC      drivers/gpu/drm/i915/intel_memory_region.o
  CC      mm/mmap.o
  CC      kernel/time/tick-broadcast.o
  CC      crypto/hash_info.o
  CC      net/netfilter/nf_conntrack_irc.o
  AR      drivers/mfd/built-in.a
  CC      kernel/trace/trace_events.o
  CC      drivers/acpi/acpica/nspredef.o
  CC      crypto/rsapubkey.asn1.o
  CC      crypto/rsaprivkey.asn1.o
  CC      fs/nfs/symlink.o
  CC      kernel/time/tick-broadcast-hrtimer.o
  AR      crypto/built-in.a
  CC      lib/siphash.o
  CC      arch/x86/kernel/ldt.o
  CC      lib/string.o
  CC      drivers/acpi/resource.o
  CC      net/wireless/ap.o
  AR      kernel/events/built-in.a
  CC      lib/timerqueue.o
  CC      fs/nfs/unlink.o
  CC      net/core/tso.o
  CC      lib/vsprintf.o
  CC      drivers/gpu/drm/i915/intel_pcode.o
  CC      drivers/base/auxiliary.o
  CC      drivers/acpi/acpica/nsprepkg.o
  CC [M]  drivers/gpu/drm/scheduler/sched_fence.o
  CC      lib/win_minmax.o
  AR      kernel/cgroup/built-in.a
  CC      net/ipv6/raw.o
  CC      net/ipv6/icmp.o
  CC      kernel/time/tick-oneshot.o
  CC      arch/x86/kernel/setup.o
  AR      drivers/nfc/built-in.a
  AR      drivers/dax/hmem/built-in.a
  AR      drivers/dax/built-in.a
  CC      kernel/time/tick-sched.o
  CC      drivers/dma-buf/dma-buf.o
  CC      drivers/dma-buf/dma-fence.o
  CC      net/ipv6/mcast.o
  CC      drivers/base/devtmpfs.o
  CC      lib/xarray.o
  AR      drivers/cxl/core/built-in.a
  CC      lib/lockref.o
  AR      drivers/cxl/built-in.a
  CC      net/9p/trans_virtio.o
  CC [M]  drivers/gpu/drm/scheduler/sched_entity.o
  CC      drivers/acpi/acpica/nsrepair.o
  CC      arch/x86/kernel/x86_init.o
  CC      drivers/base/module.o
  CC      kernel/trace/trace_export.o
  CC      net/ipv4/tcp_ipv4.o
  CC      kernel/time/timer_migration.o
  CC      drivers/macintosh/mac_hid.o
  CC      net/netfilter/nf_conntrack_sip.o
  CC      drivers/gpu/drm/i915/intel_region_ttm.o
  CC      net/core/sock_reuseport.o
  CC      fs/exportfs/expfs.o
  AR      drivers/scsi/pcmcia/built-in.a
  CC      drivers/scsi/scsi.o
  CC      kernel/time/vsyscall.o
  CC      drivers/scsi/hosts.o
  CC      net/sunrpc/auth_null.o
  CC      net/sunrpc/auth_tls.o
  CC      net/ipv4/tcp_minisocks.o
  CC      lib/bcd.o
  CC      drivers/base/auxiliary_sysfs.o
  CC      drivers/acpi/acpica/nsrepair2.o
  CC      fs/nfs/write.o
  CC      kernel/time/timekeeping_debug.o
  CC      drivers/gpu/drm/i915/intel_runtime_pm.o
  CC      arch/x86/kernel/i8259.o
  AR      drivers/nvme/common/built-in.a
  AR      net/handshake/built-in.a
  AR      drivers/nvme/host/built-in.a
  CC      drivers/ata/libata-core.o
  AR      drivers/nvme/target/built-in.a
  AR      drivers/nvme/built-in.a
  AR      drivers/net/pse-pd/built-in.a
  AR      drivers/net/phy/qcom/built-in.a
  CC      fs/lockd/clntlock.o
  CC      drivers/net/phy/mdio-boardinfo.o
  CC      net/core/fib_notifier.o
  CC      drivers/ata/libata-scsi.o
  LD [M]  drivers/gpu/drm/scheduler/gpu-sched.o
  CC      drivers/firewire/init_ohci1394_dma.o
  AR      drivers/macintosh/built-in.a
  CC      fs/lockd/clntproc.o
  CC      drivers/dma-buf/dma-fence-array.o
  CC      drivers/base/devcoredump.o
  CC      net/sunrpc/auth_unix.o
  AR      fs/exportfs/built-in.a
  CC      fs/nls/nls_base.o
  CC      net/netfilter/nf_nat_core.o
  AR      fs/unicode/built-in.a
  CC      fs/nls/nls_cp437.o
  CC      drivers/acpi/acpica/nssearch.o
  CC      kernel/time/namespace.o
  CC      net/ipv6/reassembly.o
  CC      kernel/trace/trace_event_perf.o
  CC      net/mac80211/agg-rx.o
  HOSTCC  drivers/gpu/drm/xe/xe_gen_wa_oob
  CC      arch/x86/kernel/irqinit.o
  CC      arch/x86/kernel/jump_label.o
  CC      drivers/acpi/acpi_processor.o
  CC      fs/lockd/clntxdr.o
  CC      drivers/acpi/processor_core.o
  AR      net/9p/built-in.a
  GEN     xe_wa_oob.c xe_wa_oob.h
  CC [M]  drivers/gpu/drm/xe/xe_bb.o
  CC      drivers/acpi/processor_pdc.o
  CC [M]  drivers/gpu/drm/xe/xe_bo.o
  CC      drivers/dma-buf/dma-fence-chain.o
  CC      drivers/scsi/scsi_ioctl.o
  CC      net/ipv6/tcp_ipv6.o
  CC      fs/lockd/host.o
  CC      drivers/acpi/acpica/nsutils.o
  CC      net/ipv4/tcp_cong.o
  CC      fs/nls/nls_ascii.o
  AR      drivers/firewire/built-in.a
  CC      net/mac80211/vht.o
  CC      drivers/base/platform-msi.o
  CC      net/core/xdp.o
  CC      drivers/net/phy/stubs.o
  CC      net/sunrpc/svc.o
  CC      kernel/trace/trace_events_filter.o
  CC      drivers/cdrom/cdrom.o
  CC      drivers/gpu/drm/drm_aperture.o
  AR      drivers/auxdisplay/built-in.a
  CC      drivers/pcmcia/cs.o
  CC      mm/mmu_gather.o
  CC      drivers/pcmcia/socket_sysfs.o
  CC      drivers/gpu/drm/i915/intel_sbi.o
  AR      kernel/time/built-in.a
  CC      kernel/softirq.o
  CC      fs/nls/nls_iso8859-1.o
  CC      lib/sort.o
  CC      drivers/acpi/ec.o
  CC      drivers/gpu/drm/drm_atomic.o
  CC      drivers/acpi/acpica/nswalk.o
  CC      arch/x86/kernel/irq_work.o
  CC      mm/mprotect.o
  CC      arch/x86/kernel/probe_roms.o
  CC      lib/parser.o
  CC      drivers/base/physical_location.o
  CC      drivers/dma-buf/dma-fence-unwrap.o
  CC      kernel/resource.o
  CC      drivers/usb/common/common.o
  CC      kernel/trace/trace_events_trigger.o
  CC      lib/debug_locks.o
  CC      mm/mremap.o
  CC      net/mac80211/he.o
  CC      fs/lockd/svc.o
  CC      drivers/acpi/dock.o
  CC      drivers/acpi/pci_root.o
  CC      drivers/scsi/scsicam.o
  CC      fs/nls/nls_utf8.o
  CC      drivers/dma-buf/dma-resv.o
  CC      drivers/acpi/acpica/nsxfeval.o
  CC      kernel/trace/trace_eprobe.o
  CC [M]  drivers/gpu/drm/xe/xe_bo_evict.o
  CC      lib/random32.o
  CC      drivers/net/phy/mdio_devres.o
  CC      fs/lockd/svclock.o
  CC      drivers/base/trace.o
  CC      net/ipv6/ping.o
  CC      net/ipv6/exthdrs.o
  CC      net/mac80211/s1g.o
  CC      drivers/pcmcia/cardbus.o
  CC      net/netfilter/nf_nat_proto.o
  AR      fs/nls/built-in.a
  CC      fs/autofs/init.o
  CC      fs/9p/vfs_super.o
  CC      fs/9p/vfs_inode.o
  CC      drivers/ata/libata-eh.o
  CC      lib/bust_spinlocks.o
  CC      drivers/gpu/drm/i915/intel_step.o
  CC      mm/msync.o
  CC      drivers/usb/common/debug.o
  CC      drivers/acpi/acpica/nsxfname.o
  CC      net/ipv4/tcp_metrics.o
  AR      drivers/usb/common/built-in.a
  CC      drivers/scsi/scsi_error.o
  CC      drivers/usb/core/usb.o
  CC      arch/x86/kernel/sys_ia32.o
  CC      drivers/usb/core/hub.o
  CC [M]  drivers/gpu/drm/xe/xe_debugfs.o
  CC      drivers/ata/libata-transport.o
  CC      net/ipv6/datagram.o
  CC      drivers/scsi/scsi_lib.o
  CC      kernel/trace/trace_kprobe.o
  CC      net/core/flow_offload.o
  CC      net/core/gro.o
  CC      mm/page_vma_mapped.o
  CC      drivers/usb/core/hcd.o
  CC      net/core/netdev-genl.o
  CC      fs/nfs/namespace.o
  CC      drivers/acpi/pci_link.o
  CC      drivers/dma-buf/sync_file.o
  AR      drivers/cdrom/built-in.a
  CC      drivers/pcmcia/ds.o
  CC      drivers/acpi/pci_irq.o
  CC      drivers/usb/core/urb.o
  CC      drivers/net/phy/phy.o
  CC      drivers/acpi/acpica/nsxfobj.o
  AR      drivers/base/built-in.a
  CC      lib/kasprintf.o
  CC      drivers/scsi/constants.o
  CC      net/ipv4/tcp_fastopen.o
  CC      drivers/usb/core/message.o
  CC      drivers/gpu/drm/drm_atomic_uapi.o
  CC      fs/autofs/inode.o
  CC      kernel/sysctl.o
  CC      kernel/trace/error_report-traces.o
  CC      net/core/netdev-genl-gen.o
  CC      lib/bitmap.o
  CC      lib/scatterlist.o
  CC      drivers/acpi/acpica/psargs.o
  CC      arch/x86/kernel/ksysfs.o
  CC      fs/lockd/svcshare.o
  CC      drivers/gpu/drm/i915/intel_uncore.o
  CC      fs/9p/vfs_inode_dotl.o
  CC      net/mac80211/ibss.o
  AR      drivers/dma-buf/built-in.a
  CC      net/wireless/trace.o
  CC      drivers/input/serio/serio.o
  CC      net/mac80211/iface.o
  CC      mm/pagewalk.o
  CC      lib/list_sort.o
  CC      net/netfilter/nf_nat_helper.o
  CC [M]  drivers/gpu/drm/xe/xe_devcoredump.o
  CC      net/netfilter/nf_nat_masquerade.o
  CC      drivers/usb/core/driver.o
  CC      net/ipv6/ip6_flowlabel.o
  CC      mm/pgtable-generic.o
  CC      lib/uuid.o
  CC      arch/x86/kernel/bootflag.o
  CC      drivers/acpi/acpi_apd.o
  CC      drivers/acpi/acpica/psloop.o
  CC      drivers/ata/libata-trace.o
  CC      drivers/ata/libata-sata.o
  CC      drivers/scsi/scsi_lib_dma.o
  CC      fs/autofs/root.o
  CC      drivers/scsi/scsi_scan.o
  CC      kernel/trace/power-traces.o
  CC      fs/nfs/mount_clnt.o
  CC      drivers/pcmcia/pcmcia_resource.o
  CC      arch/x86/kernel/e820.o
  CC      drivers/input/serio/i8042.o
  CC      lib/iov_iter.o
  CC      net/wireless/ocb.o
  CC      fs/nfs/nfstrace.o
  CC      drivers/acpi/acpica/psobject.o
  CC      net/ipv6/inet6_connection_sock.o
  GEN     drivers/scsi/scsi_devinfo_tbl.c
  CC      net/ipv6/udp_offload.o
  CC      arch/x86/kernel/pci-dma.o
  CC      net/ipv6/seg6.o
  CC      arch/x86/kernel/quirks.o
  CC      fs/nfs/export.o
  CC      drivers/input/serio/serport.o
  CC      drivers/acpi/acpica/psopcode.o
  CC      drivers/input/serio/libps2.o
  CC      net/ipv4/tcp_rate.o
  CC      drivers/net/phy/phy-c45.o
  CC      fs/9p/vfs_addr.o
  CC      fs/lockd/svcproc.o
  CC [M]  drivers/gpu/drm/xe/xe_device.o
  CC      net/sunrpc/svcsock.o
  CC      drivers/acpi/acpica/psopinfo.o
  CC [M]  drivers/gpu/drm/xe/xe_device_sysfs.o
  CC      drivers/scsi/scsi_devinfo.o
  CC      mm/rmap.o
  CC      net/core/gso.o
  CC      net/core/net-sysfs.o
  CC      drivers/ata/libata-sff.o
  CC      lib/clz_ctz.o
  CC      fs/nfs/sysfs.o
  CC      lib/bsearch.o
  CC      mm/vmalloc.o
  CC      fs/autofs/symlink.o
  CC      drivers/usb/core/config.o
  CC      fs/autofs/waitq.o
  CC      kernel/trace/rpm-traces.o
  CC      drivers/acpi/acpica/psparse.o
  CC      fs/nfs/fs_context.o
  CC      arch/x86/kernel/kdebugfs.o
  CC      drivers/ata/libata-pmp.o
  CC      drivers/acpi/acpi_platform.o
  CC      drivers/ata/libata-acpi.o
  CC      net/netfilter/nf_nat_ftp.o
  CC      drivers/ata/libata-pata-timings.o
  CC      net/sunrpc/svcauth.o
  CC      drivers/acpi/acpi_pnp.o
  CC      drivers/pcmcia/cistpl.o
  CC      drivers/gpu/drm/i915/intel_wakeref.o
  CC      drivers/pcmcia/pcmcia_cis.o
  CC      drivers/net/phy/phy-core.o
  CC      drivers/net/phy/phy_device.o
  CC      net/ipv6/fib6_notifier.o
  CC      net/ipv6/rpl.o
  AR      drivers/input/serio/built-in.a
  CC      drivers/acpi/power.o
  CC      drivers/acpi/acpica/psscope.o
  CC      drivers/acpi/acpica/pstree.o
  CC      fs/9p/vfs_file.o
  CC      fs/nfs/nfsroot.o
  CC      drivers/net/phy/linkmode.o
  CC      drivers/scsi/scsi_sysctl.o
  CC      drivers/usb/core/file.o
  CC      arch/x86/kernel/alternative.o
  CC      drivers/acpi/event.o
  CC      fs/lockd/svcsubs.o
  CC      fs/autofs/expire.o
  CC      drivers/pcmcia/rsrc_mgr.o
  CC      drivers/scsi/scsi_proc.o
  CC      net/ipv4/tcp_recovery.o
  CC [M]  drivers/gpu/drm/xe/xe_dma_buf.o
  CC      fs/9p/vfs_dir.o
  CC      drivers/usb/core/buffer.o
  CC      drivers/acpi/acpica/psutils.o
  CC      fs/lockd/mon.o
  CC      net/netfilter/nf_nat_irc.o
  CC      kernel/trace/trace_dynevent.o
  CC      kernel/capability.o
  CC      drivers/scsi/scsi_debugfs.o
  CC      drivers/usb/core/sysfs.o
  CC      lib/find_bit.o
  CC      drivers/ata/ahci.o
  CC      drivers/acpi/evged.o
  CC      drivers/ata/libahci.o
  CC      net/core/hotdata.o
  CC      fs/autofs/dev-ioctl.o
  CC      net/ipv6/ioam6.o
  CC      drivers/acpi/acpica/pswalk.o
  CC      drivers/gpu/drm/i915/vlv_sideband.o
  CC      fs/nfs/sysctl.o
  CC      drivers/acpi/acpica/psxface.o
  CC      drivers/acpi/acpica/rsaddr.o
  CC      net/mac80211/link.o
  CC      lib/llist.o
  CC      fs/nfs/nfs3super.o
  CC      drivers/net/phy/mdio_bus.o
  CC      drivers/acpi/acpica/rscalc.o
  CC      net/ipv6/sysctl_net_ipv6.o
  CC      net/core/net-procfs.o
  CC      net/ipv6/xfrm6_policy.o
  CC      lib/lwq.o
  CC      arch/x86/kernel/i8253.o
  CC      net/sunrpc/svcauth_unix.o
  CC      net/wireless/pmsr.o
  CC      drivers/gpu/drm/drm_auth.o
  CC      drivers/acpi/sysfs.o
  CC      drivers/pcmcia/rsrc_nonstatic.o
  CC      drivers/usb/core/endpoint.o
  CC      fs/9p/vfs_dentry.o
  CC      net/sunrpc/addr.o
  CC      drivers/acpi/property.o
  CC      drivers/acpi/debugfs.o
  CC [M]  drivers/gpu/drm/xe/xe_drm_client.o
  CC      lib/memweight.o
  CC      drivers/scsi/scsi_trace.o
  CC      drivers/pcmcia/yenta_socket.o
  CC      drivers/scsi/scsi_logging.o
  CC      lib/kfifo.o
  CC      kernel/trace/trace_probe.o
  CC      kernel/trace/trace_uprobe.o
  CC      net/mac80211/rate.o
  CC      drivers/acpi/acpica/rscreate.o
  GEN     net/wireless/shipped-certs.c
  CC      drivers/net/phy/mdio_device.o
  CC      fs/9p/v9fs.o
  CC      net/mac80211/michael.o
  CC      net/netfilter/nf_nat_sip.o
  CC      net/ipv6/xfrm6_state.o
  AR      fs/autofs/built-in.a
  CC      net/ipv4/tcp_ulp.o
  CC      fs/lockd/trace.o
  CC      net/sunrpc/rpcb_clnt.o
  CC      arch/x86/kernel/hw_breakpoint.o
  CC      net/wireless/shipped-certs.o
  CC      drivers/net/phy/swphy.o
  CC      drivers/gpu/drm/i915/vlv_suspend.o
  CC      drivers/input/keyboard/atkbd.o
  CC      drivers/input/mouse/psmouse-base.o
  CC      drivers/input/mouse/synaptics.o
  CC      drivers/gpu/drm/i915/soc/intel_dram.o
  CC      drivers/usb/core/devio.o
  CC      drivers/input/mouse/focaltech.o
  CC      drivers/net/phy/fixed_phy.o
  CC      drivers/usb/core/notify.o
  CC      drivers/input/mouse/alps.o
  CC      drivers/acpi/acpica/rsdumpinfo.o
  CC      drivers/input/mouse/byd.o
  CC      drivers/acpi/acpi_lpat.o
  CC      drivers/gpu/drm/drm_blend.o
  CC      net/core/netpoll.o
  AR      fs/hostfs/built-in.a
  CC      fs/debugfs/inode.o
  CC      fs/tracefs/inode.o
  CC      drivers/scsi/scsi_pm.o
  CC      fs/tracefs/event_inode.o
  CC      fs/debugfs/file.o
  CC      fs/nfs/nfs3client.o
  CC      net/sunrpc/timer.o
  CC      fs/9p/fid.o
  CC      fs/nfs/nfs3proc.o
  CC      lib/percpu-refcount.o
  CC      drivers/acpi/acpica/rsinfo.o
  CC      mm/process_vm_access.o
  CC [M]  drivers/gpu/drm/xe/xe_exec.o
  CC      net/mac80211/tkip.o
  CC      drivers/net/phy/realtek.o
  CC      drivers/ata/ata_piix.o
  CC      drivers/gpu/drm/i915/soc/intel_gmch.o
  CC      drivers/usb/core/generic.o
  CC      drivers/input/mouse/logips2pp.o
  CC      arch/x86/kernel/tsc.o
  CC      net/ipv6/xfrm6_input.o
  AR      drivers/pcmcia/built-in.a
  CC      net/mac80211/aes_cmac.o
  CC      drivers/rtc/lib.o
  CC      net/core/fib_rules.o
  CC      drivers/rtc/class.o
  CC      drivers/acpi/acpica/rsio.o
  CC      arch/x86/kernel/tsc_msr.o
  CC      net/ipv4/tcp_offload.o
  AR      drivers/input/keyboard/built-in.a
  CC      net/ipv6/xfrm6_output.o
  CC      mm/page_alloc.o
  CC      fs/lockd/xdr.o
  CC      net/netfilter/x_tables.o
  CC      drivers/scsi/scsi_bsg.o
  CC      kernel/trace/rethook.o
  CC      drivers/ata/pata_amd.o
  CC      drivers/acpi/acpica/rsirq.o
  CC      fs/9p/xattr.o
  CC      drivers/usb/core/quirks.o
  CC      lib/rhashtable.o
  CC      net/ipv4/tcp_plb.o
  CC      drivers/gpu/drm/i915/soc/intel_pch.o
  CC      drivers/gpu/drm/i915/i915_memcpy.o
  CC      drivers/input/mouse/lifebook.o
  CC      drivers/acpi/acpica/rslist.o
  AR      fs/tracefs/built-in.a
  CC      drivers/ata/pata_oldpiix.o
  CC      drivers/scsi/scsi_common.o
  CC      drivers/ata/pata_sch.o
  CC      lib/base64.o
  CC      net/ipv4/datagram.o
  CC      drivers/gpu/drm/drm_bridge.o
  CC      drivers/gpu/drm/drm_cache.o
  CC      drivers/i2c/algos/i2c-algo-bit.o
  CC      drivers/i2c/busses/i2c-i801.o
  CC      drivers/ata/pata_mpiix.o
  CC [M]  drivers/gpu/drm/xe/xe_execlist.o
  CC      drivers/input/mouse/trackpoint.o
  CC      drivers/rtc/interface.o
  AR      fs/debugfs/built-in.a
  CC      drivers/input/mouse/cypress_ps2.o
  CC      drivers/acpi/acpica/rsmemory.o
  CC [M]  fs/efivarfs/inode.o
  CC      drivers/ata/ata_generic.o
  CC      net/sunrpc/xdr.o
  AR      drivers/i2c/muxes/built-in.a
  CC [M]  fs/efivarfs/file.o
  CC      drivers/acpi/acpi_pcc.o
  CC [M]  fs/efivarfs/super.o
  CC      fs/nfs/nfs3xdr.o
  CC      net/core/net-traces.o
  CC      drivers/scsi/scsi_transport_spi.o
  CC      drivers/i2c/i2c-boardinfo.o
  AR      drivers/net/phy/built-in.a
  CC      drivers/net/mdio/acpi_mdio.o
  CC      arch/x86/kernel/io_delay.o
  CC      arch/x86/kernel/rtc.o
  AR      kernel/trace/built-in.a
  CC      kernel/ptrace.o
  AR      fs/9p/built-in.a
  CC      net/netfilter/xt_tcpudp.o
  CC      drivers/net/mdio/fwnode_mdio.o
  CC      drivers/usb/core/devices.o
  CC      drivers/acpi/acpica/rsmisc.o
  CC      fs/lockd/clnt4xdr.o
  CC [M]  fs/efivarfs/vars.o
  CC      net/ipv6/xfrm6_protocol.o
  CC      drivers/gpu/drm/drm_client.o
  CC      fs/open.o
  CC      drivers/scsi/virtio_scsi.o
  AR      drivers/net/pcs/built-in.a
  CC      drivers/usb/core/phy.o
  AR      drivers/net/ethernet/3com/built-in.a
  CC      drivers/net/ethernet/8390/ne2k-pci.o
  CC      drivers/usb/core/port.o
  AR      drivers/net/wireless/admtek/built-in.a
  CC      drivers/usb/core/hcd-pci.o
  CC      drivers/net/ethernet/8390/8390.o
  CC      drivers/gpu/drm/drm_client_modeset.o
  CC      lib/once.o
  AR      drivers/net/wireless/ath/built-in.a
  CC      net/core/selftests.o
  AR      drivers/net/wireless/atmel/built-in.a
  CC      drivers/scsi/sd.o
  CC      drivers/scsi/sr.o
  AR      drivers/net/wireless/broadcom/built-in.a
  CC      drivers/gpu/drm/i915/i915_mm.o
  CC      net/mac80211/aes_gmac.o
  AR      drivers/net/wireless/intel/built-in.a
  CC      drivers/input/mouse/psmouse-smbus.o
  CC      net/core/ptp_classifier.o
  AR      drivers/net/wireless/intersil/built-in.a
  AR      drivers/i2c/algos/built-in.a
  AR      drivers/net/wireless/marvell/built-in.a
  CC      fs/nfs/nfs3acl.o
  AR      drivers/net/wireless/mediatek/built-in.a
  AR      drivers/usb/phy/built-in.a
  CC      net/mac80211/fils_aead.o
  AR      drivers/net/wireless/microchip/built-in.a
  AR      drivers/net/ethernet/adaptec/built-in.a
  CC      net/core/netprio_cgroup.o
  AR      drivers/net/wireless/purelifi/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_exec_queue.o
  AR      drivers/net/wireless/quantenna/built-in.a
  AR      drivers/net/wireless/ralink/built-in.a
  AR      drivers/ata/built-in.a
  AR      drivers/net/wireless/realtek/built-in.a
  CC      net/core/netclassid_cgroup.o
  AR      drivers/net/wireless/rsi/built-in.a
  CC      arch/x86/kernel/resource.o
  AR      drivers/net/wireless/silabs/built-in.a
  AR      drivers/net/wireless/st/built-in.a
  CC      net/ipv4/raw.o
  CC      drivers/acpi/acpica/rsserial.o
  AR      drivers/net/wireless/ti/built-in.a
  AS      arch/x86/kernel/irqflags.o
  CC      net/ipv4/udp.o
  AR      drivers/net/wireless/zydas/built-in.a
  CC      lib/refcount.o
  AR      drivers/net/wireless/virtual/built-in.a
  CC      net/ipv4/udplite.o
  CC      drivers/i2c/i2c-core-base.o
  AR      drivers/net/wireless/built-in.a
  AR      drivers/i2c/busses/built-in.a
  CC      lib/rcuref.o
  CC      lib/usercopy.o
  CC      drivers/i2c/i2c-core-smbus.o
  AR      drivers/i3c/built-in.a
  CC      drivers/i2c/i2c-core-acpi.o
  CC      arch/x86/kernel/static_call.o
  CC      drivers/usb/core/usb-acpi.o
  CC      net/ipv6/netfilter.o
  LD [M]  fs/efivarfs/efivarfs.o
  CC [M]  drivers/gpu/drm/xe/xe_force_wake.o
  CC      net/mac80211/cfg.o
  CC      lib/errseq.o
  AR      drivers/net/mdio/built-in.a
  CC      drivers/i2c/i2c-smbus.o
  CC      drivers/scsi/sr_ioctl.o
  CC      drivers/acpi/acpica/rsutils.o
  CC      net/core/dst_cache.o
  CC      lib/bucket_locks.o
  AR      drivers/media/i2c/built-in.a
  CC      kernel/user.o
  AR      drivers/media/tuners/built-in.a
  CC      lib/generic-radix-tree.o
  AR      drivers/media/rc/keymaps/built-in.a
  CC      drivers/rtc/nvmem.o
  AR      drivers/media/rc/built-in.a
  CC      lib/bitmap-str.o
  AR      drivers/media/common/b2c2/built-in.a
  CC      fs/lockd/xdr4.o
  AR      drivers/media/common/saa7146/built-in.a
  CC      net/netfilter/xt_CONNSECMARK.o
  AR      drivers/input/mouse/built-in.a
  AR      drivers/media/common/siano/built-in.a
  AR      drivers/input/joystick/built-in.a
  AR      drivers/media/common/v4l2-tpg/built-in.a
  AR      drivers/input/tablet/built-in.a
  CC      arch/x86/kernel/process.o
  AR      drivers/media/common/videobuf2/built-in.a
  AR      drivers/input/touchscreen/built-in.a
  AR      drivers/input/misc/built-in.a
  AR      drivers/media/common/built-in.a
  AR      drivers/pps/clients/built-in.a
  CC      net/netfilter/xt_NFLOG.o
  CC      drivers/input/input.o
  CC      net/core/gro_cells.o
  AR      drivers/pps/generators/built-in.a
  CC      drivers/pps/pps.o
  CC      drivers/input/input-compat.o
  AR      drivers/net/ethernet/agere/built-in.a
  AR      drivers/media/platform/allegro-dvt/built-in.a
  CC      drivers/scsi/sr_vendor.o
  CC      drivers/gpu/drm/i915/i915_sw_fence.o
  CC      drivers/pps/kapi.o
  CC      drivers/gpu/drm/drm_color_mgmt.o
  AR      drivers/media/platform/amlogic/meson-ge2d/built-in.a
  AR      drivers/media/platform/amlogic/built-in.a
  AR      drivers/media/platform/amphion/built-in.a
  AR      drivers/net/ethernet/8390/built-in.a
  AR      drivers/media/platform/aspeed/built-in.a
  AR      drivers/net/ethernet/alacritech/built-in.a
  AR      drivers/media/platform/atmel/built-in.a
  AR      drivers/net/ethernet/alteon/built-in.a
  AR      drivers/media/platform/broadcom/built-in.a
  CC      net/core/failover.o
  AR      drivers/net/ethernet/amazon/built-in.a
  CC      drivers/acpi/acpica/rsxface.o
  AR      drivers/media/platform/cadence/built-in.a
  AR      drivers/net/ethernet/amd/built-in.a
  AR      drivers/net/ethernet/aquantia/built-in.a
  CC      drivers/pps/sysfs.o
  AR      drivers/media/platform/chips-media/coda/built-in.a
  CC      kernel/signal.o
  AR      drivers/net/ethernet/arc/built-in.a
  AR      drivers/media/platform/chips-media/wave5/built-in.a
  AR      drivers/media/platform/chips-media/built-in.a
  AR      drivers/net/ethernet/asix/built-in.a
  CC      drivers/gpu/drm/drm_connector.o
  CC      drivers/gpu/drm/drm_crtc.o
  AR      drivers/net/ethernet/atheros/built-in.a
  AR      drivers/media/platform/imagination/built-in.a
  AR      drivers/usb/core/built-in.a
  CC      drivers/gpu/drm/drm_displayid.o
  AR      drivers/net/ethernet/cadence/built-in.a
  CC      drivers/gpu/drm/drm_drv.o
  AR      drivers/media/platform/intel/built-in.a
  CC      drivers/usb/mon/mon_main.o
  AR      drivers/media/platform/marvell/built-in.a
  CC      drivers/net/ethernet/broadcom/bnx2.o
  CC      drivers/usb/mon/mon_stat.o
  AR      drivers/media/platform/mediatek/jpeg/built-in.a
  CC      drivers/rtc/dev.o
  CC      drivers/usb/mon/mon_text.o
  CC      drivers/usb/mon/mon_bin.o
  AR      drivers/media/platform/mediatek/mdp/built-in.a
  CC      net/netfilter/xt_SECMARK.o
  AR      drivers/media/platform/mediatek/vcodec/common/built-in.a
  AR      drivers/media/platform/mediatek/vcodec/encoder/built-in.a
  AR      drivers/media/platform/mediatek/vpu/built-in.a
  CC      net/netfilter/xt_TCPMSS.o
  AR      drivers/media/platform/mediatek/vcodec/decoder/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_ggtt.o
  AR      drivers/media/platform/mediatek/vcodec/built-in.a
  AR      drivers/media/platform/mediatek/mdp3/built-in.a
  AR      drivers/media/platform/mediatek/built-in.a
  CC      net/netfilter/xt_conntrack.o
  CC      drivers/acpi/acpica/tbdata.o
  AR      drivers/media/platform/microchip/built-in.a
  CC      fs/read_write.o
  CC      lib/string_helpers.o
  AR      drivers/media/platform/nuvoton/built-in.a
  AR      drivers/media/platform/nvidia/tegra-vde/built-in.a
  CC      fs/file_table.o
  AR      drivers/media/platform/nvidia/built-in.a
  CC      lib/hexdump.o
  AR      drivers/media/platform/nxp/dw100/built-in.a
  CC      lib/kstrtox.o
  AR      drivers/media/platform/nxp/imx-jpeg/built-in.a
  CC      lib/iomap.o
  CC      drivers/rtc/proc.o
  AR      drivers/pps/built-in.a
  AR      drivers/media/platform/nxp/imx8-isi/built-in.a
  CC      fs/nfs/nfs4proc.o
  CC      drivers/gpu/drm/i915/i915_sw_fence_work.o
  AR      drivers/media/platform/nxp/built-in.a
  AR      drivers/media/platform/qcom/camss/built-in.a
  AR      drivers/media/platform/qcom/venus/built-in.a
  AR      drivers/media/platform/qcom/built-in.a
  CC      fs/nfs/nfs4xdr.o
  CC      drivers/gpu/drm/drm_dumb_buffers.o
  CC      mm/init-mm.o
  CC      fs/nfs/nfs4state.o
  AR      drivers/media/platform/raspberrypi/pisp_be/built-in.a
  CC      mm/memblock.o
  AR      drivers/media/platform/raspberrypi/built-in.a
  AR      drivers/media/platform/renesas/rcar-vin/built-in.a
  CC      drivers/acpi/ac.o
  AR      drivers/media/platform/renesas/rzg2l-cru/built-in.a
  AR      drivers/media/platform/renesas/vsp1/built-in.a
  AR      drivers/media/platform/renesas/built-in.a
  CC      net/ipv6/proc.o
  CC      drivers/acpi/button.o
  AR      drivers/media/platform/rockchip/rga/built-in.a
  CC      lib/iomap_copy.o
  CC      kernel/sys.o
  CC      fs/lockd/svc4proc.o
  AR      drivers/media/platform/rockchip/rkisp1/built-in.a
  CC      drivers/scsi/sg.o
  AR      drivers/media/platform/rockchip/built-in.a
  CC      net/netfilter/xt_policy.o
  CC      lib/devres.o
  AR      drivers/media/platform/samsung/exynos-gsc/built-in.a
  AR      drivers/media/platform/samsung/exynos4-is/built-in.a
  CC      drivers/acpi/acpica/tbfadt.o
  AR      drivers/media/platform/samsung/s3c-camif/built-in.a
  CC      drivers/gpu/drm/i915/i915_syncmap.o
  AR      drivers/media/platform/st/sti/bdisp/built-in.a
  AR      drivers/media/platform/samsung/s5p-g2d/built-in.a
  CC      drivers/scsi/scsi_sysfs.o
  AR      drivers/media/platform/samsung/s5p-jpeg/built-in.a
  AR      drivers/media/platform/st/sti/c8sectpfe/built-in.a
  CC      drivers/rtc/sysfs.o
  CC      fs/lockd/procfs.o
  AR      drivers/media/platform/samsung/s5p-mfc/built-in.a
  CC      net/netfilter/xt_state.o
  AR      drivers/media/platform/samsung/built-in.a
  AR      drivers/media/platform/st/sti/delta/built-in.a
  CC      fs/nfs/nfs4renewd.o
  AR      drivers/media/platform/st/sti/hva/built-in.a
  AR      drivers/media/platform/st/stm32/built-in.a
  CC      drivers/usb/host/pci-quirks.o
  AR      drivers/media/platform/st/built-in.a
  CC [M]  net/netfilter/nf_log_syslog.o
  CC      drivers/usb/host/ehci-hcd.o
  CC [M]  net/netfilter/xt_mark.o
  AR      drivers/media/platform/sunxi/sun4i-csi/built-in.a
  CC      drivers/rtc/rtc-mc146818-lib.o
  AR      drivers/i2c/built-in.a
  AR      drivers/media/platform/sunxi/sun6i-csi/built-in.a
  CC      drivers/rtc/rtc-cmos.o
  AR      drivers/media/platform/sunxi/sun6i-mipi-csi2/built-in.a
  AR      drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/built-in.a
  AR      drivers/media/platform/sunxi/sun8i-di/built-in.a
  AR      drivers/media/platform/sunxi/sun8i-rotate/built-in.a
  AR      drivers/net/ethernet/brocade/built-in.a
  AR      drivers/media/platform/sunxi/built-in.a
  CC      drivers/gpu/drm/drm_edid.o
  AR      drivers/net/ethernet/cavium/common/built-in.a
  AR      drivers/net/ethernet/chelsio/built-in.a
  CC      drivers/acpi/fan_core.o
  AR      drivers/net/ethernet/cavium/thunder/built-in.a
  AR      drivers/net/ethernet/cavium/liquidio/built-in.a
  CC      drivers/acpi/fan_attr.o
  CC [M]  drivers/gpu/drm/xe/xe_gpu_scheduler.o
  CC      net/ipv6/syncookies.o
  CC      net/ipv6/calipso.o
  AR      drivers/net/ethernet/cavium/octeon/built-in.a
  AR      drivers/media/platform/ti/am437x/built-in.a
  AR      drivers/net/ethernet/cavium/built-in.a
  AR      drivers/media/platform/ti/cal/built-in.a
  CC      drivers/gpu/drm/drm_eld.o
  CC      drivers/usb/host/ehci-pci.o
  AR      drivers/media/platform/ti/vpe/built-in.a
  AR      drivers/usb/mon/built-in.a
  CC      lib/check_signature.o
  AR      drivers/media/platform/ti/davinci/built-in.a
  CC      drivers/usb/host/ohci-hcd.o
  CC      drivers/acpi/acpica/tbfind.o
  CC      drivers/input/input-mt.o
  AR      drivers/media/platform/ti/j721e-csi2rx/built-in.a
  AR      drivers/media/platform/ti/omap/built-in.a
  AR      drivers/media/platform/ti/omap3isp/built-in.a
  CC      arch/x86/kernel/ptrace.o
  AR      drivers/media/platform/ti/built-in.a
  AR      drivers/net/ethernet/cisco/built-in.a
  CC      net/sunrpc/sunrpc_syms.o
  CC      drivers/gpu/drm/drm_encoder.o
  CC      drivers/gpu/drm/i915/i915_user_extensions.o
  AR      drivers/media/platform/verisilicon/built-in.a
  AR      drivers/net/ethernet/cortina/built-in.a
  AR      drivers/media/platform/via/built-in.a
  AR      drivers/media/platform/xilinx/built-in.a
  AR      drivers/media/platform/built-in.a
  AR      drivers/net/ethernet/dec/tulip/built-in.a
  AR      drivers/net/ethernet/dec/built-in.a
  CC      net/sunrpc/cache.o
  AR      drivers/net/ethernet/dlink/built-in.a
  CC      lib/interval_tree.o
  CC      drivers/acpi/fan_hwmon.o
  AR      drivers/media/pci/ttpci/built-in.a
  AR      drivers/media/pci/b2c2/built-in.a
  CC [M]  net/netfilter/xt_nat.o
  AR      drivers/media/usb/b2c2/built-in.a
  AR      drivers/media/pci/pluto2/built-in.a
  AR      drivers/media/usb/dvb-usb/built-in.a
  AR      drivers/media/pci/dm1105/built-in.a
  AR      drivers/media/pci/pt1/built-in.a
  AR      drivers/media/usb/dvb-usb-v2/built-in.a
  AR      drivers/media/pci/pt3/built-in.a
  AR      drivers/net/ethernet/emulex/built-in.a
  AR      drivers/media/usb/s2255/built-in.a
  CC      lib/assoc_array.o
  CC [M]  drivers/gpu/drm/xe/xe_gsc.o
  AR      drivers/media/pci/mantis/built-in.a
  AR      drivers/media/usb/siano/built-in.a
  AR      drivers/media/pci/ngene/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_gsc_proxy.o
  AR      drivers/media/usb/ttusb-budget/built-in.a
  AR      drivers/media/usb/ttusb-dec/built-in.a
  AR      drivers/media/pci/ddbridge/built-in.a
  AR      drivers/media/usb/built-in.a
  AR      drivers/media/pci/saa7146/built-in.a
  AR      drivers/net/ethernet/engleder/built-in.a
  CC      lib/bitrev.o
  AR      drivers/media/pci/smipcie/built-in.a
  AR      drivers/net/ethernet/ezchip/built-in.a
  AR      drivers/media/pci/netup_unidvb/built-in.a
  CC      drivers/usb/host/ohci-pci.o
  CC      drivers/acpi/acpica/tbinstal.o
  AR      drivers/media/pci/intel/ipu3/built-in.a
  CC      drivers/acpi/acpica/tbprint.o
  CC      drivers/gpu/drm/i915/i915_debugfs.o
  AR      drivers/media/pci/intel/ivsc/built-in.a
  AR      drivers/media/pci/intel/built-in.a
  CC      drivers/acpi/acpica/tbutils.o
  CC      drivers/acpi/acpi_video.o
  AR      drivers/media/pci/built-in.a
  AR      drivers/media/mmc/siano/built-in.a
  AR      drivers/media/mmc/built-in.a
  AR      drivers/media/firewire/built-in.a
  CC      arch/x86/kernel/tls.o
  AR      drivers/media/spi/built-in.a
  AR      drivers/media/test-drivers/built-in.a
  CC      drivers/acpi/video_detect.o
  AR      drivers/media/built-in.a
  AR      fs/lockd/built-in.a
  CC      drivers/ptp/ptp_clock.o
  CC      drivers/power/supply/power_supply_core.o
  CC      mm/slub.o
  CC      drivers/power/supply/power_supply_sysfs.o
  CC      drivers/hwmon/hwmon.o
  CC      drivers/ptp/ptp_chardev.o
  CC      drivers/gpu/drm/i915/i915_debugfs_params.o
  CC      drivers/ptp/ptp_sysfs.o
  CC      arch/x86/kernel/step.o
  CC      mm/madvise.o
  AR      drivers/thermal/broadcom/built-in.a
  AR      drivers/thermal/renesas/built-in.a
  CC      drivers/input/input-poller.o
  CC      lib/crc-ccitt.o
  AR      drivers/watchdog/built-in.a
  AR      drivers/thermal/samsung/built-in.a
  CC      drivers/input/ff-core.o
  CC      mm/page_io.o
  CC      drivers/thermal/intel/intel_tcc.o
  AR      drivers/rtc/built-in.a
  CC      kernel/umh.o
  CC      drivers/acpi/acpica/tbxface.o
  CC      drivers/gpu/drm/drm_file.o
  CC      net/ipv4/udp_offload.o
  CC      fs/nfs/nfs4super.o
  AR      drivers/scsi/built-in.a
  CC      drivers/md/md.o
  CC      drivers/cpufreq/cpufreq.o
  CC      drivers/md/md-bitmap.o
  CC      drivers/usb/host/uhci-hcd.o
  CC      drivers/thermal/intel/therm_throt.o
  CC      drivers/gpu/drm/drm_fourcc.o
  CC      net/ipv6/ah6.o
  CC      drivers/md/md-autodetect.o
  CC      drivers/md/dm.o
  CC      lib/crc16.o
  CC      net/sunrpc/rpc_pipe.o
  AR      drivers/net/ethernet/fujitsu/built-in.a
  AR      drivers/net/ethernet/fungible/built-in.a
  CC [M]  drivers/thermal/intel/x86_pkg_temp_thermal.o
  AR      drivers/net/ethernet/google/built-in.a
  AR      drivers/net/ethernet/huawei/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_gsc_submit.o
  CC      drivers/net/ethernet/intel/e1000/e1000_main.o
  CC [M]  drivers/gpu/drm/xe/xe_gt.o
  CC      drivers/acpi/acpica/tbxfload.o
  CC [M]  net/netfilter/xt_LOG.o
  CC      drivers/acpi/processor_driver.o
  CC      drivers/acpi/acpica/tbxfroot.o
  CC      arch/x86/kernel/i8237.o
  CC      drivers/power/supply/power_supply_leds.o
  CC      drivers/input/touchscreen.o
  CC      net/ipv6/esp6.o
  HOSTCC  lib/gen_crc32table
  CC      kernel/workqueue.o
  CC      arch/x86/kernel/stacktrace.o
  CC      drivers/ptp/ptp_vclock.o
  AR      net/core/built-in.a
  CC      kernel/pid.o
  CC      lib/xxhash.o
  CC      drivers/cpuidle/governors/menu.o
  CC      drivers/input/ff-memless.o
  CC      drivers/ptp/ptp_kvm_x86.o
  CC      kernel/task_work.o
  CC      drivers/acpi/acpica/utaddress.o
  CC      drivers/gpu/drm/i915/i915_pmu.o
  CC      drivers/cpuidle/governors/haltpoll.o
  CC      drivers/input/sparse-keymap.o
  CC      drivers/input/vivaldi-fmap.o
  CC      drivers/acpi/acpica/utalloc.o
  CC      drivers/power/supply/power_supply_hwmon.o
  CC      drivers/acpi/processor_thermal.o
  CC      arch/x86/kernel/reboot.o
  CC      drivers/gpu/drm/i915/gt/gen2_engine_cs.o
  AR      drivers/mmc/built-in.a
  AR      drivers/ufs/built-in.a
  AR      drivers/hwmon/built-in.a
  AR      drivers/leds/trigger/built-in.a
  AR      drivers/leds/blink/built-in.a
  AR      drivers/firmware/arm_ffa/built-in.a
  AR      drivers/leds/simple/built-in.a
  AR      drivers/firmware/arm_scmi/built-in.a
  CC      drivers/leds/led-core.o
  AR      drivers/firmware/broadcom/built-in.a
  AR      drivers/firmware/cirrus/built-in.a
  CC      drivers/leds/led-class.o
  AR      drivers/firmware/meson/built-in.a
  CC      drivers/leds/led-triggers.o
  AR      drivers/firmware/microchip/built-in.a
  CC      drivers/md/dm-table.o
  CC      drivers/firmware/efi/efi-bgrt.o
  AR      drivers/thermal/intel/built-in.a
  CC      arch/x86/kernel/msr.o
  CC [M]  net/netfilter/xt_MASQUERADE.o
  AR      drivers/firmware/imx/built-in.a
  AR      drivers/thermal/st/built-in.a
  CC      drivers/input/input-leds.o
  CC      drivers/firmware/efi/libstub/efi-stub-helper.o
  AR      drivers/thermal/tegra/built-in.a
  AR      drivers/thermal/qcom/built-in.a
  CC      drivers/acpi/acpica/utascii.o
  CC      drivers/firmware/efi/libstub/gop.o
  AR      drivers/thermal/mediatek/built-in.a
  CC      fs/super.o
  CC      drivers/thermal/thermal_core.o
  CC      lib/genalloc.o
  AR      net/wireless/built-in.a
  CC      lib/percpu_counter.o
  AR      drivers/firmware/psci/built-in.a
  AR      drivers/power/supply/built-in.a
  CC      drivers/thermal/thermal_sysfs.o
  AR      drivers/power/built-in.a
  CC      arch/x86/kernel/cpuid.o
  CC      net/ipv4/arp.o
  CC      net/mac80211/ethtool.o
  CC      arch/x86/kernel/early-quirks.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_ccs_mode.o
  CC      net/ipv6/sit.o
  CC      net/mac80211/rx.o
  CC [M]  net/netfilter/xt_addrtype.o
  CC      drivers/acpi/processor_idle.o
  CC      drivers/ptp/ptp_kvm_common.o
  CC      fs/char_dev.o
  CC      drivers/thermal/thermal_trip.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_clock.o
  CC      drivers/acpi/acpica/utbuffer.o
  CC      drivers/acpi/acpica/utcksum.o
  CC      drivers/net/ethernet/intel/e1000e/82571.o
  CC      drivers/net/ethernet/intel/e100.o
  CC      drivers/usb/host/xhci.o
  CC      drivers/net/ethernet/intel/e1000e/ich8lan.o
  AR      drivers/firmware/qcom/built-in.a
  AR      drivers/cpuidle/governors/built-in.a
  CC      drivers/cpuidle/cpuidle.o
  AR      drivers/firmware/smccc/built-in.a
  CC      fs/nfs/nfs4file.o
  CC      net/mac80211/spectmgmt.o
  AR      drivers/leds/built-in.a
  CC      drivers/input/evdev.o
  CC      drivers/firmware/efi/efi.o
  CC      drivers/gpu/drm/i915/gt/gen6_engine_cs.o
  CC      lib/audit.o
  CC      fs/nfs/delegation.o
  CC      drivers/cpufreq/freq_table.o
  CC      drivers/net/ethernet/broadcom/tg3.o
  CC      fs/nfs/nfs4idmap.o
  AR      drivers/firmware/tegra/built-in.a
  AR      drivers/firmware/xilinx/built-in.a
  CC      net/mac80211/tx.o
  CC      drivers/gpu/drm/i915/gt/gen6_ppgtt.o
  CC      drivers/gpu/drm/i915/gt/gen7_renderclear.o
  CC      arch/x86/kernel/smp.o
  CC      arch/x86/kernel/smpboot.o
  CC      drivers/firmware/efi/libstub/secureboot.o
  CC      drivers/net/ethernet/intel/e1000e/80003es2lan.o
  CC      drivers/acpi/acpica/utcopy.o
  CC      drivers/usb/class/usblp.o
  CC      drivers/md/dm-target.o
  CC      net/sunrpc/sysfs.o
  CC      drivers/gpu/drm/i915/gt/gen8_engine_cs.o
  AR      drivers/ptp/built-in.a
  CC      drivers/gpu/drm/i915/gt/gen8_ppgtt.o
  CC      drivers/acpi/acpica/utexcep.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_debugfs.o
  CC      net/ipv6/addrconf_core.o
  CC      drivers/cpuidle/driver.o
  CC      net/mac80211/key.o
  CC      fs/stat.o
  CC      lib/syscall.o
  CC      lib/errname.o
  CC      drivers/cpufreq/cpufreq_performance.o
  CC      drivers/firmware/dmi_scan.o
  CC      lib/nlattr.o
  CC      drivers/md/dm-linear.o
  CC      drivers/firmware/efi/libstub/tpm.o
  CC      drivers/acpi/acpica/utdebug.o
  CC      drivers/firmware/dmi-id.o
  CC      drivers/acpi/processor_throttling.o
  CC      mm/swap_state.o
  CC      net/ipv6/exthdrs_core.o
  AR      net/netfilter/built-in.a
  CC      drivers/thermal/thermal_helpers.o
  CC      net/sunrpc/svc_xprt.o
  CC      drivers/thermal/thermal_hwmon.o
  CC      drivers/cpufreq/cpufreq_userspace.o
  AR      drivers/usb/class/built-in.a
  AR      drivers/input/built-in.a
  CC      drivers/usb/storage/scsiglue.o
  AR      drivers/crypto/stm32/built-in.a
  CC      drivers/usb/storage/protocol.o
  CC      drivers/usb/storage/transport.o
  CC      net/mac80211/util.o
  AR      drivers/crypto/xilinx/built-in.a
  CC      net/mac80211/parse.o
  CC      arch/x86/kernel/tsc_sync.o
  CC      drivers/acpi/acpica/utdecode.o
  AR      drivers/crypto/hisilicon/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_gt_freq.o
  CC      arch/x86/kernel/setup_percpu.o
  AR      drivers/crypto/intel/keembay/built-in.a
  AR      drivers/crypto/intel/ixp4xx/built-in.a
  AR      drivers/crypto/intel/built-in.a
  CC      arch/x86/kernel/mpparse.o
  CC      drivers/cpuidle/governor.o
  AR      drivers/crypto/starfive/built-in.a
  AR      drivers/crypto/built-in.a
  CC      net/ipv4/icmp.o
  CC      lib/cpu_rmap.o
  CC      drivers/usb/storage/usb.o
  CC      arch/x86/kernel/trace_clock.o
  CC      drivers/cpufreq/cpufreq_ondemand.o
  CC      drivers/thermal/gov_step_wise.o
  CC      net/sunrpc/xprtmultipath.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_idle.o
  CC      drivers/gpu/drm/drm_framebuffer.o
  CC      drivers/thermal/gov_user_space.o
  CC      net/ipv6/ip6_checksum.o
  CC      drivers/net/ethernet/intel/e1000/e1000_hw.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_mcr.o
  AR      drivers/net/ethernet/i825xx/built-in.a
  AR      drivers/net/ethernet/microsoft/built-in.a
  CC      drivers/firmware/efi/libstub/file.o
  CC      drivers/acpi/acpica/utdelete.o
  AR      drivers/net/ethernet/litex/built-in.a
  CC      drivers/gpu/drm/i915/gt/intel_breadcrumbs.o
  CC      drivers/firmware/efi/libstub/mem.o
  CC      drivers/gpu/drm/i915/gt/intel_context.o
  CC      drivers/cpuidle/sysfs.o
  CC      drivers/usb/storage/initializers.o
  CC      drivers/net/ethernet/intel/e1000e/mac.o
  CC      drivers/net/ethernet/intel/e1000/e1000_ethtool.o
  CC      drivers/gpu/drm/i915/gt/intel_context_sseu.o
  CC      drivers/firmware/efi/libstub/random.o
  CC      fs/exec.o
  CC      drivers/usb/storage/sierra_ms.o
  CC      lib/dynamic_queue_limits.o
  CC      drivers/cpufreq/cpufreq_governor.o
  CC      kernel/extable.o
  CC      drivers/firmware/efi/libstub/randomalloc.o
  CC      drivers/clocksource/acpi_pm.o
  AR      drivers/thermal/built-in.a
  CC      drivers/cpufreq/cpufreq_governor_attr_set.o
  AR      drivers/net/usb/built-in.a
  CC      drivers/acpi/processor_perflib.o
  CC      drivers/net/mii.o
  CC      drivers/gpu/drm/i915/gt/intel_engine_cs.o
  CC      drivers/cpufreq/acpi-cpufreq.o
  CC      drivers/acpi/acpica/uterror.o
  CC      net/ipv6/ip6_icmp.o
  CC      drivers/md/dm-stripe.o
  CC      drivers/net/ethernet/intel/e1000e/manage.o
  CC      drivers/clocksource/i8253.o
  CC      mm/swapfile.o
  CC      drivers/firmware/memmap.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_pagefault.o
  CC      arch/x86/kernel/trace.o
  CC      fs/nfs/callback.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_sysfs.o
  CC      drivers/cpuidle/poll_state.o
  CC      drivers/usb/storage/option_ms.o
  CC      drivers/hid/usbhid/hid-core.o
  CC      drivers/usb/storage/usual-tables.o
  CC      drivers/acpi/acpica/uteval.o
  CC      drivers/gpu/drm/i915/gt/intel_engine_heartbeat.o
  CC      drivers/usb/host/xhci-mem.o
  CC      drivers/md/dm-ioctl.o
  CC      drivers/cpuidle/cpuidle-haltpoll.o
  CC      drivers/net/loopback.o
  CC      mm/swap_slots.o
  CC      kernel/params.o
  CC      kernel/kthread.o
  CC      drivers/firmware/efi/libstub/pci.o
  AR      drivers/clocksource/built-in.a
  CC      mm/dmapool.o
  CC      net/mac80211/wme.o
  AR      drivers/platform/x86/amd/built-in.a
  AR      drivers/platform/x86/intel/built-in.a
  CC      drivers/platform/x86/wmi.o
  CC      net/ipv6/output_core.o
  CC      lib/glob.o
  CC      drivers/firmware/efi/libstub/skip_spaces.o
  CC      drivers/acpi/acpica/utglobal.o
  CC      drivers/platform/x86/wmi-bmof.o
  CC      fs/nfs/callback_xdr.o
  CC      drivers/platform/x86/eeepc-laptop.o
  CC      fs/nfs/callback_proc.o
  CC      lib/strncpy_from_user.o
  CC      drivers/acpi/container.o
  AR      drivers/usb/storage/built-in.a
  CC      arch/x86/kernel/rethook.o
  CC      drivers/acpi/thermal_lib.o
  CC      drivers/cpufreq/amd-pstate.o
  CC      drivers/md/dm-io.o
  AR      drivers/cpuidle/built-in.a
  CC      drivers/net/ethernet/intel/e1000/e1000_param.o
  CC      drivers/hid/hid-core.o
  CC      drivers/usb/host/xhci-ext-caps.o
  CC      net/ipv6/protocol.o
  CC      net/ipv4/devinet.o
  CC      net/mac80211/chan.o
  CC      drivers/net/ethernet/intel/e1000e/nvm.o
  AR      drivers/usb/misc/built-in.a
  CC      net/sunrpc/stats.o
  CC      drivers/acpi/acpica/uthex.o
  CC      drivers/usb/early/ehci-dbgp.o
  CC      net/ipv4/af_inet.o
  CC      mm/hugetlb.o
  CC      fs/nfs/nfs4namespace.o
  CC      drivers/firmware/efi/libstub/lib-cmdline.o
  CC      drivers/net/ethernet/intel/e1000e/phy.o
  CC      drivers/acpi/thermal.o
  CC      lib/strnlen_user.o
  CC      drivers/hid/usbhid/hiddev.o
  CC      drivers/firmware/efi/libstub/lib-ctype.o
  CC      net/ipv4/igmp.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_throttle.o
  CC      drivers/firmware/efi/libstub/alignedmem.o
  CC      drivers/hid/hid-input.o
  CC      arch/x86/kernel/vmcore_info_32.o
  CC      drivers/acpi/acpica/utids.o
  CC      drivers/acpi/acpica/utinit.o
  CC      drivers/hid/hid-quirks.o
  CC      drivers/gpu/drm/i915/gt/intel_engine_pm.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_tlb_invalidation.o
  CC      net/ipv4/fib_frontend.o
  CC      mm/mmu_notifier.o
  CC      kernel/sys_ni.o
  CC      drivers/usb/host/xhci-ring.o
  CC      drivers/mailbox/mailbox.o
  CC      drivers/cpufreq/amd-pstate-trace.o
  CC      net/sunrpc/sysctl.o
  CC      drivers/platform/x86/p2sb.o
  CC      drivers/mailbox/pcc.o
  CC      drivers/hid/usbhid/hid-pidff.o
  CC      drivers/acpi/acpica/utlock.o
  CC      lib/net_utils.o
  CC      arch/x86/kernel/machine_kexec_32.o
  CC      kernel/nsproxy.o
  CC      net/ipv6/ip6_offload.o
  CC      fs/pipe.o
  AR      drivers/usb/early/built-in.a
  CC      drivers/firmware/efi/libstub/relocate.o
  CC      drivers/firmware/efi/libstub/printk.o
  CC      drivers/acpi/acpica/utmath.o
  AR      drivers/platform/surface/built-in.a
  CC      lib/sg_pool.o
  CC      net/mac80211/trace.o
  AS      arch/x86/kernel/relocate_kernel_32.o
  CC      arch/x86/kernel/crash_dump_32.o
  CC      lib/stackdepot.o
  CC      drivers/md/dm-kcopyd.o
  AR      drivers/net/ethernet/intel/e1000/built-in.a
  CC      arch/x86/kernel/crash.o
  CC      drivers/firmware/efi/libstub/vsprintf.o
  CC      drivers/usb/host/xhci-hub.o
  CC      lib/asn1_decoder.o
  CC      drivers/gpu/drm/i915/gt/intel_engine_user.o
  CC      drivers/cpufreq/intel_pstate.o
  CC      drivers/acpi/acpica/utmisc.o
  CC      drivers/firmware/efi/libstub/x86-stub.o
  CC      fs/nfs/nfs4getroot.o
  CC      drivers/firmware/efi/libstub/smbios.o
  CC      net/ipv6/tcpv6_offload.o
  CC      drivers/hid/hid-debug.o
  CC      fs/nfs/nfs4client.o
  STUBCPY drivers/firmware/efi/libstub/alignedmem.stub.o
  CC      fs/nfs/nfs4session.o
  AR      drivers/platform/x86/built-in.a
  CC      fs/nfs/dns_resolve.o
  AR      drivers/mailbox/built-in.a
  AR      drivers/platform/built-in.a
  AR      drivers/perf/built-in.a
  CC      drivers/acpi/acpica/utmutex.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_topology.o
  AR      drivers/hwtracing/intel_th/built-in.a
  CC      fs/nfs/nfs4trace.o
  AR      drivers/android/built-in.a
  GEN     lib/oid_registry_data.c
  CC      drivers/firmware/efi/vars.o
  CC      drivers/net/netconsole.o
  CC      drivers/hid/hidraw.o
  CC      drivers/hid/hid-generic.o
  CC      arch/x86/kernel/module.o
  CC      fs/namei.o
  CC      net/ipv4/fib_semantics.o
  CC      net/ipv4/fib_trie.o
  CC      arch/x86/kernel/doublefault_32.o
  CC      lib/ucs2_string.o
  CC [M]  drivers/gpu/drm/xe/xe_guc.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_ads.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_ct.o
  CC      drivers/net/ethernet/intel/e1000e/param.o
  CC      lib/sbitmap.o
  CC      net/mac80211/mlme.o
  AR      drivers/hid/usbhid/built-in.a
  CC      drivers/hid/hid-a4tech.o
  CC      drivers/acpi/acpica/utnonansi.o
  CC      kernel/notifier.o
  CC      drivers/firmware/efi/reboot.o
  CC      drivers/acpi/nhlt.o
  CC      net/ipv4/fib_notifier.o
  CC      net/ipv4/inet_fragment.o
  STUBCPY drivers/firmware/efi/libstub/efi-stub-helper.stub.o
  STUBCPY drivers/firmware/efi/libstub/file.stub.o
  STUBCPY drivers/firmware/efi/libstub/gop.stub.o
  CC      drivers/net/virtio_net.o
  CC      drivers/net/net_failover.o
  STUBCPY drivers/firmware/efi/libstub/lib-cmdline.stub.o
  STUBCPY drivers/firmware/efi/libstub/lib-ctype.stub.o
  STUBCPY drivers/firmware/efi/libstub/mem.stub.o
  CC      drivers/acpi/acpica/utobject.o
  STUBCPY drivers/firmware/efi/libstub/pci.stub.o
  STUBCPY drivers/firmware/efi/libstub/printk.stub.o
  STUBCPY drivers/firmware/efi/libstub/random.stub.o
  CC      drivers/md/dm-sysfs.o
  CC      mm/migrate.o
  STUBCPY drivers/firmware/efi/libstub/randomalloc.stub.o
  CC      drivers/gpu/drm/i915/gt/intel_execlists_submission.o
  CC      mm/page_counter.o
  STUBCPY drivers/firmware/efi/libstub/relocate.stub.o
  CC      mm/hugetlb_cgroup.o
  STUBCPY drivers/firmware/efi/libstub/secureboot.stub.o
  STUBCPY drivers/firmware/efi/libstub/skip_spaces.stub.o
  CC      mm/early_ioremap.o
  STUBCPY drivers/firmware/efi/libstub/smbios.stub.o
  CC      mm/secretmem.o
  CC      net/ipv6/exthdrs_offload.o
  STUBCPY drivers/firmware/efi/libstub/tpm.stub.o
  CC      kernel/ksysfs.o
  STUBCPY drivers/firmware/efi/libstub/vsprintf.stub.o
  STUBCPY drivers/firmware/efi/libstub/x86-stub.stub.o
  CC      drivers/acpi/acpica/utosi.o
  AR      drivers/firmware/efi/libstub/lib.a
  CC      drivers/acpi/acpica/utownerid.o
  CC      net/mac80211/tdls.o
  CC      drivers/gpu/drm/drm_gem.o
  CC      drivers/net/ethernet/intel/e1000e/ethtool.o
  CC      drivers/usb/host/xhci-dbg.o
  CC      drivers/firmware/efi/memattr.o
  CC      arch/x86/kernel/early_printk.o
  CC      drivers/md/dm-stats.o
  CC      lib/group_cpus.o
  AR      net/sunrpc/built-in.a
  CC      net/mac80211/ocb.o
  CC      drivers/acpi/acpi_memhotplug.o
  CC      lib/fw_table.o
  CC      fs/nfs/nfs4sysctl.o
  CC      drivers/hid/hid-apple.o
  AR      drivers/nvmem/layouts/built-in.a
  CC      drivers/nvmem/core.o
  CC      drivers/hid/hid-belkin.o
  AR      lib/lib.a
  CC      net/ipv4/ping.o
  CC      drivers/firmware/efi/tpm.o
  CC      drivers/acpi/acpica/utpredef.o
  CC      net/ipv6/inet6_hashtables.o
  CC      drivers/acpi/acpica/utresdecode.o
  CC      drivers/net/ethernet/intel/e1000e/netdev.o
  CC      arch/x86/kernel/hpet.o
  CC      net/mac80211/airtime.o
  CC      arch/x86/kernel/amd_nb.o
  CC      drivers/acpi/ioapic.o
  CC      kernel/cred.o
  GEN     lib/crc32table.h
  CC      net/ipv4/ip_tunnel_core.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_db_mgr.o
  CC      drivers/acpi/acpica/utresrc.o
  CC      lib/oid_registry.o
  CC      drivers/acpi/battery.o
  CC      drivers/acpi/bgrt.o
  CC      drivers/usb/host/xhci-trace.o
  CC      fs/fcntl.o
  CC      drivers/firmware/efi/memmap.o
  CC      drivers/firmware/efi/capsule.o
  CC      arch/x86/kernel/kvm.o
  AR      drivers/net/ethernet/marvell/octeon_ep/built-in.a
  CC      drivers/firmware/efi/esrt.o
  AR      drivers/net/ethernet/marvell/octeon_ep_vf/built-in.a
  AR      drivers/net/ethernet/marvell/octeontx2/built-in.a
  CC      lib/crc32.o
  AR      drivers/net/ethernet/marvell/prestera/built-in.a
  CC      drivers/net/ethernet/marvell/sky2.o
  AR      drivers/cpufreq/built-in.a
  CC      mm/hmm.o
  CC      drivers/firmware/efi/runtime-wrappers.o
  AR      drivers/net/ethernet/mellanox/built-in.a
  CC      drivers/firmware/efi/capsule-loader.o
  CC      drivers/gpu/drm/i915/gt/intel_ggtt.o
  CC      drivers/net/ethernet/intel/e1000e/ptp.o
  CC      drivers/hid/hid-cherry.o
  CC      drivers/acpi/acpica/utstate.o
  CC      drivers/acpi/acpica/utstring.o
  CC      drivers/hid/hid-chicony.o
  CC      drivers/hid/hid-cypress.o
  CC      drivers/acpi/spcr.o
  CC      net/mac80211/eht.o
  CC      net/ipv4/gre_offload.o
  CC      net/ipv4/metrics.o
  AR      drivers/nvmem/built-in.a
  AR      drivers/net/ethernet/meta/built-in.a
  CC      drivers/md/dm-rq.o
  CC      drivers/gpu/drm/drm_ioctl.o
  CC      drivers/gpu/drm/drm_lease.o
  CC      drivers/hid/hid-ezkey.o
  CC      net/mac80211/led.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_debugfs.o
  CC      net/mac80211/pm.o
  CC      net/ipv4/netlink.o
  AR      drivers/net/ethernet/micrel/built-in.a
  AR      lib/built-in.a
  CC      net/mac80211/rc80211_minstrel_ht.o
  AR      drivers/net/ethernet/microchip/built-in.a
  CC      drivers/acpi/acpica/utstrsuppt.o
  CC      drivers/hid/hid-gyration.o
  CC      net/mac80211/wbrf.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_hwconfig.o
  CC      drivers/gpu/drm/i915/gt/intel_ggtt_fencing.o
  CC      kernel/reboot.o
  CC      drivers/firmware/efi/earlycon.o
  CC      fs/ioctl.o
  CC      drivers/md/dm-io-rewind.o
  CC      drivers/md/dm-builtin.o
  CC      mm/memfd.o
  CC      drivers/hid/hid-ite.o
  CC      drivers/hid/hid-kensington.o
  CC      net/ipv6/mcast_snoop.o
  CC      drivers/hid/hid-lg.o
  CC      drivers/acpi/acpica/utstrtoul64.o
  CC      mm/ptdump.o
  CC      net/ipv4/nexthop.o
  CC      kernel/async.o
  CC      drivers/usb/host/xhci-debugfs.o
  CC      net/ipv4/udp_tunnel_stub.o
  CC      arch/x86/kernel/kvmclock.o
  CC      drivers/hid/hid-lgff.o
  CC      drivers/hid/hid-lg4ff.o
  CC      drivers/acpi/acpica/utxface.o
  CC      arch/x86/kernel/paravirt.o
  AR      drivers/net/ethernet/mscc/built-in.a
  AR      drivers/net/ethernet/myricom/built-in.a
  AR      drivers/net/ethernet/natsemi/built-in.a
  CC      mm/execmem.o
  CC      drivers/gpu/drm/drm_managed.o
  CC      fs/readdir.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_id_mgr.o
  CC      arch/x86/kernel/pvclock.o
  CC      drivers/acpi/acpica/utxfinit.o
  CC      drivers/gpu/drm/i915/gt/intel_gt.o
  AR      drivers/firmware/efi/built-in.a
  CC      arch/x86/kernel/pcspeaker.o
  AR      drivers/firmware/built-in.a
  CC      arch/x86/kernel/check.o
  CC      drivers/hid/hid-lg-g15.o
  CC      drivers/hid/hid-microsoft.o
  CC      net/ipv4/ip_tunnel.o
  CC      drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.o
  CC      drivers/gpu/drm/i915/gt/intel_gt_ccs_mode.o
  CC      drivers/md/dm-raid1.o
  CC      arch/x86/kernel/uprobes.o
  CC      drivers/hid/hid-monterey.o
  CC      drivers/hid/hid-ntrig.o
  AR      fs/nfs/built-in.a
  CC      net/ipv4/sysctl_net_ipv4.o
  CC      drivers/usb/host/xhci-pci.o
  CC      kernel/range.o
  CC      net/ipv4/proc.o
  CC      drivers/md/dm-log.o
  CC      drivers/md/dm-region-hash.o
  CC      drivers/md/dm-zero.o
  CC      drivers/acpi/acpica/utxferror.o
  CC      kernel/smpboot.o
  CC      drivers/gpu/drm/i915/gt/intel_gt_clock_utils.o
  CC      arch/x86/kernel/perf_regs.o
  CC      arch/x86/kernel/tracepoint.o
  CC      arch/x86/kernel/itmt.o
  AR      mm/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_guc_klv_helpers.o
  CC      drivers/gpu/drm/i915/gt/intel_gt_debugfs.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_log.o
  CC      drivers/hid/hid-pl.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_pc.o
  AR      net/ipv6/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_guc_submit.o
  CC [M]  drivers/gpu/drm/xe/xe_heci_gsc.o
  CC      drivers/gpu/drm/i915/gt/intel_gt_engines_debugfs.o
  CC      arch/x86/kernel/umip.o
  CC      drivers/gpu/drm/i915/gt/intel_gt_irq.o
  CC      net/ipv4/fib_rules.o
  CC      net/ipv4/ipmr.o
  CC [M]  drivers/gpu/drm/xe/xe_hw_engine.o
  CC      arch/x86/kernel/unwind_frame.o
  CC      drivers/acpi/acpica/utxfmutex.o
  CC      fs/select.o
  CC      drivers/hid/hid-petalynx.o
  CC      drivers/hid/hid-redragon.o
  CC      fs/dcache.o
  AR      drivers/net/ethernet/broadcom/built-in.a
  CC      drivers/hid/hid-samsung.o
  AR      drivers/net/ethernet/neterion/built-in.a
  CC      drivers/hid/hid-sony.o
  AR      drivers/net/ethernet/netronome/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.o
  CC      fs/inode.o
  CC      kernel/ucount.o
  CC      kernel/regset.o
  CC      kernel/ksyms_common.o
  CC      drivers/hid/hid-sunplus.o
  CC      drivers/hid/hid-topseed.o
  CC      drivers/gpu/drm/i915/gt/intel_gt_mcr.o
  CC      drivers/gpu/drm/drm_mm.o
  AR      drivers/acpi/acpica/built-in.a
  CC      drivers/gpu/drm/drm_mode_config.o
  AR      drivers/acpi/built-in.a
  CC      drivers/gpu/drm/i915/gt/intel_gt_pm.o
  CC      drivers/gpu/drm/drm_mode_object.o
  CC      drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.o
  CC      drivers/gpu/drm/i915/gt/intel_gt_pm_irq.o
  CC      drivers/gpu/drm/i915/gt/intel_gt_requests.o
  AR      drivers/net/ethernet/ni/built-in.a
  CC      net/ipv4/ipmr_base.o
  AR      drivers/net/ethernet/marvell/built-in.a
  CC      drivers/net/ethernet/nvidia/forcedeth.o
  CC      drivers/gpu/drm/i915/gt/intel_gt_sysfs.o
  CC      kernel/groups.o
  AR      drivers/md/built-in.a
  CC      kernel/kcmp.o
  CC      kernel/freezer.o
  AR      arch/x86/kernel/built-in.a
  CC      kernel/profile.o
  CC      drivers/gpu/drm/i915/gt/intel_gt_sysfs_pm.o
  CC      fs/attr.o
  CC      drivers/gpu/drm/i915/gt/intel_gtt.o
  AR      drivers/net/ethernet/oki-semi/built-in.a
  AR      arch/x86/built-in.a
  CC      net/ipv4/syncookies.o
  CC      net/ipv4/tunnel4.o
  CC      fs/bad_inode.o
  CC      drivers/gpu/drm/i915/gt/intel_llc.o
  CC      net/ipv4/ipconfig.o
  CC      net/ipv4/netfilter.o
  CC      net/ipv4/tcp_cubic.o
  CC      net/ipv4/tcp_sigpool.o
  CC [M]  drivers/gpu/drm/xe/xe_hw_fence.o
  AR      drivers/usb/host/built-in.a
  AR      drivers/usb/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_huc.o
  CC [M]  drivers/gpu/drm/xe/xe_huc_debugfs.o
  AR      drivers/net/ethernet/intel/e1000e/built-in.a
  AR      drivers/net/ethernet/intel/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_irq.o
  AR      drivers/net/ethernet/packetengines/built-in.a
  CC      net/ipv4/cipso_ipv4.o
  AR      drivers/net/ethernet/qlogic/built-in.a
  CC      net/ipv4/xfrm4_policy.o
  AR      drivers/net/ethernet/qualcomm/emac/built-in.a
  CC      net/ipv4/xfrm4_state.o
  AR      drivers/net/ethernet/qualcomm/built-in.a
  CC      drivers/net/ethernet/realtek/8139too.o
  CC [M]  drivers/gpu/drm/xe/xe_lrc.o
  CC      net/ipv4/xfrm4_input.o
  CC      drivers/net/ethernet/realtek/r8169_main.o
  CC      fs/file.o
  CC      drivers/gpu/drm/drm_modes.o
  CC      fs/filesystems.o
  CC      fs/namespace.o
  CC      drivers/gpu/drm/drm_modeset_lock.o
  AR      drivers/hid/built-in.a
  CC      drivers/gpu/drm/drm_plane.o
  CC      drivers/gpu/drm/drm_prime.o
  CC      drivers/gpu/drm/i915/gt/intel_lrc.o
  CC      net/ipv4/xfrm4_output.o
  CC      fs/seq_file.o
  CC      kernel/stacktrace.o
  CC      kernel/dma.o
  CC      fs/xattr.o
  CC      fs/libfs.o
  CC      drivers/gpu/drm/i915/gt/intel_migrate.o
  CC      drivers/net/ethernet/realtek/r8169_firmware.o
  CC      drivers/gpu/drm/i915/gt/intel_mocs.o
  CC [M]  drivers/gpu/drm/xe/xe_migrate.o
  CC      drivers/gpu/drm/i915/gt/intel_ppgtt.o
  CC      drivers/gpu/drm/i915/gt/intel_rc6.o
  CC [M]  drivers/gpu/drm/xe/xe_mmio.o
  CC      kernel/smp.o
  CC      net/ipv4/xfrm4_protocol.o
  CC [M]  drivers/gpu/drm/xe/xe_mocs.o
  CC      drivers/gpu/drm/i915/gt/intel_region_lmem.o
  CC      drivers/gpu/drm/drm_print.o
  CC      drivers/gpu/drm/drm_property.o
  CC      drivers/gpu/drm/i915/gt/intel_renderstate.o
  CC      drivers/gpu/drm/i915/gt/intel_reset.o
  CC      drivers/gpu/drm/i915/gt/intel_ring.o
  CC      drivers/net/ethernet/realtek/r8169_phy_config.o
  CC      fs/fs-writeback.o
  CC      kernel/uid16.o
  CC [M]  drivers/gpu/drm/xe/xe_module.o
  CC      drivers/gpu/drm/drm_syncobj.o
  AR      drivers/net/ethernet/renesas/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_oa.o
  AR      drivers/net/ethernet/rdc/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_observation.o
  CC      drivers/gpu/drm/drm_sysfs.o
  AR      drivers/net/ethernet/rocker/built-in.a
  CC      fs/pnode.o
  CC      fs/splice.o
  CC      fs/sync.o
  CC      drivers/gpu/drm/i915/gt/intel_ring_submission.o
  CC      drivers/gpu/drm/i915/gt/intel_rps.o
  CC      drivers/gpu/drm/i915/gt/intel_sa_media.o
  CC      drivers/gpu/drm/drm_trace_points.o
  CC      drivers/gpu/drm/drm_vblank.o
  CC      drivers/gpu/drm/drm_vblank_work.o
  CC      fs/utimes.o
  CC      drivers/gpu/drm/drm_vma_manager.o
  CC [M]  drivers/gpu/drm/xe/xe_pat.o
  CC [M]  drivers/gpu/drm/xe/xe_pci.o
  CC [M]  drivers/gpu/drm/xe/xe_pcode.o
  CC      drivers/gpu/drm/drm_writeback.o
  CC      drivers/gpu/drm/drm_panel.o
  CC      drivers/gpu/drm/i915/gt/intel_sseu.o
  CC      drivers/gpu/drm/drm_pci.o
  CC      drivers/gpu/drm/i915/gt/intel_sseu_debugfs.o
  CC      drivers/gpu/drm/drm_debugfs.o
  CC      fs/d_path.o
  CC      fs/stack.o
  CC      drivers/gpu/drm/drm_debugfs_crc.o
  CC      fs/fs_struct.o
  CC      fs/statfs.o
  CC      kernel/kallsyms.o
  AR      net/ipv4/built-in.a
  CC      drivers/gpu/drm/i915/gt/intel_timeline.o
  CC [M]  drivers/gpu/drm/xe/xe_pm.o
  CC      drivers/gpu/drm/i915/gt/intel_tlb.o
  CC      kernel/acct.o
  CC      drivers/gpu/drm/i915/gt/intel_wopcm.o
  CC      fs/fs_pin.o
  CC      fs/nsfs.o
  CC      fs/fs_types.o
  CC      drivers/gpu/drm/i915/gt/intel_workarounds.o
  CC      drivers/gpu/drm/i915/gt/shmem_utils.o
  CC      kernel/vmcore_info.o
  CC [M]  drivers/gpu/drm/xe/xe_preempt_fence.o
  AR      net/mac80211/built-in.a
  CC      drivers/gpu/drm/drm_panel_orientation_quirks.o
  AR      net/built-in.a
  CC      drivers/gpu/drm/drm_buddy.o
  CC [M]  drivers/gpu/drm/xe/xe_pt.o
  CC      drivers/gpu/drm/drm_gem_shmem_helper.o
  CC      drivers/gpu/drm/i915/gt/sysfs_engines.o
  CC      fs/fs_context.o
  CC      drivers/gpu/drm/i915/gt/intel_ggtt_gmch.o
  CC [M]  drivers/gpu/drm/xe/xe_pt_walk.o
  CC      fs/fs_parser.o
  CC [M]  drivers/gpu/drm/xe/xe_query.o
  CC      drivers/gpu/drm/drm_atomic_helper.o
  CC      drivers/gpu/drm/drm_atomic_state_helper.o
  AR      drivers/net/ethernet/nvidia/built-in.a
  CC      drivers/gpu/drm/drm_bridge_connector.o
  AR      drivers/net/ethernet/samsung/built-in.a
  AR      drivers/net/ethernet/seeq/built-in.a
  CC      fs/fsopen.o
  AR      drivers/net/ethernet/silan/built-in.a
  CC      fs/init.o
  CC      fs/kernel_read_file.o
  CC      drivers/gpu/drm/drm_crtc_helper.o
  CC      drivers/gpu/drm/i915/gt/gen6_renderstate.o
  CC [M]  drivers/gpu/drm/xe/xe_range_fence.o
  CC      fs/mnt_idmapping.o
  CC      drivers/gpu/drm/drm_damage_helper.o
  CC      drivers/gpu/drm/drm_encoder_slave.o
  CC      fs/remap_range.o
  CC      kernel/elfcorehdr.o
  CC      fs/pidfs.o
  CC      drivers/gpu/drm/drm_flip_work.o
  CC [M]  drivers/gpu/drm/xe/xe_reg_sr.o
  CC      fs/buffer.o
  CC      drivers/gpu/drm/i915/gt/gen7_renderstate.o
  CC      drivers/gpu/drm/i915/gt/gen8_renderstate.o
  CC [M]  drivers/gpu/drm/xe/xe_reg_whitelist.o
  CC [M]  drivers/gpu/drm/xe/xe_rtp.o
  CC      drivers/gpu/drm/i915/gt/gen9_renderstate.o
  AR      drivers/net/ethernet/realtek/built-in.a
  CC      kernel/crash_reserve.o
  AR      drivers/net/ethernet/sis/built-in.a
  CC      kernel/kexec_core.o
  AR      drivers/net/ethernet/sfc/built-in.a
  AR      drivers/net/ethernet/smsc/built-in.a
  CC      drivers/gpu/drm/i915/gem/i915_gem_busy.o
  AR      drivers/net/ethernet/socionext/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_ring_ops.o
  CC [M]  drivers/gpu/drm/xe/xe_sa.o
  CC      kernel/crash_core.o
  AR      drivers/net/ethernet/stmicro/built-in.a
  CC      drivers/gpu/drm/i915/gem/i915_gem_clflush.o
  AR      drivers/net/ethernet/sun/built-in.a
  AR      drivers/net/ethernet/tehuti/built-in.a
  AR      drivers/net/ethernet/ti/built-in.a
  AR      drivers/net/ethernet/vertexcom/built-in.a
  AR      drivers/net/ethernet/via/built-in.a
  AR      drivers/net/ethernet/wangxun/built-in.a
  AR      drivers/net/ethernet/wiznet/built-in.a
  CC      drivers/gpu/drm/i915/gem/i915_gem_context.o
  AR      drivers/net/ethernet/xilinx/built-in.a
  CC      drivers/gpu/drm/i915/gem/i915_gem_create.o
  AR      drivers/net/ethernet/xircom/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_sched_job.o
  AR      drivers/net/ethernet/synopsys/built-in.a
  CC      drivers/gpu/drm/i915/gem/i915_gem_dmabuf.o
  AR      drivers/net/ethernet/pensando/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_step.o
  CC      kernel/kexec.o
  CC      drivers/gpu/drm/drm_format_helper.o
  AR      drivers/net/ethernet/built-in.a
  CC      fs/mpage.o
  CC      fs/proc_namespace.o
  CC      fs/direct-io.o
  CC      drivers/gpu/drm/drm_gem_atomic_helper.o
  CC      kernel/utsname.o
  CC      fs/eventpoll.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_domain.o
  CC [M]  drivers/gpu/drm/xe/xe_sync.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_execbuffer.o
  CC      drivers/gpu/drm/drm_gem_framebuffer_helper.o
  CC [M]  drivers/gpu/drm/xe/xe_tile.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_internal.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_lmem.o
  CC      drivers/gpu/drm/drm_kms_helper_common.o
  CC      fs/anon_inodes.o
  CC      fs/signalfd.o
  CC      fs/timerfd.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_mman.o
  AR      drivers/net/built-in.a
  CC      drivers/gpu/drm/i915/gem/i915_gem_object.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_pages.o
  CC      drivers/gpu/drm/drm_modeset_helper.o
  CC      drivers/gpu/drm/drm_plane_helper.o
  CC [M]  drivers/gpu/drm/xe/xe_tile_sysfs.o
  CC [M]  drivers/gpu/drm/xe/xe_trace.o
  CC      fs/eventfd.o
  CC      drivers/gpu/drm/drm_probe_helper.o
  CC [M]  drivers/gpu/drm/xe/xe_trace_bo.o
  CC      kernel/pid_namespace.o
  CC      kernel/stop_machine.o
  CC      fs/aio.o
  CC      drivers/gpu/drm/drm_rect.o
  CC [M]  drivers/gpu/drm/xe/xe_trace_guc.o
  CC      fs/locks.o
  CC [M]  drivers/gpu/drm/xe/xe_ttm_sys_mgr.o
  CC      kernel/audit.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_phys.o
  CC [M]  drivers/gpu/drm/xe/xe_ttm_stolen_mgr.o
  CC      drivers/gpu/drm/drm_self_refresh_helper.o
  CC      kernel/auditfilter.o
  CC [M]  drivers/gpu/drm/xe/xe_ttm_vram_mgr.o
  CC      kernel/auditsc.o
  CC      fs/binfmt_misc.o
  CC      fs/binfmt_script.o
  CC      fs/binfmt_elf.o
  CC      drivers/gpu/drm/drm_simple_kms_helper.o
  CC      drivers/gpu/drm/bridge/panel.o
  CC [M]  drivers/gpu/drm/xe/xe_tuning.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_pm.o
  CC [M]  drivers/gpu/drm/xe/xe_uc.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_region.o
  CC      fs/mbcache.o
  CC      drivers/gpu/drm/drm_mipi_dsi.o
  CC [M]  drivers/gpu/drm/xe/xe_uc_debugfs.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_shmem.o
  CC [M]  drivers/gpu/drm/xe/xe_uc_fw.o
  CC      fs/posix_acl.o
  CC [M]  drivers/gpu/drm/drm_exec.o
  CC [M]  drivers/gpu/drm/xe/xe_vm.o
  CC      fs/coredump.o
  CC [M]  drivers/gpu/drm/xe/xe_vram.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_shrinker.o
  CC      fs/drop_caches.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_stolen.o
  CC [M]  drivers/gpu/drm/drm_gpuvm.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_throttle.o
  CC      kernel/audit_watch.o
  CC      kernel/audit_fsnotify.o
  CC      fs/sysctls.o
  CC [M]  drivers/gpu/drm/xe/xe_vram_freq.o
  CC      fs/fhandle.o
  CC [M]  drivers/gpu/drm/drm_suballoc.o
  CC [M]  drivers/gpu/drm/drm_gem_ttm_helper.o
  CC [M]  drivers/gpu/drm/xe/xe_wait_user_fence.o
  CC [M]  drivers/gpu/drm/xe/xe_wa.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_tiling.o
  CC [M]  drivers/gpu/drm/xe/xe_wopcm.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_ttm.o
  CC [M]  drivers/gpu/drm/xe/xe_hmm.o
  CC      kernel/audit_tree.o
  CC [M]  drivers/gpu/drm/xe/xe_hwmon.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_ttm_move.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_sriov_vf.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_sriov_vf_debugfs.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_relay.o
  CC      kernel/kprobes.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_userptr.o
  CC [M]  drivers/gpu/drm/xe/xe_memirq.o
  CC [M]  drivers/gpu/drm/xe/xe_sriov.o
  CC      kernel/seccomp.o
  CC [M]  drivers/gpu/drm/xe/display/ext/i915_irq.o
  CC [M]  drivers/gpu/drm/xe/display/ext/i915_utils.o
  CC [M]  drivers/gpu/drm/xe/display/intel_fb_bo.o
  CC      drivers/gpu/drm/i915/gem/i915_gem_wait.o
  CC [M]  drivers/gpu/drm/xe/display/intel_fbdev_fb.o
  LD [M]  drivers/gpu/drm/drm_suballoc_helper.o
  CC [M]  drivers/gpu/drm/xe/display/xe_display.o
  CC      drivers/gpu/drm/i915/gem/i915_gemfs.o
  CC [M]  drivers/gpu/drm/xe/display/xe_display_misc.o
  CC      kernel/relay.o
  CC [M]  drivers/gpu/drm/xe/display/xe_display_rps.o
  CC [M]  drivers/gpu/drm/xe/display/xe_display_wa.o
  LD [M]  drivers/gpu/drm/drm_ttm_helper.o
  CC [M]  drivers/gpu/drm/xe/display/xe_dsb_buffer.o
  CC [M]  drivers/gpu/drm/xe/display/xe_fb_pin.o
  CC      kernel/utsname_sysctl.o
  CC      drivers/gpu/drm/i915/i915_active.o
  CC      drivers/gpu/drm/i915/i915_cmd_parser.o
  CC      drivers/gpu/drm/i915/i915_deps.o
  CC      kernel/delayacct.o
  CC      kernel/taskstats.o
  CC [M]  drivers/gpu/drm/xe/display/xe_hdcp_gsc.o
  CC      kernel/tsacct.o
  CC      kernel/tracepoint.o
  CC [M]  drivers/gpu/drm/xe/display/xe_plane_initial.o
  CC [M]  drivers/gpu/drm/xe/display/xe_tdf.o
  CC      drivers/gpu/drm/i915/i915_gem.o
  CC      drivers/gpu/drm/i915/i915_gem_evict.o
  CC      kernel/irq_work.o
  CC      kernel/static_call.o
  CC      drivers/gpu/drm/i915/i915_gem_gtt.o
  CC [M]  drivers/gpu/drm/xe/i915-soc/intel_dram.o
  CC      drivers/gpu/drm/i915/i915_gem_ww.o
  CC [M]  drivers/gpu/drm/xe/i915-soc/intel_pch.o
  CC [M]  drivers/gpu/drm/xe/i915-display/icl_dsi.o
  CC      kernel/padata.o
  CC      kernel/jump_label.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_alpm.o
  CC      kernel/context_tracking.o
  CC      drivers/gpu/drm/i915/i915_query.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_atomic.o
  CC      drivers/gpu/drm/i915/i915_request.o
  CC      kernel/iomem.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_atomic_plane.o
  CC      drivers/gpu/drm/i915/i915_scheduler.o
  AR      fs/built-in.a
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_audio.o
  CC      kernel/rseq.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_backlight.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_bios.o
  CC      drivers/gpu/drm/i915/i915_trace_points.o
  CC      drivers/gpu/drm/i915/i915_ttm_buddy_manager.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_bw.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_cdclk.o
  CC      drivers/gpu/drm/i915/i915_vma.o
  CC      drivers/gpu/drm/i915/i915_vma_resource.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_color.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_combo_phy.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_connector.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_gsc_proxy.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_gsc_uc.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_crtc.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_debugfs.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_crtc_state_dump.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_cursor.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_cx0_phy.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_ddi.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_ddi_buf_trans.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_device.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_driver.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_irq.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_params.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_guc.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_guc_ads.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_power.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_power_map.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_power_well.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_guc_capture.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_guc_ct.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_guc_debugfs.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_guc_fw.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_trace.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_guc_hwconfig.o
  AR      kernel/built-in.a
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_wa.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dkl_phy.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_guc_log.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_guc_log_debugfs.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dmc.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_guc_rc.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dp.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_guc_submission.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_huc.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_huc_debugfs.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_huc_fw.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dp_aux.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_uc.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dp_aux_backlight.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dp_hdcp.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dp_link_training.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dp_mst.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dpll.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dpll_mgr.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dpt_common.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_drrs.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_uc_debugfs.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dsb.o
  CC      drivers/gpu/drm/i915/gt/uc/intel_uc_fw.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dsi.o
  CC      drivers/gpu/drm/i915/gt/intel_gsc.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dsi_dcs_backlight.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dsi_vbt.o
  CC      drivers/gpu/drm/i915/i915_hwmon.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_encoder.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_fb.o
  CC      drivers/gpu/drm/i915/display/hsw_ips.o
  CC      drivers/gpu/drm/i915/display/i9xx_plane.o
  CC      drivers/gpu/drm/i915/display/i9xx_wm.o
  CC      drivers/gpu/drm/i915/display/intel_alpm.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_fbc.o
  CC      drivers/gpu/drm/i915/display/intel_atomic.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_fdi.o
  CC      drivers/gpu/drm/i915/display/intel_atomic_plane.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_fifo_underrun.o
  CC      drivers/gpu/drm/i915/display/intel_audio.o
  CC      drivers/gpu/drm/i915/display/intel_bios.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_frontbuffer.o
  CC      drivers/gpu/drm/i915/display/intel_bw.o
  CC      drivers/gpu/drm/i915/display/intel_cdclk.o
  CC      drivers/gpu/drm/i915/display/intel_color.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_global_state.o
  CC      drivers/gpu/drm/i915/display/intel_combo_phy.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_gmbus.o
  CC      drivers/gpu/drm/i915/display/intel_connector.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_hdcp.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_hdcp_gsc_message.o
  CC      drivers/gpu/drm/i915/display/intel_crtc.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_hdmi.o
  CC      drivers/gpu/drm/i915/display/intel_crtc_state_dump.o
  CC      drivers/gpu/drm/i915/display/intel_cursor.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_hotplug.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_hotplug_irq.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_hti.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_link_bw.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_lspcon.o
  CC      drivers/gpu/drm/i915/display/intel_display.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_modeset_lock.o
  CC      drivers/gpu/drm/i915/display/intel_display_driver.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_modeset_setup.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_modeset_verify.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_panel.o
  CC      drivers/gpu/drm/i915/display/intel_display_irq.o
  CC      drivers/gpu/drm/i915/display/intel_display_params.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_pmdemand.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_pps.o
  CC      drivers/gpu/drm/i915/display/intel_display_power.o
  CC      drivers/gpu/drm/i915/display/intel_display_power_map.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_psr.o
  CC      drivers/gpu/drm/i915/display/intel_display_power_well.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_qp_tables.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_quirks.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_snps_phy.o
  CC      drivers/gpu/drm/i915/display/intel_display_reset.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_tc.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_vblank.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_vdsc.o
  CC      drivers/gpu/drm/i915/display/intel_display_rps.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_vga.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_vrr.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dmc_wl.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_wm.o
  CC [M]  drivers/gpu/drm/xe/i915-display/skl_scaler.o
  CC      drivers/gpu/drm/i915/display/intel_display_wa.o
  CC [M]  drivers/gpu/drm/xe/i915-display/skl_universal_plane.o
  CC [M]  drivers/gpu/drm/xe/i915-display/skl_watermark.o
  CC      drivers/gpu/drm/i915/display/intel_dmc.o
  CC      drivers/gpu/drm/i915/display/intel_dmc_wl.o
  CC      drivers/gpu/drm/i915/display/intel_dpio_phy.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_acpi.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_opregion.o
  CC      drivers/gpu/drm/i915/display/intel_dpll.o
  CC      drivers/gpu/drm/i915/display/intel_dpll_mgr.o
  CC      drivers/gpu/drm/i915/display/intel_dpt.o
  CC      drivers/gpu/drm/i915/display/intel_dpt_common.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_debugfs.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_debugfs_params.o
  CC      drivers/gpu/drm/i915/display/intel_drrs.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_pipe_crc.o
  CC      drivers/gpu/drm/i915/display/intel_dsb.o
  CC      drivers/gpu/drm/i915/display/intel_dsb_buffer.o
  CC      drivers/gpu/drm/i915/display/intel_fb.o
  CC      drivers/gpu/drm/i915/display/intel_fb_bo.o
  CC      drivers/gpu/drm/i915/display/intel_fb_pin.o
  CC      drivers/gpu/drm/i915/display/intel_fbc.o
  CC      drivers/gpu/drm/i915/display/intel_fdi.o
  CC      drivers/gpu/drm/i915/display/intel_fifo_underrun.o
  CC      drivers/gpu/drm/i915/display/intel_frontbuffer.o
  CC      drivers/gpu/drm/i915/display/intel_global_state.o
  CC      drivers/gpu/drm/i915/display/intel_hdcp.o
  CC      drivers/gpu/drm/i915/display/intel_hdcp_gsc.o
  CC      drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.o
  CC      drivers/gpu/drm/i915/display/intel_hotplug.o
  CC      drivers/gpu/drm/i915/display/intel_hotplug_irq.o
  CC      drivers/gpu/drm/i915/display/intel_hti.o
  CC      drivers/gpu/drm/i915/display/intel_link_bw.o
  CC      drivers/gpu/drm/i915/display/intel_load_detect.o
  CC      drivers/gpu/drm/i915/display/intel_lpe_audio.o
  CC      drivers/gpu/drm/i915/display/intel_modeset_lock.o
  CC      drivers/gpu/drm/i915/display/intel_modeset_setup.o
  CC      drivers/gpu/drm/i915/display/intel_modeset_verify.o
  CC      drivers/gpu/drm/i915/display/intel_overlay.o
  CC      drivers/gpu/drm/i915/display/intel_pch_display.o
  CC      drivers/gpu/drm/i915/display/intel_pch_refclk.o
  CC      drivers/gpu/drm/i915/display/intel_plane_initial.o
  CC      drivers/gpu/drm/i915/display/intel_pmdemand.o
  CC      drivers/gpu/drm/i915/display/intel_psr.o
  CC      drivers/gpu/drm/i915/display/intel_quirks.o
  CC      drivers/gpu/drm/i915/display/intel_sprite.o
  CC      drivers/gpu/drm/i915/display/intel_sprite_uapi.o
  CC      drivers/gpu/drm/i915/display/intel_tc.o
  CC      drivers/gpu/drm/i915/display/intel_vblank.o
  CC      drivers/gpu/drm/i915/display/intel_vga.o
  CC      drivers/gpu/drm/i915/display/intel_wm.o
  CC      drivers/gpu/drm/i915/display/skl_scaler.o
  CC      drivers/gpu/drm/i915/display/skl_universal_plane.o
  CC      drivers/gpu/drm/i915/display/skl_watermark.o
  CC      drivers/gpu/drm/i915/display/intel_acpi.o
  CC      drivers/gpu/drm/i915/display/intel_opregion.o
  CC      drivers/gpu/drm/i915/display/intel_display_debugfs.o
  CC      drivers/gpu/drm/i915/display/intel_display_debugfs_params.o
  CC      drivers/gpu/drm/i915/display/intel_pipe_crc.o
  CC      drivers/gpu/drm/i915/display/dvo_ch7017.o
  CC      drivers/gpu/drm/i915/display/dvo_ch7xxx.o
  CC      drivers/gpu/drm/i915/display/dvo_ivch.o
  CC      drivers/gpu/drm/i915/display/dvo_ns2501.o
  CC      drivers/gpu/drm/i915/display/dvo_sil164.o
  CC      drivers/gpu/drm/i915/display/dvo_tfp410.o
  CC      drivers/gpu/drm/i915/display/g4x_dp.o
  CC      drivers/gpu/drm/i915/display/g4x_hdmi.o
  CC      drivers/gpu/drm/i915/display/icl_dsi.o
  CC      drivers/gpu/drm/i915/display/intel_backlight.o
  CC      drivers/gpu/drm/i915/display/intel_crt.o
  CC      drivers/gpu/drm/i915/display/intel_cx0_phy.o
  CC      drivers/gpu/drm/i915/display/intel_ddi.o
  CC      drivers/gpu/drm/i915/display/intel_ddi_buf_trans.o
  CC      drivers/gpu/drm/i915/display/intel_display_device.o
  CC      drivers/gpu/drm/i915/display/intel_display_trace.o
  CC      drivers/gpu/drm/i915/display/intel_dkl_phy.o
  CC      drivers/gpu/drm/i915/display/intel_dp.o
  CC      drivers/gpu/drm/i915/display/intel_dp_aux.o
  CC      drivers/gpu/drm/i915/display/intel_dp_aux_backlight.o
  CC      drivers/gpu/drm/i915/display/intel_dp_hdcp.o
  CC      drivers/gpu/drm/i915/display/intel_dp_link_training.o
  CC      drivers/gpu/drm/i915/display/intel_dp_mst.o
  CC      drivers/gpu/drm/i915/display/intel_dsi.o
  CC      drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.o
  CC      drivers/gpu/drm/i915/display/intel_dsi_vbt.o
  CC      drivers/gpu/drm/i915/display/intel_dvo.o
  CC      drivers/gpu/drm/i915/display/intel_encoder.o
  CC      drivers/gpu/drm/i915/display/intel_gmbus.o
  CC      drivers/gpu/drm/i915/display/intel_hdmi.o
  CC      drivers/gpu/drm/i915/display/intel_lspcon.o
  CC      drivers/gpu/drm/i915/display/intel_lvds.o
  CC      drivers/gpu/drm/i915/display/intel_panel.o
  CC      drivers/gpu/drm/i915/display/intel_pps.o
  CC      drivers/gpu/drm/i915/display/intel_qp_tables.o
  CC      drivers/gpu/drm/i915/display/intel_sdvo.o
  CC      drivers/gpu/drm/i915/display/intel_snps_phy.o
  CC      drivers/gpu/drm/i915/display/intel_tv.o
  LD [M]  drivers/gpu/drm/xe/xe.o
  CC      drivers/gpu/drm/i915/display/intel_vdsc.o
  CC      drivers/gpu/drm/i915/display/intel_vrr.o
  CC      drivers/gpu/drm/i915/display/vlv_dsi.o
  CC      drivers/gpu/drm/i915/display/vlv_dsi_pll.o
  CC      drivers/gpu/drm/i915/i915_perf.o
  CC      drivers/gpu/drm/i915/pxp/intel_pxp.o
  CC      drivers/gpu/drm/i915/pxp/intel_pxp_huc.o
  CC      drivers/gpu/drm/i915/pxp/intel_pxp_tee.o
  CC      drivers/gpu/drm/i915/i915_gpu_error.o
  CC      drivers/gpu/drm/i915/i915_vgpu.o
  AR      drivers/gpu/drm/i915/built-in.a
  AR      drivers/gpu/drm/built-in.a
  AR      drivers/gpu/built-in.a
  AR      drivers/built-in.a
  AR      built-in.a
  AR      vmlinux.a
  LD      vmlinux.o
  OBJCOPY modules.builtin.modinfo
  GEN     modules.builtin
  MODPOST Module.symvers
  CC      .vmlinux.export.o
  CC [M]  fs/efivarfs/efivarfs.mod.o
  CC [M]  drivers/gpu/drm/drm_exec.mod.o
  CC [M]  drivers/gpu/drm/drm_gpuvm.mod.o
  CC [M]  drivers/gpu/drm/drm_suballoc_helper.mod.o
  CC [M]  drivers/gpu/drm/drm_ttm_helper.mod.o
  CC [M]  drivers/gpu/drm/scheduler/gpu-sched.mod.o
  CC [M]  drivers/gpu/drm/xe/xe.mod.o
  CC [M]  drivers/thermal/intel/x86_pkg_temp_thermal.mod.o
  CC [M]  sound/core/snd-hwdep.mod.o
  CC [M]  sound/core/snd-pcm.mod.o
  CC [M]  sound/pci/hda/snd-hda-codec.mod.o
  CC [M]  sound/pci/hda/snd-hda-codec-hdmi.mod.o
  CC [M]  sound/pci/hda/snd-hda-intel.mod.o
  CC [M]  sound/hda/snd-hda-core.mod.o
  CC [M]  sound/hda/snd-intel-dspcfg.mod.o
  CC [M]  sound/hda/snd-intel-sdw-acpi.mod.o
  CC [M]  net/netfilter/nf_log_syslog.mod.o
  CC [M]  net/netfilter/xt_mark.mod.o
  CC [M]  net/netfilter/xt_nat.mod.o
  CC [M]  net/netfilter/xt_LOG.mod.o
  CC [M]  net/netfilter/xt_MASQUERADE.mod.o
  CC [M]  net/netfilter/xt_addrtype.mod.o
  CC [M]  net/ipv4/netfilter/iptable_nat.mod.o
  LD [M]  sound/hda/snd-intel-dspcfg.ko
  LD [M]  drivers/gpu/drm/drm_suballoc_helper.ko
  LD [M]  drivers/gpu/drm/scheduler/gpu-sched.ko
  LD [M]  sound/pci/hda/snd-hda-codec-hdmi.ko
  LD [M]  drivers/gpu/drm/drm_exec.ko
  LD [M]  net/netfilter/xt_addrtype.ko
  LD [M]  net/netfilter/xt_MASQUERADE.ko
  LD [M]  fs/efivarfs/efivarfs.ko
  LD [M]  net/netfilter/xt_nat.ko
  LD [M]  net/netfilter/xt_LOG.ko
  LD [M]  net/ipv4/netfilter/iptable_nat.ko
  LD [M]  sound/core/snd-hwdep.ko
  LD [M]  sound/pci/hda/snd-hda-intel.ko
  LD [M]  sound/core/snd-pcm.ko
  LD [M]  net/netfilter/nf_log_syslog.ko
  LD [M]  drivers/gpu/drm/drm_ttm_helper.ko
  LD [M]  sound/pci/hda/snd-hda-codec.ko
  LD [M]  sound/hda/snd-intel-sdw-acpi.ko
  LD [M]  net/netfilter/xt_mark.ko
  LD [M]  drivers/thermal/intel/x86_pkg_temp_thermal.ko
  LD [M]  sound/hda/snd-hda-core.ko
  LD [M]  drivers/gpu/drm/drm_gpuvm.ko
  LD [M]  drivers/gpu/drm/xe/xe.ko
  UPD     include/generated/utsversion.h
  CC      init/version-timestamp.o
  KSYMS   .tmp_vmlinux0.kallsyms.S
  AS      .tmp_vmlinux0.kallsyms.o
  LD      .tmp_vmlinux1
  NM      .tmp_vmlinux1.syms
  KSYMS   .tmp_vmlinux1.kallsyms.S
  AS      .tmp_vmlinux1.kallsyms.o
  LD      .tmp_vmlinux2
  NM      .tmp_vmlinux2.syms
  KSYMS   .tmp_vmlinux2.kallsyms.S
  AS      .tmp_vmlinux2.kallsyms.o
  LD      vmlinux
  NM      System.map
  SORTTAB vmlinux
  RELOCS  arch/x86/boot/compressed/vmlinux.relocs
  RSTRIP  vmlinux
  CC      arch/x86/boot/a20.o
  AS      arch/x86/boot/bioscall.o
  CC      arch/x86/boot/cmdline.o
  AS      arch/x86/boot/copy.o
  HOSTCC  arch/x86/boot/mkcpustr
  CC      arch/x86/boot/cpuflags.o
  CC      arch/x86/boot/cpucheck.o
  CC      arch/x86/boot/early_serial_console.o
  CC      arch/x86/boot/edd.o
  CC      arch/x86/boot/main.o
  CC      arch/x86/boot/memory.o
  CC      arch/x86/boot/pm.o
  AS      arch/x86/boot/pmjump.o
  CC      arch/x86/boot/printf.o
  CC      arch/x86/boot/regs.o
  CC      arch/x86/boot/string.o
  CC      arch/x86/boot/tty.o
  CC      arch/x86/boot/video.o
  CC      arch/x86/boot/video-mode.o
  CC      arch/x86/boot/version.o
  CC      arch/x86/boot/video-vga.o
  CC      arch/x86/boot/video-vesa.o
  CC      arch/x86/boot/video-bios.o
  HOSTCC  arch/x86/boot/tools/build
  CPUSTR  arch/x86/boot/cpustr.h
  CC      arch/x86/boot/cpu.o
  LDS     arch/x86/boot/compressed/vmlinux.lds
  AS      arch/x86/boot/compressed/kernel_info.o
  AS      arch/x86/boot/compressed/head_32.o
  VOFFSET arch/x86/boot/compressed/../voffset.h
  CC      arch/x86/boot/compressed/string.o
  CC      arch/x86/boot/compressed/cmdline.o
  CC      arch/x86/boot/compressed/error.o
  OBJCOPY arch/x86/boot/compressed/vmlinux.bin
  HOSTCC  arch/x86/boot/compressed/mkpiggy
  CC      arch/x86/boot/compressed/cpuflags.o
  CC      arch/x86/boot/compressed/early_serial_console.o
  CC      arch/x86/boot/compressed/kaslr.o
  CC      arch/x86/boot/compressed/acpi.o
  CC      arch/x86/boot/compressed/efi.o
  GZIP    arch/x86/boot/compressed/vmlinux.bin.gz
  CC      arch/x86/boot/compressed/misc.o
  MKPIGGY arch/x86/boot/compressed/piggy.S
  AS      arch/x86/boot/compressed/piggy.o
  LD      arch/x86/boot/compressed/vmlinux
  ZOFFSET arch/x86/boot/zoffset.h
  OBJCOPY arch/x86/boot/vmlinux.bin
  AS      arch/x86/boot/header.o
  LD      arch/x86/boot/setup.elf
  OBJCOPY arch/x86/boot/setup.bin
  BUILD   arch/x86/boot/bzImage
Kernel: arch/x86/boot/bzImage is ready  (#1)
run-parts: executing /workspace/ci/hooks/20-kernel-doc
+ SRC_DIR=/workspace/kernel
+ cd /workspace/kernel
+ find drivers/gpu/drm/xe/ -name '*.[ch]' -not -path 'drivers/gpu/drm/xe/display/*'
+ xargs ./scripts/kernel-doc -Werror -none include/uapi/drm/xe_drm.h
drivers/gpu/drm/xe/xe_guc_ct_types.h:137: warning: Function parameter or struct member 'send_recv' not described in 'xe_guc_ct'
1 warnings as Errors
run-parts: /workspace/ci/hooks/20-kernel-doc exited with return code 123



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

* ✓ CI.checksparse: success for PF: Improve VF control (rev2)
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (19 preceding siblings ...)
  2024-08-09 17:44 ` ✗ CI.Hooks: failure " Patchwork
@ 2024-08-09 17:46 ` Patchwork
  2024-08-09 18:06 ` ✓ CI.BAT: " Patchwork
  2024-08-09 20:35 ` ✗ CI.FULL: failure " Patchwork
  22 siblings, 0 replies; 47+ messages in thread
From: Patchwork @ 2024-08-09 17:46 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

== Series Details ==

Series: PF: Improve VF control (rev2)
URL   : https://patchwork.freedesktop.org/series/137095/
State : success

== Summary ==

+ trap cleanup EXIT
+ KERNEL=/kernel
+ MT=/root/linux/maintainer-tools
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools /root/linux/maintainer-tools
Cloning into '/root/linux/maintainer-tools'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ make -C /root/linux/maintainer-tools
make: Entering directory '/root/linux/maintainer-tools'
cc -O2 -g -Wextra -o remap-log remap-log.c
make: Leaving directory '/root/linux/maintainer-tools'
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ /root/linux/maintainer-tools/dim sparse --fast 13384fb5b1e76e7012902cc10b1e49023358dc1d
Sparse version: 0.6.1 (Ubuntu: 0.6.1-2build1)
Fast mode used, each commit won't be checked separately.
Okay!

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



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

* ✓ CI.BAT: success for PF: Improve VF control (rev2)
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (20 preceding siblings ...)
  2024-08-09 17:46 ` ✓ CI.checksparse: success " Patchwork
@ 2024-08-09 18:06 ` Patchwork
  2024-08-09 20:35 ` ✗ CI.FULL: failure " Patchwork
  22 siblings, 0 replies; 47+ messages in thread
From: Patchwork @ 2024-08-09 18:06 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

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

== Series Details ==

Series: PF: Improve VF control (rev2)
URL   : https://patchwork.freedesktop.org/series/137095/
State : success

== Summary ==

CI Bug Log - changes from xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d_BAT -> xe-pw-137095v2_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (9 -> 9)
------------------------------

  No changes in participating hosts

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

  Here are the changes found in xe-pw-137095v2_BAT that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_addfb_basic@addfb25-x-tiled-legacy:
    - bat-bmg-1:          [PASS][1] -> [DMESG-WARN][2] ([Intel XE#877])
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/bat-bmg-1/igt@kms_addfb_basic@addfb25-x-tiled-legacy.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/bat-bmg-1/igt@kms_addfb_basic@addfb25-x-tiled-legacy.html

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


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

  * IGT: IGT_7964 -> IGT_7965
  * Linux: xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d -> xe-pw-137095v2

  IGT_7964: 0dabf88262c0349d261248638064b97da35369f8 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  IGT_7965: 965de1e69e91e331eee9d9f53e46b4652ba157c1 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d: 13384fb5b1e76e7012902cc10b1e49023358dc1d
  xe-pw-137095v2: 137095v2

== Logs ==

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

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

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

* ✗ CI.FULL: failure for PF: Improve VF control (rev2)
  2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
                   ` (21 preceding siblings ...)
  2024-08-09 18:06 ` ✓ CI.BAT: " Patchwork
@ 2024-08-09 20:35 ` Patchwork
  22 siblings, 0 replies; 47+ messages in thread
From: Patchwork @ 2024-08-09 20:35 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

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

== Series Details ==

Series: PF: Improve VF control (rev2)
URL   : https://patchwork.freedesktop.org/series/137095/
State : failure

== Summary ==

CI Bug Log - changes from xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d_full -> xe-pw-137095v2_full
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with xe-pw-137095v2_full absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in xe-pw-137095v2_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-137095v2_full:

### IGT changes ###

#### Possible regressions ####

  * igt@kms_fbcon_fbt@fbc-suspend:
    - shard-dg2-set2:     [PASS][1] -> [DMESG-WARN][2] +1 other test dmesg-warn
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-434/igt@kms_fbcon_fbt@fbc-suspend.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-466/igt@kms_fbcon_fbt@fbc-suspend.html

  * igt@xe_oa@oa-regs-whitelisted:
    - shard-lnl:          [PASS][3] -> [FAIL][4] +3 other tests fail
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-2/igt@xe_oa@oa-regs-whitelisted.html
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-5/igt@xe_oa@oa-regs-whitelisted.html

  
#### Suppressed ####

  The following results come from untrusted machines, tests, or statuses.
  They do not affect the overall result.

  * igt@kms_flip@plain-flip-fb-recreate-interruptible@c-dp2:
    - {shard-bmg}:        [PASS][5] -> [INCOMPLETE][6] +3 other tests incomplete
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-bmg-6/igt@kms_flip@plain-flip-fb-recreate-interruptible@c-dp2.html
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-bmg-2/igt@kms_flip@plain-flip-fb-recreate-interruptible@c-dp2.html

  * igt@kms_multipipe_modeset@basic-max-pipe-crc-check:
    - {shard-bmg}:        NOTRUN -> [SKIP][7]
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-bmg-1/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html

  * igt@kms_tiled_display@basic-test-pattern-with-chamelium:
    - {shard-bmg}:        [SKIP][8] ([Intel XE#2426]) -> [SKIP][9]
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-bmg-7/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-bmg-6/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html

  * igt@xe_oa@create-destroy-userspace-config:
    - {shard-bmg}:        [PASS][10] -> [DMESG-WARN][11] +9 other tests dmesg-warn
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-bmg-8/igt@xe_oa@create-destroy-userspace-config.html
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-bmg-3/igt@xe_oa@create-destroy-userspace-config.html

  * igt@xe_oa@oa-regs-whitelisted@ccs-0:
    - {shard-bmg}:        [PASS][12] -> [FAIL][13] +1 other test fail
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-bmg-5/igt@xe_oa@oa-regs-whitelisted@ccs-0.html
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-bmg-4/igt@xe_oa@oa-regs-whitelisted@ccs-0.html

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

  Here are the changes found in xe-pw-137095v2_full that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_addfb_basic@addfb25-y-tiled-small-legacy:
    - shard-dg2-set2:     NOTRUN -> [SKIP][14] ([Intel XE#623])
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_addfb_basic@addfb25-y-tiled-small-legacy.html

  * igt@kms_async_flips@async-flip-with-page-flip-events@pipe-a-edp-1-linear:
    - shard-lnl:          [PASS][15] -> [FAIL][16] ([Intel XE#911]) +3 other tests fail
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-7/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-a-edp-1-linear.html
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-1/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-a-edp-1-linear.html

  * igt@kms_atomic_transition@modeset-transition-nonblocking:
    - shard-lnl:          [PASS][17] -> [FAIL][18] ([Intel XE#1701]) +1 other test fail
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-1/igt@kms_atomic_transition@modeset-transition-nonblocking.html
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-5/igt@kms_atomic_transition@modeset-transition-nonblocking.html

  * igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels:
    - shard-lnl:          [PASS][19] -> [FAIL][20] ([Intel XE#1426]) +1 other test fail
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-7/igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels.html
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-5/igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels.html

  * igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-hdmi-a-6:
    - shard-dg2-set2:     [PASS][21] -> [FAIL][22] ([Intel XE#1426]) +1 other test fail
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-434/igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-hdmi-a-6.html
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-436/igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-hdmi-a-6.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip:
    - shard-adlp:         NOTRUN -> [SKIP][23] ([Intel XE#1124] / [Intel XE#1201]) +2 other tests skip
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip.html

  * igt@kms_big_fb@linear-8bpp-rotate-90:
    - shard-dg2-set2:     NOTRUN -> [SKIP][24] ([Intel XE#1201] / [Intel XE#316])
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-466/igt@kms_big_fb@linear-8bpp-rotate-90.html

  * igt@kms_big_fb@x-tiled-16bpp-rotate-90:
    - shard-adlp:         NOTRUN -> [SKIP][25] ([Intel XE#1201] / [Intel XE#316])
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-4/igt@kms_big_fb@x-tiled-16bpp-rotate-90.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip:
    - shard-adlp:         [PASS][26] -> [FAIL][27] ([Intel XE#1231])
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-2/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip.html
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-4/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-async-flip:
    - shard-adlp:         NOTRUN -> [FAIL][28] ([Intel XE#1231])
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-8/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-async-flip.html

  * igt@kms_big_fb@yf-tiled-32bpp-rotate-180:
    - shard-dg2-set2:     NOTRUN -> [SKIP][29] ([Intel XE#1124] / [Intel XE#1201]) +2 other tests skip
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-436/igt@kms_big_fb@yf-tiled-32bpp-rotate-180.html

  * igt@kms_bw@connected-linear-tiling-3-displays-1920x1080p:
    - shard-dg2-set2:     NOTRUN -> [SKIP][30] ([Intel XE#1201] / [Intel XE#2191])
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-463/igt@kms_bw@connected-linear-tiling-3-displays-1920x1080p.html

  * igt@kms_bw@linear-tiling-3-displays-2160x1440p:
    - shard-adlp:         NOTRUN -> [SKIP][31] ([Intel XE#1201] / [Intel XE#367])
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@kms_bw@linear-tiling-3-displays-2160x1440p.html

  * igt@kms_bw@linear-tiling-4-displays-2160x1440p:
    - shard-dg2-set2:     NOTRUN -> [SKIP][32] ([Intel XE#1201] / [Intel XE#367])
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-433/igt@kms_bw@linear-tiling-4-displays-2160x1440p.html

  * igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-rc-ccs-cc@pipe-a-hdmi-a-1:
    - shard-adlp:         NOTRUN -> [SKIP][33] ([Intel XE#1201] / [Intel XE#787]) +11 other tests skip
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-6/igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-rc-ccs-cc@pipe-a-hdmi-a-1.html

  * igt@kms_ccs@missing-ccs-buffer-y-tiled-gen12-rc-ccs-cc@pipe-d-dp-4:
    - shard-dg2-set2:     NOTRUN -> [SKIP][34] ([Intel XE#1201] / [Intel XE#455] / [Intel XE#787]) +3 other tests skip
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-435/igt@kms_ccs@missing-ccs-buffer-y-tiled-gen12-rc-ccs-cc@pipe-d-dp-4.html

  * igt@kms_ccs@missing-ccs-buffer-y-tiled-gen12-rc-ccs-cc@pipe-d-hdmi-a-6:
    - shard-dg2-set2:     NOTRUN -> [SKIP][35] ([Intel XE#1201] / [Intel XE#787]) +13 other tests skip
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-435/igt@kms_ccs@missing-ccs-buffer-y-tiled-gen12-rc-ccs-cc@pipe-d-hdmi-a-6.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-d-hdmi-a-1:
    - shard-adlp:         NOTRUN -> [SKIP][36] ([Intel XE#1201] / [Intel XE#455] / [Intel XE#787]) +7 other tests skip
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-4/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-d-hdmi-a-1.html

  * igt@kms_chamelium_color@ctm-blue-to-red:
    - shard-adlp:         NOTRUN -> [SKIP][37] ([Intel XE#1201] / [Intel XE#306])
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@kms_chamelium_color@ctm-blue-to-red.html

  * igt@kms_chamelium_color@ctm-green-to-red:
    - shard-dg2-set2:     NOTRUN -> [SKIP][38] ([Intel XE#1201] / [Intel XE#306])
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-434/igt@kms_chamelium_color@ctm-green-to-red.html

  * igt@kms_chamelium_edid@hdmi-mode-timings:
    - shard-dg2-set2:     NOTRUN -> [SKIP][39] ([Intel XE#1201] / [Intel XE#373])
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-434/igt@kms_chamelium_edid@hdmi-mode-timings.html

  * igt@kms_chamelium_frames@vga-frame-dump:
    - shard-adlp:         NOTRUN -> [SKIP][40] ([Intel XE#1201] / [Intel XE#373]) +2 other tests skip
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-4/igt@kms_chamelium_frames@vga-frame-dump.html

  * igt@kms_chamelium_hpd@hdmi-hpd-after-suspend:
    - shard-dg2-set2:     NOTRUN -> [SKIP][41] ([Intel XE#373])
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_chamelium_hpd@hdmi-hpd-after-suspend.html

  * igt@kms_content_protection@dp-mst-lic-type-0:
    - shard-adlp:         NOTRUN -> [SKIP][42] ([Intel XE#1201] / [Intel XE#307])
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-6/igt@kms_content_protection@dp-mst-lic-type-0.html

  * igt@kms_cursor_crc@cursor-random-32x32:
    - shard-adlp:         NOTRUN -> [SKIP][43] ([Intel XE#1201] / [Intel XE#455]) +6 other tests skip
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-2/igt@kms_cursor_crc@cursor-random-32x32.html

  * igt@kms_cursor_crc@cursor-random-512x512:
    - shard-dg2-set2:     NOTRUN -> [SKIP][44] ([Intel XE#1201] / [Intel XE#308])
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-466/igt@kms_cursor_crc@cursor-random-512x512.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size:
    - shard-adlp:         NOTRUN -> [SKIP][45] ([Intel XE#1201] / [Intel XE#309]) +1 other test skip
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size.html

  * igt@kms_feature_discovery@display-2x:
    - shard-adlp:         NOTRUN -> [SKIP][46] ([Intel XE#1201] / [Intel XE#702])
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-8/igt@kms_feature_discovery@display-2x.html

  * igt@kms_flip@2x-flip-vs-panning-vs-hang:
    - shard-adlp:         NOTRUN -> [SKIP][47] ([Intel XE#1201] / [Intel XE#310])
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-9/igt@kms_flip@2x-flip-vs-panning-vs-hang.html

  * igt@kms_flip@flip-vs-suspend-interruptible@d-dp4:
    - shard-dg2-set2:     NOTRUN -> [INCOMPLETE][48] ([Intel XE#1195] / [Intel XE#2049])
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-435/igt@kms_flip@flip-vs-suspend-interruptible@d-dp4.html

  * igt@kms_flip@flip-vs-suspend@a-hdmi-a6:
    - shard-dg2-set2:     [PASS][49] -> [DMESG-WARN][50] ([Intel XE#1551]) +1 other test dmesg-warn
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-434/igt@kms_flip@flip-vs-suspend@a-hdmi-a6.html
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-463/igt@kms_flip@flip-vs-suspend@a-hdmi-a6.html

  * igt@kms_flip_scaled_crc@flip-64bpp-xtile-to-16bpp-xtile-downscaling:
    - shard-adlp:         [PASS][51] -> [DMESG-FAIL][52] ([Intel XE#324]) +2 other tests dmesg-fail
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-8/igt@kms_flip_scaled_crc@flip-64bpp-xtile-to-16bpp-xtile-downscaling.html
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-2/igt@kms_flip_scaled_crc@flip-64bpp-xtile-to-16bpp-xtile-downscaling.html

  * igt@kms_flip_tiling@flip-change-tiling@pipe-d-hdmi-a-1-x-to-x:
    - shard-adlp:         [PASS][53] -> [FAIL][54] ([Intel XE#1874]) +2 other tests fail
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-4/igt@kms_flip_tiling@flip-change-tiling@pipe-d-hdmi-a-1-x-to-x.html
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-4/igt@kms_flip_tiling@flip-change-tiling@pipe-d-hdmi-a-1-x-to-x.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-shrfb-draw-render:
    - shard-dg2-set2:     NOTRUN -> [SKIP][55] ([Intel XE#1201] / [Intel XE#651]) +2 other tests skip
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-436/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-shrfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-shrfb-draw-blt:
    - shard-adlp:         NOTRUN -> [SKIP][56] ([Intel XE#1201] / [Intel XE#651]) +2 other tests skip
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-8/igt@kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-shrfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-onoff:
    - shard-dg2-set2:     NOTRUN -> [SKIP][57] ([Intel XE#651]) +2 other tests skip
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-msflip-blt:
    - shard-dg2-set2:     NOTRUN -> [SKIP][58] ([Intel XE#1201] / [Intel XE#653]) +1 other test skip
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-435/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@pipe-fbc-rte:
    - shard-dg2-set2:     NOTRUN -> [SKIP][59] ([Intel XE#455])
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_frontbuffer_tracking@pipe-fbc-rte.html

  * igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-render:
    - shard-adlp:         NOTRUN -> [SKIP][60] ([Intel XE#1201] / [Intel XE#653])
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-6/igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-shrfb-msflip-blt:
    - shard-dg2-set2:     NOTRUN -> [SKIP][61] ([Intel XE#653]) +2 other tests skip
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_frontbuffer_tracking@psr-2p-primscrn-shrfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-fullscreen:
    - shard-adlp:         NOTRUN -> [SKIP][62] ([Intel XE#1201] / [Intel XE#656]) +9 other tests skip
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-2/igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-fullscreen.html

  * igt@kms_pipe_crc_basic@suspend-read-crc@pipe-a-edp-1:
    - shard-lnl:          [PASS][63] -> [FAIL][64] ([Intel XE#2028]) +17 other tests fail
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-6/igt@kms_pipe_crc_basic@suspend-read-crc@pipe-a-edp-1.html
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-1/igt@kms_pipe_crc_basic@suspend-read-crc@pipe-a-edp-1.html

  * igt@kms_plane@plane-position-hole:
    - shard-lnl:          [PASS][65] -> [DMESG-FAIL][66] ([Intel XE#324]) +2 other tests dmesg-fail
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-1/igt@kms_plane@plane-position-hole.html
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-4/igt@kms_plane@plane-position-hole.html

  * igt@kms_plane@plane-position-hole@pipe-b-plane-1:
    - shard-lnl:          [PASS][67] -> [DMESG-WARN][68] ([Intel XE#324]) +3 other tests dmesg-warn
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-1/igt@kms_plane@plane-position-hole@pipe-b-plane-1.html
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-4/igt@kms_plane@plane-position-hole@pipe-b-plane-1.html

  * igt@kms_plane_cursor@primary@pipe-a-hdmi-a-1-size-128:
    - shard-adlp:         NOTRUN -> [FAIL][69] ([Intel XE#1874]) +3 other tests fail
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-8/igt@kms_plane_cursor@primary@pipe-a-hdmi-a-1-size-128.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format:
    - shard-adlp:         NOTRUN -> [SKIP][70] ([Intel XE#1201] / [Intel XE#455] / [Intel XE#498]) +1 other test skip
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-8/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format@pipe-a-hdmi-a-1:
    - shard-adlp:         NOTRUN -> [SKIP][71] ([Intel XE#1201] / [Intel XE#498]) +2 other tests skip
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-8/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format@pipe-a-hdmi-a-1.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-a-hdmi-a-1:
    - shard-adlp:         NOTRUN -> [SKIP][72] ([Intel XE#1201] / [Intel XE#2318]) +2 other tests skip
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-a-hdmi-a-1.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-d-hdmi-a-1:
    - shard-adlp:         NOTRUN -> [SKIP][73] ([Intel XE#1201] / [Intel XE#2318] / [Intel XE#455]) +1 other test skip
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-d-hdmi-a-1.html

  * igt@kms_pm_backlight@basic-brightness:
    - shard-lnl:          [PASS][74] -> [SKIP][75] ([Intel XE#870]) +1 other test skip
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-8/igt@kms_pm_backlight@basic-brightness.html
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-6/igt@kms_pm_backlight@basic-brightness.html

  * igt@kms_psr2_sf@fbc-primary-plane-update-sf-dmg-area:
    - shard-adlp:         NOTRUN -> [SKIP][76] ([Intel XE#1201]) +2 other tests skip
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-8/igt@kms_psr2_sf@fbc-primary-plane-update-sf-dmg-area.html

  * igt@kms_psr2_sf@overlay-plane-update-sf-dmg-area:
    - shard-dg2-set2:     NOTRUN -> [SKIP][77] ([Intel XE#1201] / [Intel XE#1489])
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-466/igt@kms_psr2_sf@overlay-plane-update-sf-dmg-area.html

  * igt@kms_psr@fbc-psr2-basic:
    - shard-adlp:         NOTRUN -> [SKIP][78] ([Intel XE#1201] / [Intel XE#929]) +5 other tests skip
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-8/igt@kms_psr@fbc-psr2-basic.html

  * igt@kms_psr@pr-suspend:
    - shard-dg2-set2:     NOTRUN -> [SKIP][79] ([Intel XE#1201] / [Intel XE#929]) +1 other test skip
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-436/igt@kms_psr@pr-suspend.html

  * igt@kms_psr@psr2-cursor-plane-move@edp-1:
    - shard-lnl:          [PASS][80] -> [FAIL][81] ([Intel XE#1649]) +1 other test fail
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-2/igt@kms_psr@psr2-cursor-plane-move@edp-1.html
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-5/igt@kms_psr@psr2-cursor-plane-move@edp-1.html

  * igt@kms_rotation_crc@bad-tiling:
    - shard-adlp:         NOTRUN -> [SKIP][82] ([Intel XE#1201] / [Intel XE#327])
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@kms_rotation_crc@bad-tiling.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-90:
    - shard-dg2-set2:     NOTRUN -> [SKIP][83] ([Intel XE#327])
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-90.html

  * igt@kms_tv_load_detect@load-detect:
    - shard-adlp:         NOTRUN -> [SKIP][84] ([Intel XE#1201] / [Intel XE#330])
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-2/igt@kms_tv_load_detect@load-detect.html

  * igt@kms_universal_plane@cursor-fb-leak:
    - shard-dg2-set2:     [PASS][85] -> [FAIL][86] ([Intel XE#771] / [Intel XE#899])
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-466/igt@kms_universal_plane@cursor-fb-leak.html
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_universal_plane@cursor-fb-leak.html
    - shard-lnl:          [PASS][87] -> [FAIL][88] ([Intel XE#899]) +1 other test fail
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-1/igt@kms_universal_plane@cursor-fb-leak.html
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-2/igt@kms_universal_plane@cursor-fb-leak.html

  * igt@kms_universal_plane@cursor-fb-leak@pipe-d-hdmi-a-6:
    - shard-dg2-set2:     [PASS][89] -> [FAIL][90] ([Intel XE#899])
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-466/igt@kms_universal_plane@cursor-fb-leak@pipe-d-hdmi-a-6.html
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_universal_plane@cursor-fb-leak@pipe-d-hdmi-a-6.html

  * igt@kms_vrr@flipline:
    - shard-lnl:          [PASS][91] -> [FAIL][92] ([Intel XE#2443]) +3 other tests fail
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-6/igt@kms_vrr@flipline.html
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-4/igt@kms_vrr@flipline.html

  * igt@kms_writeback@writeback-fb-id:
    - shard-adlp:         NOTRUN -> [SKIP][93] ([Intel XE#1201] / [Intel XE#756])
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-6/igt@kms_writeback@writeback-fb-id.html

  * igt@xe_copy_basic@mem-copy-linear-0x3fff:
    - shard-adlp:         NOTRUN -> [SKIP][94] ([Intel XE#1123] / [Intel XE#1201])
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-8/igt@xe_copy_basic@mem-copy-linear-0x3fff.html

  * igt@xe_copy_basic@mem-set-linear-0x369:
    - shard-dg2-set2:     NOTRUN -> [SKIP][95] ([Intel XE#1126])
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@xe_copy_basic@mem-set-linear-0x369.html

  * igt@xe_evict@evict-beng-small-external:
    - shard-adlp:         NOTRUN -> [SKIP][96] ([Intel XE#1201] / [Intel XE#261] / [Intel XE#688]) +1 other test skip
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-8/igt@xe_evict@evict-beng-small-external.html

  * igt@xe_evict@evict-large-multi-vm-cm:
    - shard-dg2-set2:     [PASS][97] -> [FAIL][98] ([Intel XE#1600])
   [97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-433/igt@xe_evict@evict-large-multi-vm-cm.html
   [98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-436/igt@xe_evict@evict-large-multi-vm-cm.html

  * igt@xe_evict@evict-mixed-many-threads-large:
    - shard-adlp:         NOTRUN -> [SKIP][99] ([Intel XE#1201] / [Intel XE#261])
   [99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-8/igt@xe_evict@evict-mixed-many-threads-large.html

  * igt@xe_evict@evict-mixed-threads-large:
    - shard-dg2-set2:     [PASS][100] -> [INCOMPLETE][101] ([Intel XE#1195] / [Intel XE#1473] / [Intel XE#392])
   [100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-434/igt@xe_evict@evict-mixed-threads-large.html
   [101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-463/igt@xe_evict@evict-mixed-threads-large.html

  * igt@xe_evict_ccs@evict-overcommit-standalone-instantfree-reopen:
    - shard-adlp:         NOTRUN -> [SKIP][102] ([Intel XE#1201] / [Intel XE#688])
   [102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-4/igt@xe_evict_ccs@evict-overcommit-standalone-instantfree-reopen.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-null-defer-bind:
    - shard-adlp:         NOTRUN -> [SKIP][103] ([Intel XE#1201] / [Intel XE#1392]) +2 other tests skip
   [103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-null-defer-bind.html

  * igt@xe_exec_compute_mode@lr-mode-workload:
    - shard-adlp:         NOTRUN -> [FAIL][104] ([Intel XE#2125])
   [104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-8/igt@xe_exec_compute_mode@lr-mode-workload.html

  * igt@xe_exec_fault_mode@many-bindexecqueue-userptr-invalidate-race-imm:
    - shard-dg2-set2:     NOTRUN -> [SKIP][105] ([Intel XE#288])
   [105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@xe_exec_fault_mode@many-bindexecqueue-userptr-invalidate-race-imm.html

  * igt@xe_exec_fault_mode@many-execqueues-rebind:
    - shard-adlp:         NOTRUN -> [SKIP][106] ([Intel XE#1201] / [Intel XE#288]) +5 other tests skip
   [106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@xe_exec_fault_mode@many-execqueues-rebind.html

  * igt@xe_exec_fault_mode@twice-basic-prefetch:
    - shard-dg2-set2:     NOTRUN -> [SKIP][107] ([Intel XE#1201] / [Intel XE#288]) +3 other tests skip
   [107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-436/igt@xe_exec_fault_mode@twice-basic-prefetch.html

  * igt@xe_exec_threads@threads-fd-userptr:
    - shard-adlp:         [PASS][108] -> [DMESG-WARN][109] ([Intel XE#2226]) +1 other test dmesg-warn
   [108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-8/igt@xe_exec_threads@threads-fd-userptr.html
   [109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@xe_exec_threads@threads-fd-userptr.html

  * igt@xe_exec_threads@threads-userptr-rebind:
    - shard-adlp:         [PASS][110] -> [INCOMPLETE][111] ([Intel XE#1169] / [Intel XE#1195])
   [110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-4/igt@xe_exec_threads@threads-userptr-rebind.html
   [111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-2/igt@xe_exec_threads@threads-userptr-rebind.html

  * igt@xe_live_ktest@xe_bo:
    - shard-dg2-set2:     [PASS][112] -> [SKIP][113] ([Intel XE#1192] / [Intel XE#1201])
   [112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-435/igt@xe_live_ktest@xe_bo.html
   [113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-463/igt@xe_live_ktest@xe_bo.html

  * igt@xe_live_ktest@xe_migrate@xe_validate_ccs_kunit:
    - shard-dg2-set2:     NOTRUN -> [SKIP][114] ([Intel XE#1201] / [Intel XE#2229])
   [114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-433/igt@xe_live_ktest@xe_migrate@xe_validate_ccs_kunit.html

  * igt@xe_oa@missing-sample-flags:
    - shard-dg2-set2:     NOTRUN -> [SKIP][115] ([Intel XE#2207])
   [115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@xe_oa@missing-sample-flags.html

  * igt@xe_oa@mmio-triggered-reports:
    - shard-lnl:          [PASS][116] -> [FAIL][117] ([Intel XE#2249])
   [116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-1/igt@xe_oa@mmio-triggered-reports.html
   [117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-1/igt@xe_oa@mmio-triggered-reports.html

  * igt@xe_oa@mmio-triggered-reports@rcs-0:
    - shard-lnl:          NOTRUN -> [FAIL][118] ([Intel XE#2249])
   [118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-1/igt@xe_oa@mmio-triggered-reports@rcs-0.html

  * igt@xe_oa@oa-unit-exclusive-stream-sample-oa:
    - shard-adlp:         NOTRUN -> [SKIP][119] ([Intel XE#1201] / [Intel XE#2207]) +1 other test skip
   [119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-6/igt@xe_oa@oa-unit-exclusive-stream-sample-oa.html

  * igt@xe_pm@s3-multiple-execs:
    - shard-dg2-set2:     [PASS][120] -> [DMESG-WARN][121] ([Intel XE#1551] / [Intel XE#569])
   [120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-436/igt@xe_pm@s3-multiple-execs.html
   [121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@xe_pm@s3-multiple-execs.html

  * igt@xe_pm@s4-multiple-execs:
    - shard-adlp:         [PASS][122] -> [ABORT][123] ([Intel XE#1358] / [Intel XE#1794])
   [122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-2/igt@xe_pm@s4-multiple-execs.html
   [123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-9/igt@xe_pm@s4-multiple-execs.html

  * igt@xe_pm@s4-vm-bind-userptr:
    - shard-lnl:          [PASS][124] -> [ABORT][125] ([Intel XE#1794])
   [124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-4/igt@xe_pm@s4-vm-bind-userptr.html
   [125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-2/igt@xe_pm@s4-vm-bind-userptr.html

  * igt@xe_query@multigpu-query-cs-cycles:
    - shard-adlp:         NOTRUN -> [SKIP][126] ([Intel XE#1201] / [Intel XE#944])
   [126]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-8/igt@xe_query@multigpu-query-cs-cycles.html

  * igt@xe_query@multigpu-query-oa-units:
    - shard-dg2-set2:     NOTRUN -> [SKIP][127] ([Intel XE#1201] / [Intel XE#944])
   [127]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-463/igt@xe_query@multigpu-query-oa-units.html

  
#### Possible fixes ####

  * igt@kms_async_flips@alternate-sync-async-flip@pipe-d-dp-2:
    - {shard-bmg}:        [DMESG-WARN][128] ([Intel XE#1033]) -> [PASS][129] +1 other test pass
   [128]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-bmg-2/igt@kms_async_flips@alternate-sync-async-flip@pipe-d-dp-2.html
   [129]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-bmg-6/igt@kms_async_flips@alternate-sync-async-flip@pipe-d-dp-2.html

  * igt@kms_atomic_transition@plane-all-modeset-transition-fencing:
    - shard-adlp:         [FAIL][130] ([Intel XE#1426]) -> [PASS][131] +1 other test pass
   [130]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-9/igt@kms_atomic_transition@plane-all-modeset-transition-fencing.html
   [131]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-9/igt@kms_atomic_transition@plane-all-modeset-transition-fencing.html

  * igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels@pipe-a-edp-1:
    - shard-lnl:          [FAIL][132] ([Intel XE#1426]) -> [PASS][133] +1 other test pass
   [132]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-6/igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels@pipe-a-edp-1.html
   [133]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-1/igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels@pipe-a-edp-1.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip:
    - shard-adlp:         [FAIL][134] ([Intel XE#1231]) -> [PASS][135] +4 other tests pass
   [134]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-4/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip.html
   [135]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-4/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic:
    - {shard-bmg}:        [INCOMPLETE][136] -> [PASS][137] +3 other tests pass
   [136]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-bmg-6/igt@kms_cursor_legacy@flip-vs-cursor-atomic.html
   [137]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-bmg-4/igt@kms_cursor_legacy@flip-vs-cursor-atomic.html

  * igt@kms_cursor_legacy@short-flip-before-cursor-atomic-transitions-varying-size:
    - shard-lnl:          [FAIL][138] ([Intel XE#1541]) -> [PASS][139]
   [138]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-1/igt@kms_cursor_legacy@short-flip-before-cursor-atomic-transitions-varying-size.html
   [139]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-4/igt@kms_cursor_legacy@short-flip-before-cursor-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@torture-move@pipe-a:
    - shard-dg2-set2:     [DMESG-WARN][140] ([Intel XE#877]) -> [PASS][141] +1 other test pass
   [140]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-434/igt@kms_cursor_legacy@torture-move@pipe-a.html
   [141]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-436/igt@kms_cursor_legacy@torture-move@pipe-a.html

  * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible:
    - shard-dg2-set2:     [FAIL][142] ([Intel XE#301]) -> [PASS][143]
   [142]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-463/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible.html
   [143]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-435/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible.html

  * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bd-hdmi-a6-dp4:
    - shard-dg2-set2:     [FAIL][144] -> [PASS][145]
   [144]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-463/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bd-hdmi-a6-dp4.html
   [145]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-435/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bd-hdmi-a6-dp4.html

  * igt@kms_flip@2x-flip-vs-panning-interruptible:
    - {shard-bmg}:        [DMESG-WARN][146] ([Intel XE#877]) -> [PASS][147]
   [146]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-bmg-4/igt@kms_flip@2x-flip-vs-panning-interruptible.html
   [147]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-bmg-6/igt@kms_flip@2x-flip-vs-panning-interruptible.html

  * igt@kms_flip@2x-flip-vs-panning-interruptible@cd-dp2-hdmi-a3:
    - {shard-bmg}:        [DMESG-WARN][148] -> [PASS][149] +7 other tests pass
   [148]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-bmg-4/igt@kms_flip@2x-flip-vs-panning-interruptible@cd-dp2-hdmi-a3.html
   [149]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-bmg-6/igt@kms_flip@2x-flip-vs-panning-interruptible@cd-dp2-hdmi-a3.html

  * igt@kms_flip@flip-vs-suspend-interruptible@c-dp4:
    - shard-dg2-set2:     [INCOMPLETE][150] -> [PASS][151]
   [150]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_flip@flip-vs-suspend-interruptible@c-dp4.html
   [151]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-435/igt@kms_flip@flip-vs-suspend-interruptible@c-dp4.html

  * igt@kms_flip@wf_vblank-ts-check:
    - shard-lnl:          [FAIL][152] ([Intel XE#886]) -> [PASS][153] +1 other test pass
   [152]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-1/igt@kms_flip@wf_vblank-ts-check.html
   [153]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-3/igt@kms_flip@wf_vblank-ts-check.html

  * igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-blt:
    - shard-adlp:         [FAIL][154] ([Intel XE#1861]) -> [PASS][155] +3 other tests pass
   [154]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-6/igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-blt.html
   [155]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-2/igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-blt.html

  * igt@kms_hdr@invalid-hdr:
    - {shard-bmg}:        [SKIP][156] ([Intel XE#1503]) -> [PASS][157]
   [156]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-bmg-6/igt@kms_hdr@invalid-hdr.html
   [157]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-bmg-7/igt@kms_hdr@invalid-hdr.html

  * igt@kms_plane@plane-position-hole-dpms@pipe-a-plane-3:
    - shard-lnl:          [DMESG-WARN][158] ([Intel XE#324]) -> [PASS][159]
   [158]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-6/igt@kms_plane@plane-position-hole-dpms@pipe-a-plane-3.html
   [159]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-5/igt@kms_plane@plane-position-hole-dpms@pipe-a-plane-3.html

  * igt@kms_plane_lowres@tiling-y@pipe-d-hdmi-a-1:
    - shard-adlp:         [FAIL][160] ([Intel XE#1874]) -> [PASS][161] +6 other tests pass
   [160]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-2/igt@kms_plane_lowres@tiling-y@pipe-d-hdmi-a-1.html
   [161]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-4/igt@kms_plane_lowres@tiling-y@pipe-d-hdmi-a-1.html

  * igt@kms_pm_backlight@fade:
    - shard-lnl:          [SKIP][162] ([Intel XE#870]) -> [PASS][163] +1 other test pass
   [162]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-1/igt@kms_pm_backlight@fade.html
   [163]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-7/igt@kms_pm_backlight@fade.html

  * igt@kms_rotation_crc@primary-4-tiled-reflect-x-180:
    - {shard-bmg}:        [FAIL][164] -> [PASS][165]
   [164]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-bmg-3/igt@kms_rotation_crc@primary-4-tiled-reflect-x-180.html
   [165]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-bmg-4/igt@kms_rotation_crc@primary-4-tiled-reflect-x-180.html

  * igt@kms_universal_plane@cursor-fb-leak:
    - shard-adlp:         [FAIL][166] ([Intel XE#771] / [Intel XE#899]) -> [PASS][167]
   [166]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-8/igt@kms_universal_plane@cursor-fb-leak.html
   [167]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@kms_universal_plane@cursor-fb-leak.html
    - {shard-bmg}:        [FAIL][168] ([Intel XE#899]) -> [PASS][169] +3 other tests pass
   [168]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-bmg-2/igt@kms_universal_plane@cursor-fb-leak.html
   [169]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-bmg-8/igt@kms_universal_plane@cursor-fb-leak.html

  * igt@kms_universal_plane@cursor-fb-leak@pipe-c-hdmi-a-1:
    - shard-adlp:         [FAIL][170] ([Intel XE#899]) -> [PASS][171]
   [170]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-8/igt@kms_universal_plane@cursor-fb-leak@pipe-c-hdmi-a-1.html
   [171]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@kms_universal_plane@cursor-fb-leak@pipe-c-hdmi-a-1.html

  * igt@kms_vrr@flip-dpms:
    - shard-lnl:          [FAIL][172] -> [PASS][173]
   [172]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-7/igt@kms_vrr@flip-dpms.html
   [173]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-5/igt@kms_vrr@flip-dpms.html

  * igt@kms_vrr@flip-dpms@pipe-a-edp-1:
    - shard-lnl:          [FAIL][174] ([Intel XE#2443]) -> [PASS][175]
   [174]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-7/igt@kms_vrr@flip-dpms@pipe-a-edp-1.html
   [175]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-5/igt@kms_vrr@flip-dpms@pipe-a-edp-1.html

  * igt@xe_evict@evict-beng-cm-threads-large:
    - {shard-bmg}:        [TIMEOUT][176] ([Intel XE#1473]) -> [PASS][177]
   [176]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-bmg-8/igt@xe_evict@evict-beng-cm-threads-large.html
   [177]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-bmg-6/igt@xe_evict@evict-beng-cm-threads-large.html
    - shard-dg2-set2:     [TIMEOUT][178] ([Intel XE#1473] / [Intel XE#392]) -> [PASS][179]
   [178]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-435/igt@xe_evict@evict-beng-cm-threads-large.html
   [179]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-434/igt@xe_evict@evict-beng-cm-threads-large.html

  * igt@xe_exec_basic@once-null:
    - shard-adlp:         [DMESG-WARN][180] -> [PASS][181]
   [180]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-8/igt@xe_exec_basic@once-null.html
   [181]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-8/igt@xe_exec_basic@once-null.html

  * igt@xe_exec_reset@parallel-gt-reset:
    - {shard-bmg}:        [TIMEOUT][182] ([Intel XE#2105]) -> [PASS][183]
   [182]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-bmg-5/igt@xe_exec_reset@parallel-gt-reset.html
   [183]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-bmg-3/igt@xe_exec_reset@parallel-gt-reset.html
    - shard-dg2-set2:     [TIMEOUT][184] ([Intel XE#2105]) -> [PASS][185]
   [184]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-463/igt@xe_exec_reset@parallel-gt-reset.html
   [185]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-466/igt@xe_exec_reset@parallel-gt-reset.html

  * igt@xe_live_ktest@xe_migrate:
    - shard-dg2-set2:     [SKIP][186] ([Intel XE#1192] / [Intel XE#1201]) -> [PASS][187] +1 other test pass
   [186]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-436/igt@xe_live_ktest@xe_migrate.html
   [187]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-433/igt@xe_live_ktest@xe_migrate.html

  * igt@xe_module_load@many-reload:
    - shard-dg2-set2:     [FAIL][188] ([Intel XE#2136]) -> [PASS][189]
   [188]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-434/igt@xe_module_load@many-reload.html
   [189]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@xe_module_load@many-reload.html

  * igt@xe_pm@s2idle-exec-after:
    - shard-lnl:          [FAIL][190] ([Intel XE#2028]) -> [PASS][191]
   [190]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-lnl-1/igt@xe_pm@s2idle-exec-after.html
   [191]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-lnl-5/igt@xe_pm@s2idle-exec-after.html

  * igt@xe_pm@s3-d3hot-basic-exec:
    - shard-dg2-set2:     [DMESG-WARN][192] ([Intel XE#1551] / [Intel XE#569]) -> [PASS][193]
   [192]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-433/igt@xe_pm@s3-d3hot-basic-exec.html
   [193]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-466/igt@xe_pm@s3-d3hot-basic-exec.html

  * igt@xe_pm@s4-vm-bind-unbind-all:
    - shard-adlp:         [ABORT][194] ([Intel XE#1794]) -> [PASS][195]
   [194]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-9/igt@xe_pm@s4-vm-bind-unbind-all.html
   [195]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-6/igt@xe_pm@s4-vm-bind-unbind-all.html

  
#### Warnings ####

  * igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-6-4-mc-ccs:
    - shard-dg2-set2:     [SKIP][196] ([Intel XE#801]) -> [SKIP][197] ([Intel XE#1201] / [Intel XE#801]) +23 other tests skip
   [196]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-6-4-mc-ccs.html
   [197]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-466/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-6-4-mc-ccs.html

  * igt@kms_big_fb@linear-16bpp-rotate-90:
    - shard-dg2-set2:     [SKIP][198] ([Intel XE#1201] / [Intel XE#316]) -> [SKIP][199] ([Intel XE#316]) +4 other tests skip
   [198]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-463/igt@kms_big_fb@linear-16bpp-rotate-90.html
   [199]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_big_fb@linear-16bpp-rotate-90.html

  * igt@kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip:
    - shard-adlp:         [FAIL][200] ([Intel XE#1204]) -> [DMESG-FAIL][201] ([Intel XE#324])
   [200]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-2/igt@kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html
   [201]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-2/igt@kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html

  * igt@kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-180-async-flip:
    - shard-adlp:         [DMESG-FAIL][202] ([Intel XE#324]) -> [FAIL][203] ([Intel XE#1231])
   [202]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-2/igt@kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-180-async-flip.html
   [203]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-8/igt@kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-180-async-flip.html

  * igt@kms_big_fb@y-tiled-addfb:
    - shard-dg2-set2:     [SKIP][204] ([Intel XE#1201] / [Intel XE#619]) -> [SKIP][205] ([Intel XE#619])
   [204]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-463/igt@kms_big_fb@y-tiled-addfb.html
   [205]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_big_fb@y-tiled-addfb.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-async-flip:
    - shard-dg2-set2:     [SKIP][206] ([Intel XE#1124] / [Intel XE#1201]) -> [SKIP][207] ([Intel XE#1124]) +7 other tests skip
   [206]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-463/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-async-flip.html
   [207]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-async-flip.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip:
    - shard-dg2-set2:     [SKIP][208] ([Intel XE#1124]) -> [SKIP][209] ([Intel XE#1124] / [Intel XE#1201]) +5 other tests skip
   [208]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip.html
   [209]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-463/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip.html

  * igt@kms_bw@connected-linear-tiling-4-displays-2560x1440p:
    - shard-dg2-set2:     [SKIP][210] ([Intel XE#1201] / [Intel XE#2191]) -> [SKIP][211] ([Intel XE#2191])
   [210]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-436/igt@kms_bw@connected-linear-tiling-4-displays-2560x1440p.html
   [211]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_bw@connected-linear-tiling-4-displays-2560x1440p.html

  * igt@kms_bw@connected-linear-tiling-4-displays-3840x2160p:
    - shard-dg2-set2:     [SKIP][212] ([Intel XE#2191]) -> [SKIP][213] ([Intel XE#1201] / [Intel XE#2191])
   [212]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_bw@connected-linear-tiling-4-displays-3840x2160p.html
   [213]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-466/igt@kms_bw@connected-linear-tiling-4-displays-3840x2160p.html

  * igt@kms_bw@linear-tiling-1-displays-1920x1080p:
    - shard-dg2-set2:     [SKIP][214] ([Intel XE#1201] / [Intel XE#367]) -> [SKIP][215] ([Intel XE#367]) +4 other tests skip
   [214]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-433/igt@kms_bw@linear-tiling-1-displays-1920x1080p.html
   [215]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_bw@linear-tiling-1-displays-1920x1080p.html

  * igt@kms_bw@linear-tiling-3-displays-2160x1440p:
    - shard-dg2-set2:     [SKIP][216] ([Intel XE#367]) -> [SKIP][217] ([Intel XE#1201] / [Intel XE#367])
   [216]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_bw@linear-tiling-3-displays-2160x1440p.html
   [217]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-434/igt@kms_bw@linear-tiling-3-displays-2160x1440p.html

  * igt@kms_ccs@bad-rotation-90-4-tiled-xe2-ccs:
    - shard-dg2-set2:     [SKIP][218] ([Intel XE#1201] / [Intel XE#1252]) -> [SKIP][219] ([Intel XE#1252])
   [218]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-433/igt@kms_ccs@bad-rotation-90-4-tiled-xe2-ccs.html
   [219]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_ccs@bad-rotation-90-4-tiled-xe2-ccs.html

  * igt@kms_ccs@bad-rotation-90-y-tiled-gen12-rc-ccs-cc:
    - shard-dg2-set2:     [SKIP][220] ([Intel XE#455] / [Intel XE#787]) -> [SKIP][221] ([Intel XE#1201] / [Intel XE#455] / [Intel XE#787]) +7 other tests skip
   [220]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_ccs@bad-rotation-90-y-tiled-gen12-rc-ccs-cc.html
   [221]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-463/igt@kms_ccs@bad-rotation-90-y-tiled-gen12-rc-ccs-cc.html

  * igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-mc-ccs@pipe-a-dp-4:
    - shard-dg2-set2:     [SKIP][222] ([Intel XE#1201] / [Intel XE#787]) -> [SKIP][223] ([Intel XE#787]) +48 other tests skip
   [222]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-466/igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-mc-ccs@pipe-a-dp-4.html
   [223]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-mc-ccs@pipe-a-dp-4.html

  * igt@kms_ccs@crc-primary-basic-4-tiled-xe2-ccs:
    - shard-dg2-set2:     [SKIP][224] ([Intel XE#1252]) -> [SKIP][225] ([Intel XE#1201] / [Intel XE#1252])
   [224]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_ccs@crc-primary-basic-4-tiled-xe2-ccs.html
   [225]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-435/igt@kms_ccs@crc-primary-basic-4-tiled-xe2-ccs.html

  * igt@kms_ccs@crc-primary-basic-y-tiled-ccs@pipe-b-hdmi-a-6:
    - shard-dg2-set2:     [SKIP][226] ([Intel XE#787]) -> [SKIP][227] ([Intel XE#1201] / [Intel XE#787]) +27 other tests skip
   [226]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_ccs@crc-primary-basic-y-tiled-ccs@pipe-b-hdmi-a-6.html
   [227]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-436/igt@kms_ccs@crc-primary-basic-y-tiled-ccs@pipe-b-hdmi-a-6.html

  * igt@kms_ccs@crc-sprite-planes-basic-y-tiled-gen12-rc-ccs@pipe-d-dp-4:
    - shard-dg2-set2:     [SKIP][228] ([Intel XE#1201] / [Intel XE#455] / [Intel XE#787]) -> [SKIP][229] ([Intel XE#455] / [Intel XE#787]) +13 other tests skip
   [228]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-463/igt@kms_ccs@crc-sprite-planes-basic-y-tiled-gen12-rc-ccs@pipe-d-dp-4.html
   [229]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_ccs@crc-sprite-planes-basic-y-tiled-gen12-rc-ccs@pipe-d-dp-4.html

  * igt@kms_cdclk@mode-transition@pipe-d-dp-4:
    - shard-dg2-set2:     [SKIP][230] ([Intel XE#1201] / [Intel XE#314]) -> [SKIP][231] ([Intel XE#314]) +3 other tests skip
   [230]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-463/igt@kms_cdclk@mode-transition@pipe-d-dp-4.html
   [231]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_cdclk@mode-transition@pipe-d-dp-4.html

  * igt@kms_cdclk@plane-scaling@pipe-b-dp-4:
    - shard-dg2-set2:     [SKIP][232] ([Intel XE#1152] / [Intel XE#1201]) -> [SKIP][233] ([Intel XE#1152]) +3 other tests skip
   [232]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-435/igt@kms_cdclk@plane-scaling@pipe-b-dp-4.html
   [233]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_cdclk@plane-scaling@pipe-b-dp-4.html

  * igt@kms_chamelium_color@ctm-0-75:
    - shard-dg2-set2:     [SKIP][234] ([Intel XE#1201] / [Intel XE#306]) -> [SKIP][235] ([Intel XE#306])
   [234]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-433/igt@kms_chamelium_color@ctm-0-75.html
   [235]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_chamelium_color@ctm-0-75.html

  * igt@kms_chamelium_color@ctm-blue-to-red:
    - shard-dg2-set2:     [SKIP][236] ([Intel XE#306]) -> [SKIP][237] ([Intel XE#1201] / [Intel XE#306])
   [236]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_chamelium_color@ctm-blue-to-red.html
   [237]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-466/igt@kms_chamelium_color@ctm-blue-to-red.html

  * igt@kms_chamelium_edid@dp-edid-resolution-list:
    - shard-dg2-set2:     [SKIP][238] ([Intel XE#1201] / [Intel XE#373]) -> [SKIP][239] ([Intel XE#373]) +6 other tests skip
   [238]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-434/igt@kms_chamelium_edid@dp-edid-resolution-list.html
   [239]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_chamelium_edid@dp-edid-resolution-list.html

  * igt@kms_chamelium_edid@hdmi-edid-change-during-hibernate:
    - shard-dg2-set2:     [SKIP][240] ([Intel XE#373]) -> [SKIP][241] ([Intel XE#1201] / [Intel XE#373]) +2 other tests skip
   [240]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_chamelium_edid@hdmi-edid-change-during-hibernate.html
   [241]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-433/igt@kms_chamelium_edid@hdmi-edid-change-during-hibernate.html

  * igt@kms_content_protection@dp-mst-lic-type-0:
    - shard-dg2-set2:     [SKIP][242] ([Intel XE#307]) -> [SKIP][243] ([Intel XE#1201] / [Intel XE#307])
   [242]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_content_protection@dp-mst-lic-type-0.html
   [243]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-466/igt@kms_content_protection@dp-mst-lic-type-0.html

  * igt@kms_content_protection@dp-mst-type-1:
    - shard-dg2-set2:     [SKIP][244] ([Intel XE#1201] / [Intel XE#307]) -> [SKIP][245] ([Intel XE#307])
   [244]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-463/igt@kms_content_protection@dp-mst-type-1.html
   [245]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_content_protection@dp-mst-type-1.html

  * igt@kms_cursor_crc@cursor-random-512x170:
    - shard-dg2-set2:     [SKIP][246] ([Intel XE#1201] / [Intel XE#308]) -> [SKIP][247] ([Intel XE#308])
   [246]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-466/igt@kms_cursor_crc@cursor-random-512x170.html
   [247]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_cursor_crc@cursor-random-512x170.html

  * igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic:
    - shard-adlp:         [SKIP][248] ([Intel XE#1201] / [Intel XE#309]) -> [DMESG-FAIL][249] ([Intel XE#1727])
   [248]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-4/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic.html
   [249]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-toggle:
    - shard-dg2-set2:     [SKIP][250] ([Intel XE#1201] / [Intel XE#323]) -> [SKIP][251] ([Intel XE#323])
   [250]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-463/igt@kms_cursor_legacy@short-busy-flip-before-cursor-toggle.html
   [251]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_cursor_legacy@short-busy-flip-before-cursor-toggle.html

  * igt@kms_dsc@dsc-with-bpc-formats:
    - shard-dg2-set2:     [SKIP][252] ([Intel XE#455]) -> [SKIP][253] ([Intel XE#1201] / [Intel XE#455]) +6 other tests skip
   [252]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_dsc@dsc-with-bpc-formats.html
   [253]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-434/igt@kms_dsc@dsc-with-bpc-formats.html

  * igt@kms_feature_discovery@chamelium:
    - shard-dg2-set2:     [SKIP][254] ([Intel XE#1201] / [Intel XE#701]) -> [SKIP][255] ([Intel XE#701])
   [254]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-466/igt@kms_feature_discovery@chamelium.html
   [255]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_feature_discovery@chamelium.html

  * igt@kms_feature_discovery@dp-mst:
    - shard-dg2-set2:     [SKIP][256] ([Intel XE#1137]) -> [SKIP][257] ([Intel XE#1137] / [Intel XE#1201])
   [256]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_feature_discovery@dp-mst.html
   [257]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-463/igt@kms_feature_discovery@dp-mst.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-dg2-set2:     [INCOMPLETE][258] ([Intel XE#2049]) -> [INCOMPLETE][259] ([Intel XE#1195] / [Intel XE#2049])
   [258]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_flip@flip-vs-suspend-interruptible.html
   [259]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-435/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling:
    - shard-adlp:         [DMESG-FAIL][260] ([Intel XE#324]) -> [SKIP][261] ([Intel XE#1201] / [Intel XE#455])
   [260]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-8/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling.html
   [261]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling.html

  * igt@kms_force_connector_basic@prune-stale-modes:
    - shard-dg2-set2:     [SKIP][262] ([Intel XE#1201] / [i915#5274]) -> [SKIP][263] ([i915#5274])
   [262]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-434/igt@kms_force_connector_basic@prune-stale-modes.html
   [263]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_force_connector_basic@prune-stale-modes.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-fullscreen:
    - shard-dg2-set2:     [SKIP][264] ([Intel XE#1201] / [Intel XE#651]) -> [SKIP][265] ([Intel XE#651]) +22 other tests skip
   [264]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-434/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-fullscreen.html
   [265]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-fullscreen.html

  * igt@kms_frontbuffer_tracking@fbc-tiling-y:
    - shard-dg2-set2:     [SKIP][266] ([Intel XE#658]) -> [SKIP][267] ([Intel XE#1201] / [Intel XE#658])
   [266]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_frontbuffer_tracking@fbc-tiling-y.html
   [267]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-466/igt@kms_frontbuffer_tracking@fbc-tiling-y.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-onoff:
    - shard-dg2-set2:     [SKIP][268] ([Intel XE#651]) -> [SKIP][269] ([Intel XE#1201] / [Intel XE#651]) +12 other tests skip
   [268]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-onoff.html
   [269]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-434/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-draw-render:
    - shard-dg2-set2:     [SKIP][270] ([Intel XE#653]) -> [SKIP][271] ([Intel XE#1201] / [Intel XE#653]) +11 other tests skip
   [270]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-draw-render.html
   [271]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-435/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsr-tiling-4:
    - shard-dg2-set2:     [SKIP][272] ([Intel XE#1201] / [Intel XE#653]) -> [SKIP][273] ([Intel XE#653]) +24 other tests skip
   [272]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-434/igt@kms_frontbuffer_tracking@fbcpsr-tiling-4.html
   [273]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_frontbuffer_tracking@fbcpsr-tiling-4.html

  * igt@kms_multipipe_modeset@basic-max-pipe-crc-check:
    - shard-dg2-set2:     [SKIP][274] ([Intel XE#1201] / [Intel XE#356]) -> [SKIP][275] ([Intel XE#356])
   [274]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-435/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html
   [275]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format:
    - shard-dg2-set2:     [SKIP][276] ([Intel XE#455] / [Intel XE#498]) -> [SKIP][277] ([Intel XE#1201] / [Intel XE#455] / [Intel XE#498]) +1 other test skip
   [276]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format.html
   [277]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-436/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format@pipe-c-hdmi-a-6:
    - shard-dg2-set2:     [SKIP][278] ([Intel XE#498]) -> [SKIP][279] ([Intel XE#1201] / [Intel XE#498]) +2 other tests skip
   [278]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format@pipe-c-hdmi-a-6.html
   [279]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-436/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format@pipe-c-hdmi-a-6.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-a-hdmi-a-6:
    - shard-dg2-set2:     [SKIP][280] ([Intel XE#2318]) -> [SKIP][281] ([Intel XE#1201] / [Intel XE#2318]) +2 other tests skip
   [280]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-a-hdmi-a-6.html
   [281]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-433/igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-a-hdmi-a-6.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-d-hdmi-a-6:
    - shard-dg2-set2:     [SKIP][282] ([Intel XE#2318] / [Intel XE#455]) -> [SKIP][283] ([Intel XE#1201] / [Intel XE#2318] / [Intel XE#455]) +1 other test skip
   [282]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-d-hdmi-a-6.html
   [283]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-433/igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-d-hdmi-a-6.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25@pipe-d-hdmi-a-6:
    - shard-dg2-set2:     [SKIP][284] ([Intel XE#1201] / [Intel XE#2318] / [Intel XE#455]) -> [SKIP][285] ([Intel XE#2318] / [Intel XE#455]) +3 other tests skip
   [284]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-433/igt@kms_plane_scaling@planes-downscale-factor-0-25@pipe-d-hdmi-a-6.html
   [285]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_plane_scaling@planes-downscale-factor-0-25@pipe-d-hdmi-a-6.html

  * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25@pipe-c-hdmi-a-6:
    - shard-dg2-set2:     [SKIP][286] ([Intel XE#1201] / [Intel XE#2318]) -> [SKIP][287] ([Intel XE#2318]) +5 other tests skip
   [286]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-433/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25@pipe-c-hdmi-a-6.html
   [287]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25@pipe-c-hdmi-a-6.html

  * igt@kms_pm_dc@dc5-psr:
    - shard-dg2-set2:     [SKIP][288] ([Intel XE#1129] / [Intel XE#1201]) -> [SKIP][289] ([Intel XE#1129])
   [288]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-434/igt@kms_pm_dc@dc5-psr.html
   [289]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_pm_dc@dc5-psr.html

  * igt@kms_pm_dc@dc6-psr:
    - shard-dg2-set2:     [SKIP][290] ([Intel XE#1129]) -> [SKIP][291] ([Intel XE#1129] / [Intel XE#1201])
   [290]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_pm_dc@dc6-psr.html
   [291]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-436/igt@kms_pm_dc@dc6-psr.html

  * igt@kms_pm_dc@deep-pkgc:
    - shard-dg2-set2:     [SKIP][292] ([Intel XE#1201] / [Intel XE#908]) -> [SKIP][293] ([Intel XE#908])
   [292]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-436/igt@kms_pm_dc@deep-pkgc.html
   [293]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_pm_dc@deep-pkgc.html

  * igt@kms_psr2_sf@fbc-overlay-plane-move-continuous-sf:
    - shard-dg2-set2:     [SKIP][294] ([Intel XE#1489]) -> [SKIP][295] ([Intel XE#1201] / [Intel XE#1489])
   [294]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_psr2_sf@fbc-overlay-plane-move-continuous-sf.html
   [295]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-463/igt@kms_psr2_sf@fbc-overlay-plane-move-continuous-sf.html

  * igt@kms_psr2_sf@fbc-plane-move-sf-dmg-area:
    - shard-dg2-set2:     [SKIP][296] ([Intel XE#1201] / [Intel XE#1489]) -> [SKIP][297] ([Intel XE#1489]) +1 other test skip
   [296]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-436/igt@kms_psr2_sf@fbc-plane-move-sf-dmg-area.html
   [297]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_psr2_sf@fbc-plane-move-sf-dmg-area.html

  * igt@kms_psr2_su@frontbuffer-xrgb8888:
    - shard-dg2-set2:     [SKIP][298] ([Intel XE#1122]) -> [SKIP][299] ([Intel XE#1122] / [Intel XE#1201])
   [298]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_psr2_su@frontbuffer-xrgb8888.html
   [299]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-433/igt@kms_psr2_su@frontbuffer-xrgb8888.html

  * igt@kms_psr2_su@page_flip-nv12:
    - shard-dg2-set2:     [SKIP][300] ([Intel XE#1122] / [Intel XE#1201]) -> [SKIP][301] ([Intel XE#1122])
   [300]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-436/igt@kms_psr2_su@page_flip-nv12.html
   [301]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_psr2_su@page_flip-nv12.html

  * igt@kms_psr@pr-basic:
    - shard-dg2-set2:     [SKIP][302] ([Intel XE#1201] / [Intel XE#929]) -> [SKIP][303] ([Intel XE#929]) +11 other tests skip
   [302]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-463/igt@kms_psr@pr-basic.html
   [303]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_psr@pr-basic.html

  * igt@kms_psr@psr2-primary-render:
    - shard-dg2-set2:     [SKIP][304] ([Intel XE#929]) -> [SKIP][305] ([Intel XE#1201] / [Intel XE#929]) +5 other tests skip
   [304]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_psr@psr2-primary-render.html
   [305]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-433/igt@kms_psr@psr2-primary-render.html

  * igt@kms_psr_stress_test@invalidate-primary-flip-overlay:
    - shard-dg2-set2:     [SKIP][306] ([Intel XE#1149]) -> [SKIP][307] ([Intel XE#1149] / [Intel XE#1201])
   [306]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html
   [307]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-435/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html

  * igt@kms_rotation_crc@bad-tiling:
    - shard-dg2-set2:     [SKIP][308] ([Intel XE#1201] / [Intel XE#327]) -> [SKIP][309] ([Intel XE#327])
   [308]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-436/igt@kms_rotation_crc@bad-tiling.html
   [309]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_rotation_crc@bad-tiling.html

  * igt@kms_rotation_crc@primary-y-tiled-reflect-x-180:
    - shard-dg2-set2:     [SKIP][310] ([Intel XE#1127] / [Intel XE#1201]) -> [SKIP][311] ([Intel XE#1127]) +1 other test skip
   [310]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-436/igt@kms_rotation_crc@primary-y-tiled-reflect-x-180.html
   [311]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_rotation_crc@primary-y-tiled-reflect-x-180.html

  * igt@kms_tv_load_detect@load-detect:
    - shard-dg2-set2:     [SKIP][312] ([Intel XE#330]) -> [SKIP][313] ([Intel XE#1201] / [Intel XE#330])
   [312]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_tv_load_detect@load-detect.html
   [313]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-433/igt@kms_tv_load_detect@load-detect.html

  * igt@kms_vrr@flipline:
    - shard-dg2-set2:     [SKIP][314] ([Intel XE#1201] / [Intel XE#455]) -> [SKIP][315] ([Intel XE#455]) +13 other tests skip
   [314]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-433/igt@kms_vrr@flipline.html
   [315]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_vrr@flipline.html

  * igt@kms_writeback@writeback-fb-id:
    - shard-dg2-set2:     [SKIP][316] ([Intel XE#756]) -> [SKIP][317] ([Intel XE#1201] / [Intel XE#756])
   [316]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@kms_writeback@writeback-fb-id.html
   [317]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-466/igt@kms_writeback@writeback-fb-id.html

  * igt@kms_writeback@writeback-pixel-formats:
    - shard-dg2-set2:     [SKIP][318] ([Intel XE#1201] / [Intel XE#756]) -> [SKIP][319] ([Intel XE#756]) +1 other test skip
   [318]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-463/igt@kms_writeback@writeback-pixel-formats.html
   [319]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@kms_writeback@writeback-pixel-formats.html

  * igt@xe_copy_basic@mem-copy-linear-0x3fff:
    - shard-dg2-set2:     [SKIP][320] ([Intel XE#1123]) -> [SKIP][321] ([Intel XE#1123] / [Intel XE#1201])
   [320]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@xe_copy_basic@mem-copy-linear-0x3fff.html
   [321]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-435/igt@xe_copy_basic@mem-copy-linear-0x3fff.html

  * igt@xe_copy_basic@mem-set-linear-0xfd:
    - shard-dg2-set2:     [SKIP][322] ([Intel XE#1126] / [Intel XE#1201]) -> [SKIP][323] ([Intel XE#1126])
   [322]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-463/igt@xe_copy_basic@mem-set-linear-0xfd.html
   [323]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@xe_copy_basic@mem-set-linear-0xfd.html

  * igt@xe_exec_fault_mode@many-execqueues-userptr-invalidate-imm:
    - shard-dg2-set2:     [SKIP][324] ([Intel XE#1201] / [Intel XE#288]) -> [SKIP][325] ([Intel XE#288]) +15 other tests skip
   [324]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-463/igt@xe_exec_fault_mode@many-execqueues-userptr-invalidate-imm.html
   [325]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@xe_exec_fault_mode@many-execqueues-userptr-invalidate-imm.html

  * igt@xe_exec_fault_mode@twice-userptr-invalidate-race:
    - shard-dg2-set2:     [SKIP][326] ([Intel XE#288]) -> [SKIP][327] ([Intel XE#1201] / [Intel XE#288]) +7 other tests skip
   [326]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@xe_exec_fault_mode@twice-userptr-invalidate-race.html
   [327]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-466/igt@xe_exec_fault_mode@twice-userptr-invalidate-race.html

  * igt@xe_exec_mix_modes@exec-simple-batch-store-dma-fence:
    - shard-dg2-set2:     [SKIP][328] ([Intel XE#1201] / [Intel XE#2360]) -> [SKIP][329] ([Intel XE#2360]) +1 other test skip
   [328]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-434/igt@xe_exec_mix_modes@exec-simple-batch-store-dma-fence.html
   [329]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@xe_exec_mix_modes@exec-simple-batch-store-dma-fence.html

  * igt@xe_huc_copy@huc_copy:
    - shard-dg2-set2:     [SKIP][330] ([Intel XE#1201] / [Intel XE#255]) -> [SKIP][331] ([Intel XE#255])
   [330]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-463/igt@xe_huc_copy@huc_copy.html
   [331]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@xe_huc_copy@huc_copy.html

  * igt@xe_mmap@small-bar:
    - shard-dg2-set2:     [SKIP][332] ([Intel XE#1201] / [Intel XE#512]) -> [SKIP][333] ([Intel XE#512])
   [332]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-433/igt@xe_mmap@small-bar.html
   [333]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@xe_mmap@small-bar.html

  * igt@xe_module_load@many-reload:
    - shard-adlp:         [TIMEOUT][334] ([Intel XE#2026]) -> [TIMEOUT][335] ([Intel XE#1353] / [Intel XE#1961] / [Intel XE#2026])
   [334]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-8/igt@xe_module_load@many-reload.html
   [335]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@xe_module_load@many-reload.html

  * igt@xe_oa@oa-unit-exclusive-stream-sample-oa:
    - shard-dg2-set2:     [SKIP][336] ([Intel XE#2207]) -> [SKIP][337] ([Intel XE#1201] / [Intel XE#2207]) +3 other tests skip
   [336]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@xe_oa@oa-unit-exclusive-stream-sample-oa.html
   [337]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-435/igt@xe_oa@oa-unit-exclusive-stream-sample-oa.html

  * igt@xe_oa@polling-small-buf:
    - shard-dg2-set2:     [SKIP][338] ([Intel XE#1201] / [Intel XE#2207]) -> [SKIP][339] ([Intel XE#2207]) +3 other tests skip
   [338]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-433/igt@xe_oa@polling-small-buf.html
   [339]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@xe_oa@polling-small-buf.html

  * igt@xe_pat@pat-index-xe2:
    - shard-dg2-set2:     [SKIP][340] ([Intel XE#1201] / [Intel XE#977]) -> [SKIP][341] ([Intel XE#977])
   [340]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-436/igt@xe_pat@pat-index-xe2.html
   [341]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@xe_pat@pat-index-xe2.html

  * igt@xe_pat@pat-index-xelpg:
    - shard-dg2-set2:     [SKIP][342] ([Intel XE#1201] / [Intel XE#979]) -> [SKIP][343] ([Intel XE#979])
   [342]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-433/igt@xe_pat@pat-index-xelpg.html
   [343]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@xe_pat@pat-index-xelpg.html

  * igt@xe_pm@d3cold-basic:
    - shard-dg2-set2:     [SKIP][344] ([Intel XE#2284] / [Intel XE#366]) -> [SKIP][345] ([Intel XE#1201] / [Intel XE#2284] / [Intel XE#366])
   [344]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@xe_pm@d3cold-basic.html
   [345]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-466/igt@xe_pm@d3cold-basic.html

  * igt@xe_pm@d3cold-mmap-vram:
    - shard-dg2-set2:     [SKIP][346] ([Intel XE#1201] / [Intel XE#2284] / [Intel XE#366]) -> [SKIP][347] ([Intel XE#2284] / [Intel XE#366]) +2 other tests skip
   [346]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-463/igt@xe_pm@d3cold-mmap-vram.html
   [347]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@xe_pm@d3cold-mmap-vram.html

  * igt@xe_pm@s3-d3hot-basic-exec:
    - shard-adlp:         [DMESG-WARN][348] ([Intel XE#1191] / [Intel XE#2226]) -> [DMESG-WARN][349] ([Intel XE#1191] / [Intel XE#1727] / [Intel XE#2226])
   [348]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-8/igt@xe_pm@s3-d3hot-basic-exec.html
   [349]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@xe_pm@s3-d3hot-basic-exec.html

  * igt@xe_query@multigpu-query-mem-usage:
    - shard-dg2-set2:     [SKIP][350] ([Intel XE#1201] / [Intel XE#944]) -> [SKIP][351] ([Intel XE#944]) +1 other test skip
   [350]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-434/igt@xe_query@multigpu-query-mem-usage.html
   [351]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-432/igt@xe_query@multigpu-query-mem-usage.html

  * igt@xe_query@multigpu-query-topology-l3-bank-mask:
    - shard-dg2-set2:     [SKIP][352] ([Intel XE#944]) -> [SKIP][353] ([Intel XE#1201] / [Intel XE#944])
   [352]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-dg2-432/igt@xe_query@multigpu-query-topology-l3-bank-mask.html
   [353]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-dg2-463/igt@xe_query@multigpu-query-topology-l3-bank-mask.html

  * igt@xe_wedged@wedged-at-any-timeout:
    - shard-adlp:         [DMESG-FAIL][354] ([Intel XE#1760]) -> [DMESG-WARN][355] ([Intel XE#1760])
   [354]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d/shard-adlp-6/igt@xe_wedged@wedged-at-any-timeout.html
   [355]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-137095v2/shard-adlp-1/igt@xe_wedged@wedged-at-any-timeout.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [Intel XE#1033]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1033
  [Intel XE#1122]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1122
  [Intel XE#1123]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1123
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [Intel XE#1126]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1126
  [Intel XE#1127]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1127
  [Intel XE#1129]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1129
  [Intel XE#1137]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1137
  [Intel XE#1149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1149
  [Intel XE#1152]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1152
  [Intel XE#1169]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1169
  [Intel XE#1191]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1191
  [Intel XE#1192]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1192
  [Intel XE#1195]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1195
  [Intel XE#1201]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1201
  [Intel XE#1204]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1204
  [Intel XE#1231]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1231
  [Intel XE#1252]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1252
  [Intel XE#1353]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1353
  [Intel XE#1358]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1358
  [Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
  [Intel XE#1426]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1426
  [Intel XE#1473]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1473
  [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#1541]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1541
  [Intel XE#1551]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1551
  [Intel XE#1600]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1600
  [Intel XE#1649]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1649
  [Intel XE#1659]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1659
  [Intel XE#1695]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1695
  [Intel XE#1701]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1701
  [Intel XE#1727]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1727
  [Intel XE#1760]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1760
  [Intel XE#1794]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1794
  [Intel XE#1861]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1861
  [Intel XE#1874]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1874
  [Intel XE#1961]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1961
  [Intel XE#2026]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2026
  [Intel XE#2028]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2028
  [Intel XE#2049]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2049
  [Intel XE#2105]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2105
  [Intel XE#2125]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2125
  [Intel XE#2136]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2136
  [Intel XE#2191]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2191
  [Intel XE#2207]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2207
  [Intel XE#2226]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2226
  [Intel XE#2229]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2229
  [Intel XE#2233]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2233
  [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#2249]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2249
  [Intel XE#2251]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2251
  [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#2293]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2293
  [Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
  [Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
  [Intel XE#2318]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2318
  [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#2329]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2329
  [Intel XE#2333]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2333
  [Intel XE#2360]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2360
  [Intel XE#2364]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2364
  [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#2429]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2429
  [Intel XE#2436]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2436
  [Intel XE#2443]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2443
  [Intel XE#2472]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2472
  [Intel XE#255]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/255
  [Intel XE#261]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/261
  [Intel XE#288]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/288
  [Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
  [Intel XE#306]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/306
  [Intel XE#307]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/307
  [Intel XE#308]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/308
  [Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
  [Intel XE#310]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/310
  [Intel XE#314]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/314
  [Intel XE#316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/316
  [Intel XE#323]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/323
  [Intel XE#324]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/324
  [Intel XE#327]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/327
  [Intel XE#330]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/330
  [Intel XE#356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/356
  [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#392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/392
  [Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
  [Intel XE#498]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/498
  [Intel XE#512]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/512
  [Intel XE#569]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/569
  [Intel XE#619]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/619
  [Intel XE#623]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/623
  [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#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
  [Intel XE#658]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/658
  [Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
  [Intel XE#701]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/701
  [Intel XE#702]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/702
  [Intel XE#756]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/756
  [Intel XE#771]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/771
  [Intel XE#787]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/787
  [Intel XE#801]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/801
  [Intel XE#870]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/870
  [Intel XE#877]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/877
  [Intel XE#886]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/886
  [Intel XE#899]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/899
  [Intel XE#908]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/908
  [Intel XE#911]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/911
  [Intel XE#929]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/929
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
  [Intel XE#977]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/977
  [Intel XE#979]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/979
  [i915#5274]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5274


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

  * IGT: IGT_7964 -> IGT_7965
  * Linux: xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d -> xe-pw-137095v2

  IGT_7964: 0dabf88262c0349d261248638064b97da35369f8 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  IGT_7965: 965de1e69e91e331eee9d9f53e46b4652ba157c1 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-1742-13384fb5b1e76e7012902cc10b1e49023358dc1d: 13384fb5b1e76e7012902cc10b1e49023358dc1d
  xe-pw-137095v2: 137095v2

== Logs ==

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

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

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

* Re: [PATCH 01/12] drm/xe/pf: Add function to sanitize VF resources
  2024-08-09 16:51 ` [PATCH 01/12] drm/xe/pf: Add function to sanitize VF resources Michal Wajdeczko
@ 2024-08-16 12:58   ` Piotr Piórkowski
  2024-08-19 20:47   ` Lucas De Marchi
  1 sibling, 0 replies; 47+ messages in thread
From: Piotr Piórkowski @ 2024-08-16 12:58 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

Michal Wajdeczko <michal.wajdeczko@intel.com> wrote on pią [2024-sie-09 18:51:48 +0200]:
> On current platforms it is a PF driver responsibility to clear
> some of the VF's resources during a VF FLR. Add simple function
> that will clear configured VF resources (GGTT, LMEM). We will
> start using this function soon.
> 
> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c | 84 ++++++++++++++++++++++
>  drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h |  1 +
>  2 files changed, 85 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c
> index 227527785afd..eba6793294f3 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c
> @@ -29,6 +29,7 @@
>  #include "xe_guc_submit.h"
>  #include "xe_lmtt.h"
>  #include "xe_map.h"
> +#include "xe_migrate.h"
>  #include "xe_sriov.h"
>  #include "xe_ttm_vram_mgr.h"
>  #include "xe_wopcm.h"
> @@ -1893,6 +1894,89 @@ int xe_gt_sriov_pf_config_release(struct xe_gt *gt, unsigned int vfid, bool forc
>  	return force ? 0 : err;
>  }
>  
> +static void pf_sanitize_ggtt(struct xe_tile *tile, struct drm_mm_node *node, unsigned int vfid)
> +{
> +	struct xe_ggtt *ggtt = tile->mem.ggtt;
> +
> +	if (drm_mm_node_allocated(node))
> +		xe_ggtt_assign(ggtt, node, vfid);
> +}
> +
> +static int pf_sanitize_lmem(struct xe_tile *tile, struct xe_bo *bo, long timeout)
> +{
> +	struct xe_migrate *m = tile->migrate;
> +	struct dma_fence *fence;
> +	int err;
> +
> +	if (!bo)
> +		return 0;
> +
> +	xe_bo_lock(bo, false);
> +	fence = xe_migrate_clear(m, bo, bo->ttm.resource);
> +	if (IS_ERR(fence)) {
> +		err = PTR_ERR(fence);
> +	} else if (!fence) {
> +		err = -ENOMEM;
> +	} else {
> +		long ret = dma_fence_wait_timeout(fence, false, timeout);
> +
> +		err = ret > 0 ? 0 : ret < 0 ? ret : -ETIMEDOUT;
> +		dma_fence_put(fence);
> +		if (!err)
> +			xe_gt_sriov_dbg_verbose(tile->primary_gt, "LMEM cleared in %dms\n",
> +						jiffies_to_msecs(timeout - ret));
> +	}
> +	xe_bo_unlock(bo);
> +
> +	return err;
> +}
> +
> +static int pf_sanitize_vf_resources(struct xe_gt *gt, u32 vfid, long timeout)
> +{
> +	struct xe_gt_sriov_config *config = pf_pick_vf_config(gt, vfid);
> +	struct xe_tile *tile = gt_to_tile(gt);
> +	struct xe_device *xe = gt_to_xe(gt);
> +	int err = 0;
> +
> +	/*
> +	 * Only GGTT and LMEM requires to be cleared by the PF.
> +	 * GuC doorbell IDs and context IDs do not need any clearing.
> +	 */
> +	if (!xe_gt_is_media_type(gt)) {
> +		pf_sanitize_ggtt(tile, &config->ggtt_region, vfid);
> +		if (IS_DGFX(xe))
> +			err = pf_sanitize_lmem(tile, config->lmem_obj, timeout);
> +	}
> +
> +	return err;
> +}
> +
> +/**
> + * xe_gt_sriov_pf_config_sanitize() - Sanitize VF's resources.
> + * @gt: the &xe_gt
> + * @vfid: the VF identifier (can't be PF)
> + * @timeout: maximum timeout to wait for completion in jiffies
> + *
> + * This function can only be called on PF.
> + *
> + * Return: 0 on success or a negative error code on failure.
> + */
> +int xe_gt_sriov_pf_config_sanitize(struct xe_gt *gt, unsigned int vfid, long timeout)
> +{
> +	int err;
> +
> +	xe_gt_assert(gt, vfid != PFID);
> +
> +	mutex_lock(xe_gt_sriov_pf_master_mutex(gt));
> +	err = pf_sanitize_vf_resources(gt, vfid, timeout);
> +	mutex_unlock(xe_gt_sriov_pf_master_mutex(gt));
> +
> +	if (unlikely(err))
> +		xe_gt_sriov_notice(gt, "VF%u resource sanitizing failed (%pe)\n",
> +				   vfid, ERR_PTR(err));
> +	return err;
> +}
> +
>  /**
>   * xe_gt_sriov_pf_config_push - Reprovision VF's configuration.
>   * @gt: the &xe_gt
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h
> index c0e6e4743dc2..42e64769f666 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h
> @@ -50,6 +50,7 @@ int xe_gt_sriov_pf_config_set_threshold(struct xe_gt *gt, unsigned int vfid,
>  					enum xe_guc_klv_threshold_index index, u32 value);
>  
>  int xe_gt_sriov_pf_config_set_fair(struct xe_gt *gt, unsigned int vfid, unsigned int num_vfs);
> +int xe_gt_sriov_pf_config_sanitize(struct xe_gt *gt, unsigned int vfid, long timeout);
>  int xe_gt_sriov_pf_config_release(struct xe_gt *gt, unsigned int vfid, bool force);
>  int xe_gt_sriov_pf_config_push(struct xe_gt *gt, unsigned int vfid, bool refresh);
>  
> -- 
> 2.43.0
> 

LGTM:
Reviewed-by: Piotr Piórkowski <piotr.piorkowski@intel.com>


-- 

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

* Re: [PATCH 02/12] drm/xe/pf: Fix documentation formatting
  2024-08-09 16:51 ` [PATCH 02/12] drm/xe/pf: Fix documentation formatting Michal Wajdeczko
@ 2024-08-16 12:59   ` Piotr Piórkowski
  0 siblings, 0 replies; 47+ messages in thread
From: Piotr Piórkowski @ 2024-08-16 12:59 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

Michal Wajdeczko <michal.wajdeczko@intel.com> wrote on pią [2024-sie-09 18:51:49 +0200]:
> Current formatting of "The VF FLR Flow with GuC" only looks fine,
> but it will not render properly when included in htmldocs due to:
> 
>   WARNING: Block quote ends without a blank line; unexpected unindent.
>   CRITICAL: Missing matching underline for section title overline.
> 
> Fix that by adding proper indent and using list markup.
> 
> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c | 54 +++++++++++----------
>  1 file changed, 28 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> index ebf06e037750..d11839d9e7d4 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> @@ -153,33 +153,35 @@ int xe_gt_sriov_pf_control_trigger_flr(struct xe_gt *gt, unsigned int vfid)
>  /**
>   * DOC: The VF FLR Flow with GuC
>   *
> - *          PF                        GUC             PCI
> - * ========================================================
> - *          |                          |               |
> - * (1)      |                         [ ] <----- FLR --|
> - *          |                         [ ]              :
> - * (2)     [ ] <-------- NOTIFY FLR --[ ]
> - *         [ ]                         |
> - * (3)     [ ]                         |
> - *         [ ]                         |
> - *         [ ]-- START FLR ---------> [ ]
> - *          |                         [ ]
> - * (4)      |                         [ ]
> - *          |                         [ ]
> - *         [ ] <--------- FLR DONE -- [ ]
> - *         [ ]                         |
> - * (5)     [ ]                         |
> - *         [ ]                         |
> - *         [ ]-- FINISH FLR --------> [ ]
> - *          |                          |
> + * The VF FLR flow includes several steps::
>   *
> - * Step 1: PCI HW generates interrupt to the GuC about VF FLR
> - * Step 2: GuC FW sends G2H notification to the PF about VF FLR
> - * Step 2a: on some platforms G2H is only received from root GuC
> - * Step 3: PF sends H2G request to the GuC to start VF FLR sequence
> - * Step 3a: on some platforms PF must send H2G to all other GuCs
> - * Step 4: GuC FW performs VF FLR cleanups and notifies the PF when done
> - * Step 5: PF performs VF FLR cleanups and notifies the GuC FW when finished
> + *	         PF                        GUC             PCI
> + *	========================================================
> + *	         |                          |               |
> + *	(1)      |                         [ ] <----- FLR --|
> + *	         |                         [ ]              :
> + *	(2)     [ ] <-------- NOTIFY FLR --[ ]
> + *	        [ ]                         |
> + *	(3)     [ ]                         |
> + *	        [ ]                         |
> + *	        [ ]-- START FLR ---------> [ ]
> + *	         |                         [ ]
> + *	(4)      |                         [ ]
> + *	         |                         [ ]
> + *	        [ ] <--------- FLR DONE -- [ ]
> + *	        [ ]                         |
> + *	(5)     [ ]                         |
> + *	        [ ]                         |
> + *	        [ ]-- FINISH FLR --------> [ ]
> + *	         |                          |
> + *
> + * * Step 1: PCI HW generates interrupt to the GuC about VF FLR
> + * * Step 2: GuC FW sends G2H notification to the PF about VF FLR
> + * * Step 2a: on some platforms G2H is only received from root GuC
> + * * Step 3: PF sends H2G request to the GuC to start VF FLR sequence
> + * * Step 3a: on some platforms PF must send H2G to all other GuCs
> + * * Step 4: GuC FW performs VF FLR cleanups and notifies the PF when done
> + * * Step 5: PF performs VF FLR cleanups and notifies the GuC FW when finished
>   */
>  
>  static bool needs_dispatch_flr(struct xe_device *xe)
> -- 
> 2.43.0

LGTM:
Reviewed-by: Piotr Piórkowski <piotr.piorkowski@intel.com>
> 

-- 

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

* Re: [PATCH 03/12] drm/xe/pf: Drop GuC notifications for non-existing VF
  2024-08-09 16:51 ` [PATCH 03/12] drm/xe/pf: Drop GuC notifications for non-existing VF Michal Wajdeczko
@ 2024-08-16 13:01   ` Piotr Piórkowski
  2024-08-19 17:51     ` Michal Wajdeczko
  0 siblings, 1 reply; 47+ messages in thread
From: Piotr Piórkowski @ 2024-08-16 13:01 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

Michal Wajdeczko <michal.wajdeczko@intel.com> wrote on pią [2024-sie-09 18:51:50 +0200]:
> It is unlikely that GuC will ever send a G2H notification with an
> invalid VFID and it is currently harmless if that actually happen.
> But in upcoming patches we will start using that VFID as an index
> and we must be sure it is a valid to avoid a crash due to a buggy
> firmware or a currupted G2H message.
> 
> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> index d11839d9e7d4..ad447d867e51 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> @@ -8,6 +8,7 @@
>  #include "xe_device.h"
>  #include "xe_gt.h"
>  #include "xe_gt_sriov_pf_control.h"
> +#include "xe_gt_sriov_pf_helpers.h"
>  #include "xe_gt_sriov_printk.h"
>  #include "xe_guc_ct.h"
>  #include "xe_sriov.h"
> @@ -212,6 +213,11 @@ static void pf_handle_vf_flr_done(struct xe_gt *gt, u32 vfid)
>  
>  static int pf_handle_vf_event(struct xe_gt *gt, u32 vfid, u32 eventid)
>  {
> +	xe_gt_sriov_dbg_verbose(gt, "received VF%u event %#x\n", vfid, eventid);
> +
> +	if (vfid > xe_gt_sriov_pf_get_totalvfs(gt))
> +		return -EPROTO;

I would probably add some log here.
I'm afraid that during debug the information about the last event is not enough

Thanks,
Piotr
> +
>  	switch (eventid) {
>  	case GUC_PF_NOTIFY_VF_FLR:
>  		pf_handle_vf_flr(gt, vfid);
> -- 
> 2.43.0
> 

-- 

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

* Re: [PATCH 04/12] drm/xe/pf: Improve VF control
  2024-08-09 16:51 ` [PATCH 04/12] drm/xe/pf: Improve VF control Michal Wajdeczko
@ 2024-08-16 13:06   ` Piotr Piórkowski
  2024-08-19 17:52     ` Michal Wajdeczko
  2024-08-20  7:56   ` Piotr Piórkowski
  1 sibling, 1 reply; 47+ messages in thread
From: Piotr Piórkowski @ 2024-08-16 13:06 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

Michal Wajdeczko <michal.wajdeczko@intel.com> wrote on pią [2024-sie-09 18:51:51 +0200]:
> Our initial VF control implementation was focused on providing
> a very minimal support for the VF_STATE_NOTIFY events just to
> meet GuC requirements, without tracking a VF state or doing any
> expected actions (like cleanup in case of the FLR notification).
> 
> Try to improve this by defining set of VF state machines, each
> responsible for processing one activity (PAUSE, RESUME, STOP or
> FLR). All required steps defined by the VF state machine are then
> executed by the PF worker from the dedicated workqueue.
> 
> Any external requests or notifications simply try to transition
> between the states to trigger a work and then wait for that work
> to finish. Some predefined default timeouts are used to avoid
> changing existing API calls, but it should be easy to extend the
> control API to also accept specific timeout values.
> 
> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Piotr Piórkowski <piotr.piorkowski@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_gt_sriov_pf.c           |    6 +
>  drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c   | 1203 ++++++++++++++++-
>  drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h   |    3 +
>  .../gpu/drm/xe/xe_gt_sriov_pf_control_types.h |  107 ++
>  drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h     |    6 +
>  5 files changed, 1310 insertions(+), 15 deletions(-)
>  create mode 100644 drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h
> 


<snip>

> @@ -284,3 +1295,165 @@ int xe_gt_sriov_pf_control_process_guc2pf(struct xe_gt *gt, const u32 *msg, u32
>  
>  	return vfid ? pf_handle_vf_event(gt, vfid, eventid) : pf_handle_pf_event(gt, eventid);
>  }
> +
> +static bool pf_process_vf_machine(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (pf_exit_vf_flr_send_start(gt, vfid))
> +		return true;
> +
> +	if (pf_exit_vf_flr_send_start(gt, vfid))
> +		return true;


hmmm... Should we call out this function twice here ? 



Thanks,
Piotr

> -- 
> 2.43.0
> 

-- 

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

* Re: [PATCH 03/12] drm/xe/pf: Drop GuC notifications for non-existing VF
  2024-08-16 13:01   ` Piotr Piórkowski
@ 2024-08-19 17:51     ` Michal Wajdeczko
  2024-08-22 10:48       ` Piotr Piórkowski
  0 siblings, 1 reply; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-19 17:51 UTC (permalink / raw)
  To: Piotr Piórkowski; +Cc: intel-xe



On 16.08.2024 15:01, Piotr Piórkowski wrote:
> Michal Wajdeczko <michal.wajdeczko@intel.com> wrote on pią [2024-sie-09 18:51:50 +0200]:
>> It is unlikely that GuC will ever send a G2H notification with an
>> invalid VFID and it is currently harmless if that actually happen.
>> But in upcoming patches we will start using that VFID as an index
>> and we must be sure it is a valid to avoid a crash due to a buggy
>> firmware or a currupted G2H message.
>>
>> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
>> ---
>>  drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c | 6 ++++++
>>  1 file changed, 6 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
>> index d11839d9e7d4..ad447d867e51 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
>> @@ -8,6 +8,7 @@
>>  #include "xe_device.h"
>>  #include "xe_gt.h"
>>  #include "xe_gt_sriov_pf_control.h"
>> +#include "xe_gt_sriov_pf_helpers.h"
>>  #include "xe_gt_sriov_printk.h"
>>  #include "xe_guc_ct.h"
>>  #include "xe_sriov.h"
>> @@ -212,6 +213,11 @@ static void pf_handle_vf_flr_done(struct xe_gt *gt, u32 vfid)
>>  
>>  static int pf_handle_vf_event(struct xe_gt *gt, u32 vfid, u32 eventid)
>>  {
>> +	xe_gt_sriov_dbg_verbose(gt, "received VF%u event %#x\n", vfid, eventid);
>> +
>> +	if (vfid > xe_gt_sriov_pf_get_totalvfs(gt))
>> +		return -EPROTO;
> 
> I would probably add some log here.
> I'm afraid that during debug the information about the last event is not enough

it should be the CTB layer responsibility to print an error message and
dump this invalid or corrupted or unexpected G2H message, no point in
doing this in every possible G2H message handler; note that 'silent'
return is aligned with the existing code in this file.

for now CTB will just report:

	xe_gt_err(gt, "G2H action 0x%04x failed (%pe)\n",
		  action, ERR_PTR(ret));

but it should be easy to add (what we had in i915) full dump of the
problematic G2H message in case of at least the EPROTO error

> 
> Thanks,
> Piotr
>> +
>>  	switch (eventid) {
>>  	case GUC_PF_NOTIFY_VF_FLR:
>>  		pf_handle_vf_flr(gt, vfid);
>> -- 
>> 2.43.0
>>
> 

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

* Re: [PATCH 04/12] drm/xe/pf: Improve VF control
  2024-08-16 13:06   ` Piotr Piórkowski
@ 2024-08-19 17:52     ` Michal Wajdeczko
  0 siblings, 0 replies; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-19 17:52 UTC (permalink / raw)
  To: Piotr Piórkowski; +Cc: intel-xe



On 16.08.2024 15:06, Piotr Piórkowski wrote:
> Michal Wajdeczko <michal.wajdeczko@intel.com> wrote on pią [2024-sie-09 18:51:51 +0200]:
>> Our initial VF control implementation was focused on providing
>> a very minimal support for the VF_STATE_NOTIFY events just to
>> meet GuC requirements, without tracking a VF state or doing any
>> expected actions (like cleanup in case of the FLR notification).
>>
>> Try to improve this by defining set of VF state machines, each
>> responsible for processing one activity (PAUSE, RESUME, STOP or
>> FLR). All required steps defined by the VF state machine are then
>> executed by the PF worker from the dedicated workqueue.
>>
>> Any external requests or notifications simply try to transition
>> between the states to trigger a work and then wait for that work
>> to finish. Some predefined default timeouts are used to avoid
>> changing existing API calls, but it should be easy to extend the
>> control API to also accept specific timeout values.
>>
>> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
>> Cc: Piotr Piórkowski <piotr.piorkowski@intel.com>
>> ---
>>  drivers/gpu/drm/xe/xe_gt_sriov_pf.c           |    6 +
>>  drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c   | 1203 ++++++++++++++++-
>>  drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h   |    3 +
>>  .../gpu/drm/xe/xe_gt_sriov_pf_control_types.h |  107 ++
>>  drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h     |    6 +
>>  5 files changed, 1310 insertions(+), 15 deletions(-)
>>  create mode 100644 drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h
>>
> 
> 
> <snip>
> 
>> @@ -284,3 +1295,165 @@ int xe_gt_sriov_pf_control_process_guc2pf(struct xe_gt *gt, const u32 *msg, u32
>>  
>>  	return vfid ? pf_handle_vf_event(gt, vfid, eventid) : pf_handle_pf_event(gt, eventid);
>>  }
>> +
>> +static bool pf_process_vf_machine(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (pf_exit_vf_flr_send_start(gt, vfid))
>> +		return true;
>> +
>> +	if (pf_exit_vf_flr_send_start(gt, vfid))
>> +		return true;
> 
> 
> hmmm... Should we call out this function twice here ? 

no, it's a typo (and one more, also harmless, later on)

> 
> 
> 
> Thanks,
> Piotr
> 
>> -- 
>> 2.43.0
>>
> 

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

* Re: [PATCH 01/12] drm/xe/pf: Add function to sanitize VF resources
  2024-08-09 16:51 ` [PATCH 01/12] drm/xe/pf: Add function to sanitize VF resources Michal Wajdeczko
  2024-08-16 12:58   ` Piotr Piórkowski
@ 2024-08-19 20:47   ` Lucas De Marchi
  2024-08-20  9:38     ` Michal Wajdeczko
  1 sibling, 1 reply; 47+ messages in thread
From: Lucas De Marchi @ 2024-08-19 20:47 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

On Fri, Aug 09, 2024 at 06:51:48PM GMT, Michal Wajdeczko wrote:
>+static int pf_sanitize_lmem(struct xe_tile *tile, struct xe_bo *bo, long timeout)

it took a while to make xe use "vram"... now we are back with lmem in
several places :(

Lucas De Marchi

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

* Re: [PATCH 05/12] drm/xe/tests: Allow deferred function call during KUnit test
  2024-08-09 16:51 ` [PATCH 05/12] drm/xe/tests: Allow deferred function call during KUnit test Michal Wajdeczko
@ 2024-08-19 21:38   ` Lucas De Marchi
  2024-08-20 10:23     ` Michal Wajdeczko
  0 siblings, 1 reply; 47+ messages in thread
From: Lucas De Marchi @ 2024-08-19 21:38 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

On Fri, Aug 09, 2024 at 06:51:52PM GMT, Michal Wajdeczko wrote:
>For some advanced test cases we might want to simulate external
>activity that will stimulate function under test. Add set of
>helper functions to implement such requirement. Usage example:
>
>  static void foo(struct xe_device *xe)
>  {
>      WRITE_ONCE(xe->foo, 1);
>  }
>
>  static void foo_test(struct kunit *test)
>  {
>      struct xe_device *xe = test->priv;
>
>      xe_kunit_helper_delayed_call(test, HZ / 2, foo, xe);
>
>      KUNIT_EXPECT_EQ(test, 0, READ_ONCE(xe->foo));
>      schedule_timeout_uninterruptible(HZ);
>      KUNIT_EXPECT_EQ(test, 1, READ_ONCE(xe->foo));
>  }
>
>Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
>Cc: Lucas De Marchi <lucas.demarchi@intel.com>
>---
> drivers/gpu/drm/xe/tests/xe_kunit_helpers.c | 148 ++++++++++++++++++++
> drivers/gpu/drm/xe/tests/xe_kunit_helpers.h |  38 +++++
> 2 files changed, 186 insertions(+)
>
>diff --git a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
>index bc5156966ce9..8fe1a0918b32 100644
>--- a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
>+++ b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
>@@ -127,3 +127,151 @@ int xe_kunit_helper_xe_device_live_test_init(struct kunit *test)
> 	return 0;
> }
> EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_xe_device_live_test_init);
>+
>+struct xe_kunit_call {
>+	struct delayed_work work;
>+	struct kunit *test;
>+	struct {
>+		int (*int_gt)(struct xe_gt *gt);
>+		int (*int_gt_uint)(struct xe_gt *gt, unsigned int n);
>+		void (*void_gt)(struct xe_gt *gt);
>+		void (*void_gt_uint)(struct xe_gt *gt, unsigned int n);
>+		void (*void_xe)(struct xe_device *xe);

I think the only reason why you're adding this in xe is because you are
using xe-specific types. This could rather be done generically by
always using int delayed_func(void *data). Then you can simply add it to
kunit and get it reviewed there.

Also thinking that the example you added in the commit message is likely
suggesting the wrong type of test, that a) sleep too much and b) tend to
be noisy

Lucas De Marchi

>+	} func;
>+	struct {
>+		struct xe_device *xe;
>+		struct xe_gt *gt;
>+		unsigned int n;
>+	} args;
>+};
>+
>+static void call_work_func(struct work_struct *work)
>+{
>+	struct xe_kunit_call *call = container_of(work, typeof(*call), work.work);
>+
>+	if (call->func.void_xe) {
>+		kunit_info(call->test, "calling %ps(xe)\n", call->func.void_xe);
>+		call->func.void_xe(call->args.xe);
>+		kunit_info(call->test, "%ps(xe) completed\n", call->func.void_xe);
>+	} else if (call->func.void_gt) {
>+		kunit_info(call->test, "%ps(gt)\n", call->func.void_gt);
>+		call->func.void_gt(call->args.gt);
>+		kunit_info(call->test, "%ps(gt) completed\n", call->func.void_gt);
>+	} else if (call->func.int_gt_uint) {
>+		int ret;
>+
>+		kunit_info(call->test, "calling %ps(gt,%u)\n",
>+			   call->func.int_gt_uint, call->args.n);
>+		ret = call->func.int_gt_uint(call->args.gt, call->args.n);
>+		if (ret < 0) {
>+			kunit_info(call->test, "%ps(gt,%u) reported error %pe\n",
>+				   call->func.int_gt_uint, call->args.n, ERR_PTR(ret));
>+		} else {
>+			kunit_info(call->test, "%ps(gt,%u) returned %d\n",
>+				   call->func.int_gt_uint, call->args.n, ret);
>+		}
>+	}
>+}
>+
>+static struct xe_kunit_call *prepare_call(struct kunit *test)
>+{
>+	struct xe_kunit_call *call;
>+
>+	call = kunit_kzalloc(test, sizeof(*call), GFP_KERNEL);
>+	KUNIT_ASSERT_NOT_NULL(test, call);
>+
>+	INIT_DELAYED_WORK(&call->work, call_work_func);
>+	call->test = test;
>+
>+	return call;
>+}
>+
>+KUNIT_DEFINE_ACTION_WRAPPER(cancel_call, cancel_delayed_work_sync, struct delayed_work *);
>+
>+static void queue_call(struct kunit *test, struct xe_kunit_call *call, unsigned long delay)
>+{
>+	queue_delayed_work(system_wq, &call->work, delay);
>+	KUNIT_ASSERT_EQ(test, 0, kunit_add_action_or_reset(test, cancel_call, &call->work));
>+}
>+
>+/**
>+ * xe_kunit_helper_delayed_call_void_xe_device - Queue a function call during KUnit test
>+ * @test: the &kunit test case
>+ * @delay: number of jiffies to wait before queueing
>+ * @func: the &xe_device function to call
>+ * @xe: the &xe_device argument
>+ *
>+ * This function uses KUNIT_ASSERT to detect any failures.
>+ */
>+void xe_kunit_helper_delayed_call_void_xe_device(struct kunit *test,
>+						 unsigned long delay,
>+						 void (*func)(struct xe_device *xe),
>+						 struct xe_device *xe)
>+{
>+	struct xe_kunit_call *call = prepare_call(test);
>+
>+	KUNIT_ASSERT_NOT_NULL(test, func);
>+	KUNIT_ASSERT_NOT_NULL(test, xe);
>+
>+	call->func.void_xe = func;
>+	call->args.xe = xe;
>+
>+	return queue_call(test, call, delay);
>+}
>+EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_delayed_call_void_xe_device);
>+
>+/**
>+ * xe_kunit_helper_delayed_call_void_xe_gt - Queue a function call during KUnit test
>+ * @test: the &kunit test case
>+ * @delay: number of jiffies to wait before queueing
>+ * @func: the &xe_gt function to call
>+ * @gt: the &xe_gt function argument
>+ *
>+ * This function uses KUNIT_ASSERT to detect any failures.
>+ */
>+void xe_kunit_helper_delayed_call_void_xe_gt(struct kunit *test,
>+					     unsigned long delay,
>+					     void (*func)(struct xe_gt *gt),
>+					     struct xe_gt *gt)
>+{
>+	struct xe_kunit_call *call = prepare_call(test);
>+
>+	KUNIT_ASSERT_NOT_NULL(test, func);
>+	KUNIT_ASSERT_NOT_NULL(test, gt);
>+
>+	call->func.void_gt = func;
>+	call->args.gt = gt;
>+
>+	return queue_call(test, call, delay);
>+}
>+EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_delayed_call_void_xe_gt);
>+
>+/**
>+ * xe_kunit_helper_delayed_call_int_xe_gt_uint - Queue a function call during KUnit test
>+ * @test: the &kunit test case
>+ * @delay: number of jiffies to wait before queueing
>+ * @func: the &xe_gt function to call
>+ * @gt: the &xe_gt function argument
>+ * @n: the function argument
>+ *
>+ * This function uses KUNIT_ASSERT to detect any failures.
>+ */
>+void xe_kunit_helper_delayed_call_int_xe_gt_uint(struct kunit *test,
>+						 unsigned long delay,
>+						 int (*func)(struct xe_gt *gt,
>+							     unsigned int vfid),
>+						 struct xe_gt *gt,
>+						 unsigned int n)
>+{
>+	struct xe_kunit_call *call = prepare_call(test);
>+
>+	KUNIT_ASSERT_NOT_NULL(test, func);
>+	KUNIT_ASSERT_NOT_NULL(test, gt);
>+
>+	call->func.int_gt_uint = func;
>+	call->args.gt = gt;
>+	call->args.n = n;
>+
>+	return queue_call(test, call, delay);
>+}
>+EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_delayed_call_int_xe_gt_uint);
>diff --git a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
>index 83665f7b1254..ec5287947ee4 100644
>--- a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
>+++ b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
>@@ -9,6 +9,7 @@
> struct device;
> struct kunit;
> struct xe_device;
>+struct xe_gt;
>
> struct xe_device *xe_kunit_helper_alloc_xe_device(struct kunit *test,
> 						  struct device *dev);
>@@ -16,4 +17,41 @@ int xe_kunit_helper_xe_device_test_init(struct kunit *test);
>
> int xe_kunit_helper_xe_device_live_test_init(struct kunit *test);
>
>+void xe_kunit_helper_delayed_call_void_xe_device(struct kunit *test,
>+						 unsigned long delay,
>+						 void (*func)(struct xe_device *xe),
>+						 struct xe_device *xe);
>+
>+void xe_kunit_helper_delayed_call_void_xe_gt(struct kunit *test,
>+					     unsigned long delay,
>+					     void (*func)(struct xe_gt *gt),
>+					     struct xe_gt *gt);
>+
>+void xe_kunit_helper_delayed_call_int_xe_gt_uint(struct kunit *test,
>+						 unsigned long delay,
>+						 int (*func)(struct xe_gt *gt,
>+							     unsigned int vfid),
>+						 struct xe_gt *gt,
>+						 unsigned int n);
>+
>+/**
>+ * xe_kunit_helper_delayed_call - Queue a function call during KUnit test
>+ * @test: the &kunit test case
>+ * @delay: number of jiffies to wait before queueing
>+ * @func: the &xe_device or &xe_gt function to call
>+ * @args: the &xe_device or &xe_gt and other function arguments
>+ *
>+ * This is a helper macro that compiles into dedicated function call based on
>+ * the provided argument types.
>+ */
>+#define xe_kunit_helper_delayed_call(test, delay, func, args...)	\
>+	_Generic(func,							\
>+		 void (*)(struct xe_device *) :				\
>+			xe_kunit_helper_delayed_call_void_xe_device,	\
>+		 void (*)(struct xe_gt *) :				\
>+			xe_kunit_helper_delayed_call_void_xe_gt,	\
>+		 int (*)(struct xe_gt *, unsigned int) :		\
>+			xe_kunit_helper_delayed_call_int_xe_gt_uint	\
>+	)(test, delay, func, args)
>+
> #endif
>-- 
>2.43.0
>

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

* Re: [PATCH 07/12] drm/xe/tests: Add helpers to call stubs out of KUnit context
  2024-08-09 16:51 ` [PATCH 07/12] drm/xe/tests: Add helpers to call stubs out of KUnit context Michal Wajdeczko
@ 2024-08-19 21:52   ` Lucas De Marchi
  2024-08-20 10:31     ` Michal Wajdeczko
  0 siblings, 1 reply; 47+ messages in thread
From: Lucas De Marchi @ 2024-08-19 21:52 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

On Fri, Aug 09, 2024 at 06:51:54PM GMT, Michal Wajdeczko wrote:
>The KUNIT_STATIC_STUB_REDIRECT() allows to redirect function call but will
>work only if the caller is in a KUnit context. To allow implementation of
>the more complex test cases, add helpers that allow calling stubs also out
>of a KUnit context.
>
>Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
>Cc: Lucas De Marchi <lucas.demarchi@intel.com>
>---
> drivers/gpu/drm/xe/tests/xe_test.h | 74 ++++++++++++++++++++++++++++++
> 1 file changed, 74 insertions(+)
>
>diff --git a/drivers/gpu/drm/xe/tests/xe_test.h b/drivers/gpu/drm/xe/tests/xe_test.h
>index b8fa409ce2b1..ffa8fa6c96f0 100644
>--- a/drivers/gpu/drm/xe/tests/xe_test.h
>+++ b/drivers/gpu/drm/xe/tests/xe_test.h
>@@ -54,11 +54,85 @@ xe_cur_kunit_priv(enum xe_test_priv_id id)
> 	return priv->id == id ? priv : NULL;
> }
>
>+/**
>+ * XE_TEST_REDIRECT() - Call a function stub if one exists.
>+ * @stub: The pointer to the function stub
>+ * @args: All of the arguments passed to this stub
>+ *
>+ * This is a function prologue which is used to allow calls to the current
>+ * function to be redirected if a KUnit is running. If the stub is NULL or
>+ * the KUnit is not running the function will continue execution as normal.
>+ *
>+ * Unlikely the KUNIT_STATIC_STUB_REDIRECT(), this redirection will work
>+ * even if the caller is not in a KUnit context (like a worker thread).
>+ *
>+ * Example:
>+ *
>+ * .. code-block:: c
>+ *
>+ *	int (*stub)(int n);
>+ *
>+ *	int real_func(int n)
>+ *	{
>+ *		XE_TEST_REDIRECT(stub, n);
>+ *		return n + 1;
>+ *	}
>+ *
>+ *	int replacement_func(int n)
>+ *	{
>+ *		return n + 100;
>+ *	}
>+ *
>+ *	void example_test(struct kunit *test)
>+ *	{
>+ *		stub = replacement_func;
>+ *		KUNIT_EXPECT_EQ(test, real_func(1), 101);
>+ *		KUNIT_EXPECT_EQ(test, real_func(1), 101);
>+ *	}
>+ */
>+#define XE_TEST_REDIRECT(stub, args...)							\

this seems another one that should rather be in the kunit layer, not in
xe

>+do {											\
>+	typeof(stub) replacement = (stub);						\
>+	if (XE_TEST_RUNNING()) {							\
>+		if (unlikely(replacement)) {						\
>+			pr_info(KUNIT_SUBTEST_INDENT "# %s: calling stub %ps\n",	\
>+				__func__, replacement);					\

KUNIT_STATIC_STUB_REDIRECT() silently calls the stub without pr_info().
Why does this version need to be extra-verbose?

Lucas De Marchi


>+			return replacement(args);					\
>+		}									\
>+	}										\
>+} while (0)
>+
>+static inline void __nullify_pointer(void *data)
>+{
>+	void **ptr = data;
>+
>+	*ptr = NULL;
>+}
>+
>+/**
>+ * XE_TEST_ACTIVATE_STUB() - Setup a function stub.
>+ * @test: Test case that wants to setup a function stub
>+ * @stub: The function stub pointer
>+ * @replacement: The replacement function
>+ *
>+ * This helper setups a function stub with the replacement function.
>+ * It will also automatically restore stub to NULL at the test end.
>+ */
>+#define XE_TEST_ACTIVATE_STUB(test, stub, replacement)	({					\
>+	typeof(test) __test = (test);								\
>+	typeof(stub) *__ptr = &(stub);								\
>+	typecheck_pointer(*__ptr);								\
>+	*__ptr = (replacement);									\
>+	kunit_info(__test, "activated stub %s with %ps\n", __stringify(stub), *__ptr);		\
>+	kunit_add_action_or_reset(__test, __nullify_pointer, __ptr);				\
>+})
>+
> #else /* if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST) */
>
> #define XE_TEST_DECLARE(x)
> #define XE_TEST_ONLY(x) 0
> #define XE_TEST_RUNNING() false
>+#define XE_TEST_REDIRECT(...) do { } while (0)
>
> #define xe_cur_kunit_priv(_id) NULL
>
>-- 
>2.43.0
>

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

* Re: [PATCH 04/12] drm/xe/pf: Improve VF control
  2024-08-09 16:51 ` [PATCH 04/12] drm/xe/pf: Improve VF control Michal Wajdeczko
  2024-08-16 13:06   ` Piotr Piórkowski
@ 2024-08-20  7:56   ` Piotr Piórkowski
  2024-08-20 10:04     ` Michal Wajdeczko
  1 sibling, 1 reply; 47+ messages in thread
From: Piotr Piórkowski @ 2024-08-20  7:56 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

Michal Wajdeczko <michal.wajdeczko@intel.com> wrote on pią [2024-sie-09 18:51:51 +0200]:
> Our initial VF control implementation was focused on providing
> a very minimal support for the VF_STATE_NOTIFY events just to
> meet GuC requirements, without tracking a VF state or doing any
> expected actions (like cleanup in case of the FLR notification).
> 
> Try to improve this by defining set of VF state machines, each
> responsible for processing one activity (PAUSE, RESUME, STOP or
> FLR). All required steps defined by the VF state machine are then
> executed by the PF worker from the dedicated workqueue.
> 
> Any external requests or notifications simply try to transition
> between the states to trigger a work and then wait for that work
> to finish. Some predefined default timeouts are used to avoid
> changing existing API calls, but it should be easy to extend the
> control API to also accept specific timeout values.
> 
> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Piotr Piórkowski <piotr.piorkowski@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_gt_sriov_pf.c           |    6 +
>  drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c   | 1203 ++++++++++++++++-
>  drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h   |    3 +
>  .../gpu/drm/xe/xe_gt_sriov_pf_control_types.h |  107 ++
>  drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h     |    6 +
>  5 files changed, 1310 insertions(+), 15 deletions(-)
>  create mode 100644 drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h
> 
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf.c
> index ef239440963c..905f409db74b 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf.c
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf.c
> @@ -9,6 +9,7 @@
>  
>  #include "xe_gt_sriov_pf.h"
>  #include "xe_gt_sriov_pf_config.h"
> +#include "xe_gt_sriov_pf_control.h"
>  #include "xe_gt_sriov_pf_helpers.h"
>  #include "xe_gt_sriov_pf_service.h"
>  #include "xe_mmio.h"
> @@ -57,6 +58,10 @@ int xe_gt_sriov_pf_init_early(struct xe_gt *gt)
>  	if (err)
>  		return err;
>  
> +	err = xe_gt_sriov_pf_control_init(gt);
> +	if (err)
> +		return err;
> +
>  	return 0;
>  }
>  
> @@ -93,4 +98,5 @@ void xe_gt_sriov_pf_init_hw(struct xe_gt *gt)
>  void xe_gt_sriov_pf_restart(struct xe_gt *gt)
>  {
>  	xe_gt_sriov_pf_config_restart(gt);
> +	xe_gt_sriov_pf_control_restart(gt);
>  }
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> index ad447d867e51..1ed7d49bef8c 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> @@ -3,12 +3,17 @@
>   * Copyright © 2023-2024 Intel Corporation
>   */
>  
> +#include <drm/drm_managed.h>
> +
>  #include "abi/guc_actions_sriov_abi.h"
>  
>  #include "xe_device.h"
>  #include "xe_gt.h"
> +#include "xe_gt_sriov_pf_config.h"
>  #include "xe_gt_sriov_pf_control.h"
>  #include "xe_gt_sriov_pf_helpers.h"
> +#include "xe_gt_sriov_pf_monitor.h"
> +#include "xe_gt_sriov_pf_service.h"
>  #include "xe_gt_sriov_printk.h"
>  #include "xe_guc_ct.h"
>  #include "xe_sriov.h"
> @@ -42,10 +47,6 @@ static int guc_action_vf_control_cmd(struct xe_guc *guc, u32 vfid, u32 cmd)
>  	};
>  	int ret;
>  
> -	/* XXX those two commands are now sent from the G2H handler */
> -	if (cmd == GUC_PF_TRIGGER_VF_FLR_START || cmd == GUC_PF_TRIGGER_VF_FLR_FINISH)
> -		return xe_guc_ct_send_g2h_handler(&guc->ct, request, ARRAY_SIZE(request));
> -
>  	ret = xe_guc_ct_send_block(&guc->ct, request, ARRAY_SIZE(request));
>  	return ret > 0 ? -EPROTO : ret;
>  }
> @@ -55,6 +56,8 @@ static int pf_send_vf_control_cmd(struct xe_gt *gt, unsigned int vfid, u32 cmd)
>  	int err;
>  
>  	xe_gt_assert(gt, vfid != PFID);
> +	xe_gt_sriov_dbg_verbose(gt, "sending VF%u control command %s\n",
> +				vfid, control_cmd_to_string(cmd));
>  
>  	err = guc_action_vf_control_cmd(&gt->uc.guc, vfid, cmd);
>  	if (unlikely(err))
> @@ -88,6 +91,457 @@ static int pf_send_vf_flr_finish(struct xe_gt *gt, unsigned int vfid)
>  	return pf_send_vf_control_cmd(gt, vfid, GUC_PF_TRIGGER_VF_FLR_FINISH);
>  }
>  
> +/**
> + * DOC: The VF state machine
> + *
> + * The simplified VF state machine could be presented as::
> + *
> + *	               pause--------------------------o
> + *	              /                               |
> + *	             /                                v
> + *	      (READY)<------------------resume-----(PAUSED)
> + *	         ^   \                             /    /
> + *	         |    \                           /    /
> + *	         |     stop---->(STOPPED)<----stop    /
> + *	         |                  /                /
> + *	         |                 /                /
> + *	         o--------<-----flr                /
> + *	          \                               /
> + *	           o------<--------------------flr
> + *
> + * Where:
> + *
> + * * READY - represents a state in which VF is fully operable
> + * * PAUSED - represents a state in which VF activity is temporarily suspended
> + * * STOPPED - represents a state in which VF activity is definitely halted
> + * * pause - represents a request to temporarily suspend VF activity
> + * * resume - represents a request to resume VF activity
> + * * stop - represents a request to definitely halt VF activity
> + * * flr - represents a request to perform VF FLR to restore VF activity
> + *
> + * However, each state transition requires additional steps that involves
> + * communication with GuC that might fail or be interrupted by other requests::
> + *
> + *	                   .................................WIP....
> + *	                   :                                      :
> + *	          pause--------------------->PAUSE_WIP----------------------------o
> + *	         /         :                /         \           :               |
> + *	        /          :    o----<---stop          flr--o     :               |
> + *	       /           :    |           \         /     |     :               V
> + *	 (READY)<---------------+------------RESUME_WIP<----+--<-----resume--(PAUSED)
> + *	  ^ \  \           :    |                           |     :          /   /
> + *	  |  \  \          :    |                           |     :         /   /
> + *	  |   \  \         :    |                           |     :        /   /
> + *	  |    \  \        :    o----<----------------------+--<-------stop   /
> + *	  |     \  \       :    |                           |     :          /
> + *	  |      \  \      :    V                           |     :         /
> + *	  |       \  stop----->STOP_WIP---------flr--->-----o     :        /
> + *	  |        \       :    |                           |     :       /
> + *	  |         \      :    |                           V     :      /
> + *	  |          flr--------+----->----------------->FLR_WIP<-----flr
> + *	  |                :    |                        /  ^     :
> + *	  |                :    |                       /   |     :
> + *	  o--------<-------:----+-----<----------------o    |     :
> + *	                   :    |                           |     :
> + *	                   :....|...........................|.....:
> + *	                        |                           |
> + *	                        V                           |
> + *	                     (STOPPED)--------------------flr
> + *
> + * For details about each internal WIP state machine see:
> + *
> + * * `The VF PAUSE state machine`_
> + * * `The VF RESUME state machine`_
> + * * `The VF STOP state machine`_
> + * * `The VF FLR state machine`_


Later in the code there is one state that is not obvious when you look at the first
two drawings of the state machine - it is the resumed state. It appears in subsequent
drawings but in my opinion it is not obvious. I have already talked to Michal about it
and he explained to me why he introduced it in the code, but it seems to me that it
should be included at least in this drawing.

> + */
> +
> +#ifdef CONFIG_DRM_XE_DEBUG_SRIOV
> +static const char *control_bit_to_string(enum xe_gt_sriov_control_bits bit)
> +{
> +	switch (bit) {
> +#define CASE2STR(_X) \
> +	case XE_GT_SRIOV_STATE_##_X: return #_X
> +	CASE2STR(WIP);
> +	CASE2STR(FLR_WIP);
> +	CASE2STR(FLR_SEND_START);
> +	CASE2STR(FLR_WAIT_GUC);
> +	CASE2STR(FLR_GUC_DONE);
> +	CASE2STR(FLR_RESET_CONFIG);
> +	CASE2STR(FLR_RESET_DATA);
> +	CASE2STR(FLR_RESET_MMIO);
> +	CASE2STR(FLR_SEND_FINISH);
> +	CASE2STR(FLR_FAILED);
> +	CASE2STR(PAUSE_WIP);
> +	CASE2STR(PAUSE_SEND_PAUSE);
> +	CASE2STR(PAUSE_WAIT_GUC);
> +	CASE2STR(PAUSE_GUC_DONE);
> +	CASE2STR(PAUSE_FAILED);
> +	CASE2STR(PAUSED);
> +	CASE2STR(RESUME_WIP);
> +	CASE2STR(RESUME_SEND_RESUME);
> +	CASE2STR(RESUME_FAILED);
> +	CASE2STR(RESUMED);
> +	CASE2STR(STOP_WIP);
> +	CASE2STR(STOP_SEND_STOP);
> +	CASE2STR(STOP_FAILED);
> +	CASE2STR(STOPPED);
> +	CASE2STR(MISMATCH);
> +#undef  CASE2STR
> +	default: return "?";
> +	}
> +}
> +#endif
> +
> +static unsigned long pf_get_default_timeout(enum xe_gt_sriov_control_bits bit)
> +{
> +	switch (bit) {
> +	case XE_GT_SRIOV_STATE_FLR_WAIT_GUC:
> +	case XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC:
> +		return HZ / 2;
> +	case XE_GT_SRIOV_STATE_FLR_WIP:
> +	case XE_GT_SRIOV_STATE_FLR_RESET_CONFIG:
> +		return 5 * HZ;
> +	default:
> +		return HZ;
> +	}
> +}
> +
> +static unsigned long *pf_peek_vf_state(struct xe_gt *gt, unsigned int vfid)
> +{
> +	xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
> +	xe_gt_assert(gt, vfid <= xe_gt_sriov_pf_get_totalvfs(gt));
> +
> +	return &gt->sriov.pf.vfs[vfid].control.state;
> +}

NIT: Later in the code you define such a function as pf_peek_vf_control.
Maybe you define it earlier and use it in pf_peek_vf_state ? The code will reduce by two asserts
> +
> +static bool pf_check_vf_state(struct xe_gt *gt, unsigned int vfid,
> +			      enum xe_gt_sriov_control_bits bit)
> +{
> +	return test_bit(bit, pf_peek_vf_state(gt, vfid));
> +}
> +
> +static void pf_dump_vf_state(struct xe_gt *gt, unsigned int vfid)
> +{
> +	unsigned long state = *pf_peek_vf_state(gt, vfid);
> +	enum xe_gt_sriov_control_bits bit;
> +
> +	if (state) {
> +		xe_gt_sriov_dbg_verbose(gt, "VF%u state %#lx%s%*pbl\n",
> +					vfid, state, state ? " bits " : "",
> +					(int)BITS_PER_LONG, &state);
> +		for_each_set_bit(bit, &state, BITS_PER_LONG)
> +			xe_gt_sriov_dbg_verbose(gt, "VF%u state %s(%d)\n",
> +						vfid, control_bit_to_string(bit), bit);
> +	} else {
> +		xe_gt_sriov_dbg_verbose(gt, "VF%u state READY\n", vfid);
> +	}
> +}
> +
> +static bool pf_expect_vf_state(struct xe_gt *gt, unsigned int vfid,
> +			       enum xe_gt_sriov_control_bits bit)
> +{
> +	bool result = pf_check_vf_state(gt, vfid, bit);
> +
> +	if (unlikely(!result))
> +		pf_dump_vf_state(gt, vfid);
> +
> +	return result;
> +}
> +
> +static bool pf_expect_vf_not_state(struct xe_gt *gt, unsigned int vfid,
> +				   enum xe_gt_sriov_control_bits bit)
> +{
> +	bool result = !pf_check_vf_state(gt, vfid, bit);
> +
> +	if (unlikely(!result))
> +		pf_dump_vf_state(gt, vfid);
> +
> +	return result;
> +}
> +
> +static bool pf_enter_vf_state(struct xe_gt *gt, unsigned int vfid,
> +			      enum xe_gt_sriov_control_bits bit)
> +{
> +	if (!test_and_set_bit(bit, pf_peek_vf_state(gt, vfid))) {
> +		xe_gt_sriov_dbg_verbose(gt, "VF%u state %s(%d) enter\n",
> +					vfid, control_bit_to_string(bit), bit);
> +		return true;
> +	}
> +	return false;
> +}
> +
> +static bool pf_exit_vf_state(struct xe_gt *gt, unsigned int vfid,
> +			     enum xe_gt_sriov_control_bits bit)
> +{
> +	if (test_and_clear_bit(bit, pf_peek_vf_state(gt, vfid))) {
> +		xe_gt_sriov_dbg_verbose(gt, "VF%u state %s(%d) exit\n",
> +					vfid, control_bit_to_string(bit), bit);
> +		return true;
> +	}
> +	return false;
> +}
> +
> +static void pf_escape_vf_state(struct xe_gt *gt, unsigned int vfid,
> +			       enum xe_gt_sriov_control_bits bit)
> +{
> +	if (pf_exit_vf_state(gt, vfid, bit))
> +		xe_gt_sriov_dbg_verbose(gt, "VF%u state %s(%d) escaped by %ps\n",
> +					vfid, control_bit_to_string(bit), bit,
> +					__builtin_return_address(0));
> +}
> +
> +static void pf_enter_vf_mismatch(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_MISMATCH)) {
> +		xe_gt_sriov_dbg(gt, "VF%u state mismatch detected by %ps\n",
> +				vfid, __builtin_return_address(0));
> +		pf_dump_vf_state(gt, vfid);
> +	}
> +}
> +
> +static void pf_exit_vf_mismatch(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_MISMATCH))
> +		xe_gt_sriov_dbg(gt, "VF%u state mismatch cleared by %ps\n",
> +				vfid, __builtin_return_address(0));
> +
> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_FAILED);
> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_FAILED);
> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_FAILED);
> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_FAILED);
> +}
> +
> +#define pf_enter_vf_state_machine_bug(gt, vfid) ({	\
> +	pf_enter_vf_mismatch((gt), (vfid));		\
> +})
> +
> +static struct xe_gt_sriov_control_state *pf_pick_vf_control(struct xe_gt *gt, unsigned int vfid)
> +{
> +	xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
> +	xe_gt_assert(gt, vfid <= xe_gt_sriov_pf_get_totalvfs(gt));
> +
> +	return &gt->sriov.pf.vfs[vfid].control;
> +}
> +
> +static void pf_queue_control_worker(struct xe_gt *gt)
> +{
> +	struct xe_device *xe = gt_to_xe(gt);
> +
> +	xe_gt_assert(gt, IS_SRIOV_PF(xe));
> +
> +	queue_work(xe->sriov.wq, &gt->sriov.pf.control.worker);
> +}
> +
> +static void pf_queue_vf(struct xe_gt *gt, unsigned int vfid)
> +{
> +	struct xe_gt_sriov_pf_control *pfc = &gt->sriov.pf.control;
> +
> +	xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
> +
> +	spin_lock(&pfc->lock);
> +	list_move_tail(&gt->sriov.pf.vfs[vfid].control.link, &pfc->list);
> +	spin_unlock(&pfc->lock);
> +
> +	pf_queue_control_worker(gt);
> +}
> +
> +static void pf_exit_vf_flr_wip(struct xe_gt *gt, unsigned int vfid);
> +static void pf_exit_vf_stop_wip(struct xe_gt *gt, unsigned int vfid);
> +static void pf_exit_vf_pause_wip(struct xe_gt *gt, unsigned int vfid);
> +static void pf_exit_vf_resume_wip(struct xe_gt *gt, unsigned int vfid);
> +
> +static bool pf_enter_vf_wip(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_WIP)) {
> +		struct xe_gt_sriov_control_state *cs = pf_pick_vf_control(gt, vfid);
> +
> +		reinit_completion(&cs->done);
> +		return true;
> +	}
> +	return false;
> +}
> +
> +static void pf_exit_vf_wip(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_WIP)) {
> +		struct xe_gt_sriov_control_state *cs = pf_pick_vf_control(gt, vfid);
> +
> +		pf_exit_vf_flr_wip(gt, vfid);
> +		pf_exit_vf_stop_wip(gt, vfid);
> +		pf_exit_vf_pause_wip(gt, vfid);
> +		pf_exit_vf_resume_wip(gt, vfid);
> +
> +		complete_all(&cs->done);
> +	}
> +}
> +
> +static int pf_wait_vf_wip_done(struct xe_gt *gt, unsigned int vfid, unsigned long timeout)
> +{
> +	struct xe_gt_sriov_control_state *cs = pf_pick_vf_control(gt, vfid);
> +
> +	return wait_for_completion_timeout(&cs->done, timeout) ? 0 : -ETIMEDOUT;
> +}
> +
> +static void pf_enter_vf_ready(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED);
> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED);
> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED);
> +	pf_exit_vf_mismatch(gt, vfid);
> +	pf_exit_vf_wip(gt, vfid);
> +}
> +
> +/**
> + * DOC: The VF PAUSE state machine
> + *
> + * The VF PAUSE state machine looks like::
> + *
> + *	 (READY,RESUMED)<-------------<---------------------o---------o
> + *	    |                                                \         \
> + *	   pause                                              \         \
> + *	    |                                                  \         \
> + *	....V...........................PAUSE_WIP........       \         \
> + *	:    \                                          :        o         \
> + *	:     \   o------<-----busy                     :        |          \
> + *	:      \ /              /                       :        |           |
> + *	:       PAUSE_SEND_PAUSE ---failed--->----------o--->(PAUSE_FAILED)  |
> + *	:        |              \                       :        |           |
> + *	:      acked             rejected---->----------o--->(MISMATCH)     /
> + *	:        |                                      :                  /
> + *	:        v                                      :                 /
> + *	:       PAUSE_WAIT_GUC                          :                /
> + *	:        |                                      :               /
> + *	:       done                                    :              /
> + *	:        |                                      :             /
> + *	:        v                                      :            /
> + *	:       PAUSE_GUC_DONE                          o-----restart
> + *	:      /                                        :
> + *	:     /                                         :
> + *	:....o..............o...............o...........:
> + *	     |              |               |
> + *	  completed        flr             stop
> + *	     |              |               |
> + *	     V         .....V.....    ......V.....
> + *	 (PAUSED)      : FLR_WIP :    : STOP_WIP :
> + *	               :.........:    :..........:
> + *
> + * For the full state machine view, see `The VF state machine`_.
> + */
> +
> +static void pf_exit_vf_pause_wip(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WIP)) {
> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE);
> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC);
> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_GUC_DONE);
> +	}
> +}
> +
> +static void pf_enter_vf_paused(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED))
> +		pf_enter_vf_state_machine_bug(gt, vfid);
> +
> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED);
> +	pf_exit_vf_mismatch(gt, vfid);
> +	pf_exit_vf_wip(gt, vfid);
> +}
> +
> +static void pf_enter_vf_pause_completed(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_enter_vf_paused(gt, vfid);
> +}
> +
> +static void pf_enter_vf_pause_failed(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_FAILED);
> +	pf_exit_vf_wip(gt, vfid);
> +}
> +
> +static void pf_enter_vf_pause_rejected(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_enter_vf_mismatch(gt, vfid);
> +	pf_enter_vf_pause_failed(gt, vfid);
> +}
> +
> +static bool pf_exit_vf_pause_guc_done(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_GUC_DONE))
> +		return false;
> +
> +	pf_enter_vf_pause_completed(gt, vfid);
> +	return true;
> +}
> +
> +static void pf_enter_vf_pause_guc_done(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_GUC_DONE))
> +		pf_queue_vf(gt, vfid);
> +}
> +
> +static void pf_enter_pause_wait_guc(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC))
> +		pf_enter_vf_state_machine_bug(gt, vfid);
> +}
> +
> +static bool pf_exit_pause_wait_guc(struct xe_gt *gt, unsigned int vfid)
> +{
> +	return pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC);
> +}
> +
> +static void pf_enter_vf_pause_send_pause(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE))
> +		pf_enter_vf_state_machine_bug(gt, vfid);
> +
> +	pf_queue_vf(gt, vfid);
> +}
> +
> +static bool pf_exit_vf_pause_send_pause(struct xe_gt *gt, unsigned int vfid)
> +{
> +	int err;
> +
> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE))
> +		return false;
> +
> +	/* GuC may actually send a PAUSE_DONE before we get a RESPONSE */
> +	pf_enter_pause_wait_guc(gt, vfid);
> +
> +	err = pf_send_vf_pause(gt, vfid);
> +	if (err) {
> +		/* send failed, so we shouldn't expect PAUSE_DONE from GuC */
> +		pf_exit_pause_wait_guc(gt, vfid);
> +
> +		if (err == -EBUSY)
> +			pf_enter_vf_pause_send_pause(gt, vfid);
> +		else if (err == -EIO)
> +			pf_enter_vf_pause_rejected(gt, vfid);
> +		else
> +			pf_enter_vf_pause_failed(gt, vfid);
> +	} else {
> +		/*
> +		 * we have already moved to WAIT_GUC, maybe even to GUC_DONE
> +		 * but since GuC didn't complain, we may clear MISMATCH
> +		 */
> +		pf_exit_vf_mismatch(gt, vfid);
> +	}
> +
> +	return true;
> +}
> +
> +static bool pf_enter_vf_pause_wip(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WIP)) {
> +		pf_enter_vf_wip(gt, vfid);
> +		pf_enter_vf_pause_send_pause(gt, vfid);
> +		return true;
> +	}
> +
> +	return false;
> +}
> +
>  /**
>   * xe_gt_sriov_pf_control_pause_vf - Pause a VF.
>   * @gt: the &xe_gt
> @@ -99,7 +553,140 @@ static int pf_send_vf_flr_finish(struct xe_gt *gt, unsigned int vfid)
>   */
>  int xe_gt_sriov_pf_control_pause_vf(struct xe_gt *gt, unsigned int vfid)
>  {
> -	return pf_send_vf_pause(gt, vfid);
> +	unsigned long timeout = pf_get_default_timeout(XE_GT_SRIOV_STATE_PAUSE_WIP);
> +	int err;
> +
> +	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED)) {
> +		xe_gt_sriov_dbg(gt, "VF%u is stopped!\n", vfid);
> +		return -EPERM;
> +	}
> +
> +	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED)) {
> +		xe_gt_sriov_dbg(gt, "VF%u was already paused!\n", vfid);
> +		return -ESTALE;
> +	}
> +
> +	if (!pf_enter_vf_pause_wip(gt, vfid)) {
> +		xe_gt_sriov_dbg(gt, "VF%u pause already in progress!\n", vfid);
> +		return -EALREADY;
> +	}
> +
> +	err = pf_wait_vf_wip_done(gt, vfid, timeout);
> +	if (err) {
> +		xe_gt_sriov_dbg(gt, "VF%u pause didn't finish in %u ms (%pe)\n",
> +				vfid, jiffies_to_msecs(timeout), ERR_PTR(err));
> +		return err;
> +	}
> +
> +	if (pf_expect_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED)) {
> +		xe_gt_sriov_info(gt, "VF%u paused!\n", vfid);
> +		return 0;
> +	}
> +
> +	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_FAILED)) {
> +		xe_gt_sriov_dbg(gt, "VF%u pause failed!\n", vfid);
> +		return -EIO;
> +	}
> +
> +	xe_gt_sriov_dbg(gt, "VF%u pause was canceled!\n", vfid);
> +	return -ECANCELED;
> +}
> +
> +/**
> + * DOC: The VF RESUME state machine
> + *
> + * The VF RESUME state machine looks like::
> + *
> + *	 (PAUSED)<-----------------<------------------------o
> + *	    |                                                \
> + *	   resume                                             \
> + *	    |                                                  \
> + *	....V............................RESUME_WIP......       \
> + *	:    \                                          :        o
> + *	:     \   o-------<-----busy                    :        |
> + *	:      \ /                /                     :        |
> + *	:       RESUME_SEND_RESUME ---failed--->--------o--->(RESUME_FAILED)
> + *	:       /                \                      :        |
> + *	:    acked                rejected---->---------o--->(MISMATCH)
> + *	:     /                                         :
> + *	:....o..............o...............o.....o.....:
> + *	     |              |               |      \
> + *	  completed        flr            stop      restart-->(READY)
> + *	     |              |               |
> + *	     V         .....V.....    ......V.....
> + *	 (RESUMED)     : FLR_WIP :    : STOP_WIP :
> + *	               :.........:    :..........:
> + *
> + * For the full state machine view, see `The VF state machine`_.
> + */
> +
> +static void pf_exit_vf_resume_wip(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_WIP))
> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_SEND_RESUME);
> +}
> +
> +static void pf_enter_vf_resumed(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED);
> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED);
> +	pf_exit_vf_mismatch(gt, vfid);
> +	pf_exit_vf_wip(gt, vfid);
> +}
> +
> +static void pf_enter_vf_resume_completed(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_enter_vf_resumed(gt, vfid);
> +}
> +
> +static void pf_enter_vf_resume_failed(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_FAILED);
> +	pf_exit_vf_wip(gt, vfid);
> +}
> +
> +static void pf_enter_vf_resume_rejected(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_enter_vf_mismatch(gt, vfid);
> +	pf_enter_vf_resume_failed(gt, vfid);
> +}
> +
> +static void pf_enter_vf_resume_send_resume(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_SEND_RESUME))
> +		pf_enter_vf_state_machine_bug(gt, vfid);
> +
> +	pf_queue_vf(gt, vfid);
> +}
> +
> +static bool pf_exit_vf_resume_send_resume(struct xe_gt *gt, unsigned int vfid)
> +{
> +	int err;
> +
> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_SEND_RESUME))
> +		return false;
> +
> +	err = pf_send_vf_resume(gt, vfid);
> +	if (err == -EBUSY)
> +		pf_enter_vf_resume_send_resume(gt, vfid);
> +	else if (err == -EIO)
> +		pf_enter_vf_resume_rejected(gt, vfid);
> +	else if (err)
> +		pf_enter_vf_resume_failed(gt, vfid);
> +	else
> +		pf_enter_vf_resume_completed(gt, vfid);
> +	return true;
> +}
> +
> +static bool pf_enter_vf_resume_wip(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_WIP)) {
> +		pf_enter_vf_wip(gt, vfid);
> +		pf_enter_vf_resume_send_resume(gt, vfid);
> +		return true;
> +	}
> +
> +	return false;
>  }
>  
>  /**
> @@ -113,7 +700,133 @@ int xe_gt_sriov_pf_control_pause_vf(struct xe_gt *gt, unsigned int vfid)
>   */
>  int xe_gt_sriov_pf_control_resume_vf(struct xe_gt *gt, unsigned int vfid)
>  {
> -	return pf_send_vf_resume(gt, vfid);
> +	int err;
> +
> +	if (!pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED)) {
> +		xe_gt_sriov_dbg(gt, "VF%u is not paused!\n", vfid);
> +		return -EPERM;
> +	}
> +
> +	if (!pf_enter_vf_resume_wip(gt, vfid)) {
> +		xe_gt_sriov_dbg(gt, "VF%u resume already in progress!\n", vfid);
> +		return -EALREADY;
> +	}
> +
> +	err = pf_wait_vf_wip_done(gt, vfid, 2 * HZ);

use define, or pf_get_default_timeout for this timeout


> +	if (err)
> +		return err;
> +
> +	if (pf_expect_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED)) {
> +		xe_gt_sriov_info(gt, "VF%u resumed!\n", vfid);
> +		return 0;
> +	}
> +
> +	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_FAILED)) {
> +		xe_gt_sriov_dbg(gt, "VF%u resume failed!\n", vfid);
> +		return -EIO;
> +	}
> +
> +	xe_gt_sriov_dbg(gt, "VF%u resume was canceled!\n", vfid);
> +	return -ECANCELED;
> +}
> +
> +/**
> + * DOC: The VF STOP state machine
> + *
> + * The VF STOP state machine looks like::
> + *
> + *	 (READY,PAUSED,RESUMED)<-------<--------------------o
> + *	    |                                                \
> + *	   stop                                               \
> + *	    |                                                  \
> + *	....V..............................STOP_WIP......       \
> + *	:    \                                          :        o
> + *	:     \   o----<----busy                        :        |
> + *	:      \ /            /                         :        |
> + *	:       STOP_SEND_STOP--------failed--->--------o--->(STOP_FAILED)
> + *	:       /             \                         :        |
> + *	:    acked             rejected-------->--------o--->(MISMATCH)
> + *	:     /                                         :
> + *	:....o..............o...............o...........:
> + *	     |              |               |
> + *	  completed        flr            restart
> + *	     |              |               |
> + *	     V         .....V.....          V
> + *	 (STOPPED)     : FLR_WIP :       (READY)
> + *	               :.........:
> + *
> + * For the full state machine view, see `The VF state machine`_.
> + */
> +
> +static void pf_exit_vf_stop_wip(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_WIP))
> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_SEND_STOP);
> +}
> +
> +static void pf_enter_vf_stopped(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED))
> +		pf_enter_vf_state_machine_bug(gt, vfid);
> +
> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED);
> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED);
> +	pf_exit_vf_mismatch(gt, vfid);
> +	pf_exit_vf_wip(gt, vfid);
> +}
> +
> +static void pf_enter_vf_stop_completed(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_enter_vf_stopped(gt, vfid);
> +}
> +
> +static void pf_enter_vf_stop_failed(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_FAILED);
> +	pf_exit_vf_wip(gt, vfid);
> +}
> +
> +static void pf_enter_vf_stop_rejected(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_enter_vf_mismatch(gt, vfid);
> +	pf_enter_vf_stop_failed(gt, vfid);
> +}
> +
> +static void pf_enter_vf_stop_send_stop(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_SEND_STOP))
> +		pf_enter_vf_state_machine_bug(gt, vfid);
> +
> +	pf_queue_vf(gt, vfid);
> +}
> +
> +static bool pf_exit_vf_stop_send_stop(struct xe_gt *gt, unsigned int vfid)
> +{
> +	int err;
> +
> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_SEND_STOP))
> +		return false;
> +
> +	err = pf_send_vf_stop(gt, vfid);
> +	if (err == -EBUSY)
> +		pf_enter_vf_stop_send_stop(gt, vfid);
> +	else if (err == -EIO)
> +		pf_enter_vf_stop_rejected(gt, vfid);
> +	else if (err)
> +		pf_enter_vf_stop_failed(gt, vfid);
> +	else
> +		pf_enter_vf_stop_completed(gt, vfid);
> +	return true;
> +}
> +
> +static bool pf_enter_vf_stop_wip(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_WIP)) {
> +		pf_enter_vf_wip(gt, vfid);
> +		pf_enter_vf_stop_send_stop(gt, vfid);
> +		return true;
> +	}
> +	return false;
>  }
>  
>  /**
> @@ -127,7 +840,279 @@ int xe_gt_sriov_pf_control_resume_vf(struct xe_gt *gt, unsigned int vfid)
>   */
>  int xe_gt_sriov_pf_control_stop_vf(struct xe_gt *gt, unsigned int vfid)
>  {
> -	return pf_send_vf_stop(gt, vfid);
> +	int err;
> +
> +	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED)) {
> +		xe_gt_sriov_dbg(gt, "VF%u was already stopped!\n", vfid);
> +		return -ESTALE;
> +	}
> +
> +	if (!pf_enter_vf_stop_wip(gt, vfid)) {
> +		xe_gt_sriov_dbg(gt, "VF%u stop already in progress!\n", vfid);
> +		return -EALREADY;
> +	}
> +
> +	err = pf_wait_vf_wip_done(gt, vfid, 2 * HZ);

use define, or pf_get_default_timeout for this timeout

> +	if (err)
> +		return err;
> +
> +	if (pf_expect_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED)) {
> +		xe_gt_sriov_info(gt, "VF%u stopped!\n", vfid);
> +		return 0;
> +	}
> +
> +	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_FAILED)) {
> +		xe_gt_sriov_dbg(gt, "VF%u stop failed!\n", vfid);
> +		return -EIO;
> +	}
> +
> +	xe_gt_sriov_dbg(gt, "VF%u stop was canceled!\n", vfid);
> +	return -ECANCELED;
> +}
> +
> +/**
> + * DOC: The VF FLR state machine
> + *
> + * The VF FLR state machine looks like::
> + *
> + *	 (READY,PAUSED,STOPPED)<------------<--------------o
> + *	    |                                               \
> + *	   flr                                               \
> + *	    |                                                 \
> + *	....V..........................FLR_WIP...........      \
> + *	:    \                                          :       \
> + *	:     \   o----<----busy                        :        |
> + *	:      \ /            /                         :        |
> + *	:       FLR_SEND_START---failed----->-----------o--->(FLR_FAILED)<---o
> + *	:        |            \                         :        |           |
> + *	:      acked           rejected----->-----------o--->(MISMATCH)      |
> + *	:        |                                      :        ^           |
> + *	:        v                                      :        |           |
> + *	:       FLR_WAIT_GUC                            :        |           |
> + *	:        |                                      :        |           |
> + *	:       done                                    :        |           |
> + *	:        |                                      :        |           |
> + *	:        v                                      :        |           |
> + *	:       FLR_GUC_DONE                            :        |           |
> + *	:        |                                      :        |           |
> + *	:       FLR_RESET_CONFIG---failed--->-----------o--------+-----------o
> + *	:        |                                      :        |           |
> + *	:       FLR_RESET_DATA                          :        |           |
> + *	:        |                                      :        |           |
> + *	:       FLR_RESET_MMIO                          :        |           |
> + *	:        |                                      :        |           |
> + *	:        | o----<----busy                       :        |           |
> + *	:        |/            /                        :        |           |
> + *	:       FLR_SEND_FINISH----failed--->-----------o--------+-----------o
> + *	:       /             \                         :        |
> + *	:     acked            rejected----->-----------o--------o
> + *	:     /                                         :
> + *	:....o..............................o...........:
> + *	     |                              |
> + *	  completed                       restart
> + *	     |                             /
> + *	     V                            /
> + *	  (READY)<----------<------------o
> + *
> + * For the full state machine view, see `The VF state machine`_.
> + */
> +
> +static void pf_enter_vf_flr_send_start(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_START))
> +		pf_enter_vf_state_machine_bug(gt, vfid);
> +
> +	pf_queue_vf(gt, vfid);
> +}
> +
> +static void pf_enter_vf_flr_wip(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WIP)) {
> +		xe_gt_sriov_dbg(gt, "VF%u FLR is already in progress\n", vfid);
> +		return;
> +	}
> +
> +	pf_enter_vf_wip(gt, vfid);
> +	pf_enter_vf_flr_send_start(gt, vfid);
> +}
> +
> +static void pf_exit_vf_flr_wip(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WIP)) {
> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_FINISH);
> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_MMIO);
> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_DATA);
> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_CONFIG);
> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_GUC_DONE);
> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WAIT_GUC);
> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_START);
> +	}
> +}
> +
> +static void pf_enter_vf_flr_completed(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_enter_vf_ready(gt, vfid);
> +}
> +
> +static void pf_enter_vf_flr_failed(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_FAILED))
> +		xe_gt_sriov_notice(gt, "VF%u FLR failed!\n", vfid);
> +	pf_exit_vf_wip(gt, vfid);
> +}
> +
> +static void pf_enter_vf_flr_rejected(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_enter_vf_mismatch(gt, vfid);
> +	pf_enter_vf_flr_failed(gt, vfid);
> +}
> +
> +static void pf_enter_vf_flr_send_finish(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_FINISH))
> +		pf_enter_vf_state_machine_bug(gt, vfid);
> +
> +	pf_queue_vf(gt, vfid);
> +}
> +
> +static bool pf_exit_vf_flr_send_finish(struct xe_gt *gt, unsigned int vfid)
> +{
> +	int err;
> +
> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_FINISH))
> +		return false;
> +
> +	err = pf_send_vf_flr_finish(gt, vfid);
> +	if (err == -EBUSY)
> +		pf_enter_vf_flr_send_finish(gt, vfid);
> +	else if (err == -EIO)
> +		pf_enter_vf_flr_rejected(gt, vfid);
> +	else if (err)
> +		pf_enter_vf_flr_failed(gt, vfid);
> +	else
> +		pf_enter_vf_flr_completed(gt, vfid);
> +	return true;
> +}
> +
> +static void pf_enter_vf_flr_reset_mmio(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_MMIO))
> +		pf_enter_vf_state_machine_bug(gt, vfid);
> +
> +	pf_queue_vf(gt, vfid);
> +}
> +
> +static bool pf_exit_vf_flr_reset_mmio(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_MMIO))
> +		return false;
> +
> +	/* XXX: placeholder */
> +
> +	pf_enter_vf_flr_send_finish(gt, vfid);
> +	return true;
> +}
> +
> +static void pf_enter_vf_flr_reset_data(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_DATA))
> +		pf_enter_vf_state_machine_bug(gt, vfid);
> +
> +	pf_queue_vf(gt, vfid);
> +}
> +
> +static bool pf_exit_vf_flr_reset_data(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_DATA))
> +		return false;
> +
> +	xe_gt_sriov_pf_service_reset(gt, vfid);
> +	xe_gt_sriov_pf_monitor_flr(gt, vfid);
> +
> +	pf_enter_vf_flr_reset_mmio(gt, vfid);
> +	return true;
> +}
> +
> +static void pf_enter_vf_flr_reset_config(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_CONFIG))
> +		pf_enter_vf_state_machine_bug(gt, vfid);
> +
> +	pf_queue_vf(gt, vfid);
> +}
> +
> +static bool pf_exit_vf_flr_reset_config(struct xe_gt *gt, unsigned int vfid)
> +{
> +	unsigned long timeout = pf_get_default_timeout(XE_GT_SRIOV_STATE_FLR_RESET_CONFIG);
> +	int err;
> +
> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_CONFIG))
> +		return false;
> +
> +	err = xe_gt_sriov_pf_config_sanitize(gt, vfid, timeout);
> +	if (err)
> +		pf_enter_vf_flr_failed(gt, vfid);
> +	else
> +		pf_enter_vf_flr_reset_data(gt, vfid);
> +	return true;
> +}
> +
> +static void pf_enter_vf_flr_wait_guc(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WAIT_GUC))
> +		pf_enter_vf_state_machine_bug(gt, vfid);
> +}
> +
> +static bool pf_exit_vf_flr_wait_guc(struct xe_gt *gt, unsigned int vfid)
> +{
> +	return pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WAIT_GUC);
> +}
> +
> +static bool pf_exit_vf_flr_send_start(struct xe_gt *gt, unsigned int vfid)
> +{
> +	int err;
> +
> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_START))
> +		return false;
> +
> +	/* GuC may actually send a FLR_DONE before we get a RESPONSE */
> +	pf_enter_vf_flr_wait_guc(gt, vfid);
> +
> +	err = pf_send_vf_flr_start(gt, vfid);
> +	if (err) {
> +		/* send failed, so we shouldn't expect FLR_DONE from GuC */
> +		pf_exit_vf_flr_wait_guc(gt, vfid);
> +
> +		if (err == -EBUSY)
> +			pf_enter_vf_flr_send_start(gt, vfid);
> +		else if (err == -EIO)
> +			pf_enter_vf_flr_rejected(gt, vfid);
> +		else
> +			pf_enter_vf_flr_failed(gt, vfid);
> +	} else {
> +		/*
> +		 * we have already moved to WAIT_GUC, maybe even to GUC_DONE
> +		 * but since GuC didn't complain, we may clear MISMATCH
> +		 */
> +		pf_exit_vf_mismatch(gt, vfid);
> +	}
> +
> +	return true;
> +}
> +
> +static bool pf_exit_vf_flr_guc_done(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_GUC_DONE))
> +		return false;
> +
> +	pf_enter_vf_flr_reset_config(gt, vfid);
> +	return true;
> +}
> +
> +static void pf_enter_vf_flr_guc_done(struct xe_gt *gt, unsigned int vfid)
> +{
> +	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_GUC_DONE))
> +		pf_queue_vf(gt, vfid);
>  }
>  
>  /**
> @@ -141,14 +1126,22 @@ int xe_gt_sriov_pf_control_stop_vf(struct xe_gt *gt, unsigned int vfid)
>   */
>  int xe_gt_sriov_pf_control_trigger_flr(struct xe_gt *gt, unsigned int vfid)
>  {
> +	unsigned long timeout = pf_get_default_timeout(XE_GT_SRIOV_STATE_FLR_WIP);
>  	int err;
>  
> -	/* XXX pf_send_vf_flr_start() expects ct->lock */
> -	mutex_lock(&gt->uc.guc.ct.lock);
> -	err = pf_send_vf_flr_start(gt, vfid);
> -	mutex_unlock(&gt->uc.guc.ct.lock);
> +	pf_enter_vf_flr_wip(gt, vfid);
>  
> -	return err;
> +	err = pf_wait_vf_wip_done(gt, vfid, timeout);
> +	if (err) {
> +		xe_gt_sriov_dbg(gt, "VF%u FLR didn't finish in %u ms (%pe)\n",
> +				vfid, jiffies_to_msecs(timeout), ERR_PTR(err));

I would increase the level of this log, dbg IMO is not enough,

> +		return err;
> +	}
> +
> +	if (!pf_expect_vf_not_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_FAILED))
> +		return -EIO;
> +
> +	return 0;
>  }
>  
>  /**
> @@ -200,15 +1193,32 @@ static void pf_handle_vf_flr(struct xe_gt *gt, u32 vfid)
>  
>  	if (needs_dispatch_flr(xe)) {
>  		for_each_gt(gtit, xe, gtid)
> -			pf_send_vf_flr_start(gtit, vfid);
> +			pf_enter_vf_flr_wip(gtit, vfid);
>  	} else {
> -		pf_send_vf_flr_start(gt, vfid);
> +		pf_enter_vf_flr_wip(gt, vfid);
>  	}
>  }
>  
>  static void pf_handle_vf_flr_done(struct xe_gt *gt, u32 vfid)
>  {
> -	pf_send_vf_flr_finish(gt, vfid);
> +	if (!pf_exit_vf_flr_wait_guc(gt, vfid)) {
> +		xe_gt_sriov_dbg(gt, "Received out of order 'VF%u FLR done'\n", vfid);
> +		pf_enter_vf_mismatch(gt, vfid);
> +		return;
> +	}
> +
> +	pf_enter_vf_flr_guc_done(gt, vfid);
> +}
> +
> +static void pf_handle_vf_pause_done(struct xe_gt *gt, u32 vfid)
> +{
> +	if (!pf_exit_pause_wait_guc(gt, vfid)) {
> +		xe_gt_sriov_dbg(gt, "Received out of order 'VF%u PAUSE done'\n", vfid);
> +		pf_enter_vf_mismatch(gt, vfid);
> +		return;
> +	}
> +
> +	pf_enter_vf_pause_guc_done(gt, vfid);
>  }
>  
>  static int pf_handle_vf_event(struct xe_gt *gt, u32 vfid, u32 eventid)
> @@ -226,6 +1236,7 @@ static int pf_handle_vf_event(struct xe_gt *gt, u32 vfid, u32 eventid)
>  		pf_handle_vf_flr_done(gt, vfid);
>  		break;
>  	case GUC_PF_NOTIFY_VF_PAUSE_DONE:
> +		pf_handle_vf_pause_done(gt, vfid);
>  		break;
>  	case GUC_PF_NOTIFY_VF_FIXUP_DONE:
>  		break;
> @@ -284,3 +1295,165 @@ int xe_gt_sriov_pf_control_process_guc2pf(struct xe_gt *gt, const u32 *msg, u32
>  
>  	return vfid ? pf_handle_vf_event(gt, vfid, eventid) : pf_handle_pf_event(gt, eventid);
>  }
> +
> +static bool pf_process_vf_machine(struct xe_gt *gt, unsigned int vfid)

NIT: rename to pf_process_vf_state_machine ?
> +{
> +	if (pf_exit_vf_flr_send_start(gt, vfid))
> +		return true;
> +
> +	if (pf_exit_vf_flr_send_start(gt, vfid))
> +		return true;

Mentioned in a previous email, but as a reminder:
function called twice

> +	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WAIT_GUC)) {
> +		xe_gt_sriov_dbg_verbose(gt, "VF%u in %s\n", vfid,
> +					control_bit_to_string(XE_GT_SRIOV_STATE_FLR_WAIT_GUC));
> +		return false;
> +	}
> +
> +	if (pf_exit_vf_flr_guc_done(gt, vfid))
> +		return true;
> +
> +	if (pf_exit_vf_flr_reset_config(gt, vfid))
> +		return true;
> +
> +	if (pf_exit_vf_flr_reset_data(gt, vfid))
> +		return true;
> +
> +	if (pf_exit_vf_flr_reset_mmio(gt, vfid))
> +		return true;
> +
> +	if (pf_exit_vf_flr_reset_mmio(gt, vfid))
> +		return true;

function called twice
> +
> +	if (pf_exit_vf_flr_send_finish(gt, vfid))
> +		return true;
> +
> +	if (pf_exit_vf_stop_send_stop(gt, vfid))
> +		return true;
> +
> +	if (pf_exit_vf_pause_send_pause(gt, vfid))
> +		return true;
> +
> +	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC)) {
> +		xe_gt_sriov_dbg_verbose(gt, "VF%u in %s\n", vfid,
> +					control_bit_to_string(XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC));
> +		return true;
> +	}
> +
> +	if (pf_exit_vf_pause_guc_done(gt, vfid))
> +		return true;
> +
> +	if (pf_exit_vf_resume_send_resume(gt, vfid))
> +		return true;
> +
> +	return false;
> +}
> +
> +static unsigned int pf_control_state_index(struct xe_gt *gt,
> +					   struct xe_gt_sriov_control_state *cs)
> +{
> +	return container_of(cs, struct xe_gt_sriov_metadata, control) - gt->sriov.pf.vfs;
> +}
> +
> +static void pf_worker_find_work(struct xe_gt *gt)
> +{
> +	struct xe_gt_sriov_pf_control *pfc = &gt->sriov.pf.control;
> +	struct xe_gt_sriov_control_state *cs;
> +	unsigned int vfid;
> +	bool empty;
> +	bool more;
> +
> +	spin_lock(&pfc->lock);
> +	cs = list_first_entry_or_null(&pfc->list, struct xe_gt_sriov_control_state, link);
> +	if (cs)
> +		list_del_init(&cs->link);
> +	empty = list_empty(&pfc->list);
> +	spin_unlock(&pfc->lock);
> +
> +	if (!cs)
> +		return;
> +
> +	/* VF metadata structures are indexed by the VFID */
> +	vfid = pf_control_state_index(gt, cs);
> +	xe_gt_assert(gt, vfid <= xe_gt_sriov_pf_get_totalvfs(gt));
> +
> +	more = pf_process_vf_machine(gt, vfid);
> +	if (more)
> +		pf_queue_vf(gt, vfid);
> +	else if (!empty)
> +		pf_queue_control_worker(gt);
> +}
> +
> +static void control_worker_func(struct work_struct *w)
> +{
> +	struct xe_gt *gt = container_of(w, struct xe_gt, sriov.pf.control.worker);
> +
> +	xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
> +	pf_worker_find_work(gt);
> +}
> +
> +static void pf_stop_worker(struct xe_gt *gt)
> +{
> +	xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
> +	cancel_work_sync(&gt->sriov.pf.control.worker);
> +}
> +
> +static void control_fini_action(struct drm_device *dev, void *data)
> +{
> +	struct xe_gt *gt = data;
> +
> +	pf_stop_worker(gt);
> +}
> +
> +/**
> + * xe_gt_sriov_pf_control_init() - Initialize PF's control data.
> + * @gt: the &xe_gt
> + *
> + * This function is for PF only.
> + *
> + * Return: 0 on success or a negative error code on failure.
> + */
> +int xe_gt_sriov_pf_control_init(struct xe_gt *gt)
> +{
> +	struct xe_device *xe = gt_to_xe(gt);
> +	unsigned int n, totalvfs;
> +
> +	xe_gt_assert(gt, IS_SRIOV_PF(xe));
> +
> +	totalvfs = xe_sriov_pf_get_totalvfs(xe);
> +	for (n = 0; n <= totalvfs; n++) {
> +		struct xe_gt_sriov_control_state *cs = pf_pick_vf_control(gt, n);
> +
> +		init_completion(&cs->done);
> +		INIT_LIST_HEAD(&cs->link);
> +	}
> +
> +	spin_lock_init(&gt->sriov.pf.control.lock);
> +	INIT_LIST_HEAD(&gt->sriov.pf.control.list);
> +	INIT_WORK(&gt->sriov.pf.control.worker, control_worker_func);
> +
> +	return drmm_add_action_or_reset(&xe->drm, control_fini_action, gt);
> +}
> +
> +/**
> + * xe_gt_sriov_pf_control_restart() - Restart SR-IOV control data after a GT reset.
> + * @gt: the &xe_gt
> + *
> + * Any per-VF status maintained by the PF or any ongoing VF control activity
> + * performed by the PF must be reset or cancelled when the GT is reset.
> + *
> + * This function is for PF only.
> + */
> +void xe_gt_sriov_pf_control_restart(struct xe_gt *gt)
> +{
> +	struct xe_device *xe = gt_to_xe(gt);
> +	unsigned int n, totalvfs;
> +
> +	xe_gt_assert(gt, IS_SRIOV_PF(xe));
> +
> +	pf_stop_worker(gt);
> +
> +	totalvfs = xe_sriov_pf_get_totalvfs(xe);
> +	for (n = 1; n <= totalvfs; n++)
> +		pf_enter_vf_ready(gt, n);
> +}
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h
> index 405d1586f991..c85e64f099cc 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h
> @@ -11,6 +11,9 @@
>  
>  struct xe_gt;
>  
> +int xe_gt_sriov_pf_control_init(struct xe_gt *gt);
> +void xe_gt_sriov_pf_control_restart(struct xe_gt *gt);
> +
>  int xe_gt_sriov_pf_control_pause_vf(struct xe_gt *gt, unsigned int vfid);
>  int xe_gt_sriov_pf_control_resume_vf(struct xe_gt *gt, unsigned int vfid);
>  int xe_gt_sriov_pf_control_stop_vf(struct xe_gt *gt, unsigned int vfid);
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h
> new file mode 100644
> index 000000000000..11830aafea45
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h
> @@ -0,0 +1,107 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2024 Intel Corporation
> + */
> +
> +#ifndef _XE_GT_SRIOV_PF_CONTROL_TYPES_H_
> +#define _XE_GT_SRIOV_PF_CONTROL_TYPES_H_
> +
> +#include <linux/completion.h>
> +#include <linux/spinlock.h>
> +#include <linux/workqueue_types.h>
> +
> +/**
> + * enum xe_gt_sriov_control_bits - Various bits used by the PF to represent a VF state
> + *
> + * @XE_GT_SRIOV_STATE_WIP: indicates that some operations are in progress.
> + * @XE_GT_SRIOV_STATE_FLR_WIP: indicates that a VF FLR is in progress.
> + * @XE_GT_SRIOV_STATE_FLR_SEND_START: indicates that the PF wants to send a FLR START command.
> + * @XE_GT_SRIOV_STATE_FLR_WAIT_GUC: indicates that the PF awaits for a response from the GuC.
> + * @XE_GT_SRIOV_STATE_FLR_GUC_DONE: indicates that the PF has received a response from the GuC.
> + * @XE_GT_SRIOV_STATE_FLR_RESET_CONFIG: indicates that the PF needs to clear VF's resources.
> + * @XE_GT_SRIOV_STATE_FLR_RESET_DATA: indicates that the PF needs to clear VF's data.
> + * @XE_GT_SRIOV_STATE_FLR_RESET_MMIO: indicates that the PF needs to reset VF's registers.
> + * @XE_GT_SRIOV_STATE_FLR_SEND_FINISH: indicates that the PF wants to send a FLR FINISH message.
> + * @XE_GT_SRIOV_STATE_FLR_FAILED: indicates that VF FLR sequence failed.
> + * @XE_GT_SRIOV_STATE_PAUSE_WIP: indicates that a VF pause operation is in progress.
> + * @XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE: indicates that the PF is about to send a PAUSE command.
> + * @XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC: indicates that the PF awaits for a response from the GuC.
> + * @XE_GT_SRIOV_STATE_PAUSE_GUC_DONE: indicates that the PF has received a response from the GuC.
> + * @XE_GT_SRIOV_STATE_PAUSE_FAILED: indicates that a VF pause operation has failed.
> + * @XE_GT_SRIOV_STATE_PAUSED: indicates that the VF is paused.
> + * @XE_GT_SRIOV_STATE_RESUME_WIP: indicates the a VF resume operation is in progress.
> + * @XE_GT_SRIOV_STATE_RESUME_SEND_RESUME: indicates that the PF is about to send RESUME command.
> + * @XE_GT_SRIOV_STATE_RESUME_FAILED: indicates that a VF resume operation has failed.
> + * @XE_GT_SRIOV_STATE_RESUMED: indicates that the VF was resumed.
> + * @XE_GT_SRIOV_STATE_STOP_WIP: indicates that a VF stop operation is in progress.
> + * @XE_GT_SRIOV_STATE_STOP_SEND_STOP: indicates that the PF wants to send a STOP command.
> + * @XE_GT_SRIOV_STATE_STOP_FAILED: indicates that the VF stop operation has failed
> + * @XE_GT_SRIOV_STATE_STOPPED: indicates that the VF was stopped.
> + * @XE_GT_SRIOV_STATE_MISMATCH: indicates that the PF has detected a VF state mismatch.
> + */
> +enum xe_gt_sriov_control_bits {
> +	XE_GT_SRIOV_STATE_WIP = 1,
> +
> +	XE_GT_SRIOV_STATE_FLR_WIP,
> +	XE_GT_SRIOV_STATE_FLR_SEND_START,
> +	XE_GT_SRIOV_STATE_FLR_WAIT_GUC,
> +	XE_GT_SRIOV_STATE_FLR_GUC_DONE,
> +	XE_GT_SRIOV_STATE_FLR_RESET_CONFIG,
> +	XE_GT_SRIOV_STATE_FLR_RESET_DATA,
> +	XE_GT_SRIOV_STATE_FLR_RESET_MMIO,
> +	XE_GT_SRIOV_STATE_FLR_SEND_FINISH,
> +	XE_GT_SRIOV_STATE_FLR_FAILED,
> +
> +	XE_GT_SRIOV_STATE_PAUSE_WIP,
> +	XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE,
> +	XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC,
> +	XE_GT_SRIOV_STATE_PAUSE_GUC_DONE,
> +	XE_GT_SRIOV_STATE_PAUSE_FAILED,
> +	XE_GT_SRIOV_STATE_PAUSED,
> +
> +	XE_GT_SRIOV_STATE_RESUME_WIP,
> +	XE_GT_SRIOV_STATE_RESUME_SEND_RESUME,
> +	XE_GT_SRIOV_STATE_RESUME_FAILED,
> +	XE_GT_SRIOV_STATE_RESUMED,
> +
> +	XE_GT_SRIOV_STATE_STOP_WIP,
> +	XE_GT_SRIOV_STATE_STOP_SEND_STOP,
> +	XE_GT_SRIOV_STATE_STOP_FAILED,
> +	XE_GT_SRIOV_STATE_STOPPED,
> +
> +	XE_GT_SRIOV_STATE_MISMATCH = BITS_PER_LONG - 1,
> +};
> +
> +/**
> + * struct xe_gt_sriov_control_state - GT-level per-VF control state.
> + *
> + * Used by the PF driver to maintain per-VF control data.
> + */
> +struct xe_gt_sriov_control_state {
> +	/** @state: VF state bits */
> +	unsigned long state;
> +
> +	/** @done: completion of async operations */
> +	struct completion done;
> +
> +	/** @link: link into worker list */
> +	struct list_head link;
> +};
> +
> +/**
> + * struct xe_gt_sriov_pf_control - GT-level control data.
> + *
> + * Used by the PF driver to maintain its data.
> + */
> +struct xe_gt_sriov_pf_control {
> +	/** @worker: worker that executes a VF operations */
> +	struct work_struct worker;
> +
> +	/** @list: list of VF entries that have a pending work */
> +	struct list_head list;
> +
> +	/** @lock: protects VF pending list */
> +	spinlock_t lock;
> +};
> +
> +#endif
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h
> index 40cbaea3ef44..28e1b130bf87 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h
> @@ -9,6 +9,7 @@
>  #include <linux/types.h>
>  
>  #include "xe_gt_sriov_pf_config_types.h"
> +#include "xe_gt_sriov_pf_control_types.h"
>  #include "xe_gt_sriov_pf_monitor_types.h"
>  #include "xe_gt_sriov_pf_policy_types.h"
>  #include "xe_gt_sriov_pf_service_types.h"
> @@ -23,6 +24,9 @@ struct xe_gt_sriov_metadata {
>  	/** @monitor: per-VF monitoring data. */
>  	struct xe_gt_sriov_monitor monitor;
>  
> +	/** @control: per-VF control data. */
> +	struct xe_gt_sriov_control_state control;
> +
>  	/** @version: negotiated VF/PF ABI version */
>  	struct xe_gt_sriov_pf_service_version version;
>  };
> @@ -30,12 +34,14 @@ struct xe_gt_sriov_metadata {
>  /**
>   * struct xe_gt_sriov_pf - GT level PF virtualization data.
>   * @service: service data.
> + * @control: control data.
>   * @policy: policy data.
>   * @spare: PF-only provisioning configuration.
>   * @vfs: metadata for all VFs.
>   */
>  struct xe_gt_sriov_pf {
>  	struct xe_gt_sriov_pf_service service;
> +	struct xe_gt_sriov_pf_control control;
>  	struct xe_gt_sriov_pf_policy policy;
>  	struct xe_gt_sriov_spare_config spare;
>  	struct xe_gt_sriov_metadata *vfs;

Functionally, it's a good idea to introduce a state machine here.
I believe that if this code is well tested, this code will be reliable and
will handle all assumed states, including errors.

However, I have a few general comments in addition to those I left above
in the code.
While the drawings indicate a certain hierarchy of states (we have main and intermediate states),
in the code this structure is flat.
The code itself is difficult to understand (thanks to drawings it is a bit easier) but
it takes some time to analyze and understand it sensibly. I am afraid that the code will
be difficult to debug and an inexperienced person will have a problem with extending
the functionality of the code.

Thanks,
Piotr


> -- 
> 2.43.0
> 

-- 

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

* Re: [PATCH 01/12] drm/xe/pf: Add function to sanitize VF resources
  2024-08-19 20:47   ` Lucas De Marchi
@ 2024-08-20  9:38     ` Michal Wajdeczko
  2024-08-20 13:16       ` Lucas De Marchi
  0 siblings, 1 reply; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-20  9:38 UTC (permalink / raw)
  To: Lucas De Marchi; +Cc: intel-xe



On 19.08.2024 22:47, Lucas De Marchi wrote:
> On Fri, Aug 09, 2024 at 06:51:48PM GMT, Michal Wajdeczko wrote:
>> +static int pf_sanitize_lmem(struct xe_tile *tile, struct xe_bo *bo,
>> long timeout)
> 
> it took a while to make xe use "vram"... now we are back with lmem in
> several places :(
> 

it's because GuC ABI is using LMEM terminology

if you really want then I can try to rename implementation side to use
'vram' instead, but question is what to do with debugfs entries that
reflects GuC ABI almost 1:1, should it also be named with vram ?

gt0/pf/lmem_spare	-> gt0/pf/vram_spare
gt0/vf1/lmem_quota	-> gt0/vf1/vram_quota

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

* Re: [PATCH 04/12] drm/xe/pf: Improve VF control
  2024-08-20  7:56   ` Piotr Piórkowski
@ 2024-08-20 10:04     ` Michal Wajdeczko
  0 siblings, 0 replies; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-20 10:04 UTC (permalink / raw)
  To: Piotr Piórkowski; +Cc: intel-xe



On 20.08.2024 09:56, Piotr Piórkowski wrote:
> Michal Wajdeczko <michal.wajdeczko@intel.com> wrote on pią [2024-sie-09 18:51:51 +0200]:
>> Our initial VF control implementation was focused on providing
>> a very minimal support for the VF_STATE_NOTIFY events just to
>> meet GuC requirements, without tracking a VF state or doing any
>> expected actions (like cleanup in case of the FLR notification).
>>
>> Try to improve this by defining set of VF state machines, each
>> responsible for processing one activity (PAUSE, RESUME, STOP or
>> FLR). All required steps defined by the VF state machine are then
>> executed by the PF worker from the dedicated workqueue.
>>
>> Any external requests or notifications simply try to transition
>> between the states to trigger a work and then wait for that work
>> to finish. Some predefined default timeouts are used to avoid
>> changing existing API calls, but it should be easy to extend the
>> control API to also accept specific timeout values.
>>
>> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
>> Cc: Piotr Piórkowski <piotr.piorkowski@intel.com>
>> ---
>>  drivers/gpu/drm/xe/xe_gt_sriov_pf.c           |    6 +
>>  drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c   | 1203 ++++++++++++++++-
>>  drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h   |    3 +
>>  .../gpu/drm/xe/xe_gt_sriov_pf_control_types.h |  107 ++
>>  drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h     |    6 +
>>  5 files changed, 1310 insertions(+), 15 deletions(-)
>>  create mode 100644 drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h
>>
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf.c
>> index ef239440963c..905f409db74b 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf.c
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf.c
>> @@ -9,6 +9,7 @@
>>  
>>  #include "xe_gt_sriov_pf.h"
>>  #include "xe_gt_sriov_pf_config.h"
>> +#include "xe_gt_sriov_pf_control.h"
>>  #include "xe_gt_sriov_pf_helpers.h"
>>  #include "xe_gt_sriov_pf_service.h"
>>  #include "xe_mmio.h"
>> @@ -57,6 +58,10 @@ int xe_gt_sriov_pf_init_early(struct xe_gt *gt)
>>  	if (err)
>>  		return err;
>>  
>> +	err = xe_gt_sriov_pf_control_init(gt);
>> +	if (err)
>> +		return err;
>> +
>>  	return 0;
>>  }
>>  
>> @@ -93,4 +98,5 @@ void xe_gt_sriov_pf_init_hw(struct xe_gt *gt)
>>  void xe_gt_sriov_pf_restart(struct xe_gt *gt)
>>  {
>>  	xe_gt_sriov_pf_config_restart(gt);
>> +	xe_gt_sriov_pf_control_restart(gt);
>>  }
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
>> index ad447d867e51..1ed7d49bef8c 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
>> @@ -3,12 +3,17 @@
>>   * Copyright © 2023-2024 Intel Corporation
>>   */
>>  
>> +#include <drm/drm_managed.h>
>> +
>>  #include "abi/guc_actions_sriov_abi.h"
>>  
>>  #include "xe_device.h"
>>  #include "xe_gt.h"
>> +#include "xe_gt_sriov_pf_config.h"
>>  #include "xe_gt_sriov_pf_control.h"
>>  #include "xe_gt_sriov_pf_helpers.h"
>> +#include "xe_gt_sriov_pf_monitor.h"
>> +#include "xe_gt_sriov_pf_service.h"
>>  #include "xe_gt_sriov_printk.h"
>>  #include "xe_guc_ct.h"
>>  #include "xe_sriov.h"
>> @@ -42,10 +47,6 @@ static int guc_action_vf_control_cmd(struct xe_guc *guc, u32 vfid, u32 cmd)
>>  	};
>>  	int ret;
>>  
>> -	/* XXX those two commands are now sent from the G2H handler */
>> -	if (cmd == GUC_PF_TRIGGER_VF_FLR_START || cmd == GUC_PF_TRIGGER_VF_FLR_FINISH)
>> -		return xe_guc_ct_send_g2h_handler(&guc->ct, request, ARRAY_SIZE(request));
>> -
>>  	ret = xe_guc_ct_send_block(&guc->ct, request, ARRAY_SIZE(request));
>>  	return ret > 0 ? -EPROTO : ret;
>>  }
>> @@ -55,6 +56,8 @@ static int pf_send_vf_control_cmd(struct xe_gt *gt, unsigned int vfid, u32 cmd)
>>  	int err;
>>  
>>  	xe_gt_assert(gt, vfid != PFID);
>> +	xe_gt_sriov_dbg_verbose(gt, "sending VF%u control command %s\n",
>> +				vfid, control_cmd_to_string(cmd));
>>  
>>  	err = guc_action_vf_control_cmd(&gt->uc.guc, vfid, cmd);
>>  	if (unlikely(err))
>> @@ -88,6 +91,457 @@ static int pf_send_vf_flr_finish(struct xe_gt *gt, unsigned int vfid)
>>  	return pf_send_vf_control_cmd(gt, vfid, GUC_PF_TRIGGER_VF_FLR_FINISH);
>>  }
>>  
>> +/**
>> + * DOC: The VF state machine
>> + *
>> + * The simplified VF state machine could be presented as::
>> + *
>> + *	               pause--------------------------o
>> + *	              /                               |
>> + *	             /                                v
>> + *	      (READY)<------------------resume-----(PAUSED)
>> + *	         ^   \                             /    /
>> + *	         |    \                           /    /
>> + *	         |     stop---->(STOPPED)<----stop    /
>> + *	         |                  /                /
>> + *	         |                 /                /
>> + *	         o--------<-----flr                /
>> + *	          \                               /
>> + *	           o------<--------------------flr
>> + *
>> + * Where:
>> + *
>> + * * READY - represents a state in which VF is fully operable
>> + * * PAUSED - represents a state in which VF activity is temporarily suspended
>> + * * STOPPED - represents a state in which VF activity is definitely halted
>> + * * pause - represents a request to temporarily suspend VF activity
>> + * * resume - represents a request to resume VF activity
>> + * * stop - represents a request to definitely halt VF activity
>> + * * flr - represents a request to perform VF FLR to restore VF activity
>> + *
>> + * However, each state transition requires additional steps that involves
>> + * communication with GuC that might fail or be interrupted by other requests::
>> + *
>> + *	                   .................................WIP....
>> + *	                   :                                      :
>> + *	          pause--------------------->PAUSE_WIP----------------------------o
>> + *	         /         :                /         \           :               |
>> + *	        /          :    o----<---stop          flr--o     :               |
>> + *	       /           :    |           \         /     |     :               V
>> + *	 (READY)<---------------+------------RESUME_WIP<----+--<-----resume--(PAUSED)
>> + *	  ^ \  \           :    |                           |     :          /   /
>> + *	  |  \  \          :    |                           |     :         /   /
>> + *	  |   \  \         :    |                           |     :        /   /
>> + *	  |    \  \        :    o----<----------------------+--<-------stop   /
>> + *	  |     \  \       :    |                           |     :          /
>> + *	  |      \  \      :    V                           |     :         /
>> + *	  |       \  stop----->STOP_WIP---------flr--->-----o     :        /
>> + *	  |        \       :    |                           |     :       /
>> + *	  |         \      :    |                           V     :      /
>> + *	  |          flr--------+----->----------------->FLR_WIP<-----flr
>> + *	  |                :    |                        /  ^     :
>> + *	  |                :    |                       /   |     :
>> + *	  o--------<-------:----+-----<----------------o    |     :
>> + *	                   :    |                           |     :
>> + *	                   :....|...........................|.....:
>> + *	                        |                           |
>> + *	                        V                           |
>> + *	                     (STOPPED)--------------------flr
>> + *
>> + * For details about each internal WIP state machine see:
>> + *
>> + * * `The VF PAUSE state machine`_
>> + * * `The VF RESUME state machine`_
>> + * * `The VF STOP state machine`_
>> + * * `The VF FLR state machine`_
> 
> 
> Later in the code there is one state that is not obvious when you look at the first
> two drawings of the state machine - it is the resumed state. It appears in subsequent
> drawings but in my opinion it is not obvious. I have already talked to Michal about it
> and he explained to me why he introduced it in the code, but it seems to me that it
> should be included at least in this drawing.

sure, will try to put it to above diagram as (READY/RESUMED)

> 
>> + */
>> +
>> +#ifdef CONFIG_DRM_XE_DEBUG_SRIOV
>> +static const char *control_bit_to_string(enum xe_gt_sriov_control_bits bit)
>> +{
>> +	switch (bit) {
>> +#define CASE2STR(_X) \
>> +	case XE_GT_SRIOV_STATE_##_X: return #_X
>> +	CASE2STR(WIP);
>> +	CASE2STR(FLR_WIP);
>> +	CASE2STR(FLR_SEND_START);
>> +	CASE2STR(FLR_WAIT_GUC);
>> +	CASE2STR(FLR_GUC_DONE);
>> +	CASE2STR(FLR_RESET_CONFIG);
>> +	CASE2STR(FLR_RESET_DATA);
>> +	CASE2STR(FLR_RESET_MMIO);
>> +	CASE2STR(FLR_SEND_FINISH);
>> +	CASE2STR(FLR_FAILED);
>> +	CASE2STR(PAUSE_WIP);
>> +	CASE2STR(PAUSE_SEND_PAUSE);
>> +	CASE2STR(PAUSE_WAIT_GUC);
>> +	CASE2STR(PAUSE_GUC_DONE);
>> +	CASE2STR(PAUSE_FAILED);
>> +	CASE2STR(PAUSED);
>> +	CASE2STR(RESUME_WIP);
>> +	CASE2STR(RESUME_SEND_RESUME);
>> +	CASE2STR(RESUME_FAILED);
>> +	CASE2STR(RESUMED);
>> +	CASE2STR(STOP_WIP);
>> +	CASE2STR(STOP_SEND_STOP);
>> +	CASE2STR(STOP_FAILED);
>> +	CASE2STR(STOPPED);
>> +	CASE2STR(MISMATCH);
>> +#undef  CASE2STR
>> +	default: return "?";
>> +	}
>> +}
>> +#endif
>> +
>> +static unsigned long pf_get_default_timeout(enum xe_gt_sriov_control_bits bit)
>> +{
>> +	switch (bit) {
>> +	case XE_GT_SRIOV_STATE_FLR_WAIT_GUC:
>> +	case XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC:
>> +		return HZ / 2;
>> +	case XE_GT_SRIOV_STATE_FLR_WIP:
>> +	case XE_GT_SRIOV_STATE_FLR_RESET_CONFIG:
>> +		return 5 * HZ;
>> +	default:
>> +		return HZ;
>> +	}
>> +}
>> +
>> +static unsigned long *pf_peek_vf_state(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
>> +	xe_gt_assert(gt, vfid <= xe_gt_sriov_pf_get_totalvfs(gt));
>> +
>> +	return &gt->sriov.pf.vfs[vfid].control.state;
>> +}
> 
> NIT: Later in the code you define such a function as pf_peek_vf_control.
> Maybe you define it earlier and use it in pf_peek_vf_state ? The code will reduce by two asserts

you likely mean pf_pick_vf_control()
yeah, will give it a try

>> +
>> +static bool pf_check_vf_state(struct xe_gt *gt, unsigned int vfid,
>> +			      enum xe_gt_sriov_control_bits bit)
>> +{
>> +	return test_bit(bit, pf_peek_vf_state(gt, vfid));
>> +}
>> +
>> +static void pf_dump_vf_state(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	unsigned long state = *pf_peek_vf_state(gt, vfid);
>> +	enum xe_gt_sriov_control_bits bit;
>> +
>> +	if (state) {
>> +		xe_gt_sriov_dbg_verbose(gt, "VF%u state %#lx%s%*pbl\n",
>> +					vfid, state, state ? " bits " : "",
>> +					(int)BITS_PER_LONG, &state);
>> +		for_each_set_bit(bit, &state, BITS_PER_LONG)
>> +			xe_gt_sriov_dbg_verbose(gt, "VF%u state %s(%d)\n",
>> +						vfid, control_bit_to_string(bit), bit);
>> +	} else {
>> +		xe_gt_sriov_dbg_verbose(gt, "VF%u state READY\n", vfid);
>> +	}
>> +}
>> +
>> +static bool pf_expect_vf_state(struct xe_gt *gt, unsigned int vfid,
>> +			       enum xe_gt_sriov_control_bits bit)
>> +{
>> +	bool result = pf_check_vf_state(gt, vfid, bit);
>> +
>> +	if (unlikely(!result))
>> +		pf_dump_vf_state(gt, vfid);
>> +
>> +	return result;
>> +}
>> +
>> +static bool pf_expect_vf_not_state(struct xe_gt *gt, unsigned int vfid,
>> +				   enum xe_gt_sriov_control_bits bit)
>> +{
>> +	bool result = !pf_check_vf_state(gt, vfid, bit);
>> +
>> +	if (unlikely(!result))
>> +		pf_dump_vf_state(gt, vfid);
>> +
>> +	return result;
>> +}
>> +
>> +static bool pf_enter_vf_state(struct xe_gt *gt, unsigned int vfid,
>> +			      enum xe_gt_sriov_control_bits bit)
>> +{
>> +	if (!test_and_set_bit(bit, pf_peek_vf_state(gt, vfid))) {
>> +		xe_gt_sriov_dbg_verbose(gt, "VF%u state %s(%d) enter\n",
>> +					vfid, control_bit_to_string(bit), bit);
>> +		return true;
>> +	}
>> +	return false;
>> +}
>> +
>> +static bool pf_exit_vf_state(struct xe_gt *gt, unsigned int vfid,
>> +			     enum xe_gt_sriov_control_bits bit)
>> +{
>> +	if (test_and_clear_bit(bit, pf_peek_vf_state(gt, vfid))) {
>> +		xe_gt_sriov_dbg_verbose(gt, "VF%u state %s(%d) exit\n",
>> +					vfid, control_bit_to_string(bit), bit);
>> +		return true;
>> +	}
>> +	return false;
>> +}
>> +
>> +static void pf_escape_vf_state(struct xe_gt *gt, unsigned int vfid,
>> +			       enum xe_gt_sriov_control_bits bit)
>> +{
>> +	if (pf_exit_vf_state(gt, vfid, bit))
>> +		xe_gt_sriov_dbg_verbose(gt, "VF%u state %s(%d) escaped by %ps\n",
>> +					vfid, control_bit_to_string(bit), bit,
>> +					__builtin_return_address(0));
>> +}
>> +
>> +static void pf_enter_vf_mismatch(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_MISMATCH)) {
>> +		xe_gt_sriov_dbg(gt, "VF%u state mismatch detected by %ps\n",
>> +				vfid, __builtin_return_address(0));
>> +		pf_dump_vf_state(gt, vfid);
>> +	}
>> +}
>> +
>> +static void pf_exit_vf_mismatch(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_MISMATCH))
>> +		xe_gt_sriov_dbg(gt, "VF%u state mismatch cleared by %ps\n",
>> +				vfid, __builtin_return_address(0));
>> +
>> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_FAILED);
>> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_FAILED);
>> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_FAILED);
>> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_FAILED);
>> +}
>> +
>> +#define pf_enter_vf_state_machine_bug(gt, vfid) ({	\
>> +	pf_enter_vf_mismatch((gt), (vfid));		\
>> +})
>> +
>> +static struct xe_gt_sriov_control_state *pf_pick_vf_control(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
>> +	xe_gt_assert(gt, vfid <= xe_gt_sriov_pf_get_totalvfs(gt));
>> +
>> +	return &gt->sriov.pf.vfs[vfid].control;
>> +}
>> +
>> +static void pf_queue_control_worker(struct xe_gt *gt)
>> +{
>> +	struct xe_device *xe = gt_to_xe(gt);
>> +
>> +	xe_gt_assert(gt, IS_SRIOV_PF(xe));
>> +
>> +	queue_work(xe->sriov.wq, &gt->sriov.pf.control.worker);
>> +}
>> +
>> +static void pf_queue_vf(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	struct xe_gt_sriov_pf_control *pfc = &gt->sriov.pf.control;
>> +
>> +	xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
>> +
>> +	spin_lock(&pfc->lock);
>> +	list_move_tail(&gt->sriov.pf.vfs[vfid].control.link, &pfc->list);
>> +	spin_unlock(&pfc->lock);
>> +
>> +	pf_queue_control_worker(gt);
>> +}
>> +
>> +static void pf_exit_vf_flr_wip(struct xe_gt *gt, unsigned int vfid);
>> +static void pf_exit_vf_stop_wip(struct xe_gt *gt, unsigned int vfid);
>> +static void pf_exit_vf_pause_wip(struct xe_gt *gt, unsigned int vfid);
>> +static void pf_exit_vf_resume_wip(struct xe_gt *gt, unsigned int vfid);
>> +
>> +static bool pf_enter_vf_wip(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_WIP)) {
>> +		struct xe_gt_sriov_control_state *cs = pf_pick_vf_control(gt, vfid);
>> +
>> +		reinit_completion(&cs->done);
>> +		return true;
>> +	}
>> +	return false;
>> +}
>> +
>> +static void pf_exit_vf_wip(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_WIP)) {
>> +		struct xe_gt_sriov_control_state *cs = pf_pick_vf_control(gt, vfid);
>> +
>> +		pf_exit_vf_flr_wip(gt, vfid);
>> +		pf_exit_vf_stop_wip(gt, vfid);
>> +		pf_exit_vf_pause_wip(gt, vfid);
>> +		pf_exit_vf_resume_wip(gt, vfid);
>> +
>> +		complete_all(&cs->done);
>> +	}
>> +}
>> +
>> +static int pf_wait_vf_wip_done(struct xe_gt *gt, unsigned int vfid, unsigned long timeout)
>> +{
>> +	struct xe_gt_sriov_control_state *cs = pf_pick_vf_control(gt, vfid);
>> +
>> +	return wait_for_completion_timeout(&cs->done, timeout) ? 0 : -ETIMEDOUT;
>> +}
>> +
>> +static void pf_enter_vf_ready(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED);
>> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED);
>> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED);
>> +	pf_exit_vf_mismatch(gt, vfid);
>> +	pf_exit_vf_wip(gt, vfid);
>> +}
>> +
>> +/**
>> + * DOC: The VF PAUSE state machine
>> + *
>> + * The VF PAUSE state machine looks like::
>> + *
>> + *	 (READY,RESUMED)<-------------<---------------------o---------o
>> + *	    |                                                \         \
>> + *	   pause                                              \         \
>> + *	    |                                                  \         \
>> + *	....V...........................PAUSE_WIP........       \         \
>> + *	:    \                                          :        o         \
>> + *	:     \   o------<-----busy                     :        |          \
>> + *	:      \ /              /                       :        |           |
>> + *	:       PAUSE_SEND_PAUSE ---failed--->----------o--->(PAUSE_FAILED)  |
>> + *	:        |              \                       :        |           |
>> + *	:      acked             rejected---->----------o--->(MISMATCH)     /
>> + *	:        |                                      :                  /
>> + *	:        v                                      :                 /
>> + *	:       PAUSE_WAIT_GUC                          :                /
>> + *	:        |                                      :               /
>> + *	:       done                                    :              /
>> + *	:        |                                      :             /
>> + *	:        v                                      :            /
>> + *	:       PAUSE_GUC_DONE                          o-----restart
>> + *	:      /                                        :
>> + *	:     /                                         :
>> + *	:....o..............o...............o...........:
>> + *	     |              |               |
>> + *	  completed        flr             stop
>> + *	     |              |               |
>> + *	     V         .....V.....    ......V.....
>> + *	 (PAUSED)      : FLR_WIP :    : STOP_WIP :
>> + *	               :.........:    :..........:
>> + *
>> + * For the full state machine view, see `The VF state machine`_.
>> + */
>> +
>> +static void pf_exit_vf_pause_wip(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WIP)) {
>> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE);
>> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC);
>> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_GUC_DONE);
>> +	}
>> +}
>> +
>> +static void pf_enter_vf_paused(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED))
>> +		pf_enter_vf_state_machine_bug(gt, vfid);
>> +
>> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED);
>> +	pf_exit_vf_mismatch(gt, vfid);
>> +	pf_exit_vf_wip(gt, vfid);
>> +}
>> +
>> +static void pf_enter_vf_pause_completed(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	pf_enter_vf_paused(gt, vfid);
>> +}
>> +
>> +static void pf_enter_vf_pause_failed(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_FAILED);
>> +	pf_exit_vf_wip(gt, vfid);
>> +}
>> +
>> +static void pf_enter_vf_pause_rejected(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	pf_enter_vf_mismatch(gt, vfid);
>> +	pf_enter_vf_pause_failed(gt, vfid);
>> +}
>> +
>> +static bool pf_exit_vf_pause_guc_done(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_GUC_DONE))
>> +		return false;
>> +
>> +	pf_enter_vf_pause_completed(gt, vfid);
>> +	return true;
>> +}
>> +
>> +static void pf_enter_vf_pause_guc_done(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_GUC_DONE))
>> +		pf_queue_vf(gt, vfid);
>> +}
>> +
>> +static void pf_enter_pause_wait_guc(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC))
>> +		pf_enter_vf_state_machine_bug(gt, vfid);
>> +}
>> +
>> +static bool pf_exit_pause_wait_guc(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	return pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC);
>> +}
>> +
>> +static void pf_enter_vf_pause_send_pause(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE))
>> +		pf_enter_vf_state_machine_bug(gt, vfid);
>> +
>> +	pf_queue_vf(gt, vfid);
>> +}
>> +
>> +static bool pf_exit_vf_pause_send_pause(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	int err;
>> +
>> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE))
>> +		return false;
>> +
>> +	/* GuC may actually send a PAUSE_DONE before we get a RESPONSE */
>> +	pf_enter_pause_wait_guc(gt, vfid);
>> +
>> +	err = pf_send_vf_pause(gt, vfid);
>> +	if (err) {
>> +		/* send failed, so we shouldn't expect PAUSE_DONE from GuC */
>> +		pf_exit_pause_wait_guc(gt, vfid);
>> +
>> +		if (err == -EBUSY)
>> +			pf_enter_vf_pause_send_pause(gt, vfid);
>> +		else if (err == -EIO)
>> +			pf_enter_vf_pause_rejected(gt, vfid);
>> +		else
>> +			pf_enter_vf_pause_failed(gt, vfid);
>> +	} else {
>> +		/*
>> +		 * we have already moved to WAIT_GUC, maybe even to GUC_DONE
>> +		 * but since GuC didn't complain, we may clear MISMATCH
>> +		 */
>> +		pf_exit_vf_mismatch(gt, vfid);
>> +	}
>> +
>> +	return true;
>> +}
>> +
>> +static bool pf_enter_vf_pause_wip(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WIP)) {
>> +		pf_enter_vf_wip(gt, vfid);
>> +		pf_enter_vf_pause_send_pause(gt, vfid);
>> +		return true;
>> +	}
>> +
>> +	return false;
>> +}
>> +
>>  /**
>>   * xe_gt_sriov_pf_control_pause_vf - Pause a VF.
>>   * @gt: the &xe_gt
>> @@ -99,7 +553,140 @@ static int pf_send_vf_flr_finish(struct xe_gt *gt, unsigned int vfid)
>>   */
>>  int xe_gt_sriov_pf_control_pause_vf(struct xe_gt *gt, unsigned int vfid)
>>  {
>> -	return pf_send_vf_pause(gt, vfid);
>> +	unsigned long timeout = pf_get_default_timeout(XE_GT_SRIOV_STATE_PAUSE_WIP);
>> +	int err;
>> +
>> +	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED)) {
>> +		xe_gt_sriov_dbg(gt, "VF%u is stopped!\n", vfid);
>> +		return -EPERM;
>> +	}
>> +
>> +	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED)) {
>> +		xe_gt_sriov_dbg(gt, "VF%u was already paused!\n", vfid);
>> +		return -ESTALE;
>> +	}
>> +
>> +	if (!pf_enter_vf_pause_wip(gt, vfid)) {
>> +		xe_gt_sriov_dbg(gt, "VF%u pause already in progress!\n", vfid);
>> +		return -EALREADY;
>> +	}
>> +
>> +	err = pf_wait_vf_wip_done(gt, vfid, timeout);
>> +	if (err) {
>> +		xe_gt_sriov_dbg(gt, "VF%u pause didn't finish in %u ms (%pe)\n",
>> +				vfid, jiffies_to_msecs(timeout), ERR_PTR(err));
>> +		return err;
>> +	}
>> +
>> +	if (pf_expect_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED)) {
>> +		xe_gt_sriov_info(gt, "VF%u paused!\n", vfid);
>> +		return 0;
>> +	}
>> +
>> +	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_FAILED)) {
>> +		xe_gt_sriov_dbg(gt, "VF%u pause failed!\n", vfid);
>> +		return -EIO;
>> +	}
>> +
>> +	xe_gt_sriov_dbg(gt, "VF%u pause was canceled!\n", vfid);
>> +	return -ECANCELED;
>> +}
>> +
>> +/**
>> + * DOC: The VF RESUME state machine
>> + *
>> + * The VF RESUME state machine looks like::
>> + *
>> + *	 (PAUSED)<-----------------<------------------------o
>> + *	    |                                                \
>> + *	   resume                                             \
>> + *	    |                                                  \
>> + *	....V............................RESUME_WIP......       \
>> + *	:    \                                          :        o
>> + *	:     \   o-------<-----busy                    :        |
>> + *	:      \ /                /                     :        |
>> + *	:       RESUME_SEND_RESUME ---failed--->--------o--->(RESUME_FAILED)
>> + *	:       /                \                      :        |
>> + *	:    acked                rejected---->---------o--->(MISMATCH)
>> + *	:     /                                         :
>> + *	:....o..............o...............o.....o.....:
>> + *	     |              |               |      \
>> + *	  completed        flr            stop      restart-->(READY)
>> + *	     |              |               |
>> + *	     V         .....V.....    ......V.....
>> + *	 (RESUMED)     : FLR_WIP :    : STOP_WIP :
>> + *	               :.........:    :..........:
>> + *
>> + * For the full state machine view, see `The VF state machine`_.
>> + */
>> +
>> +static void pf_exit_vf_resume_wip(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_WIP))
>> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_SEND_RESUME);
>> +}
>> +
>> +static void pf_enter_vf_resumed(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED);
>> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED);
>> +	pf_exit_vf_mismatch(gt, vfid);
>> +	pf_exit_vf_wip(gt, vfid);
>> +}
>> +
>> +static void pf_enter_vf_resume_completed(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	pf_enter_vf_resumed(gt, vfid);
>> +}
>> +
>> +static void pf_enter_vf_resume_failed(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_FAILED);
>> +	pf_exit_vf_wip(gt, vfid);
>> +}
>> +
>> +static void pf_enter_vf_resume_rejected(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	pf_enter_vf_mismatch(gt, vfid);
>> +	pf_enter_vf_resume_failed(gt, vfid);
>> +}
>> +
>> +static void pf_enter_vf_resume_send_resume(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_SEND_RESUME))
>> +		pf_enter_vf_state_machine_bug(gt, vfid);
>> +
>> +	pf_queue_vf(gt, vfid);
>> +}
>> +
>> +static bool pf_exit_vf_resume_send_resume(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	int err;
>> +
>> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_SEND_RESUME))
>> +		return false;
>> +
>> +	err = pf_send_vf_resume(gt, vfid);
>> +	if (err == -EBUSY)
>> +		pf_enter_vf_resume_send_resume(gt, vfid);
>> +	else if (err == -EIO)
>> +		pf_enter_vf_resume_rejected(gt, vfid);
>> +	else if (err)
>> +		pf_enter_vf_resume_failed(gt, vfid);
>> +	else
>> +		pf_enter_vf_resume_completed(gt, vfid);
>> +	return true;
>> +}
>> +
>> +static bool pf_enter_vf_resume_wip(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_WIP)) {
>> +		pf_enter_vf_wip(gt, vfid);
>> +		pf_enter_vf_resume_send_resume(gt, vfid);
>> +		return true;
>> +	}
>> +
>> +	return false;
>>  }
>>  
>>  /**
>> @@ -113,7 +700,133 @@ int xe_gt_sriov_pf_control_pause_vf(struct xe_gt *gt, unsigned int vfid)
>>   */
>>  int xe_gt_sriov_pf_control_resume_vf(struct xe_gt *gt, unsigned int vfid)
>>  {
>> -	return pf_send_vf_resume(gt, vfid);
>> +	int err;
>> +
>> +	if (!pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED)) {
>> +		xe_gt_sriov_dbg(gt, "VF%u is not paused!\n", vfid);
>> +		return -EPERM;
>> +	}
>> +
>> +	if (!pf_enter_vf_resume_wip(gt, vfid)) {
>> +		xe_gt_sriov_dbg(gt, "VF%u resume already in progress!\n", vfid);
>> +		return -EALREADY;
>> +	}
>> +
>> +	err = pf_wait_vf_wip_done(gt, vfid, 2 * HZ);
> 
> use define, or pf_get_default_timeout for this timeout

good catch, it supposed to be pf_get_default_timeout() here

> 
> 
>> +	if (err)
>> +		return err;
>> +
>> +	if (pf_expect_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED)) {
>> +		xe_gt_sriov_info(gt, "VF%u resumed!\n", vfid);
>> +		return 0;
>> +	}
>> +
>> +	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_FAILED)) {
>> +		xe_gt_sriov_dbg(gt, "VF%u resume failed!\n", vfid);
>> +		return -EIO;
>> +	}
>> +
>> +	xe_gt_sriov_dbg(gt, "VF%u resume was canceled!\n", vfid);
>> +	return -ECANCELED;
>> +}
>> +
>> +/**
>> + * DOC: The VF STOP state machine
>> + *
>> + * The VF STOP state machine looks like::
>> + *
>> + *	 (READY,PAUSED,RESUMED)<-------<--------------------o
>> + *	    |                                                \
>> + *	   stop                                               \
>> + *	    |                                                  \
>> + *	....V..............................STOP_WIP......       \
>> + *	:    \                                          :        o
>> + *	:     \   o----<----busy                        :        |
>> + *	:      \ /            /                         :        |
>> + *	:       STOP_SEND_STOP--------failed--->--------o--->(STOP_FAILED)
>> + *	:       /             \                         :        |
>> + *	:    acked             rejected-------->--------o--->(MISMATCH)
>> + *	:     /                                         :
>> + *	:....o..............o...............o...........:
>> + *	     |              |               |
>> + *	  completed        flr            restart
>> + *	     |              |               |
>> + *	     V         .....V.....          V
>> + *	 (STOPPED)     : FLR_WIP :       (READY)
>> + *	               :.........:
>> + *
>> + * For the full state machine view, see `The VF state machine`_.
>> + */
>> +
>> +static void pf_exit_vf_stop_wip(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_WIP))
>> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_SEND_STOP);
>> +}
>> +
>> +static void pf_enter_vf_stopped(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED))
>> +		pf_enter_vf_state_machine_bug(gt, vfid);
>> +
>> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED);
>> +	pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED);
>> +	pf_exit_vf_mismatch(gt, vfid);
>> +	pf_exit_vf_wip(gt, vfid);
>> +}
>> +
>> +static void pf_enter_vf_stop_completed(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	pf_enter_vf_stopped(gt, vfid);
>> +}
>> +
>> +static void pf_enter_vf_stop_failed(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_FAILED);
>> +	pf_exit_vf_wip(gt, vfid);
>> +}
>> +
>> +static void pf_enter_vf_stop_rejected(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	pf_enter_vf_mismatch(gt, vfid);
>> +	pf_enter_vf_stop_failed(gt, vfid);
>> +}
>> +
>> +static void pf_enter_vf_stop_send_stop(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_SEND_STOP))
>> +		pf_enter_vf_state_machine_bug(gt, vfid);
>> +
>> +	pf_queue_vf(gt, vfid);
>> +}
>> +
>> +static bool pf_exit_vf_stop_send_stop(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	int err;
>> +
>> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_SEND_STOP))
>> +		return false;
>> +
>> +	err = pf_send_vf_stop(gt, vfid);
>> +	if (err == -EBUSY)
>> +		pf_enter_vf_stop_send_stop(gt, vfid);
>> +	else if (err == -EIO)
>> +		pf_enter_vf_stop_rejected(gt, vfid);
>> +	else if (err)
>> +		pf_enter_vf_stop_failed(gt, vfid);
>> +	else
>> +		pf_enter_vf_stop_completed(gt, vfid);
>> +	return true;
>> +}
>> +
>> +static bool pf_enter_vf_stop_wip(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_WIP)) {
>> +		pf_enter_vf_wip(gt, vfid);
>> +		pf_enter_vf_stop_send_stop(gt, vfid);
>> +		return true;
>> +	}
>> +	return false;
>>  }
>>  
>>  /**
>> @@ -127,7 +840,279 @@ int xe_gt_sriov_pf_control_resume_vf(struct xe_gt *gt, unsigned int vfid)
>>   */
>>  int xe_gt_sriov_pf_control_stop_vf(struct xe_gt *gt, unsigned int vfid)
>>  {
>> -	return pf_send_vf_stop(gt, vfid);
>> +	int err;
>> +
>> +	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED)) {
>> +		xe_gt_sriov_dbg(gt, "VF%u was already stopped!\n", vfid);
>> +		return -ESTALE;
>> +	}
>> +
>> +	if (!pf_enter_vf_stop_wip(gt, vfid)) {
>> +		xe_gt_sriov_dbg(gt, "VF%u stop already in progress!\n", vfid);
>> +		return -EALREADY;
>> +	}
>> +
>> +	err = pf_wait_vf_wip_done(gt, vfid, 2 * HZ);
> 
> use define, or pf_get_default_timeout for this timeout

yup

> 
>> +	if (err)
>> +		return err;
>> +
>> +	if (pf_expect_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED)) {
>> +		xe_gt_sriov_info(gt, "VF%u stopped!\n", vfid);
>> +		return 0;
>> +	}
>> +
>> +	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOP_FAILED)) {
>> +		xe_gt_sriov_dbg(gt, "VF%u stop failed!\n", vfid);
>> +		return -EIO;
>> +	}
>> +
>> +	xe_gt_sriov_dbg(gt, "VF%u stop was canceled!\n", vfid);
>> +	return -ECANCELED;
>> +}
>> +
>> +/**
>> + * DOC: The VF FLR state machine
>> + *
>> + * The VF FLR state machine looks like::
>> + *
>> + *	 (READY,PAUSED,STOPPED)<------------<--------------o
>> + *	    |                                               \
>> + *	   flr                                               \
>> + *	    |                                                 \
>> + *	....V..........................FLR_WIP...........      \
>> + *	:    \                                          :       \
>> + *	:     \   o----<----busy                        :        |
>> + *	:      \ /            /                         :        |
>> + *	:       FLR_SEND_START---failed----->-----------o--->(FLR_FAILED)<---o
>> + *	:        |            \                         :        |           |
>> + *	:      acked           rejected----->-----------o--->(MISMATCH)      |
>> + *	:        |                                      :        ^           |
>> + *	:        v                                      :        |           |
>> + *	:       FLR_WAIT_GUC                            :        |           |
>> + *	:        |                                      :        |           |
>> + *	:       done                                    :        |           |
>> + *	:        |                                      :        |           |
>> + *	:        v                                      :        |           |
>> + *	:       FLR_GUC_DONE                            :        |           |
>> + *	:        |                                      :        |           |
>> + *	:       FLR_RESET_CONFIG---failed--->-----------o--------+-----------o
>> + *	:        |                                      :        |           |
>> + *	:       FLR_RESET_DATA                          :        |           |
>> + *	:        |                                      :        |           |
>> + *	:       FLR_RESET_MMIO                          :        |           |
>> + *	:        |                                      :        |           |
>> + *	:        | o----<----busy                       :        |           |
>> + *	:        |/            /                        :        |           |
>> + *	:       FLR_SEND_FINISH----failed--->-----------o--------+-----------o
>> + *	:       /             \                         :        |
>> + *	:     acked            rejected----->-----------o--------o
>> + *	:     /                                         :
>> + *	:....o..............................o...........:
>> + *	     |                              |
>> + *	  completed                       restart
>> + *	     |                             /
>> + *	     V                            /
>> + *	  (READY)<----------<------------o
>> + *
>> + * For the full state machine view, see `The VF state machine`_.
>> + */
>> +
>> +static void pf_enter_vf_flr_send_start(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_START))
>> +		pf_enter_vf_state_machine_bug(gt, vfid);
>> +
>> +	pf_queue_vf(gt, vfid);
>> +}
>> +
>> +static void pf_enter_vf_flr_wip(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WIP)) {
>> +		xe_gt_sriov_dbg(gt, "VF%u FLR is already in progress\n", vfid);
>> +		return;
>> +	}
>> +
>> +	pf_enter_vf_wip(gt, vfid);
>> +	pf_enter_vf_flr_send_start(gt, vfid);
>> +}
>> +
>> +static void pf_exit_vf_flr_wip(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WIP)) {
>> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_FINISH);
>> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_MMIO);
>> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_DATA);
>> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_CONFIG);
>> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_GUC_DONE);
>> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WAIT_GUC);
>> +		pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_START);
>> +	}
>> +}
>> +
>> +static void pf_enter_vf_flr_completed(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	pf_enter_vf_ready(gt, vfid);
>> +}
>> +
>> +static void pf_enter_vf_flr_failed(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_FAILED))
>> +		xe_gt_sriov_notice(gt, "VF%u FLR failed!\n", vfid);
>> +	pf_exit_vf_wip(gt, vfid);
>> +}
>> +
>> +static void pf_enter_vf_flr_rejected(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	pf_enter_vf_mismatch(gt, vfid);
>> +	pf_enter_vf_flr_failed(gt, vfid);
>> +}
>> +
>> +static void pf_enter_vf_flr_send_finish(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_FINISH))
>> +		pf_enter_vf_state_machine_bug(gt, vfid);
>> +
>> +	pf_queue_vf(gt, vfid);
>> +}
>> +
>> +static bool pf_exit_vf_flr_send_finish(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	int err;
>> +
>> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_FINISH))
>> +		return false;
>> +
>> +	err = pf_send_vf_flr_finish(gt, vfid);
>> +	if (err == -EBUSY)
>> +		pf_enter_vf_flr_send_finish(gt, vfid);
>> +	else if (err == -EIO)
>> +		pf_enter_vf_flr_rejected(gt, vfid);
>> +	else if (err)
>> +		pf_enter_vf_flr_failed(gt, vfid);
>> +	else
>> +		pf_enter_vf_flr_completed(gt, vfid);
>> +	return true;
>> +}
>> +
>> +static void pf_enter_vf_flr_reset_mmio(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_MMIO))
>> +		pf_enter_vf_state_machine_bug(gt, vfid);
>> +
>> +	pf_queue_vf(gt, vfid);
>> +}
>> +
>> +static bool pf_exit_vf_flr_reset_mmio(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_MMIO))
>> +		return false;
>> +
>> +	/* XXX: placeholder */
>> +
>> +	pf_enter_vf_flr_send_finish(gt, vfid);
>> +	return true;
>> +}
>> +
>> +static void pf_enter_vf_flr_reset_data(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_DATA))
>> +		pf_enter_vf_state_machine_bug(gt, vfid);
>> +
>> +	pf_queue_vf(gt, vfid);
>> +}
>> +
>> +static bool pf_exit_vf_flr_reset_data(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_DATA))
>> +		return false;
>> +
>> +	xe_gt_sriov_pf_service_reset(gt, vfid);
>> +	xe_gt_sriov_pf_monitor_flr(gt, vfid);
>> +
>> +	pf_enter_vf_flr_reset_mmio(gt, vfid);
>> +	return true;
>> +}
>> +
>> +static void pf_enter_vf_flr_reset_config(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_CONFIG))
>> +		pf_enter_vf_state_machine_bug(gt, vfid);
>> +
>> +	pf_queue_vf(gt, vfid);
>> +}
>> +
>> +static bool pf_exit_vf_flr_reset_config(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	unsigned long timeout = pf_get_default_timeout(XE_GT_SRIOV_STATE_FLR_RESET_CONFIG);
>> +	int err;
>> +
>> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_RESET_CONFIG))
>> +		return false;
>> +
>> +	err = xe_gt_sriov_pf_config_sanitize(gt, vfid, timeout);
>> +	if (err)
>> +		pf_enter_vf_flr_failed(gt, vfid);
>> +	else
>> +		pf_enter_vf_flr_reset_data(gt, vfid);
>> +	return true;
>> +}
>> +
>> +static void pf_enter_vf_flr_wait_guc(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WAIT_GUC))
>> +		pf_enter_vf_state_machine_bug(gt, vfid);
>> +}
>> +
>> +static bool pf_exit_vf_flr_wait_guc(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	return pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WAIT_GUC);
>> +}
>> +
>> +static bool pf_exit_vf_flr_send_start(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	int err;
>> +
>> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_SEND_START))
>> +		return false;
>> +
>> +	/* GuC may actually send a FLR_DONE before we get a RESPONSE */
>> +	pf_enter_vf_flr_wait_guc(gt, vfid);
>> +
>> +	err = pf_send_vf_flr_start(gt, vfid);
>> +	if (err) {
>> +		/* send failed, so we shouldn't expect FLR_DONE from GuC */
>> +		pf_exit_vf_flr_wait_guc(gt, vfid);
>> +
>> +		if (err == -EBUSY)
>> +			pf_enter_vf_flr_send_start(gt, vfid);
>> +		else if (err == -EIO)
>> +			pf_enter_vf_flr_rejected(gt, vfid);
>> +		else
>> +			pf_enter_vf_flr_failed(gt, vfid);
>> +	} else {
>> +		/*
>> +		 * we have already moved to WAIT_GUC, maybe even to GUC_DONE
>> +		 * but since GuC didn't complain, we may clear MISMATCH
>> +		 */
>> +		pf_exit_vf_mismatch(gt, vfid);
>> +	}
>> +
>> +	return true;
>> +}
>> +
>> +static bool pf_exit_vf_flr_guc_done(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_GUC_DONE))
>> +		return false;
>> +
>> +	pf_enter_vf_flr_reset_config(gt, vfid);
>> +	return true;
>> +}
>> +
>> +static void pf_enter_vf_flr_guc_done(struct xe_gt *gt, unsigned int vfid)
>> +{
>> +	if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_GUC_DONE))
>> +		pf_queue_vf(gt, vfid);
>>  }
>>  
>>  /**
>> @@ -141,14 +1126,22 @@ int xe_gt_sriov_pf_control_stop_vf(struct xe_gt *gt, unsigned int vfid)
>>   */
>>  int xe_gt_sriov_pf_control_trigger_flr(struct xe_gt *gt, unsigned int vfid)
>>  {
>> +	unsigned long timeout = pf_get_default_timeout(XE_GT_SRIOV_STATE_FLR_WIP);
>>  	int err;
>>  
>> -	/* XXX pf_send_vf_flr_start() expects ct->lock */
>> -	mutex_lock(&gt->uc.guc.ct.lock);
>> -	err = pf_send_vf_flr_start(gt, vfid);
>> -	mutex_unlock(&gt->uc.guc.ct.lock);
>> +	pf_enter_vf_flr_wip(gt, vfid);
>>  
>> -	return err;
>> +	err = pf_wait_vf_wip_done(gt, vfid, timeout);
>> +	if (err) {
>> +		xe_gt_sriov_dbg(gt, "VF%u FLR didn't finish in %u ms (%pe)\n",
>> +				vfid, jiffies_to_msecs(timeout), ERR_PTR(err));
> 
> I would increase the level of this log, dbg IMO is not enough,

will bump to xe_gt_sriov_notice() like done for some other SRIOV related
errors

> 
>> +		return err;
>> +	}
>> +
>> +	if (!pf_expect_vf_not_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_FAILED))
>> +		return -EIO;
>> +
>> +	return 0;
>>  }
>>  
>>  /**
>> @@ -200,15 +1193,32 @@ static void pf_handle_vf_flr(struct xe_gt *gt, u32 vfid)
>>  
>>  	if (needs_dispatch_flr(xe)) {
>>  		for_each_gt(gtit, xe, gtid)
>> -			pf_send_vf_flr_start(gtit, vfid);
>> +			pf_enter_vf_flr_wip(gtit, vfid);
>>  	} else {
>> -		pf_send_vf_flr_start(gt, vfid);
>> +		pf_enter_vf_flr_wip(gt, vfid);
>>  	}
>>  }
>>  
>>  static void pf_handle_vf_flr_done(struct xe_gt *gt, u32 vfid)
>>  {
>> -	pf_send_vf_flr_finish(gt, vfid);
>> +	if (!pf_exit_vf_flr_wait_guc(gt, vfid)) {
>> +		xe_gt_sriov_dbg(gt, "Received out of order 'VF%u FLR done'\n", vfid);
>> +		pf_enter_vf_mismatch(gt, vfid);
>> +		return;
>> +	}
>> +
>> +	pf_enter_vf_flr_guc_done(gt, vfid);
>> +}
>> +
>> +static void pf_handle_vf_pause_done(struct xe_gt *gt, u32 vfid)
>> +{
>> +	if (!pf_exit_pause_wait_guc(gt, vfid)) {
>> +		xe_gt_sriov_dbg(gt, "Received out of order 'VF%u PAUSE done'\n", vfid);
>> +		pf_enter_vf_mismatch(gt, vfid);
>> +		return;
>> +	}
>> +
>> +	pf_enter_vf_pause_guc_done(gt, vfid);
>>  }
>>  
>>  static int pf_handle_vf_event(struct xe_gt *gt, u32 vfid, u32 eventid)
>> @@ -226,6 +1236,7 @@ static int pf_handle_vf_event(struct xe_gt *gt, u32 vfid, u32 eventid)
>>  		pf_handle_vf_flr_done(gt, vfid);
>>  		break;
>>  	case GUC_PF_NOTIFY_VF_PAUSE_DONE:
>> +		pf_handle_vf_pause_done(gt, vfid);
>>  		break;
>>  	case GUC_PF_NOTIFY_VF_FIXUP_DONE:
>>  		break;
>> @@ -284,3 +1295,165 @@ int xe_gt_sriov_pf_control_process_guc2pf(struct xe_gt *gt, const u32 *msg, u32
>>  
>>  	return vfid ? pf_handle_vf_event(gt, vfid, eventid) : pf_handle_pf_event(gt, eventid);
>>  }
>> +
>> +static bool pf_process_vf_machine(struct xe_gt *gt, unsigned int vfid)
> 
> NIT: rename to pf_process_vf_state_machine ?

ok

>> +{
>> +	if (pf_exit_vf_flr_send_start(gt, vfid))
>> +		return true;
>> +
>> +	if (pf_exit_vf_flr_send_start(gt, vfid))
>> +		return true;
> 
> Mentioned in a previous email, but as a reminder:
> function called twice
> 
>> +	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WAIT_GUC)) {
>> +		xe_gt_sriov_dbg_verbose(gt, "VF%u in %s\n", vfid,
>> +					control_bit_to_string(XE_GT_SRIOV_STATE_FLR_WAIT_GUC));
>> +		return false;
>> +	}
>> +
>> +	if (pf_exit_vf_flr_guc_done(gt, vfid))
>> +		return true;
>> +
>> +	if (pf_exit_vf_flr_reset_config(gt, vfid))
>> +		return true;
>> +
>> +	if (pf_exit_vf_flr_reset_data(gt, vfid))
>> +		return true;
>> +
>> +	if (pf_exit_vf_flr_reset_mmio(gt, vfid))
>> +		return true;
>> +
>> +	if (pf_exit_vf_flr_reset_mmio(gt, vfid))
>> +		return true;
> 
> function called twice
>> +
>> +	if (pf_exit_vf_flr_send_finish(gt, vfid))
>> +		return true;
>> +
>> +	if (pf_exit_vf_stop_send_stop(gt, vfid))
>> +		return true;
>> +
>> +	if (pf_exit_vf_pause_send_pause(gt, vfid))
>> +		return true;
>> +
>> +	if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC)) {
>> +		xe_gt_sriov_dbg_verbose(gt, "VF%u in %s\n", vfid,
>> +					control_bit_to_string(XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC));
>> +		return true;
>> +	}
>> +
>> +	if (pf_exit_vf_pause_guc_done(gt, vfid))
>> +		return true;
>> +
>> +	if (pf_exit_vf_resume_send_resume(gt, vfid))
>> +		return true;
>> +
>> +	return false;
>> +}
>> +
>> +static unsigned int pf_control_state_index(struct xe_gt *gt,
>> +					   struct xe_gt_sriov_control_state *cs)
>> +{
>> +	return container_of(cs, struct xe_gt_sriov_metadata, control) - gt->sriov.pf.vfs;
>> +}
>> +
>> +static void pf_worker_find_work(struct xe_gt *gt)
>> +{
>> +	struct xe_gt_sriov_pf_control *pfc = &gt->sriov.pf.control;
>> +	struct xe_gt_sriov_control_state *cs;
>> +	unsigned int vfid;
>> +	bool empty;
>> +	bool more;
>> +
>> +	spin_lock(&pfc->lock);
>> +	cs = list_first_entry_or_null(&pfc->list, struct xe_gt_sriov_control_state, link);
>> +	if (cs)
>> +		list_del_init(&cs->link);
>> +	empty = list_empty(&pfc->list);
>> +	spin_unlock(&pfc->lock);
>> +
>> +	if (!cs)
>> +		return;
>> +
>> +	/* VF metadata structures are indexed by the VFID */
>> +	vfid = pf_control_state_index(gt, cs);
>> +	xe_gt_assert(gt, vfid <= xe_gt_sriov_pf_get_totalvfs(gt));
>> +
>> +	more = pf_process_vf_machine(gt, vfid);
>> +	if (more)
>> +		pf_queue_vf(gt, vfid);
>> +	else if (!empty)
>> +		pf_queue_control_worker(gt);
>> +}
>> +
>> +static void control_worker_func(struct work_struct *w)
>> +{
>> +	struct xe_gt *gt = container_of(w, struct xe_gt, sriov.pf.control.worker);
>> +
>> +	xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
>> +	pf_worker_find_work(gt);
>> +}
>> +
>> +static void pf_stop_worker(struct xe_gt *gt)
>> +{
>> +	xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
>> +	cancel_work_sync(&gt->sriov.pf.control.worker);
>> +}
>> +
>> +static void control_fini_action(struct drm_device *dev, void *data)
>> +{
>> +	struct xe_gt *gt = data;
>> +
>> +	pf_stop_worker(gt);
>> +}
>> +
>> +/**
>> + * xe_gt_sriov_pf_control_init() - Initialize PF's control data.
>> + * @gt: the &xe_gt
>> + *
>> + * This function is for PF only.
>> + *
>> + * Return: 0 on success or a negative error code on failure.
>> + */
>> +int xe_gt_sriov_pf_control_init(struct xe_gt *gt)
>> +{
>> +	struct xe_device *xe = gt_to_xe(gt);
>> +	unsigned int n, totalvfs;
>> +
>> +	xe_gt_assert(gt, IS_SRIOV_PF(xe));
>> +
>> +	totalvfs = xe_sriov_pf_get_totalvfs(xe);
>> +	for (n = 0; n <= totalvfs; n++) {
>> +		struct xe_gt_sriov_control_state *cs = pf_pick_vf_control(gt, n);
>> +
>> +		init_completion(&cs->done);
>> +		INIT_LIST_HEAD(&cs->link);
>> +	}
>> +
>> +	spin_lock_init(&gt->sriov.pf.control.lock);
>> +	INIT_LIST_HEAD(&gt->sriov.pf.control.list);
>> +	INIT_WORK(&gt->sriov.pf.control.worker, control_worker_func);
>> +
>> +	return drmm_add_action_or_reset(&xe->drm, control_fini_action, gt);
>> +}
>> +
>> +/**
>> + * xe_gt_sriov_pf_control_restart() - Restart SR-IOV control data after a GT reset.
>> + * @gt: the &xe_gt
>> + *
>> + * Any per-VF status maintained by the PF or any ongoing VF control activity
>> + * performed by the PF must be reset or cancelled when the GT is reset.
>> + *
>> + * This function is for PF only.
>> + */
>> +void xe_gt_sriov_pf_control_restart(struct xe_gt *gt)
>> +{
>> +	struct xe_device *xe = gt_to_xe(gt);
>> +	unsigned int n, totalvfs;
>> +
>> +	xe_gt_assert(gt, IS_SRIOV_PF(xe));
>> +
>> +	pf_stop_worker(gt);
>> +
>> +	totalvfs = xe_sriov_pf_get_totalvfs(xe);
>> +	for (n = 1; n <= totalvfs; n++)
>> +		pf_enter_vf_ready(gt, n);
>> +}
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h
>> index 405d1586f991..c85e64f099cc 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h
>> @@ -11,6 +11,9 @@
>>  
>>  struct xe_gt;
>>  
>> +int xe_gt_sriov_pf_control_init(struct xe_gt *gt);
>> +void xe_gt_sriov_pf_control_restart(struct xe_gt *gt);
>> +
>>  int xe_gt_sriov_pf_control_pause_vf(struct xe_gt *gt, unsigned int vfid);
>>  int xe_gt_sriov_pf_control_resume_vf(struct xe_gt *gt, unsigned int vfid);
>>  int xe_gt_sriov_pf_control_stop_vf(struct xe_gt *gt, unsigned int vfid);
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h
>> new file mode 100644
>> index 000000000000..11830aafea45
>> --- /dev/null
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h
>> @@ -0,0 +1,107 @@
>> +/* SPDX-License-Identifier: MIT */
>> +/*
>> + * Copyright © 2024 Intel Corporation
>> + */
>> +
>> +#ifndef _XE_GT_SRIOV_PF_CONTROL_TYPES_H_
>> +#define _XE_GT_SRIOV_PF_CONTROL_TYPES_H_
>> +
>> +#include <linux/completion.h>
>> +#include <linux/spinlock.h>
>> +#include <linux/workqueue_types.h>
>> +
>> +/**
>> + * enum xe_gt_sriov_control_bits - Various bits used by the PF to represent a VF state
>> + *
>> + * @XE_GT_SRIOV_STATE_WIP: indicates that some operations are in progress.
>> + * @XE_GT_SRIOV_STATE_FLR_WIP: indicates that a VF FLR is in progress.
>> + * @XE_GT_SRIOV_STATE_FLR_SEND_START: indicates that the PF wants to send a FLR START command.
>> + * @XE_GT_SRIOV_STATE_FLR_WAIT_GUC: indicates that the PF awaits for a response from the GuC.
>> + * @XE_GT_SRIOV_STATE_FLR_GUC_DONE: indicates that the PF has received a response from the GuC.
>> + * @XE_GT_SRIOV_STATE_FLR_RESET_CONFIG: indicates that the PF needs to clear VF's resources.
>> + * @XE_GT_SRIOV_STATE_FLR_RESET_DATA: indicates that the PF needs to clear VF's data.
>> + * @XE_GT_SRIOV_STATE_FLR_RESET_MMIO: indicates that the PF needs to reset VF's registers.
>> + * @XE_GT_SRIOV_STATE_FLR_SEND_FINISH: indicates that the PF wants to send a FLR FINISH message.
>> + * @XE_GT_SRIOV_STATE_FLR_FAILED: indicates that VF FLR sequence failed.
>> + * @XE_GT_SRIOV_STATE_PAUSE_WIP: indicates that a VF pause operation is in progress.
>> + * @XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE: indicates that the PF is about to send a PAUSE command.
>> + * @XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC: indicates that the PF awaits for a response from the GuC.
>> + * @XE_GT_SRIOV_STATE_PAUSE_GUC_DONE: indicates that the PF has received a response from the GuC.
>> + * @XE_GT_SRIOV_STATE_PAUSE_FAILED: indicates that a VF pause operation has failed.
>> + * @XE_GT_SRIOV_STATE_PAUSED: indicates that the VF is paused.
>> + * @XE_GT_SRIOV_STATE_RESUME_WIP: indicates the a VF resume operation is in progress.
>> + * @XE_GT_SRIOV_STATE_RESUME_SEND_RESUME: indicates that the PF is about to send RESUME command.
>> + * @XE_GT_SRIOV_STATE_RESUME_FAILED: indicates that a VF resume operation has failed.
>> + * @XE_GT_SRIOV_STATE_RESUMED: indicates that the VF was resumed.
>> + * @XE_GT_SRIOV_STATE_STOP_WIP: indicates that a VF stop operation is in progress.
>> + * @XE_GT_SRIOV_STATE_STOP_SEND_STOP: indicates that the PF wants to send a STOP command.
>> + * @XE_GT_SRIOV_STATE_STOP_FAILED: indicates that the VF stop operation has failed
>> + * @XE_GT_SRIOV_STATE_STOPPED: indicates that the VF was stopped.
>> + * @XE_GT_SRIOV_STATE_MISMATCH: indicates that the PF has detected a VF state mismatch.
>> + */
>> +enum xe_gt_sriov_control_bits {
>> +	XE_GT_SRIOV_STATE_WIP = 1,
>> +
>> +	XE_GT_SRIOV_STATE_FLR_WIP,
>> +	XE_GT_SRIOV_STATE_FLR_SEND_START,
>> +	XE_GT_SRIOV_STATE_FLR_WAIT_GUC,
>> +	XE_GT_SRIOV_STATE_FLR_GUC_DONE,
>> +	XE_GT_SRIOV_STATE_FLR_RESET_CONFIG,
>> +	XE_GT_SRIOV_STATE_FLR_RESET_DATA,
>> +	XE_GT_SRIOV_STATE_FLR_RESET_MMIO,
>> +	XE_GT_SRIOV_STATE_FLR_SEND_FINISH,
>> +	XE_GT_SRIOV_STATE_FLR_FAILED,
>> +
>> +	XE_GT_SRIOV_STATE_PAUSE_WIP,
>> +	XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE,
>> +	XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC,
>> +	XE_GT_SRIOV_STATE_PAUSE_GUC_DONE,
>> +	XE_GT_SRIOV_STATE_PAUSE_FAILED,
>> +	XE_GT_SRIOV_STATE_PAUSED,
>> +
>> +	XE_GT_SRIOV_STATE_RESUME_WIP,
>> +	XE_GT_SRIOV_STATE_RESUME_SEND_RESUME,
>> +	XE_GT_SRIOV_STATE_RESUME_FAILED,
>> +	XE_GT_SRIOV_STATE_RESUMED,
>> +
>> +	XE_GT_SRIOV_STATE_STOP_WIP,
>> +	XE_GT_SRIOV_STATE_STOP_SEND_STOP,
>> +	XE_GT_SRIOV_STATE_STOP_FAILED,
>> +	XE_GT_SRIOV_STATE_STOPPED,
>> +
>> +	XE_GT_SRIOV_STATE_MISMATCH = BITS_PER_LONG - 1,
>> +};
>> +
>> +/**
>> + * struct xe_gt_sriov_control_state - GT-level per-VF control state.
>> + *
>> + * Used by the PF driver to maintain per-VF control data.
>> + */
>> +struct xe_gt_sriov_control_state {
>> +	/** @state: VF state bits */
>> +	unsigned long state;
>> +
>> +	/** @done: completion of async operations */
>> +	struct completion done;
>> +
>> +	/** @link: link into worker list */
>> +	struct list_head link;
>> +};
>> +
>> +/**
>> + * struct xe_gt_sriov_pf_control - GT-level control data.
>> + *
>> + * Used by the PF driver to maintain its data.
>> + */
>> +struct xe_gt_sriov_pf_control {
>> +	/** @worker: worker that executes a VF operations */
>> +	struct work_struct worker;
>> +
>> +	/** @list: list of VF entries that have a pending work */
>> +	struct list_head list;
>> +
>> +	/** @lock: protects VF pending list */
>> +	spinlock_t lock;
>> +};
>> +
>> +#endif
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h
>> index 40cbaea3ef44..28e1b130bf87 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h
>> @@ -9,6 +9,7 @@
>>  #include <linux/types.h>
>>  
>>  #include "xe_gt_sriov_pf_config_types.h"
>> +#include "xe_gt_sriov_pf_control_types.h"
>>  #include "xe_gt_sriov_pf_monitor_types.h"
>>  #include "xe_gt_sriov_pf_policy_types.h"
>>  #include "xe_gt_sriov_pf_service_types.h"
>> @@ -23,6 +24,9 @@ struct xe_gt_sriov_metadata {
>>  	/** @monitor: per-VF monitoring data. */
>>  	struct xe_gt_sriov_monitor monitor;
>>  
>> +	/** @control: per-VF control data. */
>> +	struct xe_gt_sriov_control_state control;
>> +
>>  	/** @version: negotiated VF/PF ABI version */
>>  	struct xe_gt_sriov_pf_service_version version;
>>  };
>> @@ -30,12 +34,14 @@ struct xe_gt_sriov_metadata {
>>  /**
>>   * struct xe_gt_sriov_pf - GT level PF virtualization data.
>>   * @service: service data.
>> + * @control: control data.
>>   * @policy: policy data.
>>   * @spare: PF-only provisioning configuration.
>>   * @vfs: metadata for all VFs.
>>   */
>>  struct xe_gt_sriov_pf {
>>  	struct xe_gt_sriov_pf_service service;
>> +	struct xe_gt_sriov_pf_control control;
>>  	struct xe_gt_sriov_pf_policy policy;
>>  	struct xe_gt_sriov_spare_config spare;
>>  	struct xe_gt_sriov_metadata *vfs;
> 
> Functionally, it's a good idea to introduce a state machine here.
> I believe that if this code is well tested, this code will be reliable and
> will handle all assumed states, including errors.
> 
> However, I have a few general comments in addition to those I left above
> in the code.
> While the drawings indicate a certain hierarchy of states (we have main and intermediate states),
> in the code this structure is flat.

idea of splitting into smaller state machines was tempting but without
introducing some kind of the better FSM infrastructure it could just
create even more code that would be harder to consume ...

for now, the split into hierarchy of states is, as you said, in
diagrams, but also by using some common naming pattern

> The code itself is difficult to understand (thanks to drawings it is a bit easier) but
> it takes some time to analyze and understand it sensibly. I am afraid that the code will
> be difficult to debug and an inexperienced person will have a problem with extending
> the functionality of the code.

I was trying to put some extra verbose diagnostic into the code to allow
viewing what's happening there and I've also prepared set of tests to
make sure any future changes could be easily tested offline

besides, we don't expect any big changes to the VF state machine as this
what current GuC ABI defines, and if there will be new state machine
then maybe we could think about preparing more solid FSM framework

> 
> Thanks,
> Piotr
> 
> 
>> -- 
>> 2.43.0
>>
> 

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

* Re: [PATCH 05/12] drm/xe/tests: Allow deferred function call during KUnit test
  2024-08-19 21:38   ` Lucas De Marchi
@ 2024-08-20 10:23     ` Michal Wajdeczko
  2024-08-20 13:21       ` Lucas De Marchi
  2024-08-20 13:27       ` Lucas De Marchi
  0 siblings, 2 replies; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-20 10:23 UTC (permalink / raw)
  To: Lucas De Marchi; +Cc: intel-xe



On 19.08.2024 23:38, Lucas De Marchi wrote:
> On Fri, Aug 09, 2024 at 06:51:52PM GMT, Michal Wajdeczko wrote:
>> For some advanced test cases we might want to simulate external
>> activity that will stimulate function under test. Add set of
>> helper functions to implement such requirement. Usage example:
>>
>>  static void foo(struct xe_device *xe)
>>  {
>>      WRITE_ONCE(xe->foo, 1);
>>  }
>>
>>  static void foo_test(struct kunit *test)
>>  {
>>      struct xe_device *xe = test->priv;
>>
>>      xe_kunit_helper_delayed_call(test, HZ / 2, foo, xe);
>>
>>      KUNIT_EXPECT_EQ(test, 0, READ_ONCE(xe->foo));
>>      schedule_timeout_uninterruptible(HZ);
>>      KUNIT_EXPECT_EQ(test, 1, READ_ONCE(xe->foo));
>>  }
>>
>> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
>> Cc: Lucas De Marchi <lucas.demarchi@intel.com>
>> ---
>> drivers/gpu/drm/xe/tests/xe_kunit_helpers.c | 148 ++++++++++++++++++++
>> drivers/gpu/drm/xe/tests/xe_kunit_helpers.h |  38 +++++
>> 2 files changed, 186 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
>> b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
>> index bc5156966ce9..8fe1a0918b32 100644
>> --- a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
>> +++ b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
>> @@ -127,3 +127,151 @@ int
>> xe_kunit_helper_xe_device_live_test_init(struct kunit *test)
>>     return 0;
>> }
>> EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_xe_device_live_test_init);
>> +
>> +struct xe_kunit_call {
>> +    struct delayed_work work;
>> +    struct kunit *test;
>> +    struct {
>> +        int (*int_gt)(struct xe_gt *gt);
>> +        int (*int_gt_uint)(struct xe_gt *gt, unsigned int n);
>> +        void (*void_gt)(struct xe_gt *gt);
>> +        void (*void_gt_uint)(struct xe_gt *gt, unsigned int n);
>> +        void (*void_xe)(struct xe_device *xe);
> 
> I think the only reason why you're adding this in xe is because you are
> using xe-specific types. This could rather be done generically by
> always using int delayed_func(void *data). Then you can simply add it to
> kunit and get it reviewed there.

while some generic functionality could be always extracted and moved to
the kunit, for easier use in Xe tests likely we will still need some
wrappers with xe-specific types, so do we really always need to start
with trying enhance generic kunit first and then wait for acceptance
until we can use such extension in our test code?

IMO this could be in parallel, so in kunit review we can point how this
is already being used..

anyway, will try to split that feature into 'generic' and 'xe'

> 
> Also thinking that the example you added in the commit message is likely
> suggesting the wrong type of test, that a) sleep too much and b) tend to
> be noisy

only tests longer than 2s are considered SLOW ;)

and HZ was just picked to have an example small

and you will not see any noise if test PASSES

> 
> Lucas De Marchi
> 
>> +    } func;
>> +    struct {
>> +        struct xe_device *xe;
>> +        struct xe_gt *gt;
>> +        unsigned int n;
>> +    } args;
>> +};
>> +
>> +static void call_work_func(struct work_struct *work)
>> +{
>> +    struct xe_kunit_call *call = container_of(work, typeof(*call),
>> work.work);
>> +
>> +    if (call->func.void_xe) {
>> +        kunit_info(call->test, "calling %ps(xe)\n", call->func.void_xe);
>> +        call->func.void_xe(call->args.xe);
>> +        kunit_info(call->test, "%ps(xe) completed\n",
>> call->func.void_xe);
>> +    } else if (call->func.void_gt) {
>> +        kunit_info(call->test, "%ps(gt)\n", call->func.void_gt);
>> +        call->func.void_gt(call->args.gt);
>> +        kunit_info(call->test, "%ps(gt) completed\n",
>> call->func.void_gt);
>> +    } else if (call->func.int_gt_uint) {
>> +        int ret;
>> +
>> +        kunit_info(call->test, "calling %ps(gt,%u)\n",
>> +               call->func.int_gt_uint, call->args.n);
>> +        ret = call->func.int_gt_uint(call->args.gt, call->args.n);
>> +        if (ret < 0) {
>> +            kunit_info(call->test, "%ps(gt,%u) reported error %pe\n",
>> +                   call->func.int_gt_uint, call->args.n, ERR_PTR(ret));
>> +        } else {
>> +            kunit_info(call->test, "%ps(gt,%u) returned %d\n",
>> +                   call->func.int_gt_uint, call->args.n, ret);
>> +        }
>> +    }
>> +}
>> +
>> +static struct xe_kunit_call *prepare_call(struct kunit *test)
>> +{
>> +    struct xe_kunit_call *call;
>> +
>> +    call = kunit_kzalloc(test, sizeof(*call), GFP_KERNEL);
>> +    KUNIT_ASSERT_NOT_NULL(test, call);
>> +
>> +    INIT_DELAYED_WORK(&call->work, call_work_func);
>> +    call->test = test;
>> +
>> +    return call;
>> +}
>> +
>> +KUNIT_DEFINE_ACTION_WRAPPER(cancel_call, cancel_delayed_work_sync,
>> struct delayed_work *);
>> +
>> +static void queue_call(struct kunit *test, struct xe_kunit_call
>> *call, unsigned long delay)
>> +{
>> +    queue_delayed_work(system_wq, &call->work, delay);
>> +    KUNIT_ASSERT_EQ(test, 0, kunit_add_action_or_reset(test,
>> cancel_call, &call->work));
>> +}
>> +
>> +/**
>> + * xe_kunit_helper_delayed_call_void_xe_device - Queue a function
>> call during KUnit test
>> + * @test: the &kunit test case
>> + * @delay: number of jiffies to wait before queueing
>> + * @func: the &xe_device function to call
>> + * @xe: the &xe_device argument
>> + *
>> + * This function uses KUNIT_ASSERT to detect any failures.
>> + */
>> +void xe_kunit_helper_delayed_call_void_xe_device(struct kunit *test,
>> +                         unsigned long delay,
>> +                         void (*func)(struct xe_device *xe),
>> +                         struct xe_device *xe)
>> +{
>> +    struct xe_kunit_call *call = prepare_call(test);
>> +
>> +    KUNIT_ASSERT_NOT_NULL(test, func);
>> +    KUNIT_ASSERT_NOT_NULL(test, xe);
>> +
>> +    call->func.void_xe = func;
>> +    call->args.xe = xe;
>> +
>> +    return queue_call(test, call, delay);
>> +}
>> +EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_delayed_call_void_xe_device);
>> +
>> +/**
>> + * xe_kunit_helper_delayed_call_void_xe_gt - Queue a function call
>> during KUnit test
>> + * @test: the &kunit test case
>> + * @delay: number of jiffies to wait before queueing
>> + * @func: the &xe_gt function to call
>> + * @gt: the &xe_gt function argument
>> + *
>> + * This function uses KUNIT_ASSERT to detect any failures.
>> + */
>> +void xe_kunit_helper_delayed_call_void_xe_gt(struct kunit *test,
>> +                         unsigned long delay,
>> +                         void (*func)(struct xe_gt *gt),
>> +                         struct xe_gt *gt)
>> +{
>> +    struct xe_kunit_call *call = prepare_call(test);
>> +
>> +    KUNIT_ASSERT_NOT_NULL(test, func);
>> +    KUNIT_ASSERT_NOT_NULL(test, gt);
>> +
>> +    call->func.void_gt = func;
>> +    call->args.gt = gt;
>> +
>> +    return queue_call(test, call, delay);
>> +}
>> +EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_delayed_call_void_xe_gt);
>> +
>> +/**
>> + * xe_kunit_helper_delayed_call_int_xe_gt_uint - Queue a function
>> call during KUnit test
>> + * @test: the &kunit test case
>> + * @delay: number of jiffies to wait before queueing
>> + * @func: the &xe_gt function to call
>> + * @gt: the &xe_gt function argument
>> + * @n: the function argument
>> + *
>> + * This function uses KUNIT_ASSERT to detect any failures.
>> + */
>> +void xe_kunit_helper_delayed_call_int_xe_gt_uint(struct kunit *test,
>> +                         unsigned long delay,
>> +                         int (*func)(struct xe_gt *gt,
>> +                                 unsigned int vfid),
>> +                         struct xe_gt *gt,
>> +                         unsigned int n)
>> +{
>> +    struct xe_kunit_call *call = prepare_call(test);
>> +
>> +    KUNIT_ASSERT_NOT_NULL(test, func);
>> +    KUNIT_ASSERT_NOT_NULL(test, gt);
>> +
>> +    call->func.int_gt_uint = func;
>> +    call->args.gt = gt;
>> +    call->args.n = n;
>> +
>> +    return queue_call(test, call, delay);
>> +}
>> +EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_delayed_call_int_xe_gt_uint);
>> diff --git a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
>> b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
>> index 83665f7b1254..ec5287947ee4 100644
>> --- a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
>> +++ b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
>> @@ -9,6 +9,7 @@
>> struct device;
>> struct kunit;
>> struct xe_device;
>> +struct xe_gt;
>>
>> struct xe_device *xe_kunit_helper_alloc_xe_device(struct kunit *test,
>>                           struct device *dev);
>> @@ -16,4 +17,41 @@ int xe_kunit_helper_xe_device_test_init(struct
>> kunit *test);
>>
>> int xe_kunit_helper_xe_device_live_test_init(struct kunit *test);
>>
>> +void xe_kunit_helper_delayed_call_void_xe_device(struct kunit *test,
>> +                         unsigned long delay,
>> +                         void (*func)(struct xe_device *xe),
>> +                         struct xe_device *xe);
>> +
>> +void xe_kunit_helper_delayed_call_void_xe_gt(struct kunit *test,
>> +                         unsigned long delay,
>> +                         void (*func)(struct xe_gt *gt),
>> +                         struct xe_gt *gt);
>> +
>> +void xe_kunit_helper_delayed_call_int_xe_gt_uint(struct kunit *test,
>> +                         unsigned long delay,
>> +                         int (*func)(struct xe_gt *gt,
>> +                                 unsigned int vfid),
>> +                         struct xe_gt *gt,
>> +                         unsigned int n);
>> +
>> +/**
>> + * xe_kunit_helper_delayed_call - Queue a function call during KUnit
>> test
>> + * @test: the &kunit test case
>> + * @delay: number of jiffies to wait before queueing
>> + * @func: the &xe_device or &xe_gt function to call
>> + * @args: the &xe_device or &xe_gt and other function arguments
>> + *
>> + * This is a helper macro that compiles into dedicated function call
>> based on
>> + * the provided argument types.
>> + */
>> +#define xe_kunit_helper_delayed_call(test, delay, func, args...)    \
>> +    _Generic(func,                            \
>> +         void (*)(struct xe_device *) :                \
>> +            xe_kunit_helper_delayed_call_void_xe_device,    \
>> +         void (*)(struct xe_gt *) :                \
>> +            xe_kunit_helper_delayed_call_void_xe_gt,    \
>> +         int (*)(struct xe_gt *, unsigned int) :        \
>> +            xe_kunit_helper_delayed_call_int_xe_gt_uint    \
>> +    )(test, delay, func, args)
>> +
>> #endif
>> -- 
>> 2.43.0
>>

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

* Re: [PATCH 07/12] drm/xe/tests: Add helpers to call stubs out of KUnit context
  2024-08-19 21:52   ` Lucas De Marchi
@ 2024-08-20 10:31     ` Michal Wajdeczko
  0 siblings, 0 replies; 47+ messages in thread
From: Michal Wajdeczko @ 2024-08-20 10:31 UTC (permalink / raw)
  To: Lucas De Marchi; +Cc: intel-xe



On 19.08.2024 23:52, Lucas De Marchi wrote:
> On Fri, Aug 09, 2024 at 06:51:54PM GMT, Michal Wajdeczko wrote:
>> The KUNIT_STATIC_STUB_REDIRECT() allows to redirect function call but
>> will
>> work only if the caller is in a KUnit context. To allow implementation of
>> the more complex test cases, add helpers that allow calling stubs also
>> out
>> of a KUnit context.
>>
>> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
>> Cc: Lucas De Marchi <lucas.demarchi@intel.com>
>> ---
>> drivers/gpu/drm/xe/tests/xe_test.h | 74 ++++++++++++++++++++++++++++++
>> 1 file changed, 74 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/xe/tests/xe_test.h
>> b/drivers/gpu/drm/xe/tests/xe_test.h
>> index b8fa409ce2b1..ffa8fa6c96f0 100644
>> --- a/drivers/gpu/drm/xe/tests/xe_test.h
>> +++ b/drivers/gpu/drm/xe/tests/xe_test.h
>> @@ -54,11 +54,85 @@ xe_cur_kunit_priv(enum xe_test_priv_id id)
>>     return priv->id == id ? priv : NULL;
>> }
>>
>> +/**
>> + * XE_TEST_REDIRECT() - Call a function stub if one exists.
>> + * @stub: The pointer to the function stub
>> + * @args: All of the arguments passed to this stub
>> + *
>> + * This is a function prologue which is used to allow calls to the
>> current
>> + * function to be redirected if a KUnit is running. If the stub is
>> NULL or
>> + * the KUnit is not running the function will continue execution as
>> normal.
>> + *
>> + * Unlikely the KUNIT_STATIC_STUB_REDIRECT(), this redirection will work
>> + * even if the caller is not in a KUnit context (like a worker thread).
>> + *
>> + * Example:
>> + *
>> + * .. code-block:: c
>> + *
>> + *    int (*stub)(int n);
>> + *
>> + *    int real_func(int n)
>> + *    {
>> + *        XE_TEST_REDIRECT(stub, n);
>> + *        return n + 1;
>> + *    }
>> + *
>> + *    int replacement_func(int n)
>> + *    {
>> + *        return n + 100;
>> + *    }
>> + *
>> + *    void example_test(struct kunit *test)
>> + *    {
>> + *        stub = replacement_func;
>> + *        KUNIT_EXPECT_EQ(test, real_func(1), 101);
>> + *        KUNIT_EXPECT_EQ(test, real_func(1), 101);
>> + *    }
>> + */
>> +#define XE_TEST_REDIRECT(stub, args...)                            \
> 
> this seems another one that should rather be in the kunit layer, not in
> xe

will try to prepare generic kunit patch, but I was just hoping that we
can have/use something sooner without waiting until it will accepted there

> 
>> +do {                                            \
>> +    typeof(stub) replacement = (stub);                        \
>> +    if (XE_TEST_RUNNING()) {                            \
>> +        if (unlikely(replacement)) {                        \
>> +            pr_info(KUNIT_SUBTEST_INDENT "# %s: calling stub
>> %ps\n",    \
>> +                __func__, replacement);                    \
> 
> KUNIT_STATIC_STUB_REDIRECT() silently calls the stub without pr_info().
> Why does this version need to be extra-verbose?

KUNIT_STATIC_STUB_REDIRECT() only works in kunit context so likely your
test is almost directly exercise that redirection, while here
replacement function will used for any code that executes during the
test, so this will help identify any unexpected redirections

and this extra-verbose 'noise' will not be seen unless your test fails
(unless you will use --raw_output)

> 
> Lucas De Marchi
> 
> 
>> +            return replacement(args);                    \
>> +        }                                    \
>> +    }                                        \
>> +} while (0)
>> +
>> +static inline void __nullify_pointer(void *data)
>> +{
>> +    void **ptr = data;
>> +
>> +    *ptr = NULL;
>> +}
>> +
>> +/**
>> + * XE_TEST_ACTIVATE_STUB() - Setup a function stub.
>> + * @test: Test case that wants to setup a function stub
>> + * @stub: The function stub pointer
>> + * @replacement: The replacement function
>> + *
>> + * This helper setups a function stub with the replacement function.
>> + * It will also automatically restore stub to NULL at the test end.
>> + */
>> +#define XE_TEST_ACTIVATE_STUB(test, stub, replacement)   
>> ({                    \
>> +    typeof(test) __test = (test);                                \
>> +    typeof(stub) *__ptr = &(stub);                                \
>> +    typecheck_pointer(*__ptr);                                \
>> +    *__ptr = (replacement);                                    \
>> +    kunit_info(__test, "activated stub %s with %ps\n",
>> __stringify(stub), *__ptr);        \
>> +    kunit_add_action_or_reset(__test, __nullify_pointer,
>> __ptr);                \
>> +})
>> +
>> #else /* if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST) */
>>
>> #define XE_TEST_DECLARE(x)
>> #define XE_TEST_ONLY(x) 0
>> #define XE_TEST_RUNNING() false
>> +#define XE_TEST_REDIRECT(...) do { } while (0)
>>
>> #define xe_cur_kunit_priv(_id) NULL
>>
>> -- 
>> 2.43.0
>>

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

* Re: [PATCH 01/12] drm/xe/pf: Add function to sanitize VF resources
  2024-08-20  9:38     ` Michal Wajdeczko
@ 2024-08-20 13:16       ` Lucas De Marchi
  2024-09-05 18:07         ` Rodrigo Vivi
  0 siblings, 1 reply; 47+ messages in thread
From: Lucas De Marchi @ 2024-08-20 13:16 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe, Rodrigo Vivi, Thomas Hellstrom

On Tue, Aug 20, 2024 at 11:38:35AM GMT, Michal Wajdeczko wrote:
>
>
>On 19.08.2024 22:47, Lucas De Marchi wrote:
>> On Fri, Aug 09, 2024 at 06:51:48PM GMT, Michal Wajdeczko wrote:
>>> +static int pf_sanitize_lmem(struct xe_tile *tile, struct xe_bo *bo,
>>> long timeout)
>>
>> it took a while to make xe use "vram"... now we are back with lmem in
>> several places :(
>>
>
>it's because GuC ABI is using LMEM terminology
>
>if you really want then I can try to rename implementation side to use
>'vram' instead, but question is what to do with debugfs entries that
>reflects GuC ABI almost 1:1, should it also be named with vram ?
>
>gt0/pf/lmem_spare	-> gt0/pf/vram_spare
>gt0/vf1/lmem_quota	-> gt0/vf1/vram_quota

+Rodrigo, +Thomas

Lucas De Marchi

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

* Re: [PATCH 05/12] drm/xe/tests: Allow deferred function call during KUnit test
  2024-08-20 10:23     ` Michal Wajdeczko
@ 2024-08-20 13:21       ` Lucas De Marchi
  2024-08-20 13:27       ` Lucas De Marchi
  1 sibling, 0 replies; 47+ messages in thread
From: Lucas De Marchi @ 2024-08-20 13:21 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

On Tue, Aug 20, 2024 at 12:23:43PM GMT, Michal Wajdeczko wrote:
>
>
>On 19.08.2024 23:38, Lucas De Marchi wrote:
>> On Fri, Aug 09, 2024 at 06:51:52PM GMT, Michal Wajdeczko wrote:
>>> For some advanced test cases we might want to simulate external
>>> activity that will stimulate function under test. Add set of
>>> helper functions to implement such requirement. Usage example:
>>>
>>>  static void foo(struct xe_device *xe)
>>>  {
>>>      WRITE_ONCE(xe->foo, 1);
>>>  }
>>>
>>>  static void foo_test(struct kunit *test)
>>>  {
>>>      struct xe_device *xe = test->priv;
>>>
>>>      xe_kunit_helper_delayed_call(test, HZ / 2, foo, xe);
>>>
>>>      KUNIT_EXPECT_EQ(test, 0, READ_ONCE(xe->foo));
>>>      schedule_timeout_uninterruptible(HZ);
>>>      KUNIT_EXPECT_EQ(test, 1, READ_ONCE(xe->foo));
>>>  }
>>>
>>> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
>>> Cc: Lucas De Marchi <lucas.demarchi@intel.com>
>>> ---
>>> drivers/gpu/drm/xe/tests/xe_kunit_helpers.c | 148 ++++++++++++++++++++
>>> drivers/gpu/drm/xe/tests/xe_kunit_helpers.h |  38 +++++
>>> 2 files changed, 186 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
>>> b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
>>> index bc5156966ce9..8fe1a0918b32 100644
>>> --- a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
>>> +++ b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
>>> @@ -127,3 +127,151 @@ int
>>> xe_kunit_helper_xe_device_live_test_init(struct kunit *test)
>>>     return 0;
>>> }
>>> EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_xe_device_live_test_init);
>>> +
>>> +struct xe_kunit_call {
>>> +    struct delayed_work work;
>>> +    struct kunit *test;
>>> +    struct {
>>> +        int (*int_gt)(struct xe_gt *gt);
>>> +        int (*int_gt_uint)(struct xe_gt *gt, unsigned int n);
>>> +        void (*void_gt)(struct xe_gt *gt);
>>> +        void (*void_gt_uint)(struct xe_gt *gt, unsigned int n);
>>> +        void (*void_xe)(struct xe_device *xe);
>>
>> I think the only reason why you're adding this in xe is because you are
>> using xe-specific types. This could rather be done generically by
>> always using int delayed_func(void *data). Then you can simply add it to
>> kunit and get it reviewed there.
>
>while some generic functionality could be always extracted and moved to
>the kunit, for easier use in Xe tests likely we will still need some
>wrappers with xe-specific types, so do we really always need to start
>with trying enhance generic kunit first and then wait for acceptance
>until we can use such extension in our test code?
>
>IMO this could be in parallel, so in kunit review we can point how this
>is already being used..
>
>anyway, will try to split that feature into 'generic' and 'xe'
>
>>
>> Also thinking that the example you added in the commit message is likely
>> suggesting the wrong type of test, that a) sleep too much and b) tend to
>> be noisy
>
>only tests longer than 2s are considered SLOW ;)
>
>and HZ was just picked to have an example small
>
>and you will not see any noise if test PASSES

any test we add that follows the pattern "fire something to do X, sleep,
assert it did X" falls in one of the 2 categories: either sleep too
much (in this example you're using 2x) and/or created noise because the
time slept wasn't sufficient.

Lucas De Marchi

>
>>
>> Lucas De Marchi
>>
>>> +    } func;
>>> +    struct {
>>> +        struct xe_device *xe;
>>> +        struct xe_gt *gt;
>>> +        unsigned int n;
>>> +    } args;
>>> +};
>>> +
>>> +static void call_work_func(struct work_struct *work)
>>> +{
>>> +    struct xe_kunit_call *call = container_of(work, typeof(*call),
>>> work.work);
>>> +
>>> +    if (call->func.void_xe) {
>>> +        kunit_info(call->test, "calling %ps(xe)\n", call->func.void_xe);
>>> +        call->func.void_xe(call->args.xe);
>>> +        kunit_info(call->test, "%ps(xe) completed\n",
>>> call->func.void_xe);
>>> +    } else if (call->func.void_gt) {
>>> +        kunit_info(call->test, "%ps(gt)\n", call->func.void_gt);
>>> +        call->func.void_gt(call->args.gt);
>>> +        kunit_info(call->test, "%ps(gt) completed\n",
>>> call->func.void_gt);
>>> +    } else if (call->func.int_gt_uint) {
>>> +        int ret;
>>> +
>>> +        kunit_info(call->test, "calling %ps(gt,%u)\n",
>>> +               call->func.int_gt_uint, call->args.n);
>>> +        ret = call->func.int_gt_uint(call->args.gt, call->args.n);
>>> +        if (ret < 0) {
>>> +            kunit_info(call->test, "%ps(gt,%u) reported error %pe\n",
>>> +                   call->func.int_gt_uint, call->args.n, ERR_PTR(ret));
>>> +        } else {
>>> +            kunit_info(call->test, "%ps(gt,%u) returned %d\n",
>>> +                   call->func.int_gt_uint, call->args.n, ret);
>>> +        }
>>> +    }
>>> +}
>>> +
>>> +static struct xe_kunit_call *prepare_call(struct kunit *test)
>>> +{
>>> +    struct xe_kunit_call *call;
>>> +
>>> +    call = kunit_kzalloc(test, sizeof(*call), GFP_KERNEL);
>>> +    KUNIT_ASSERT_NOT_NULL(test, call);
>>> +
>>> +    INIT_DELAYED_WORK(&call->work, call_work_func);
>>> +    call->test = test;
>>> +
>>> +    return call;
>>> +}
>>> +
>>> +KUNIT_DEFINE_ACTION_WRAPPER(cancel_call, cancel_delayed_work_sync,
>>> struct delayed_work *);
>>> +
>>> +static void queue_call(struct kunit *test, struct xe_kunit_call
>>> *call, unsigned long delay)
>>> +{
>>> +    queue_delayed_work(system_wq, &call->work, delay);
>>> +    KUNIT_ASSERT_EQ(test, 0, kunit_add_action_or_reset(test,
>>> cancel_call, &call->work));
>>> +}
>>> +
>>> +/**
>>> + * xe_kunit_helper_delayed_call_void_xe_device - Queue a function
>>> call during KUnit test
>>> + * @test: the &kunit test case
>>> + * @delay: number of jiffies to wait before queueing
>>> + * @func: the &xe_device function to call
>>> + * @xe: the &xe_device argument
>>> + *
>>> + * This function uses KUNIT_ASSERT to detect any failures.
>>> + */
>>> +void xe_kunit_helper_delayed_call_void_xe_device(struct kunit *test,
>>> +                         unsigned long delay,
>>> +                         void (*func)(struct xe_device *xe),
>>> +                         struct xe_device *xe)
>>> +{
>>> +    struct xe_kunit_call *call = prepare_call(test);
>>> +
>>> +    KUNIT_ASSERT_NOT_NULL(test, func);
>>> +    KUNIT_ASSERT_NOT_NULL(test, xe);
>>> +
>>> +    call->func.void_xe = func;
>>> +    call->args.xe = xe;
>>> +
>>> +    return queue_call(test, call, delay);
>>> +}
>>> +EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_delayed_call_void_xe_device);
>>> +
>>> +/**
>>> + * xe_kunit_helper_delayed_call_void_xe_gt - Queue a function call
>>> during KUnit test
>>> + * @test: the &kunit test case
>>> + * @delay: number of jiffies to wait before queueing
>>> + * @func: the &xe_gt function to call
>>> + * @gt: the &xe_gt function argument
>>> + *
>>> + * This function uses KUNIT_ASSERT to detect any failures.
>>> + */
>>> +void xe_kunit_helper_delayed_call_void_xe_gt(struct kunit *test,
>>> +                         unsigned long delay,
>>> +                         void (*func)(struct xe_gt *gt),
>>> +                         struct xe_gt *gt)
>>> +{
>>> +    struct xe_kunit_call *call = prepare_call(test);
>>> +
>>> +    KUNIT_ASSERT_NOT_NULL(test, func);
>>> +    KUNIT_ASSERT_NOT_NULL(test, gt);
>>> +
>>> +    call->func.void_gt = func;
>>> +    call->args.gt = gt;
>>> +
>>> +    return queue_call(test, call, delay);
>>> +}
>>> +EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_delayed_call_void_xe_gt);
>>> +
>>> +/**
>>> + * xe_kunit_helper_delayed_call_int_xe_gt_uint - Queue a function
>>> call during KUnit test
>>> + * @test: the &kunit test case
>>> + * @delay: number of jiffies to wait before queueing
>>> + * @func: the &xe_gt function to call
>>> + * @gt: the &xe_gt function argument
>>> + * @n: the function argument
>>> + *
>>> + * This function uses KUNIT_ASSERT to detect any failures.
>>> + */
>>> +void xe_kunit_helper_delayed_call_int_xe_gt_uint(struct kunit *test,
>>> +                         unsigned long delay,
>>> +                         int (*func)(struct xe_gt *gt,
>>> +                                 unsigned int vfid),
>>> +                         struct xe_gt *gt,
>>> +                         unsigned int n)
>>> +{
>>> +    struct xe_kunit_call *call = prepare_call(test);
>>> +
>>> +    KUNIT_ASSERT_NOT_NULL(test, func);
>>> +    KUNIT_ASSERT_NOT_NULL(test, gt);
>>> +
>>> +    call->func.int_gt_uint = func;
>>> +    call->args.gt = gt;
>>> +    call->args.n = n;
>>> +
>>> +    return queue_call(test, call, delay);
>>> +}
>>> +EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_delayed_call_int_xe_gt_uint);
>>> diff --git a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
>>> b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
>>> index 83665f7b1254..ec5287947ee4 100644
>>> --- a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
>>> +++ b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
>>> @@ -9,6 +9,7 @@
>>> struct device;
>>> struct kunit;
>>> struct xe_device;
>>> +struct xe_gt;
>>>
>>> struct xe_device *xe_kunit_helper_alloc_xe_device(struct kunit *test,
>>>                           struct device *dev);
>>> @@ -16,4 +17,41 @@ int xe_kunit_helper_xe_device_test_init(struct
>>> kunit *test);
>>>
>>> int xe_kunit_helper_xe_device_live_test_init(struct kunit *test);
>>>
>>> +void xe_kunit_helper_delayed_call_void_xe_device(struct kunit *test,
>>> +                         unsigned long delay,
>>> +                         void (*func)(struct xe_device *xe),
>>> +                         struct xe_device *xe);
>>> +
>>> +void xe_kunit_helper_delayed_call_void_xe_gt(struct kunit *test,
>>> +                         unsigned long delay,
>>> +                         void (*func)(struct xe_gt *gt),
>>> +                         struct xe_gt *gt);
>>> +
>>> +void xe_kunit_helper_delayed_call_int_xe_gt_uint(struct kunit *test,
>>> +                         unsigned long delay,
>>> +                         int (*func)(struct xe_gt *gt,
>>> +                                 unsigned int vfid),
>>> +                         struct xe_gt *gt,
>>> +                         unsigned int n);
>>> +
>>> +/**
>>> + * xe_kunit_helper_delayed_call - Queue a function call during KUnit
>>> test
>>> + * @test: the &kunit test case
>>> + * @delay: number of jiffies to wait before queueing
>>> + * @func: the &xe_device or &xe_gt function to call
>>> + * @args: the &xe_device or &xe_gt and other function arguments
>>> + *
>>> + * This is a helper macro that compiles into dedicated function call
>>> based on
>>> + * the provided argument types.
>>> + */
>>> +#define xe_kunit_helper_delayed_call(test, delay, func, args...)    \
>>> +    _Generic(func,                            \
>>> +         void (*)(struct xe_device *) :                \
>>> +            xe_kunit_helper_delayed_call_void_xe_device,    \
>>> +         void (*)(struct xe_gt *) :                \
>>> +            xe_kunit_helper_delayed_call_void_xe_gt,    \
>>> +         int (*)(struct xe_gt *, unsigned int) :        \
>>> +            xe_kunit_helper_delayed_call_int_xe_gt_uint    \
>>> +    )(test, delay, func, args)
>>> +
>>> #endif
>>> -- 
>>> 2.43.0
>>>

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

* Re: [PATCH 05/12] drm/xe/tests: Allow deferred function call during KUnit test
  2024-08-20 10:23     ` Michal Wajdeczko
  2024-08-20 13:21       ` Lucas De Marchi
@ 2024-08-20 13:27       ` Lucas De Marchi
  1 sibling, 0 replies; 47+ messages in thread
From: Lucas De Marchi @ 2024-08-20 13:27 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

On Tue, Aug 20, 2024 at 12:23:43PM GMT, Michal Wajdeczko wrote:
>
>
>On 19.08.2024 23:38, Lucas De Marchi wrote:
>> On Fri, Aug 09, 2024 at 06:51:52PM GMT, Michal Wajdeczko wrote:
>>> For some advanced test cases we might want to simulate external
>>> activity that will stimulate function under test. Add set of
>>> helper functions to implement such requirement. Usage example:
>>>
>>>  static void foo(struct xe_device *xe)
>>>  {
>>>      WRITE_ONCE(xe->foo, 1);
>>>  }
>>>
>>>  static void foo_test(struct kunit *test)
>>>  {
>>>      struct xe_device *xe = test->priv;
>>>
>>>      xe_kunit_helper_delayed_call(test, HZ / 2, foo, xe);
>>>
>>>      KUNIT_EXPECT_EQ(test, 0, READ_ONCE(xe->foo));
>>>      schedule_timeout_uninterruptible(HZ);
>>>      KUNIT_EXPECT_EQ(test, 1, READ_ONCE(xe->foo));
>>>  }
>>>
>>> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
>>> Cc: Lucas De Marchi <lucas.demarchi@intel.com>
>>> ---
>>> drivers/gpu/drm/xe/tests/xe_kunit_helpers.c | 148 ++++++++++++++++++++
>>> drivers/gpu/drm/xe/tests/xe_kunit_helpers.h |  38 +++++
>>> 2 files changed, 186 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
>>> b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
>>> index bc5156966ce9..8fe1a0918b32 100644
>>> --- a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
>>> +++ b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.c
>>> @@ -127,3 +127,151 @@ int
>>> xe_kunit_helper_xe_device_live_test_init(struct kunit *test)
>>>     return 0;
>>> }
>>> EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_xe_device_live_test_init);
>>> +
>>> +struct xe_kunit_call {
>>> +    struct delayed_work work;
>>> +    struct kunit *test;
>>> +    struct {
>>> +        int (*int_gt)(struct xe_gt *gt);
>>> +        int (*int_gt_uint)(struct xe_gt *gt, unsigned int n);
>>> +        void (*void_gt)(struct xe_gt *gt);
>>> +        void (*void_gt_uint)(struct xe_gt *gt, unsigned int n);
>>> +        void (*void_xe)(struct xe_device *xe);
>>
>> I think the only reason why you're adding this in xe is because you are
>> using xe-specific types. This could rather be done generically by
>> always using int delayed_func(void *data). Then you can simply add it to
>> kunit and get it reviewed there.
>
>while some generic functionality could be always extracted and moved to
>the kunit, for easier use in Xe tests likely we will still need some
>wrappers with xe-specific types, so do we really always need to start
>with trying enhance generic kunit first and then wait for acceptance
>until we can use such extension in our test code?

the other option is that we keep creating a mini-subsystem inside xe and
if we don't push back, the generic part is never done as people move on
to other tasks.

>
>IMO this could be in parallel, so in kunit review we can point how this
>is already being used..

Yes, sometimes it's better to do the concrete thing and
use that to advocate for the generic feature, but we should balance on
how much we want to maintain in the mid/long term.

>
>anyway, will try to split that feature into 'generic' and 'xe'

if the generic part is acceptable to kunit maintainers, we can always
ask to merge that via drm-xe with their acks.

Lucas De Marchi

>
>>
>> Also thinking that the example you added in the commit message is likely
>> suggesting the wrong type of test, that a) sleep too much and b) tend to
>> be noisy
>
>only tests longer than 2s are considered SLOW ;)
>
>and HZ was just picked to have an example small
>
>and you will not see any noise if test PASSES
>
>>
>> Lucas De Marchi
>>
>>> +    } func;
>>> +    struct {
>>> +        struct xe_device *xe;
>>> +        struct xe_gt *gt;
>>> +        unsigned int n;
>>> +    } args;
>>> +};
>>> +
>>> +static void call_work_func(struct work_struct *work)
>>> +{
>>> +    struct xe_kunit_call *call = container_of(work, typeof(*call),
>>> work.work);
>>> +
>>> +    if (call->func.void_xe) {
>>> +        kunit_info(call->test, "calling %ps(xe)\n", call->func.void_xe);
>>> +        call->func.void_xe(call->args.xe);
>>> +        kunit_info(call->test, "%ps(xe) completed\n",
>>> call->func.void_xe);
>>> +    } else if (call->func.void_gt) {
>>> +        kunit_info(call->test, "%ps(gt)\n", call->func.void_gt);
>>> +        call->func.void_gt(call->args.gt);
>>> +        kunit_info(call->test, "%ps(gt) completed\n",
>>> call->func.void_gt);
>>> +    } else if (call->func.int_gt_uint) {
>>> +        int ret;
>>> +
>>> +        kunit_info(call->test, "calling %ps(gt,%u)\n",
>>> +               call->func.int_gt_uint, call->args.n);
>>> +        ret = call->func.int_gt_uint(call->args.gt, call->args.n);
>>> +        if (ret < 0) {
>>> +            kunit_info(call->test, "%ps(gt,%u) reported error %pe\n",
>>> +                   call->func.int_gt_uint, call->args.n, ERR_PTR(ret));
>>> +        } else {
>>> +            kunit_info(call->test, "%ps(gt,%u) returned %d\n",
>>> +                   call->func.int_gt_uint, call->args.n, ret);
>>> +        }
>>> +    }
>>> +}
>>> +
>>> +static struct xe_kunit_call *prepare_call(struct kunit *test)
>>> +{
>>> +    struct xe_kunit_call *call;
>>> +
>>> +    call = kunit_kzalloc(test, sizeof(*call), GFP_KERNEL);
>>> +    KUNIT_ASSERT_NOT_NULL(test, call);
>>> +
>>> +    INIT_DELAYED_WORK(&call->work, call_work_func);
>>> +    call->test = test;
>>> +
>>> +    return call;
>>> +}
>>> +
>>> +KUNIT_DEFINE_ACTION_WRAPPER(cancel_call, cancel_delayed_work_sync,
>>> struct delayed_work *);
>>> +
>>> +static void queue_call(struct kunit *test, struct xe_kunit_call
>>> *call, unsigned long delay)
>>> +{
>>> +    queue_delayed_work(system_wq, &call->work, delay);
>>> +    KUNIT_ASSERT_EQ(test, 0, kunit_add_action_or_reset(test,
>>> cancel_call, &call->work));
>>> +}
>>> +
>>> +/**
>>> + * xe_kunit_helper_delayed_call_void_xe_device - Queue a function
>>> call during KUnit test
>>> + * @test: the &kunit test case
>>> + * @delay: number of jiffies to wait before queueing
>>> + * @func: the &xe_device function to call
>>> + * @xe: the &xe_device argument
>>> + *
>>> + * This function uses KUNIT_ASSERT to detect any failures.
>>> + */
>>> +void xe_kunit_helper_delayed_call_void_xe_device(struct kunit *test,
>>> +                         unsigned long delay,
>>> +                         void (*func)(struct xe_device *xe),
>>> +                         struct xe_device *xe)
>>> +{
>>> +    struct xe_kunit_call *call = prepare_call(test);
>>> +
>>> +    KUNIT_ASSERT_NOT_NULL(test, func);
>>> +    KUNIT_ASSERT_NOT_NULL(test, xe);
>>> +
>>> +    call->func.void_xe = func;
>>> +    call->args.xe = xe;
>>> +
>>> +    return queue_call(test, call, delay);
>>> +}
>>> +EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_delayed_call_void_xe_device);
>>> +
>>> +/**
>>> + * xe_kunit_helper_delayed_call_void_xe_gt - Queue a function call
>>> during KUnit test
>>> + * @test: the &kunit test case
>>> + * @delay: number of jiffies to wait before queueing
>>> + * @func: the &xe_gt function to call
>>> + * @gt: the &xe_gt function argument
>>> + *
>>> + * This function uses KUNIT_ASSERT to detect any failures.
>>> + */
>>> +void xe_kunit_helper_delayed_call_void_xe_gt(struct kunit *test,
>>> +                         unsigned long delay,
>>> +                         void (*func)(struct xe_gt *gt),
>>> +                         struct xe_gt *gt)
>>> +{
>>> +    struct xe_kunit_call *call = prepare_call(test);
>>> +
>>> +    KUNIT_ASSERT_NOT_NULL(test, func);
>>> +    KUNIT_ASSERT_NOT_NULL(test, gt);
>>> +
>>> +    call->func.void_gt = func;
>>> +    call->args.gt = gt;
>>> +
>>> +    return queue_call(test, call, delay);
>>> +}
>>> +EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_delayed_call_void_xe_gt);
>>> +
>>> +/**
>>> + * xe_kunit_helper_delayed_call_int_xe_gt_uint - Queue a function
>>> call during KUnit test
>>> + * @test: the &kunit test case
>>> + * @delay: number of jiffies to wait before queueing
>>> + * @func: the &xe_gt function to call
>>> + * @gt: the &xe_gt function argument
>>> + * @n: the function argument
>>> + *
>>> + * This function uses KUNIT_ASSERT to detect any failures.
>>> + */
>>> +void xe_kunit_helper_delayed_call_int_xe_gt_uint(struct kunit *test,
>>> +                         unsigned long delay,
>>> +                         int (*func)(struct xe_gt *gt,
>>> +                                 unsigned int vfid),
>>> +                         struct xe_gt *gt,
>>> +                         unsigned int n)
>>> +{
>>> +    struct xe_kunit_call *call = prepare_call(test);
>>> +
>>> +    KUNIT_ASSERT_NOT_NULL(test, func);
>>> +    KUNIT_ASSERT_NOT_NULL(test, gt);
>>> +
>>> +    call->func.int_gt_uint = func;
>>> +    call->args.gt = gt;
>>> +    call->args.n = n;
>>> +
>>> +    return queue_call(test, call, delay);
>>> +}
>>> +EXPORT_SYMBOL_IF_KUNIT(xe_kunit_helper_delayed_call_int_xe_gt_uint);
>>> diff --git a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
>>> b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
>>> index 83665f7b1254..ec5287947ee4 100644
>>> --- a/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
>>> +++ b/drivers/gpu/drm/xe/tests/xe_kunit_helpers.h
>>> @@ -9,6 +9,7 @@
>>> struct device;
>>> struct kunit;
>>> struct xe_device;
>>> +struct xe_gt;
>>>
>>> struct xe_device *xe_kunit_helper_alloc_xe_device(struct kunit *test,
>>>                           struct device *dev);
>>> @@ -16,4 +17,41 @@ int xe_kunit_helper_xe_device_test_init(struct
>>> kunit *test);
>>>
>>> int xe_kunit_helper_xe_device_live_test_init(struct kunit *test);
>>>
>>> +void xe_kunit_helper_delayed_call_void_xe_device(struct kunit *test,
>>> +                         unsigned long delay,
>>> +                         void (*func)(struct xe_device *xe),
>>> +                         struct xe_device *xe);
>>> +
>>> +void xe_kunit_helper_delayed_call_void_xe_gt(struct kunit *test,
>>> +                         unsigned long delay,
>>> +                         void (*func)(struct xe_gt *gt),
>>> +                         struct xe_gt *gt);
>>> +
>>> +void xe_kunit_helper_delayed_call_int_xe_gt_uint(struct kunit *test,
>>> +                         unsigned long delay,
>>> +                         int (*func)(struct xe_gt *gt,
>>> +                                 unsigned int vfid),
>>> +                         struct xe_gt *gt,
>>> +                         unsigned int n);
>>> +
>>> +/**
>>> + * xe_kunit_helper_delayed_call - Queue a function call during KUnit
>>> test
>>> + * @test: the &kunit test case
>>> + * @delay: number of jiffies to wait before queueing
>>> + * @func: the &xe_device or &xe_gt function to call
>>> + * @args: the &xe_device or &xe_gt and other function arguments
>>> + *
>>> + * This is a helper macro that compiles into dedicated function call
>>> based on
>>> + * the provided argument types.
>>> + */
>>> +#define xe_kunit_helper_delayed_call(test, delay, func, args...)    \
>>> +    _Generic(func,                            \
>>> +         void (*)(struct xe_device *) :                \
>>> +            xe_kunit_helper_delayed_call_void_xe_device,    \
>>> +         void (*)(struct xe_gt *) :                \
>>> +            xe_kunit_helper_delayed_call_void_xe_gt,    \
>>> +         int (*)(struct xe_gt *, unsigned int) :        \
>>> +            xe_kunit_helper_delayed_call_int_xe_gt_uint    \
>>> +    )(test, delay, func, args)
>>> +
>>> #endif
>>> -- 
>>> 2.43.0
>>>

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

* Re: [PATCH 11/12] drm/xe/tests: Add KUnit tests for VF control state machines
  2024-08-09 16:51 ` [PATCH 11/12] drm/xe/tests: Add KUnit tests for VF control state machines Michal Wajdeczko
  2024-08-09 17:23   ` [PATCH v2 " Michal Wajdeczko
@ 2024-08-22 10:47   ` Piotr Piórkowski
  1 sibling, 0 replies; 47+ messages in thread
From: Piotr Piórkowski @ 2024-08-22 10:47 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe, Lucas De Marchi

Michal Wajdeczko <michal.wajdeczko@intel.com> wrote on pią [2024-sie-09 18:51:58 +0200]:
> Add KUnit tests (~200) for all VF control state machines (FLR,
> PAUSE, STOP and RESUME) to make sure they work as expected and
> will not be broken while extending them with new functionality.
> 
> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Lucas De Marchi <lucas.demarchi@intel.com>
> ---
> Test file named according to the new best practices [1]
> [1] https://lore.kernel.org/linux-hardening/20240724201354.make.730-kees@kernel.org/
> ---
>  .../xe/tests/xe_gt_sriov_pf_control_kunit.c   | 1360 +++++++++++++++++
>  drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c   |    7 +
>  2 files changed, 1367 insertions(+)
>  create mode 100644 drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
> 
> diff --git a/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c b/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
> new file mode 100644
> index 000000000000..4252577b4bbd
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
> @@ -0,0 +1,1360 @@
> +// SPDX-License-Identifier: GPL-2.0 AND MIT
> +/*
> + * Copyright © 2024 Intel Corporation
> + */
> +
> +#include <kunit/test.h>
> +#include <kunit/static_stub.h>
> +
> +#include "tests/xe_kunit_helpers.h"
> +#include "tests/xe_pci_test.h"
> +
> +#include "xe_gt_sriov_pf.h"
> +
> +static const unsigned int DUT_NUM_VFS = 2;
> +static const unsigned int VFUT1 = VFID(1);
> +static const unsigned int VFUT2 = VFID(2);
> +
> +static void dump_state(void *arg)
> +{
> +	struct xe_gt *gt = arg;
> +
> +	pf_dump_vf_state(gt, VFUT1);
> +}
> +
> +static unsigned long replacement_timeout(enum xe_gt_sriov_control_bits bit)
> +{
> +	return HZ;
> +}
> +
> +static int pf_control_test_init(struct kunit *test)
> +{
> +	struct xe_pci_fake_data fake = {
> +		.sriov_mode = XE_SRIOV_MODE_PF,
> +		.platform = XE_TIGERLAKE, /* some random platform */
> +		.subplatform = XE_SUBPLATFORM_NONE,
> +	};
> +	struct xe_device *xe;
> +	struct xe_gt *gt;
> +
> +	test->priv = &fake;
> +	xe_kunit_helper_xe_device_test_init(test);
> +
> +	xe = test->priv;
> +	KUNIT_ASSERT_EQ(test, xe_sriov_init(xe), 0);
> +
> +	xe->sriov.pf.driver_max_vfs = DUT_NUM_VFS;
> +	KUNIT_EXPECT_NE(test, xe_sriov_pf_get_totalvfs(xe), 0);
> +
> +	gt = xe_device_get_gt(xe, 0);
> +	KUNIT_ASSERT_EQ(test, xe_gt_sriov_pf_init_early(gt), 0);
> +
> +	KUNIT_ASSERT_EQ(test, 0ul, *__pf_peek_vf_state(gt, VFUT1));
> +	KUNIT_ASSERT_EQ(test, 0ul, *__pf_peek_vf_state(gt, VFUT2));
> +
> +	KUNIT_EXPECT_EQ(test, 0, kunit_add_action_or_reset(test, dump_state, gt));
> +
> +	kunit_activate_static_stub(test, pf_get_default_timeout, replacement_timeout);
> +
> +	test->priv = gt;
> +	return 0;
> +}
> +
> +static int sanitize_vf_resources_fail(struct xe_gt *gt, u32 vfid, long timeout)
> +{
> +	return -ETIMEDOUT;
> +}
> +
> +static int send_vf_control_cmd_reject(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	return -EIO;
> +}
> +
> +static int send_vf_control_cmd_fail(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	return -ENODEV;
> +}
> +
> +static int send_vf_control_cmd_pass_no_reply(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	return 0;
> +}
> +
> +static int send_vf_control_cmd_pass_and_reply(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	switch (cmd) {
> +	case GUC_PF_TRIGGER_VF_PAUSE:
> +		pf_handle_vf_event(gt, vfid, GUC_PF_NOTIFY_VF_PAUSE_DONE);
> +		break;
> +	case GUC_PF_TRIGGER_VF_FLR_START:
> +		pf_handle_vf_event(gt, vfid, GUC_PF_NOTIFY_VF_FLR_DONE);
> +		break;
> +	case GUC_PF_TRIGGER_VF_RESUME:
> +	case GUC_PF_TRIGGER_VF_STOP:
> +	case GUC_PF_TRIGGER_VF_FLR_FINISH:
> +		break;
> +	default:
> +		return -EPROTO;
> +	}
> +	return 0;
> +}
> +
> +static int send_vf_control_cmd_busy_wait(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	schedule_timeout_interruptible(HZ / 20);
> +	return -EBUSY;
> +}
> +
> +static int send_vf_control_cmd_pass_but_reply_flr_only(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	return cmd == GUC_PF_TRIGGER_VF_FLR_START ?
> +		send_vf_control_cmd_pass_and_reply(gt, vfid, cmd) :
> +		send_vf_control_cmd_pass_no_reply(gt, vfid, cmd);
> +}
> +
> +static int send_vf_control_cmd_busy_except_flr(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	return cmd == GUC_PF_TRIGGER_VF_FLR_START || cmd == GUC_PF_TRIGGER_VF_FLR_FINISH ?
> +		send_vf_control_cmd_pass_and_reply(gt, vfid, cmd) :
> +		send_vf_control_cmd_busy_wait(gt, vfid, cmd);
> +}
> +
> +static int send_vf_control_cmd_busy_except_stop(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	return cmd == GUC_PF_TRIGGER_VF_STOP ?
> +		send_vf_control_cmd_pass_and_reply(gt, vfid, cmd) :
> +		send_vf_control_cmd_busy_wait(gt, vfid, cmd);
> +}
> +
> +static int BUSY_MAGIC = 3;
> +
> +static int send_vf_control_cmd_busy_no_reply(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	static int counter;
> +
> +	return ++counter % BUSY_MAGIC ? -EBUSY : 0;
> +}
> +
> +static int send_vf_control_cmd_busy_and_reply(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	static int counter;
> +
> +	return ++counter % BUSY_MAGIC ? -EBUSY :
> +		send_vf_control_cmd_pass_and_reply(gt, vfid, cmd);
> +}
> +
> +static const enum xe_gt_sriov_control_bits ready[] = {
> +};
> +
> +static const enum xe_gt_sriov_control_bits flr_starting[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_FLR_WIP,
> +	XE_GT_SRIOV_STATE_FLR_SEND_START,
> +};
> +
> +static const enum xe_gt_sriov_control_bits flr_starting_paused[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_FLR_WIP,
> +	XE_GT_SRIOV_STATE_FLR_SEND_START,
> +	XE_GT_SRIOV_STATE_PAUSED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits flr_starting_stopped[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_FLR_WIP,
> +	XE_GT_SRIOV_STATE_FLR_SEND_START,
> +	XE_GT_SRIOV_STATE_STOPPED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits flr_waiting[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_FLR_WIP,
> +	XE_GT_SRIOV_STATE_FLR_WAIT_GUC,
> +};
> +
> +static const enum xe_gt_sriov_control_bits flr_guc_done[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_FLR_WIP,
> +	XE_GT_SRIOV_STATE_FLR_GUC_DONE,
> +};
> +
> +static const enum xe_gt_sriov_control_bits flr_resetting[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_FLR_WIP,
> +	XE_GT_SRIOV_STATE_FLR_RESET_CONFIG,
> +};
> +
> +static const enum xe_gt_sriov_control_bits flr_finishing[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_FLR_WIP,
> +	XE_GT_SRIOV_STATE_FLR_SEND_FINISH,
> +};
> +
> +static const enum xe_gt_sriov_control_bits flr_failed[] = {
> +	XE_GT_SRIOV_STATE_FLR_FAILED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits stopping[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_STOP_WIP,
> +	XE_GT_SRIOV_STATE_STOP_SEND_STOP,
> +};
> +
> +static const enum xe_gt_sriov_control_bits stopping_paused[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_STOP_WIP,
> +	XE_GT_SRIOV_STATE_STOP_SEND_STOP,
> +	XE_GT_SRIOV_STATE_PAUSED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits stop_failed[] = {
> +	XE_GT_SRIOV_STATE_STOP_FAILED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits stop_rejected[] = {
> +	XE_GT_SRIOV_STATE_STOP_FAILED,
> +	XE_GT_SRIOV_STATE_MISMATCH,
> +};
> +
> +static const enum xe_gt_sriov_control_bits stopped[] = {
> +	XE_GT_SRIOV_STATE_STOPPED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits pausing[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_PAUSE_WIP,
> +	XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE,
> +};
> +
> +static const enum xe_gt_sriov_control_bits pausing_wait_guc[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_PAUSE_WIP,
> +	XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC,
> +};
> +
> +static const enum xe_gt_sriov_control_bits pausing_guc_done[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_PAUSE_WIP,
> +	XE_GT_SRIOV_STATE_PAUSE_GUC_DONE,
> +};
> +
> +static const enum xe_gt_sriov_control_bits pause_failed[] = {
> +	XE_GT_SRIOV_STATE_PAUSE_FAILED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits pause_rejected[] = {
> +	XE_GT_SRIOV_STATE_PAUSE_FAILED,
> +	XE_GT_SRIOV_STATE_MISMATCH,
> +};
> +
> +static const enum xe_gt_sriov_control_bits paused[] = {
> +	XE_GT_SRIOV_STATE_PAUSED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits resuming[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_PAUSED,
> +	XE_GT_SRIOV_STATE_RESUME_WIP,
> +	XE_GT_SRIOV_STATE_RESUME_SEND_RESUME,
> +};
> +
> +static const enum xe_gt_sriov_control_bits resume_failed[] = {
> +	XE_GT_SRIOV_STATE_PAUSED,
> +	XE_GT_SRIOV_STATE_RESUME_FAILED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits resume_rejected[] = {
> +	XE_GT_SRIOV_STATE_PAUSED,
> +	XE_GT_SRIOV_STATE_RESUME_FAILED,
> +	XE_GT_SRIOV_STATE_MISMATCH,
> +};
> +
> +static const enum xe_gt_sriov_control_bits resumed[] = {
> +	XE_GT_SRIOV_STATE_RESUMED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits mismatch[] = {
> +	XE_GT_SRIOV_STATE_MISMATCH,
> +};
> +
> +struct state_param {
> +	const char *name;
> +	const enum xe_gt_sriov_control_bits *bits;
> +	size_t num_bits;
> +};
> +
> +static void state_param_get_desc(struct state_param *p, char *desc)
> +{
> +	snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s", p->name);
> +}
> +
> +#define MAKE_STATE_PARAM(X) { .name = #X, .bits = X, .num_bits = ARRAY_SIZE(X) }
> +
> +/*
> + * Due to the test case logic the all "must_pass" params include "_rejected" states
> + * since our "GuC" calls by default will not complain again about the INVALID_STATE
> + * thus our state machine is able to fully recover.
> + */
> +
> +static struct state_param flr_must_pass_from[] = {
> +	MAKE_STATE_PARAM(ready),
> +	MAKE_STATE_PARAM(flr_starting),
> +	MAKE_STATE_PARAM(flr_starting_paused),
> +	MAKE_STATE_PARAM(flr_starting_stopped),
> +	MAKE_STATE_PARAM(flr_waiting),
> +	MAKE_STATE_PARAM(flr_guc_done),
> +	MAKE_STATE_PARAM(flr_resetting),
> +	MAKE_STATE_PARAM(flr_finishing),
> +	MAKE_STATE_PARAM(flr_failed),
> +	MAKE_STATE_PARAM(stopping),
> +	MAKE_STATE_PARAM(stop_failed),
> +	MAKE_STATE_PARAM(stop_rejected),
> +	MAKE_STATE_PARAM(stopped),
> +	MAKE_STATE_PARAM(pausing),
> +	MAKE_STATE_PARAM(pausing_wait_guc),
> +	MAKE_STATE_PARAM(pausing_guc_done),
> +	MAKE_STATE_PARAM(pause_failed),
> +	MAKE_STATE_PARAM(pause_rejected),
> +	MAKE_STATE_PARAM(paused),
> +	MAKE_STATE_PARAM(resuming),
> +	MAKE_STATE_PARAM(resume_failed),
> +	MAKE_STATE_PARAM(resume_rejected),
> +	MAKE_STATE_PARAM(resumed),
> +	MAKE_STATE_PARAM(mismatch),
> +};
> +
> +static struct state_param stop_must_pass_from[] = {
> +	MAKE_STATE_PARAM(ready),
> +	MAKE_STATE_PARAM(stop_failed),
> +	MAKE_STATE_PARAM(stop_rejected),
> +	MAKE_STATE_PARAM(pausing),
> +	MAKE_STATE_PARAM(pausing_wait_guc),
> +	MAKE_STATE_PARAM(pausing_guc_done),
> +	MAKE_STATE_PARAM(pause_failed),
> +	MAKE_STATE_PARAM(pause_rejected),
> +	MAKE_STATE_PARAM(paused),
> +	MAKE_STATE_PARAM(resuming),
> +	MAKE_STATE_PARAM(resume_failed),
> +	MAKE_STATE_PARAM(resume_rejected),
> +	MAKE_STATE_PARAM(resumed),
> +	MAKE_STATE_PARAM(mismatch),
> +	MAKE_STATE_PARAM(flr_failed),
> +};
> +
> +static struct state_param stop_must_cancel_from[] = {
> +	MAKE_STATE_PARAM(flr_starting),
> +	MAKE_STATE_PARAM(flr_starting_paused),
> +	MAKE_STATE_PARAM(flr_waiting),
> +	MAKE_STATE_PARAM(flr_guc_done),
> +	MAKE_STATE_PARAM(flr_resetting),
> +	MAKE_STATE_PARAM(flr_finishing),
> +};
> +
> +static struct state_param stop_must_fail_from[] = {
> +	MAKE_STATE_PARAM(stopping),
> +	MAKE_STATE_PARAM(stopping_paused),
> +	MAKE_STATE_PARAM(stopped),
> +	MAKE_STATE_PARAM(flr_starting_stopped),
> +};
> +
> +static struct state_param pause_must_pass_from[] = {
> +	MAKE_STATE_PARAM(ready),
> +	MAKE_STATE_PARAM(pause_failed),
> +	MAKE_STATE_PARAM(pause_rejected),
> +	MAKE_STATE_PARAM(resumed),
> +	MAKE_STATE_PARAM(mismatch),
> +	MAKE_STATE_PARAM(stop_failed),
> +	MAKE_STATE_PARAM(stop_rejected),
> +	MAKE_STATE_PARAM(flr_failed),
> +};
> +
> +static struct state_param pause_must_cancel_from[] = {
> +	MAKE_STATE_PARAM(flr_starting),
> +	MAKE_STATE_PARAM(flr_waiting),
> +	MAKE_STATE_PARAM(flr_guc_done),
> +	MAKE_STATE_PARAM(flr_resetting),
> +	MAKE_STATE_PARAM(flr_finishing),
> +	MAKE_STATE_PARAM(stopping),
> +};
> +
> +static struct state_param pause_must_fail_from[] = {
> +	MAKE_STATE_PARAM(pausing),
> +	MAKE_STATE_PARAM(pausing_wait_guc),
> +	MAKE_STATE_PARAM(pausing_guc_done),
> +	MAKE_STATE_PARAM(paused),
> +	MAKE_STATE_PARAM(resuming),
> +	MAKE_STATE_PARAM(resume_failed),
> +	MAKE_STATE_PARAM(resume_rejected),
> +	MAKE_STATE_PARAM(stopped),
> +};
> +
> +static struct state_param resume_must_pass_from[] = {
> +	MAKE_STATE_PARAM(paused),
> +	MAKE_STATE_PARAM(resume_failed),
> +	MAKE_STATE_PARAM(resume_rejected),
> +};
> +
> +static struct state_param resume_must_cancel_from[] = {
> +	MAKE_STATE_PARAM(flr_starting_paused),
> +	MAKE_STATE_PARAM(stopping_paused),
> +};
> +
> +static struct state_param resume_must_fail_from[] = {
> +	MAKE_STATE_PARAM(ready),
> +	MAKE_STATE_PARAM(pausing),
> +	MAKE_STATE_PARAM(pausing_wait_guc),
> +	MAKE_STATE_PARAM(pausing_guc_done),
> +	MAKE_STATE_PARAM(pause_failed),
> +	MAKE_STATE_PARAM(pause_rejected),
> +	MAKE_STATE_PARAM(resuming),
> +	MAKE_STATE_PARAM(resumed),
> +	MAKE_STATE_PARAM(stopping),
> +	MAKE_STATE_PARAM(stop_failed),
> +	MAKE_STATE_PARAM(stop_rejected),
> +	MAKE_STATE_PARAM(stopped),
> +	MAKE_STATE_PARAM(flr_starting),
> +	MAKE_STATE_PARAM(flr_waiting),
> +	MAKE_STATE_PARAM(flr_guc_done),
> +	MAKE_STATE_PARAM(flr_resetting),
> +	MAKE_STATE_PARAM(flr_finishing),
> +	MAKE_STATE_PARAM(flr_failed),
> +	MAKE_STATE_PARAM(mismatch),
> +};
> +
> +KUNIT_ARRAY_PARAM(flr_must_pass_from, flr_must_pass_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(stop_must_pass_from, stop_must_pass_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(stop_must_fail_from, stop_must_fail_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(stop_must_cancel_from, stop_must_cancel_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(pause_must_pass_from, pause_must_pass_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(pause_must_fail_from, pause_must_fail_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(pause_must_cancel_from, pause_must_cancel_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(resume_must_pass_from, resume_must_pass_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(resume_must_fail_from, resume_must_fail_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(resume_must_cancel_from, resume_must_cancel_from, state_param_get_desc);
> +
> +static int mimic_pf_handle_vf_flr_done(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_handle_vf_flr_done(gt, vfid);
> +	return 0;
> +}
> +
> +static int mimic_pf_handle_vf_pause_done(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_handle_vf_pause_done(gt, vfid);
> +	return 0;
> +}
> +
> +static void prepare_state(struct kunit *test, unsigned int vfid,
> +			  const enum xe_gt_sriov_control_bits *bits, size_t num_bits)
> +{
> +	struct xe_gt *gt = test->priv;
> +	size_t n;
> +
> +	for (n = 0; n < num_bits; n++) {
> +		enum xe_gt_sriov_control_bits bit = bits[n];
> +
> +		KUNIT_ASSERT_TRUE(test, pf_enter_vf_state(gt, vfid, bit));
> +
> +		if (bit == XE_GT_SRIOV_STATE_WIP) {
> +			pf_queue_vf(gt, vfid);
> +		} else if (bit == XE_GT_SRIOV_STATE_FLR_WAIT_GUC) {
> +			xe_kunit_helper_delayed_call(test, HZ / 100,
> +						     mimic_pf_handle_vf_flr_done, gt, vfid);
> +		} else if (bit == XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC) {
> +			xe_kunit_helper_delayed_call(test, HZ / 100,
> +						     mimic_pf_handle_vf_pause_done, gt, vfid);
> +		}
> +	}
> +}
> +
> +static void prepare_state_from_param(struct kunit *test)
> +{
> +	const struct state_param *p = test->param_value;
> +
> +	prepare_state(test, VFUT1, p->bits, p->num_bits);
> +}
> +
> +static void expect_not_pausing(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_GUC_DONE));
> +}
> +
> +static void expect_not_in_pause(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	expect_not_pausing(test);
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
> +}
> +
> +static void expect_not_resuming(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_SEND_RESUME));
> +}
> +
> +static void expect_not_in_resume(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	expect_not_resuming(test);
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
> +}
> +
> +static void expect_not_stopping(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_WIP));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_SEND_STOP));
> +}
> +
> +static void expect_not_in_stop(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	expect_not_stopping(test);
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
> +}
> +
> +static void expect_not_in_flr(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_SEND_START));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WAIT_GUC));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_GUC_DONE));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_SEND_FINISH));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +}
> +
> +static void expect_not_in_wip(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void expect_not_in_mismatch(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +}
> +
> +static void try_flr_vf(struct kunit *test, bool mimic_busy, bool late_reply)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      mimic_busy ? late_reply ? send_vf_control_cmd_busy_no_reply :
> +			      send_vf_control_cmd_busy_and_reply :
> +			      late_reply ? send_vf_control_cmd_pass_no_reply :
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	if (late_reply)
> +		xe_kunit_helper_delayed_call(test, HZ / 10,
> +					     mimic_pf_handle_vf_flr_done, gt, VFUT1);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +
> +	expect_not_in_flr(test);
> +	expect_not_in_pause(test);
> +	expect_not_in_resume(test);
> +	expect_not_in_stop(test);
> +	expect_not_in_mismatch(test);
> +	expect_not_in_wip(test);
> +}
> +
> +static void flr_vf_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_flr_vf(test, false, false);
> +}
> +
> +static void flr_vf_needs_retry_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_flr_vf(test, true, false);
> +}
> +
> +static void flr_vf_needs_retry_late_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_flr_vf(test, true, true);
> +}
> +
> +static void flr_vf_fails_on_send(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_fail);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
> +	KUNIT_EXPECT_NE(test, err, -ECANCELED);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void flr_vf_fails_on_reset(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.vfs[VFUT1].config.sanitize,
> +			      sanitize_vf_resources_fail);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
> +	KUNIT_EXPECT_NE(test, err, -ECANCELED);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void flr_vf_rejected_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_reject);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
> +	KUNIT_EXPECT_NE(test, err, -ECANCELED);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void flr_vf_unconfirmed_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_no_reply);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +	KUNIT_EXPECT_EQ(test, err, -ETIMEDOUT);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +}
> +
> +static void flr_vf_confirmed_early_continue_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, flr_starting, ARRAY_SIZE(flr_starting));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_no_reply);
> +
> +	pf_handle_vf_flr_done(gt, VFUT1);
> +
> +	/*
> +	 * make sure SEND_START completes;
> +	 * successful reply from cmd_pass_no_reply should exit mismatch state
> +	 */
> +	flush_work(&gt->sriov.pf.control.worker);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +}
> +
> +static void flr_vf_confirmed_early_reject_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, flr_starting, ARRAY_SIZE(flr_starting));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_reject);
> +
> +	pf_handle_vf_flr_done(gt, VFUT1);
> +
> +	/*
> +	 * make sure SEND_START completes;
> +	 * error from send_vf_control_cmd_reject should keep mismatch state
> +	 */
> +	flush_work(&gt->sriov.pf.control.worker);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void flr_vf_confirmed_twice_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, flr_guc_done, ARRAY_SIZE(flr_guc_done));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_no_reply);
> +
> +	pf_handle_vf_flr_done(gt, VFUT1);
> +
> +	/* this is fully recoverable */
> +	KUNIT_EXPECT_EQ(test, 0, pf_wait_vf_wip_done(gt, VFUT1, HZ));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +}
> +
> +static void flr_vf_confirmed_too_late_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, flr_failed, ARRAY_SIZE(flr_failed));
> +
> +	pf_handle_vf_flr_done(gt, VFUT1);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void flr_vf_unsolicited_confirmation_from_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +
> +	pf_handle_vf_flr_done(gt, VFUT1);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +}
> +
> +static void flr_vf_wrong_confirmation_from_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, flr_waiting, ARRAY_SIZE(flr_waiting));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	pf_handle_vf_pause_done(gt, VFUT1);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +}
> +
> +static void flr_vf_canceled_by_restart(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_busy_wait);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10, xe_gt_sriov_pf_control_restart, gt);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +	expect_not_in_flr(test);
> +}
> +
> +static void try_stop_vf(struct kunit *test, bool mimic_busy)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      mimic_busy ? send_vf_control_cmd_busy_and_reply :
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
> +	expect_not_stopping(test);
> +	expect_not_in_pause(test);
> +	expect_not_in_resume(test);
> +	expect_not_in_mismatch(test);
> +}
> +
> +static void stop_vf_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_stop_vf(test, false);
> +}
> +
> +static void stop_vf_needs_retry_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_stop_vf(test, true);
> +}
> +
> +static void stop_vf_refused_from(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	prepare_state_from_param(test);
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +	KUNIT_EXPECT_NE(test, err, -ECANCELED);
> +
> +	KUNIT_EXPECT_TRUE(test, err == -EALREADY ||
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
> +}
> +
> +static void stop_vf_fails_on_send(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_fail);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
> +	KUNIT_EXPECT_NE(test, err, -ECANCELED);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
> +	expect_not_stopping(test);
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void stop_vf_rejected_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_reject);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
> +	KUNIT_EXPECT_NE(test, err, -ECANCELED);
> +
> +	expect_not_stopping(test);
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void stop_vf_canceled_from(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state_from_param(test);
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
> +}
> +
> +static void stop_vf_canceled_by_restart(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_busy_except_flr);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10, xe_gt_sriov_pf_control_restart, gt);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +	expect_not_in_stop(test);
> +}
> +
> +static void stop_vf_canceled_by_flr(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_busy_except_flr);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10,
> +				     xe_gt_sriov_pf_control_trigger_flr, gt, VFUT1);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +	expect_not_in_stop(test);
> +}
> +
> +static void try_pause_vf(struct kunit *test, bool mimic_busy)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      mimic_busy ? send_vf_control_cmd_busy_and_reply :
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
> +	expect_not_pausing(test);
> +	expect_not_in_mismatch(test);
> +}
> +
> +static void pause_vf_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_pause_vf(test, false);
> +}
> +
> +static void pause_vf_needs_retry_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_pause_vf(test, true);
> +}
> +
> +static void pause_vf_canceled_from(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state_from_param(test);
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	expect_not_in_pause(test);
> +}
> +
> +static void pause_vf_refused_from(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	prepare_state_from_param(test);
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	KUNIT_EXPECT_NE(test, err, -ECANCELED);
> +
> +	KUNIT_EXPECT_TRUE(test, err == -EALREADY ||
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
> +}
> +
> +static void pause_vf_rejected_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_reject);
> +
> +	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void pause_vf_fails_on_send(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_fail);
> +
> +	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void pause_vf_unconfirmed_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_no_reply);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	KUNIT_EXPECT_EQ(test, err, -ETIMEDOUT);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
> +}
> +
> +static void pause_vf_canceled_by_restart(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_no_reply);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10, xe_gt_sriov_pf_control_restart, gt);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	expect_not_in_pause(test);
> +}
> +
> +static void pause_vf_canceled_by_flr(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_but_reply_flr_only);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10,
> +				     xe_gt_sriov_pf_control_trigger_flr, gt, VFUT1);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	expect_not_in_pause(test);
> +}
> +
> +static void pause_vf_canceled_by_stop(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_no_reply);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10,
> +				     xe_gt_sriov_pf_control_stop_vf, gt, VFUT1);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	expect_not_in_pause(test);
> +}
> +
> +static void try_resume_vf(struct kunit *test, bool mimic_busy)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      mimic_busy ? send_vf_control_cmd_busy_and_reply :
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
> +	expect_not_resuming(test);
> +	expect_not_in_pause(test);
> +	expect_not_in_mismatch(test);
> +	expect_not_in_wip(test);
> +}
> +
> +static void resume_vf_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_resume_vf(test, false);
> +}
> +
> +static void resume_vf_needs_retry_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_resume_vf(test, true);
> +}
> +
> +static void resume_vf_fails_on_send(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_fail);
> +
> +	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
> +
> +	expect_not_resuming(test);
> +	expect_not_in_mismatch(test);
> +	expect_not_in_wip(test);
> +}
> +
> +static void resume_vf_rejected_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_reject);
> +
> +	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
> +
> +	expect_not_resuming(test);
> +	expect_not_in_wip(test);
> +}
> +
> +static void resume_vf_canceled_from(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state_from_param(test);
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
> +	expect_not_resuming(test);
> +}
> +
> +static void resume_vf_refused_from(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	prepare_state_from_param(test);
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +	KUNIT_EXPECT_NE(test, err, -EIO);
> +
> +	KUNIT_EXPECT_TRUE(test, err == -EALREADY ||
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
> +}
> +
> +static void resume_vf_canceled_by_restart(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_busy_except_flr);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10, xe_gt_sriov_pf_control_restart, gt);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
> +}
> +
> +static void resume_vf_canceled_by_flr(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_busy_except_flr);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10,
> +				     xe_gt_sriov_pf_control_trigger_flr, gt, VFUT1);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
> +}
> +
> +static void resume_vf_canceled_by_stop(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_busy_except_stop);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10,
> +				     xe_gt_sriov_pf_control_stop_vf, gt, VFUT1);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
> +}
> +
> +static void basic_pause_and_resume_vf(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_ASSERT_EQ(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +}
> +
> +static void basic_pause_and_stop_vf(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_ASSERT_EQ(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +}
> +
> +static void basic_stop_and_flr_vf(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +}
> +
> +static void basic_flr_and_flr_vf(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +}
> +
> +static void basic_flr_vfs(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT2));
> +}
> +
> +static struct kunit_case pf_control_test_cases[] = {
> +	KUNIT_CASE(basic_pause_and_resume_vf),
> +	KUNIT_CASE(basic_pause_and_stop_vf),
> +	KUNIT_CASE(basic_stop_and_flr_vf),
> +	KUNIT_CASE(basic_flr_and_flr_vf),
> +	KUNIT_CASE(basic_flr_vfs),
> +
> +	KUNIT_CASE_PARAM(flr_vf_from, flr_must_pass_from_gen_params),
> +	KUNIT_CASE_PARAM(flr_vf_needs_retry_from, flr_must_pass_from_gen_params),
> +	KUNIT_CASE_PARAM(flr_vf_needs_retry_late_from, flr_must_pass_from_gen_params),
> +	KUNIT_CASE(flr_vf_fails_on_send),
> +	KUNIT_CASE(flr_vf_fails_on_reset),
> +	KUNIT_CASE(flr_vf_rejected_by_guc),
> +	KUNIT_CASE_SLOW(flr_vf_unconfirmed_by_guc),
> +	KUNIT_CASE(flr_vf_confirmed_early_continue_by_guc),
> +	KUNIT_CASE(flr_vf_confirmed_early_reject_by_guc),
> +	KUNIT_CASE(flr_vf_confirmed_twice_by_guc),
> +	KUNIT_CASE(flr_vf_confirmed_too_late_by_guc),
> +	KUNIT_CASE(flr_vf_wrong_confirmation_from_guc),
> +	KUNIT_CASE(flr_vf_unsolicited_confirmation_from_guc),
> +	KUNIT_CASE(flr_vf_canceled_by_restart),
> +
> +	KUNIT_CASE_PARAM(stop_vf_from, stop_must_pass_from_gen_params),
> +	KUNIT_CASE_PARAM(stop_vf_needs_retry_from, stop_must_pass_from_gen_params),
> +	KUNIT_CASE_PARAM(stop_vf_refused_from, stop_must_fail_from_gen_params),
> +	KUNIT_CASE_PARAM(stop_vf_canceled_from, stop_must_cancel_from_gen_params),
> +	KUNIT_CASE(stop_vf_fails_on_send),
> +	KUNIT_CASE(stop_vf_rejected_by_guc),
> +	KUNIT_CASE(stop_vf_canceled_by_flr),
> +	KUNIT_CASE(stop_vf_canceled_by_restart),
> +
> +	KUNIT_CASE_PARAM(pause_vf_from, pause_must_pass_from_gen_params),
> +	KUNIT_CASE_PARAM(pause_vf_needs_retry_from, pause_must_pass_from_gen_params),
> +	KUNIT_CASE_PARAM(pause_vf_refused_from, pause_must_fail_from_gen_params),
> +	KUNIT_CASE_PARAM(pause_vf_canceled_from, pause_must_cancel_from_gen_params),
> +	KUNIT_CASE(pause_vf_fails_on_send),
> +	KUNIT_CASE(pause_vf_rejected_by_guc),
> +	KUNIT_CASE_SLOW(pause_vf_unconfirmed_by_guc),
> +	KUNIT_CASE(pause_vf_canceled_by_flr),
> +	KUNIT_CASE(pause_vf_canceled_by_stop),
> +	KUNIT_CASE(pause_vf_canceled_by_restart),
> +
> +	KUNIT_CASE_PARAM(resume_vf_from, resume_must_pass_from_gen_params),
> +	KUNIT_CASE_PARAM(resume_vf_needs_retry_from, resume_must_pass_from_gen_params),
> +	KUNIT_CASE_PARAM(resume_vf_refused_from, resume_must_fail_from_gen_params),
> +	KUNIT_CASE_PARAM(resume_vf_canceled_from, resume_must_cancel_from_gen_params),
> +	KUNIT_CASE(resume_vf_fails_on_send),
> +	KUNIT_CASE(resume_vf_rejected_by_guc),
> +	KUNIT_CASE(resume_vf_canceled_by_flr),
> +	KUNIT_CASE(resume_vf_canceled_by_stop),
> +	KUNIT_CASE(resume_vf_canceled_by_restart),
> +
> +	{}
> +};
> +
> +static struct kunit_suite pf_control_suite = {
> +	.name = "pf_control",
> +	.test_cases = pf_control_test_cases,
> +	.init = pf_control_test_init,
> +};
> +
> +kunit_test_suite(pf_control_suite);
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> index e91c71d768ff..4863d79f72e0 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> @@ -4,6 +4,7 @@
>   */
>  
>  #include <drm/drm_managed.h>
> +#include <kunit/static_stub.h>
>  
>  #include "abi/guc_actions_sriov_abi.h"
>  
> @@ -196,6 +197,8 @@ static const char *control_bit_to_string(enum xe_gt_sriov_control_bits bit)
>  
>  static unsigned long pf_get_default_timeout(enum xe_gt_sriov_control_bits bit)
>  {
> +	KUNIT_STATIC_STUB_REDIRECT(pf_get_default_timeout, bit);
> +
>  	switch (bit) {
>  	case XE_GT_SRIOV_STATE_FLR_WAIT_GUC:
>  	case XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC:
> @@ -1458,3 +1461,7 @@ void xe_gt_sriov_pf_control_restart(struct xe_gt *gt)
>  	for (n = 1; n <= totalvfs; n++)
>  		pf_enter_vf_ready(gt, n);
>  }
> +
> +#if IS_BUILTIN(CONFIG_DRM_XE_KUNIT_TEST)
> +#include "tests/xe_gt_sriov_pf_control_kunit.c"
> +#endif
The tests look fine. I tried to verify the states according to the available
drawings of the state machine and I did not find any incorrectness.
It seems to me that the tests could be expanded to include an additional
basic test: basic_pause_and_flr_vf
But still:
Reviewed-by: Piotr Piórkowski <piotr.piorkowski@intel.com>



> -- 
> 2.43.0
> 

-- 

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

* Re: [PATCH 03/12] drm/xe/pf: Drop GuC notifications for non-existing VF
  2024-08-19 17:51     ` Michal Wajdeczko
@ 2024-08-22 10:48       ` Piotr Piórkowski
  0 siblings, 0 replies; 47+ messages in thread
From: Piotr Piórkowski @ 2024-08-22 10:48 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe

Michal Wajdeczko <michal.wajdeczko@intel.com> wrote on pon [2024-sie-19 19:51:28 +0200]:
> 
> 
> On 16.08.2024 15:01, Piotr Piórkowski wrote:
> > Michal Wajdeczko <michal.wajdeczko@intel.com> wrote on pią [2024-sie-09 18:51:50 +0200]:
> >> It is unlikely that GuC will ever send a G2H notification with an
> >> invalid VFID and it is currently harmless if that actually happen.
> >> But in upcoming patches we will start using that VFID as an index
> >> and we must be sure it is a valid to avoid a crash due to a buggy
> >> firmware or a currupted G2H message.
> >>
> >> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
> >> ---
> >>  drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c | 6 ++++++
> >>  1 file changed, 6 insertions(+)
> >>
> >> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> >> index d11839d9e7d4..ad447d867e51 100644
> >> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> >> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> >> @@ -8,6 +8,7 @@
> >>  #include "xe_device.h"
> >>  #include "xe_gt.h"
> >>  #include "xe_gt_sriov_pf_control.h"
> >> +#include "xe_gt_sriov_pf_helpers.h"
> >>  #include "xe_gt_sriov_printk.h"
> >>  #include "xe_guc_ct.h"
> >>  #include "xe_sriov.h"
> >> @@ -212,6 +213,11 @@ static void pf_handle_vf_flr_done(struct xe_gt *gt, u32 vfid)
> >>  
> >>  static int pf_handle_vf_event(struct xe_gt *gt, u32 vfid, u32 eventid)
> >>  {
> >> +	xe_gt_sriov_dbg_verbose(gt, "received VF%u event %#x\n", vfid, eventid);
> >> +
> >> +	if (vfid > xe_gt_sriov_pf_get_totalvfs(gt))
> >> +		return -EPROTO;
> > 
> > I would probably add some log here.
> > I'm afraid that during debug the information about the last event is not enough
> 
> it should be the CTB layer responsibility to print an error message and
> dump this invalid or corrupted or unexpected G2H message, no point in
> doing this in every possible G2H message handler; note that 'silent'
> return is aligned with the existing code in this file.
> 
> for now CTB will just report:
> 
> 	xe_gt_err(gt, "G2H action 0x%04x failed (%pe)\n",
> 		  action, ERR_PTR(ret));
> 
> but it should be easy to add (what we had in i915) full dump of the
> problematic G2H message in case of at least the EPROTO error


This sounds reasonable to me:
Reviewed-by: Piotr Piórkowski <piotr.piorkowski@intel.com>
> 
> > 
> > Thanks,
> > Piotr
> >> +
> >>  	switch (eventid) {
> >>  	case GUC_PF_NOTIFY_VF_FLR:
> >>  		pf_handle_vf_flr(gt, vfid);
> >> -- 
> >> 2.43.0
> >>
> > 

-- 

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

* Re: [PATCH v2 11/12] drm/xe/tests: Add KUnit tests for VF control state machines
  2024-08-09 17:23   ` [PATCH v2 " Michal Wajdeczko
@ 2024-08-22 10:51     ` Piotr Piórkowski
  0 siblings, 0 replies; 47+ messages in thread
From: Piotr Piórkowski @ 2024-08-22 10:51 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe, Lucas De Marchi

Michal Wajdeczko <michal.wajdeczko@intel.com> wrote on pią [2024-sie-09 19:23:15 +0200]:
> Add KUnit tests (~200) for all VF control state machines (FLR,
> PAUSE, STOP and RESUME) to make sure they work as expected and
> will not be broken while extending them with new functionality.
> 
> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Lucas De Marchi <lucas.demarchi@intel.com>
> ---
> Test file named according to the new best practices [1]
> [1] https://lore.kernel.org/linux-hardening/20240724201354.make.730-kees@kernel.org/
> ---
> v2: fix kunit build break due last-minute change in .c
> ---
>  .../xe/tests/xe_gt_sriov_pf_control_kunit.c   | 1360 +++++++++++++++++
>  drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c   |    7 +
>  2 files changed, 1367 insertions(+)
>  create mode 100644 drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
> 
> diff --git a/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c b/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
> new file mode 100644
> index 000000000000..3061099ad35a
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
> @@ -0,0 +1,1360 @@
> +// SPDX-License-Identifier: GPL-2.0 AND MIT
> +/*
> + * Copyright © 2024 Intel Corporation
> + */
> +
> +#include <kunit/test.h>
> +#include <kunit/static_stub.h>
> +
> +#include "tests/xe_kunit_helpers.h"
> +#include "tests/xe_pci_test.h"
> +
> +#include "xe_gt_sriov_pf.h"
> +
> +static const unsigned int DUT_NUM_VFS = 2;
> +static const unsigned int VFUT1 = VFID(1);
> +static const unsigned int VFUT2 = VFID(2);
> +
> +static void dump_state(void *arg)
> +{
> +	struct xe_gt *gt = arg;
> +
> +	pf_dump_vf_state(gt, VFUT1);
> +}
> +
> +static unsigned long replacement_timeout(enum xe_gt_sriov_control_bits bit)
> +{
> +	return HZ;
> +}
> +
> +static int pf_control_test_init(struct kunit *test)
> +{
> +	struct xe_pci_fake_data fake = {
> +		.sriov_mode = XE_SRIOV_MODE_PF,
> +		.platform = XE_TIGERLAKE, /* some random platform */
> +		.subplatform = XE_SUBPLATFORM_NONE,
> +	};
> +	struct xe_device *xe;
> +	struct xe_gt *gt;
> +
> +	test->priv = &fake;
> +	xe_kunit_helper_xe_device_test_init(test);
> +
> +	xe = test->priv;
> +	KUNIT_ASSERT_EQ(test, xe_sriov_init(xe), 0);
> +
> +	xe->sriov.pf.driver_max_vfs = DUT_NUM_VFS;
> +	KUNIT_EXPECT_NE(test, xe_sriov_pf_get_totalvfs(xe), 0);
> +
> +	gt = xe_device_get_gt(xe, 0);
> +	KUNIT_ASSERT_EQ(test, xe_gt_sriov_pf_init_early(gt), 0);
> +
> +	KUNIT_ASSERT_EQ(test, 0ul, *pf_peek_vf_state(gt, VFUT1));
> +	KUNIT_ASSERT_EQ(test, 0ul, *pf_peek_vf_state(gt, VFUT2));
> +
> +	KUNIT_EXPECT_EQ(test, 0, kunit_add_action_or_reset(test, dump_state, gt));
> +
> +	kunit_activate_static_stub(test, pf_get_default_timeout, replacement_timeout);
> +
> +	test->priv = gt;
> +	return 0;
> +}
> +
> +static int sanitize_vf_resources_fail(struct xe_gt *gt, u32 vfid, long timeout)
> +{
> +	return -ETIMEDOUT;
> +}
> +
> +static int send_vf_control_cmd_reject(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	return -EIO;
> +}
> +
> +static int send_vf_control_cmd_fail(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	return -ENODEV;
> +}
> +
> +static int send_vf_control_cmd_pass_no_reply(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	return 0;
> +}
> +
> +static int send_vf_control_cmd_pass_and_reply(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	switch (cmd) {
> +	case GUC_PF_TRIGGER_VF_PAUSE:
> +		pf_handle_vf_event(gt, vfid, GUC_PF_NOTIFY_VF_PAUSE_DONE);
> +		break;
> +	case GUC_PF_TRIGGER_VF_FLR_START:
> +		pf_handle_vf_event(gt, vfid, GUC_PF_NOTIFY_VF_FLR_DONE);
> +		break;
> +	case GUC_PF_TRIGGER_VF_RESUME:
> +	case GUC_PF_TRIGGER_VF_STOP:
> +	case GUC_PF_TRIGGER_VF_FLR_FINISH:
> +		break;
> +	default:
> +		return -EPROTO;
> +	}
> +	return 0;
> +}
> +
> +static int send_vf_control_cmd_busy_wait(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	schedule_timeout_interruptible(HZ / 20);
> +	return -EBUSY;
> +}
> +
> +static int send_vf_control_cmd_pass_but_reply_flr_only(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	return cmd == GUC_PF_TRIGGER_VF_FLR_START ?
> +		send_vf_control_cmd_pass_and_reply(gt, vfid, cmd) :
> +		send_vf_control_cmd_pass_no_reply(gt, vfid, cmd);
> +}
> +
> +static int send_vf_control_cmd_busy_except_flr(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	return cmd == GUC_PF_TRIGGER_VF_FLR_START || cmd == GUC_PF_TRIGGER_VF_FLR_FINISH ?
> +		send_vf_control_cmd_pass_and_reply(gt, vfid, cmd) :
> +		send_vf_control_cmd_busy_wait(gt, vfid, cmd);
> +}
> +
> +static int send_vf_control_cmd_busy_except_stop(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	return cmd == GUC_PF_TRIGGER_VF_STOP ?
> +		send_vf_control_cmd_pass_and_reply(gt, vfid, cmd) :
> +		send_vf_control_cmd_busy_wait(gt, vfid, cmd);
> +}
> +
> +static int BUSY_MAGIC = 3;
> +
> +static int send_vf_control_cmd_busy_no_reply(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	static int counter;
> +
> +	return ++counter % BUSY_MAGIC ? -EBUSY : 0;
> +}
> +
> +static int send_vf_control_cmd_busy_and_reply(struct xe_gt *gt, unsigned int vfid, u32 cmd)
> +{
> +	static int counter;
> +
> +	return ++counter % BUSY_MAGIC ? -EBUSY :
> +		send_vf_control_cmd_pass_and_reply(gt, vfid, cmd);
> +}
> +
> +static const enum xe_gt_sriov_control_bits ready[] = {
> +};
> +
> +static const enum xe_gt_sriov_control_bits flr_starting[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_FLR_WIP,
> +	XE_GT_SRIOV_STATE_FLR_SEND_START,
> +};
> +
> +static const enum xe_gt_sriov_control_bits flr_starting_paused[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_FLR_WIP,
> +	XE_GT_SRIOV_STATE_FLR_SEND_START,
> +	XE_GT_SRIOV_STATE_PAUSED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits flr_starting_stopped[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_FLR_WIP,
> +	XE_GT_SRIOV_STATE_FLR_SEND_START,
> +	XE_GT_SRIOV_STATE_STOPPED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits flr_waiting[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_FLR_WIP,
> +	XE_GT_SRIOV_STATE_FLR_WAIT_GUC,
> +};
> +
> +static const enum xe_gt_sriov_control_bits flr_guc_done[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_FLR_WIP,
> +	XE_GT_SRIOV_STATE_FLR_GUC_DONE,
> +};
> +
> +static const enum xe_gt_sriov_control_bits flr_resetting[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_FLR_WIP,
> +	XE_GT_SRIOV_STATE_FLR_RESET_CONFIG,
> +};
> +
> +static const enum xe_gt_sriov_control_bits flr_finishing[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_FLR_WIP,
> +	XE_GT_SRIOV_STATE_FLR_SEND_FINISH,
> +};
> +
> +static const enum xe_gt_sriov_control_bits flr_failed[] = {
> +	XE_GT_SRIOV_STATE_FLR_FAILED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits stopping[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_STOP_WIP,
> +	XE_GT_SRIOV_STATE_STOP_SEND_STOP,
> +};
> +
> +static const enum xe_gt_sriov_control_bits stopping_paused[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_STOP_WIP,
> +	XE_GT_SRIOV_STATE_STOP_SEND_STOP,
> +	XE_GT_SRIOV_STATE_PAUSED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits stop_failed[] = {
> +	XE_GT_SRIOV_STATE_STOP_FAILED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits stop_rejected[] = {
> +	XE_GT_SRIOV_STATE_STOP_FAILED,
> +	XE_GT_SRIOV_STATE_MISMATCH,
> +};
> +
> +static const enum xe_gt_sriov_control_bits stopped[] = {
> +	XE_GT_SRIOV_STATE_STOPPED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits pausing[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_PAUSE_WIP,
> +	XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE,
> +};
> +
> +static const enum xe_gt_sriov_control_bits pausing_wait_guc[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_PAUSE_WIP,
> +	XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC,
> +};
> +
> +static const enum xe_gt_sriov_control_bits pausing_guc_done[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_PAUSE_WIP,
> +	XE_GT_SRIOV_STATE_PAUSE_GUC_DONE,
> +};
> +
> +static const enum xe_gt_sriov_control_bits pause_failed[] = {
> +	XE_GT_SRIOV_STATE_PAUSE_FAILED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits pause_rejected[] = {
> +	XE_GT_SRIOV_STATE_PAUSE_FAILED,
> +	XE_GT_SRIOV_STATE_MISMATCH,
> +};
> +
> +static const enum xe_gt_sriov_control_bits paused[] = {
> +	XE_GT_SRIOV_STATE_PAUSED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits resuming[] = {
> +	XE_GT_SRIOV_STATE_WIP,
> +	XE_GT_SRIOV_STATE_PAUSED,
> +	XE_GT_SRIOV_STATE_RESUME_WIP,
> +	XE_GT_SRIOV_STATE_RESUME_SEND_RESUME,
> +};
> +
> +static const enum xe_gt_sriov_control_bits resume_failed[] = {
> +	XE_GT_SRIOV_STATE_PAUSED,
> +	XE_GT_SRIOV_STATE_RESUME_FAILED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits resume_rejected[] = {
> +	XE_GT_SRIOV_STATE_PAUSED,
> +	XE_GT_SRIOV_STATE_RESUME_FAILED,
> +	XE_GT_SRIOV_STATE_MISMATCH,
> +};
> +
> +static const enum xe_gt_sriov_control_bits resumed[] = {
> +	XE_GT_SRIOV_STATE_RESUMED,
> +};
> +
> +static const enum xe_gt_sriov_control_bits mismatch[] = {
> +	XE_GT_SRIOV_STATE_MISMATCH,
> +};
> +
> +struct state_param {
> +	const char *name;
> +	const enum xe_gt_sriov_control_bits *bits;
> +	size_t num_bits;
> +};
> +
> +static void state_param_get_desc(struct state_param *p, char *desc)
> +{
> +	snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s", p->name);
> +}
> +
> +#define MAKE_STATE_PARAM(X) { .name = #X, .bits = X, .num_bits = ARRAY_SIZE(X) }
> +
> +/*
> + * Due to the test case logic the all "must_pass" params include "_rejected" states
> + * since our "GuC" calls by default will not complain again about the INVALID_STATE
> + * thus our state machine is able to fully recover.
> + */
> +
> +static struct state_param flr_must_pass_from[] = {
> +	MAKE_STATE_PARAM(ready),
> +	MAKE_STATE_PARAM(flr_starting),
> +	MAKE_STATE_PARAM(flr_starting_paused),
> +	MAKE_STATE_PARAM(flr_starting_stopped),
> +	MAKE_STATE_PARAM(flr_waiting),
> +	MAKE_STATE_PARAM(flr_guc_done),
> +	MAKE_STATE_PARAM(flr_resetting),
> +	MAKE_STATE_PARAM(flr_finishing),
> +	MAKE_STATE_PARAM(flr_failed),
> +	MAKE_STATE_PARAM(stopping),
> +	MAKE_STATE_PARAM(stop_failed),
> +	MAKE_STATE_PARAM(stop_rejected),
> +	MAKE_STATE_PARAM(stopped),
> +	MAKE_STATE_PARAM(pausing),
> +	MAKE_STATE_PARAM(pausing_wait_guc),
> +	MAKE_STATE_PARAM(pausing_guc_done),
> +	MAKE_STATE_PARAM(pause_failed),
> +	MAKE_STATE_PARAM(pause_rejected),
> +	MAKE_STATE_PARAM(paused),
> +	MAKE_STATE_PARAM(resuming),
> +	MAKE_STATE_PARAM(resume_failed),
> +	MAKE_STATE_PARAM(resume_rejected),
> +	MAKE_STATE_PARAM(resumed),
> +	MAKE_STATE_PARAM(mismatch),
> +};
> +
> +static struct state_param stop_must_pass_from[] = {
> +	MAKE_STATE_PARAM(ready),
> +	MAKE_STATE_PARAM(stop_failed),
> +	MAKE_STATE_PARAM(stop_rejected),
> +	MAKE_STATE_PARAM(pausing),
> +	MAKE_STATE_PARAM(pausing_wait_guc),
> +	MAKE_STATE_PARAM(pausing_guc_done),
> +	MAKE_STATE_PARAM(pause_failed),
> +	MAKE_STATE_PARAM(pause_rejected),
> +	MAKE_STATE_PARAM(paused),
> +	MAKE_STATE_PARAM(resuming),
> +	MAKE_STATE_PARAM(resume_failed),
> +	MAKE_STATE_PARAM(resume_rejected),
> +	MAKE_STATE_PARAM(resumed),
> +	MAKE_STATE_PARAM(mismatch),
> +	MAKE_STATE_PARAM(flr_failed),
> +};
> +
> +static struct state_param stop_must_cancel_from[] = {
> +	MAKE_STATE_PARAM(flr_starting),
> +	MAKE_STATE_PARAM(flr_starting_paused),
> +	MAKE_STATE_PARAM(flr_waiting),
> +	MAKE_STATE_PARAM(flr_guc_done),
> +	MAKE_STATE_PARAM(flr_resetting),
> +	MAKE_STATE_PARAM(flr_finishing),
> +};
> +
> +static struct state_param stop_must_fail_from[] = {
> +	MAKE_STATE_PARAM(stopping),
> +	MAKE_STATE_PARAM(stopping_paused),
> +	MAKE_STATE_PARAM(stopped),
> +	MAKE_STATE_PARAM(flr_starting_stopped),
> +};
> +
> +static struct state_param pause_must_pass_from[] = {
> +	MAKE_STATE_PARAM(ready),
> +	MAKE_STATE_PARAM(pause_failed),
> +	MAKE_STATE_PARAM(pause_rejected),
> +	MAKE_STATE_PARAM(resumed),
> +	MAKE_STATE_PARAM(mismatch),
> +	MAKE_STATE_PARAM(stop_failed),
> +	MAKE_STATE_PARAM(stop_rejected),
> +	MAKE_STATE_PARAM(flr_failed),
> +};
> +
> +static struct state_param pause_must_cancel_from[] = {
> +	MAKE_STATE_PARAM(flr_starting),
> +	MAKE_STATE_PARAM(flr_waiting),
> +	MAKE_STATE_PARAM(flr_guc_done),
> +	MAKE_STATE_PARAM(flr_resetting),
> +	MAKE_STATE_PARAM(flr_finishing),
> +	MAKE_STATE_PARAM(stopping),
> +};
> +
> +static struct state_param pause_must_fail_from[] = {
> +	MAKE_STATE_PARAM(pausing),
> +	MAKE_STATE_PARAM(pausing_wait_guc),
> +	MAKE_STATE_PARAM(pausing_guc_done),
> +	MAKE_STATE_PARAM(paused),
> +	MAKE_STATE_PARAM(resuming),
> +	MAKE_STATE_PARAM(resume_failed),
> +	MAKE_STATE_PARAM(resume_rejected),
> +	MAKE_STATE_PARAM(stopped),
> +};
> +
> +static struct state_param resume_must_pass_from[] = {
> +	MAKE_STATE_PARAM(paused),
> +	MAKE_STATE_PARAM(resume_failed),
> +	MAKE_STATE_PARAM(resume_rejected),
> +};
> +
> +static struct state_param resume_must_cancel_from[] = {
> +	MAKE_STATE_PARAM(flr_starting_paused),
> +	MAKE_STATE_PARAM(stopping_paused),
> +};
> +
> +static struct state_param resume_must_fail_from[] = {
> +	MAKE_STATE_PARAM(ready),
> +	MAKE_STATE_PARAM(pausing),
> +	MAKE_STATE_PARAM(pausing_wait_guc),
> +	MAKE_STATE_PARAM(pausing_guc_done),
> +	MAKE_STATE_PARAM(pause_failed),
> +	MAKE_STATE_PARAM(pause_rejected),
> +	MAKE_STATE_PARAM(resuming),
> +	MAKE_STATE_PARAM(resumed),
> +	MAKE_STATE_PARAM(stopping),
> +	MAKE_STATE_PARAM(stop_failed),
> +	MAKE_STATE_PARAM(stop_rejected),
> +	MAKE_STATE_PARAM(stopped),
> +	MAKE_STATE_PARAM(flr_starting),
> +	MAKE_STATE_PARAM(flr_waiting),
> +	MAKE_STATE_PARAM(flr_guc_done),
> +	MAKE_STATE_PARAM(flr_resetting),
> +	MAKE_STATE_PARAM(flr_finishing),
> +	MAKE_STATE_PARAM(flr_failed),
> +	MAKE_STATE_PARAM(mismatch),
> +};
> +
> +KUNIT_ARRAY_PARAM(flr_must_pass_from, flr_must_pass_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(stop_must_pass_from, stop_must_pass_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(stop_must_fail_from, stop_must_fail_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(stop_must_cancel_from, stop_must_cancel_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(pause_must_pass_from, pause_must_pass_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(pause_must_fail_from, pause_must_fail_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(pause_must_cancel_from, pause_must_cancel_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(resume_must_pass_from, resume_must_pass_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(resume_must_fail_from, resume_must_fail_from, state_param_get_desc);
> +KUNIT_ARRAY_PARAM(resume_must_cancel_from, resume_must_cancel_from, state_param_get_desc);
> +
> +static int mimic_pf_handle_vf_flr_done(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_handle_vf_flr_done(gt, vfid);
> +	return 0;
> +}
> +
> +static int mimic_pf_handle_vf_pause_done(struct xe_gt *gt, unsigned int vfid)
> +{
> +	pf_handle_vf_pause_done(gt, vfid);
> +	return 0;
> +}
> +
> +static void prepare_state(struct kunit *test, unsigned int vfid,
> +			  const enum xe_gt_sriov_control_bits *bits, size_t num_bits)
> +{
> +	struct xe_gt *gt = test->priv;
> +	size_t n;
> +
> +	for (n = 0; n < num_bits; n++) {
> +		enum xe_gt_sriov_control_bits bit = bits[n];
> +
> +		KUNIT_ASSERT_TRUE(test, pf_enter_vf_state(gt, vfid, bit));
> +
> +		if (bit == XE_GT_SRIOV_STATE_WIP) {
> +			pf_queue_vf(gt, vfid);
> +		} else if (bit == XE_GT_SRIOV_STATE_FLR_WAIT_GUC) {
> +			xe_kunit_helper_delayed_call(test, HZ / 100,
> +						     mimic_pf_handle_vf_flr_done, gt, vfid);
> +		} else if (bit == XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC) {
> +			xe_kunit_helper_delayed_call(test, HZ / 100,
> +						     mimic_pf_handle_vf_pause_done, gt, vfid);
> +		}
> +	}
> +}
> +
> +static void prepare_state_from_param(struct kunit *test)
> +{
> +	const struct state_param *p = test->param_value;
> +
> +	prepare_state(test, VFUT1, p->bits, p->num_bits);
> +}
> +
> +static void expect_not_pausing(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_GUC_DONE));
> +}
> +
> +static void expect_not_in_pause(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	expect_not_pausing(test);
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
> +}
> +
> +static void expect_not_resuming(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_SEND_RESUME));
> +}
> +
> +static void expect_not_in_resume(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	expect_not_resuming(test);
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
> +}
> +
> +static void expect_not_stopping(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_WIP));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_SEND_STOP));
> +}
> +
> +static void expect_not_in_stop(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	expect_not_stopping(test);
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
> +}
> +
> +static void expect_not_in_flr(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_SEND_START));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WAIT_GUC));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_GUC_DONE));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_SEND_FINISH));
> +	KUNIT_EXPECT_TRUE(test,
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +}
> +
> +static void expect_not_in_wip(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void expect_not_in_mismatch(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +}
> +
> +static void try_flr_vf(struct kunit *test, bool mimic_busy, bool late_reply)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      mimic_busy ? late_reply ? send_vf_control_cmd_busy_no_reply :
> +			      send_vf_control_cmd_busy_and_reply :
> +			      late_reply ? send_vf_control_cmd_pass_no_reply :
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	if (late_reply)
> +		xe_kunit_helper_delayed_call(test, HZ / 10,
> +					     mimic_pf_handle_vf_flr_done, gt, VFUT1);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +
> +	expect_not_in_flr(test);
> +	expect_not_in_pause(test);
> +	expect_not_in_resume(test);
> +	expect_not_in_stop(test);
> +	expect_not_in_mismatch(test);
> +	expect_not_in_wip(test);
> +}
> +
> +static void flr_vf_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_flr_vf(test, false, false);
> +}
> +
> +static void flr_vf_needs_retry_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_flr_vf(test, true, false);
> +}
> +
> +static void flr_vf_needs_retry_late_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_flr_vf(test, true, true);
> +}
> +
> +static void flr_vf_fails_on_send(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_fail);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
> +	KUNIT_EXPECT_NE(test, err, -ECANCELED);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void flr_vf_fails_on_reset(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.vfs[VFUT1].config.sanitize,
> +			      sanitize_vf_resources_fail);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
> +	KUNIT_EXPECT_NE(test, err, -ECANCELED);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void flr_vf_rejected_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_reject);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
> +	KUNIT_EXPECT_NE(test, err, -ECANCELED);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void flr_vf_unconfirmed_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_no_reply);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +	KUNIT_EXPECT_EQ(test, err, -ETIMEDOUT);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +}
> +
> +static void flr_vf_confirmed_early_continue_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, flr_starting, ARRAY_SIZE(flr_starting));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_no_reply);
> +
> +	pf_handle_vf_flr_done(gt, VFUT1);
> +
> +	/*
> +	 * make sure SEND_START completes;
> +	 * successful reply from cmd_pass_no_reply should exit mismatch state
> +	 */
> +	flush_work(&gt->sriov.pf.control.worker);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +}
> +
> +static void flr_vf_confirmed_early_reject_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, flr_starting, ARRAY_SIZE(flr_starting));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_reject);
> +
> +	pf_handle_vf_flr_done(gt, VFUT1);
> +
> +	/*
> +	 * make sure SEND_START completes;
> +	 * error from send_vf_control_cmd_reject should keep mismatch state
> +	 */
> +	flush_work(&gt->sriov.pf.control.worker);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void flr_vf_confirmed_twice_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, flr_guc_done, ARRAY_SIZE(flr_guc_done));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_no_reply);
> +
> +	pf_handle_vf_flr_done(gt, VFUT1);
> +
> +	/* this is fully recoverable */
> +	KUNIT_EXPECT_EQ(test, 0, pf_wait_vf_wip_done(gt, VFUT1, HZ));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +}
> +
> +static void flr_vf_confirmed_too_late_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, flr_failed, ARRAY_SIZE(flr_failed));
> +
> +	pf_handle_vf_flr_done(gt, VFUT1);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void flr_vf_unsolicited_confirmation_from_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +
> +	pf_handle_vf_flr_done(gt, VFUT1);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_FLR_FAILED));
> +}
> +
> +static void flr_vf_wrong_confirmation_from_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, flr_waiting, ARRAY_SIZE(flr_waiting));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	pf_handle_vf_pause_done(gt, VFUT1);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +}
> +
> +static void flr_vf_canceled_by_restart(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_busy_wait);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10, xe_gt_sriov_pf_control_restart, gt);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +	expect_not_in_flr(test);
> +}
> +
> +static void try_stop_vf(struct kunit *test, bool mimic_busy)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      mimic_busy ? send_vf_control_cmd_busy_and_reply :
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
> +	expect_not_stopping(test);
> +	expect_not_in_pause(test);
> +	expect_not_in_resume(test);
> +	expect_not_in_mismatch(test);
> +}
> +
> +static void stop_vf_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_stop_vf(test, false);
> +}
> +
> +static void stop_vf_needs_retry_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_stop_vf(test, true);
> +}
> +
> +static void stop_vf_refused_from(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	prepare_state_from_param(test);
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +	KUNIT_EXPECT_NE(test, err, -ECANCELED);
> +
> +	KUNIT_EXPECT_TRUE(test, err == -EALREADY ||
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
> +}
> +
> +static void stop_vf_fails_on_send(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_fail);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
> +	KUNIT_EXPECT_NE(test, err, -ECANCELED);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
> +	expect_not_stopping(test);
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void stop_vf_rejected_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_reject);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +	KUNIT_EXPECT_NE(test, err, -ETIMEDOUT);
> +	KUNIT_EXPECT_NE(test, err, -ECANCELED);
> +
> +	expect_not_stopping(test);
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void stop_vf_canceled_from(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state_from_param(test);
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOP_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_STOPPED));
> +}
> +
> +static void stop_vf_canceled_by_restart(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_busy_except_flr);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10, xe_gt_sriov_pf_control_restart, gt);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +	expect_not_in_stop(test);
> +}
> +
> +static void stop_vf_canceled_by_flr(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_busy_except_flr);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10,
> +				     xe_gt_sriov_pf_control_trigger_flr, gt, VFUT1);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +	expect_not_in_stop(test);
> +}
> +
> +static void try_pause_vf(struct kunit *test, bool mimic_busy)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      mimic_busy ? send_vf_control_cmd_busy_and_reply :
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
> +	expect_not_pausing(test);
> +	expect_not_in_mismatch(test);
> +}
> +
> +static void pause_vf_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_pause_vf(test, false);
> +}
> +
> +static void pause_vf_needs_retry_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_pause_vf(test, true);
> +}
> +
> +static void pause_vf_canceled_from(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state_from_param(test);
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	expect_not_in_pause(test);
> +}
> +
> +static void pause_vf_refused_from(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	prepare_state_from_param(test);
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	KUNIT_EXPECT_NE(test, err, -ECANCELED);
> +
> +	KUNIT_EXPECT_TRUE(test, err == -EALREADY ||
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
> +}
> +
> +static void pause_vf_rejected_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_reject);
> +
> +	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void pause_vf_fails_on_send(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_fail);
> +
> +	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_WIP));
> +}
> +
> +static void pause_vf_unconfirmed_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_no_reply);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	KUNIT_EXPECT_EQ(test, err, -ETIMEDOUT);
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSE_FAILED));
> +}
> +
> +static void pause_vf_canceled_by_restart(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_no_reply);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10, xe_gt_sriov_pf_control_restart, gt);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	expect_not_in_pause(test);
> +}
> +
> +static void pause_vf_canceled_by_flr(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_but_reply_flr_only);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10,
> +				     xe_gt_sriov_pf_control_trigger_flr, gt, VFUT1);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	expect_not_in_pause(test);
> +}
> +
> +static void pause_vf_canceled_by_stop(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_no_reply);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10,
> +				     xe_gt_sriov_pf_control_stop_vf, gt, VFUT1);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	expect_not_in_pause(test);
> +}
> +
> +static void try_resume_vf(struct kunit *test, bool mimic_busy)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      mimic_busy ? send_vf_control_cmd_busy_and_reply :
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
> +	expect_not_resuming(test);
> +	expect_not_in_pause(test);
> +	expect_not_in_mismatch(test);
> +	expect_not_in_wip(test);
> +}
> +
> +static void resume_vf_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_resume_vf(test, false);
> +}
> +
> +static void resume_vf_needs_retry_from(struct kunit *test)
> +{
> +	prepare_state_from_param(test);
> +	try_resume_vf(test, true);
> +}
> +
> +static void resume_vf_fails_on_send(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_fail);
> +
> +	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
> +
> +	expect_not_resuming(test);
> +	expect_not_in_mismatch(test);
> +	expect_not_in_wip(test);
> +}
> +
> +static void resume_vf_rejected_by_guc(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_reject);
> +
> +	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_PAUSED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_MISMATCH));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
> +
> +	expect_not_resuming(test);
> +	expect_not_in_wip(test);
> +}
> +
> +static void resume_vf_canceled_from(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state_from_param(test);
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
> +	expect_not_resuming(test);
> +}
> +
> +static void resume_vf_refused_from(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +	int err;
> +
> +	prepare_state_from_param(test);
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_NE(test, 0, err = xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +	KUNIT_EXPECT_NE(test, err, -EIO);
> +
> +	KUNIT_EXPECT_TRUE(test, err == -EALREADY ||
> +			  pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_FAILED));
> +}
> +
> +static void resume_vf_canceled_by_restart(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_busy_except_flr);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10, xe_gt_sriov_pf_control_restart, gt);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
> +}
> +
> +static void resume_vf_canceled_by_flr(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_busy_except_flr);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10,
> +				     xe_gt_sriov_pf_control_trigger_flr, gt, VFUT1);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
> +}
> +
> +static void resume_vf_canceled_by_stop(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	prepare_state(test, VFUT1, paused, ARRAY_SIZE(paused));
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_busy_except_stop);
> +
> +	xe_kunit_helper_delayed_call(test, HZ / 10,
> +				     xe_gt_sriov_pf_control_stop_vf, gt, VFUT1);
> +
> +	KUNIT_EXPECT_EQ(test, -ECANCELED, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUMED));
> +	KUNIT_EXPECT_TRUE(test, pf_expect_vf_not_state(gt, VFUT1, XE_GT_SRIOV_STATE_RESUME_WIP));
> +}
> +
> +static void basic_pause_and_resume_vf(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_ASSERT_EQ(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_resume_vf(gt, VFUT1));
> +}
> +
> +static void basic_pause_and_stop_vf(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_ASSERT_EQ(test, 0, xe_gt_sriov_pf_control_pause_vf(gt, VFUT1));
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +}
> +
> +static void basic_stop_and_flr_vf(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_stop_vf(gt, VFUT1));
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +}
> +
> +static void basic_flr_and_flr_vf(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +}
> +
> +static void basic_flr_vfs(struct kunit *test)
> +{
> +	struct xe_gt *gt = test->priv;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_and_reply);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT1));
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_trigger_flr(gt, VFUT2));
> +}
> +
> +static struct kunit_case pf_control_test_cases[] = {
> +	KUNIT_CASE(basic_pause_and_resume_vf),
> +	KUNIT_CASE(basic_pause_and_stop_vf),
> +	KUNIT_CASE(basic_stop_and_flr_vf),
> +	KUNIT_CASE(basic_flr_and_flr_vf),
> +	KUNIT_CASE(basic_flr_vfs),
> +
> +	KUNIT_CASE_PARAM(flr_vf_from, flr_must_pass_from_gen_params),
> +	KUNIT_CASE_PARAM(flr_vf_needs_retry_from, flr_must_pass_from_gen_params),
> +	KUNIT_CASE_PARAM(flr_vf_needs_retry_late_from, flr_must_pass_from_gen_params),
> +	KUNIT_CASE(flr_vf_fails_on_send),
> +	KUNIT_CASE(flr_vf_fails_on_reset),
> +	KUNIT_CASE(flr_vf_rejected_by_guc),
> +	KUNIT_CASE_SLOW(flr_vf_unconfirmed_by_guc),
> +	KUNIT_CASE(flr_vf_confirmed_early_continue_by_guc),
> +	KUNIT_CASE(flr_vf_confirmed_early_reject_by_guc),
> +	KUNIT_CASE(flr_vf_confirmed_twice_by_guc),
> +	KUNIT_CASE(flr_vf_confirmed_too_late_by_guc),
> +	KUNIT_CASE(flr_vf_wrong_confirmation_from_guc),
> +	KUNIT_CASE(flr_vf_unsolicited_confirmation_from_guc),
> +	KUNIT_CASE(flr_vf_canceled_by_restart),
> +
> +	KUNIT_CASE_PARAM(stop_vf_from, stop_must_pass_from_gen_params),
> +	KUNIT_CASE_PARAM(stop_vf_needs_retry_from, stop_must_pass_from_gen_params),
> +	KUNIT_CASE_PARAM(stop_vf_refused_from, stop_must_fail_from_gen_params),
> +	KUNIT_CASE_PARAM(stop_vf_canceled_from, stop_must_cancel_from_gen_params),
> +	KUNIT_CASE(stop_vf_fails_on_send),
> +	KUNIT_CASE(stop_vf_rejected_by_guc),
> +	KUNIT_CASE(stop_vf_canceled_by_flr),
> +	KUNIT_CASE(stop_vf_canceled_by_restart),
> +
> +	KUNIT_CASE_PARAM(pause_vf_from, pause_must_pass_from_gen_params),
> +	KUNIT_CASE_PARAM(pause_vf_needs_retry_from, pause_must_pass_from_gen_params),
> +	KUNIT_CASE_PARAM(pause_vf_refused_from, pause_must_fail_from_gen_params),
> +	KUNIT_CASE_PARAM(pause_vf_canceled_from, pause_must_cancel_from_gen_params),
> +	KUNIT_CASE(pause_vf_fails_on_send),
> +	KUNIT_CASE(pause_vf_rejected_by_guc),
> +	KUNIT_CASE_SLOW(pause_vf_unconfirmed_by_guc),
> +	KUNIT_CASE(pause_vf_canceled_by_flr),
> +	KUNIT_CASE(pause_vf_canceled_by_stop),
> +	KUNIT_CASE(pause_vf_canceled_by_restart),
> +
> +	KUNIT_CASE_PARAM(resume_vf_from, resume_must_pass_from_gen_params),
> +	KUNIT_CASE_PARAM(resume_vf_needs_retry_from, resume_must_pass_from_gen_params),
> +	KUNIT_CASE_PARAM(resume_vf_refused_from, resume_must_fail_from_gen_params),
> +	KUNIT_CASE_PARAM(resume_vf_canceled_from, resume_must_cancel_from_gen_params),
> +	KUNIT_CASE(resume_vf_fails_on_send),
> +	KUNIT_CASE(resume_vf_rejected_by_guc),
> +	KUNIT_CASE(resume_vf_canceled_by_flr),
> +	KUNIT_CASE(resume_vf_canceled_by_stop),
> +	KUNIT_CASE(resume_vf_canceled_by_restart),
> +
> +	{}
> +};
> +
> +static struct kunit_suite pf_control_suite = {
> +	.name = "pf_control",
> +	.test_cases = pf_control_test_cases,
> +	.init = pf_control_test_init,
> +};
> +
> +kunit_test_suite(pf_control_suite);
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> index e91c71d768ff..4863d79f72e0 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> @@ -4,6 +4,7 @@
>   */
>  
>  #include <drm/drm_managed.h>
> +#include <kunit/static_stub.h>
>  
>  #include "abi/guc_actions_sriov_abi.h"
>  
> @@ -196,6 +197,8 @@ static const char *control_bit_to_string(enum xe_gt_sriov_control_bits bit)
>  
>  static unsigned long pf_get_default_timeout(enum xe_gt_sriov_control_bits bit)
>  {
> +	KUNIT_STATIC_STUB_REDIRECT(pf_get_default_timeout, bit);
> +
>  	switch (bit) {
>  	case XE_GT_SRIOV_STATE_FLR_WAIT_GUC:
>  	case XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC:
> @@ -1458,3 +1461,7 @@ void xe_gt_sriov_pf_control_restart(struct xe_gt *gt)
>  	for (n = 1; n <= totalvfs; n++)
>  		pf_enter_vf_ready(gt, n);
>  }
> +
> +#if IS_BUILTIN(CONFIG_DRM_XE_KUNIT_TEST)
> +#include "tests/xe_gt_sriov_pf_control_kunit.c"
> +#endif

I sent a review to the wrong patch revision, I will re-paste and send
again:
The tests look fine. I tried to verify the states according to the available
drawings of the state machine and I did not find any incorrectness.
It seems to me that the tests could be expanded to include an additional
basic test: basic_pause_and_flr_vf
But still:
Reviewed-by: Piotr Piórkowski <piotr.piorkowski@intel.com>

> -- 
> 2.43.0
> 

-- 

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

* Re: [PATCH 12/12] drm/xe/tests: Add KUnit tests for VF control GuC messages
  2024-08-09 16:51 ` [PATCH 12/12] drm/xe/tests: Add KUnit tests for VF control GuC messages Michal Wajdeczko
@ 2024-08-23 13:18   ` Piotr Piórkowski
  0 siblings, 0 replies; 47+ messages in thread
From: Piotr Piórkowski @ 2024-08-23 13:18 UTC (permalink / raw)
  To: Michal Wajdeczko; +Cc: intel-xe, Lucas De Marchi

Michal Wajdeczko <michal.wajdeczko@intel.com> wrote on pią [2024-sie-09 18:51:59 +0200]:
> Add KUnit tests (~50) to cover all possible VF control messages
> that could be seen by the PF, either expected or corrupted.
> 
> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Lucas De Marchi <lucas.demarchi@intel.com>
> ---
>  .../xe/tests/xe_gt_sriov_pf_control_kunit.c   | 194 ++++++++++++++++++
>  1 file changed, 194 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c b/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
> index 4252577b4bbd..194fcf5687d1 100644
> --- a/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
> +++ b/drivers/gpu/drm/xe/tests/xe_gt_sriov_pf_control_kunit.c
> @@ -1358,3 +1358,197 @@ static struct kunit_suite pf_control_suite = {
>  };
>  
>  kunit_test_suite(pf_control_suite);
> +
> +#define PREP_MSG_0_VF_STATE_NOTIFY(mbz)							\
> +	FIELD_PREP_CONST(GUC_HXG_MSG_0_ORIGIN, GUC_HXG_ORIGIN_GUC) |			\
> +	FIELD_PREP_CONST(GUC_HXG_MSG_0_TYPE, GUC_HXG_TYPE_EVENT) |			\
> +	FIELD_PREP_CONST(GUC_HXG_EVENT_MSG_0_DATA0, (mbz)) |				\
> +	FIELD_PREP_CONST(GUC_HXG_EVENT_MSG_0_ACTION, GUC_ACTION_GUC2PF_VF_STATE_NOTIFY)
> +
> +#define PREP_MSG_VF_STATE_NOTIFY(mbz, vfid, e)						\
> +	PREP_MSG_0_VF_STATE_NOTIFY(mbz),						\
> +	FIELD_PREP_CONST(GUC2PF_VF_STATE_NOTIFY_EVENT_MSG_1_VFID, (vfid)),		\
> +	FIELD_PREP_CONST(GUC2PF_VF_STATE_NOTIFY_EVENT_MSG_2_EVENT, (e))
> +
> +static const u32 msg_pf_enable[] = {
> +	PREP_MSG_VF_STATE_NOTIFY(0, 0, GUC_PF_NOTIFY_VF_ENABLE),
> +};
> +
> +static const u32 msg_vf_flr[] = {
> +	PREP_MSG_VF_STATE_NOTIFY(0, VFUT1, GUC_PF_NOTIFY_VF_FLR),
> +};
> +
> +static const u32 msg_vf_flr_done[] = {
> +	PREP_MSG_VF_STATE_NOTIFY(0, VFUT1, GUC_PF_NOTIFY_VF_FLR_DONE),
> +};
> +
> +static const u32 msg_vf_pause_done[] = {
> +	PREP_MSG_VF_STATE_NOTIFY(0, VFUT1, GUC_PF_NOTIFY_VF_PAUSE_DONE),
> +};
> +
> +static const u32 msg_vf_fixup[] = {
> +	PREP_MSG_VF_STATE_NOTIFY(0, VFUT1, GUC_PF_NOTIFY_VF_FIXUP_DONE),
> +};
> +
> +static const u32 msg_pf_bad_mbz[] = {
> +	PREP_MSG_VF_STATE_NOTIFY(1, 0, GUC_PF_NOTIFY_VF_ENABLE),
> +};
> +
> +static const u32 msg_pf_invalid_event[] = {
> +	PREP_MSG_VF_STATE_NOTIFY(0, 0, 0),
> +};
> +
> +static const u32 msg_pf_unknown_event[] = {
> +	PREP_MSG_VF_STATE_NOTIFY(0, 0, GUC_PF_NOTIFY_VF_ENABLE + 1),
> +};
> +
> +static const u32 msg_vf_bad_mbz[] = {
> +	PREP_MSG_VF_STATE_NOTIFY(1, VFUT1, GUC_PF_NOTIFY_VF_FLR),
> +};
> +
> +static const u32 msg_vf_bad_vfid[] = {
> +	PREP_MSG_VF_STATE_NOTIFY(0, VFID(DUT_NUM_VFS + 1), GUC_PF_NOTIFY_VF_FLR),
> +};
> +
> +static const u32 msg_vf_invalid_event[] = {
> +	PREP_MSG_VF_STATE_NOTIFY(0, VFUT1, 0),
> +};
> +
> +static const u32 msg_vf_unknown_event[] = {
> +	PREP_MSG_VF_STATE_NOTIFY(0, VFUT1, GUC_PF_NOTIFY_VF_FIXUP_DONE + 1),
> +};
> +
> +static const u32 msg_no_data[GUC_HXG_EVENT_MSG_MIN_LEN] = {
> +	PREP_MSG_0_VF_STATE_NOTIFY(0),
> +	/* only header, missing both VFID and EVENT data */
> +};
> +
> +static const u32 msg_pf_too_short[GUC2PF_VF_STATE_NOTIFY_EVENT_MSG_LEN - 1] = {
> +	PREP_MSG_0_VF_STATE_NOTIFY(0),
> +	PFID,
> +	/* missing EVENT data */
> +};
> +
> +static const u32 msg_pf_too_long[GUC2PF_VF_STATE_NOTIFY_EVENT_MSG_LEN + 1] = {
> +	PREP_MSG_VF_STATE_NOTIFY(0, 0, GUC_PF_NOTIFY_VF_ENABLE),
> +	0, /* unexpected extra DATA */
> +};
> +
> +static const u32 msg_vf_too_short[GUC2PF_VF_STATE_NOTIFY_EVENT_MSG_LEN - 1] = {
> +	PREP_MSG_0_VF_STATE_NOTIFY(0),
> +	VFUT1,
> +	/* missing EVENT data */
> +};
> +
> +static const u32 msg_vf_too_long[GUC2PF_VF_STATE_NOTIFY_EVENT_MSG_LEN + 1] = {
> +	PREP_MSG_VF_STATE_NOTIFY(0, VFUT1, GUC_PF_NOTIFY_VF_FLR),
> +	0, /* unexpected extra DATA */
> +};
> +
> +struct msg_param {
> +	const char *name;
> +	const u32 *msg;
> +	size_t len;
> +};
> +
> +static void msg_param_get_desc(struct msg_param *p, char *desc)
> +{
> +	snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s", p->name);
> +}
> +
> +#define MAKE_MSG_PARAM(X) { .name = #X, .msg = X, .len = ARRAY_SIZE(X) }
> +
> +#define LIST_MSG_PARAM_VALID			\
> +	MAKE_MSG_PARAM(msg_pf_enable),		\
> +	MAKE_MSG_PARAM(msg_vf_flr),		\
> +	MAKE_MSG_PARAM(msg_vf_flr_done),	\
> +	MAKE_MSG_PARAM(msg_vf_pause_done),	\
> +	MAKE_MSG_PARAM(msg_vf_fixup)
> +
> +#define LIST_MSG_PARAM_INVALID			\
> +	MAKE_MSG_PARAM(msg_no_data),		\
> +	MAKE_MSG_PARAM(msg_pf_too_long),	\
> +	MAKE_MSG_PARAM(msg_pf_too_short),	\
> +	MAKE_MSG_PARAM(msg_pf_bad_mbz),		\
> +	MAKE_MSG_PARAM(msg_pf_invalid_event),	\
> +	MAKE_MSG_PARAM(msg_pf_unknown_event),	\
> +	MAKE_MSG_PARAM(msg_vf_too_long),	\
> +	MAKE_MSG_PARAM(msg_vf_too_short),	\
> +	MAKE_MSG_PARAM(msg_vf_bad_mbz),		\
> +	MAKE_MSG_PARAM(msg_vf_bad_vfid),	\
> +	MAKE_MSG_PARAM(msg_vf_invalid_event),	\
> +	MAKE_MSG_PARAM(msg_vf_unknown_event)
> +
> +static struct msg_param valid_messages[] = {
> +	LIST_MSG_PARAM_VALID,
> +};
> +
> +static struct msg_param invalid_messages[] = {
> +	LIST_MSG_PARAM_INVALID,
> +};
> +
> +static struct msg_param all_messages[] = {
> +	LIST_MSG_PARAM_VALID,
> +	LIST_MSG_PARAM_INVALID,
> +};
> +
> +KUNIT_ARRAY_PARAM(valid_messages, valid_messages, msg_param_get_desc);
> +KUNIT_ARRAY_PARAM(invalid_messages, invalid_messages, msg_param_get_desc);
> +KUNIT_ARRAY_PARAM(all_messages, all_messages, msg_param_get_desc);
> +
> +static void xe_rejects_all_g2h(struct kunit *test)
> +{
> +	struct xe_device *xe = (xe_kunit_helper_xe_device_test_init(test), test->priv);
> +	struct xe_gt *gt = xe_device_get_gt(xe, 0);
> +	const struct msg_param *p = test->param_value;
> +
> +	KUNIT_EXPECT_FALSE(test, IS_SRIOV_PF(xe));
> +	KUNIT_EXPECT_EQ(test, -EPROTO, xe_gt_sriov_pf_control_process_guc2pf(gt, p->msg, p->len));
> +}
> +
> +static void vf_rejects_all_g2h(struct kunit *test)
> +{
> +	struct xe_device *xe = (xe_kunit_helper_xe_device_test_init(test), test->priv);
> +	struct xe_gt *gt = xe_device_get_gt(xe, 0);
> +	const struct msg_param *p = test->param_value;
> +
> +	KUNIT_EXPECT_FALSE(test, IS_SRIOV(xe));
> +	xe->sriov.__mode = XE_SRIOV_MODE_VF;
> +
> +	KUNIT_EXPECT_TRUE(test, IS_SRIOV_VF(xe));
> +	KUNIT_EXPECT_EQ(test, -EPROTO, xe_gt_sriov_pf_control_process_guc2pf(gt, p->msg, p->len));
> +}
> +
> +static void pf_rejects_malformed_g2h(struct kunit *test)
> +{
> +	struct xe_gt *gt = (pf_control_test_init(test), test->priv);
> +	const struct msg_param *p = test->param_value;
> +
> +	KUNIT_EXPECT_NE(test, 0, xe_gt_sriov_pf_control_process_guc2pf(gt, p->msg, p->len));
> +}
> +
> +static void pf_accepts_valid_g2h(struct kunit *test)
> +{
> +	struct xe_gt *gt = (pf_control_test_init(test), test->priv);
> +	const struct msg_param *p = test->param_value;
> +
> +	XE_TEST_ACTIVATE_STUB(test, gt->sriov.pf.control.send_vf_control_cmd,
> +			      send_vf_control_cmd_pass_no_reply);
> +
> +	KUNIT_EXPECT_EQ(test, 0, xe_gt_sriov_pf_control_process_guc2pf(gt, p->msg, p->len));
> +}
> +
> +static struct kunit_case pf_control_guc_test_cases[] = {
> +	KUNIT_CASE_PARAM(xe_rejects_all_g2h, all_messages_gen_params),
> +	KUNIT_CASE_PARAM(vf_rejects_all_g2h, all_messages_gen_params),
> +	KUNIT_CASE_PARAM(pf_rejects_malformed_g2h, invalid_messages_gen_params),
> +	KUNIT_CASE_PARAM(pf_accepts_valid_g2h, valid_messages_gen_params),
> +	{}
> +};
> +
> +static struct kunit_suite pf_control_guc_suite = {
> +	.name = "pf_control_guc",
> +	.test_cases = pf_control_guc_test_cases,
> +};
> +
> +kunit_test_suite(pf_control_guc_suite);

LGTM:
Reviewed-by: Piotr Piórkowski <piotr.piorkowski@intel.com>

> -- 
> 2.43.0
> 

-- 

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

* Re: [PATCH 01/12] drm/xe/pf: Add function to sanitize VF resources
  2024-08-20 13:16       ` Lucas De Marchi
@ 2024-09-05 18:07         ` Rodrigo Vivi
  0 siblings, 0 replies; 47+ messages in thread
From: Rodrigo Vivi @ 2024-09-05 18:07 UTC (permalink / raw)
  To: Lucas De Marchi; +Cc: Michal Wajdeczko, intel-xe, Thomas Hellstrom

On Tue, Aug 20, 2024 at 08:16:19AM -0500, Lucas De Marchi wrote:
> On Tue, Aug 20, 2024 at 11:38:35AM GMT, Michal Wajdeczko wrote:
> > 
> > 
> > On 19.08.2024 22:47, Lucas De Marchi wrote:
> > > On Fri, Aug 09, 2024 at 06:51:48PM GMT, Michal Wajdeczko wrote:
> > > > +static int pf_sanitize_lmem(struct xe_tile *tile, struct xe_bo *bo,
> > > > long timeout)
> > > 
> > > it took a while to make xe use "vram"... now we are back with lmem in
> > > several places :(
> > > 
> > 
> > it's because GuC ABI is using LMEM terminology
> > 
> > if you really want then I can try to rename implementation side to use
> > 'vram' instead, but question is what to do with debugfs entries that
> > reflects GuC ABI almost 1:1, should it also be named with vram ?
> > 
> > gt0/pf/lmem_spare	-> gt0/pf/vram_spare
> > gt0/vf1/lmem_quota	-> gt0/vf1/vram_quota
> 
> +Rodrigo, +Thomas

Sorry for taking so long here.

I believe we should keep 'lmem' here. It matches guc, sriov, and gt design.

In the past, when i915 was introducing device-memory-ram support, instead
of calling it vram to align with everyone else, we decided to go with the
name 'local memory' that we were seeing a lot in internal docs.

It is good that in Xe we are now aligned with 'vram' to refer for these
device memory (ram). But by spec, 'local memory' is something else.

'Local memory' in general is the memory from VRAM which is not managed
by OS, but only managed by our device driver. However it could also be
carved out from the system ram. And then it can be used by SRIOV and
managed with LMTT (local memory translation table).

So, with this in mind and to avoid the sysfs breakage, I'm in favor
of keeping 'lmem' term where it applies. But maybe worth some
documentation page?


> 
> Lucas De Marchi

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

end of thread, other threads:[~2024-09-05 18:07 UTC | newest]

Thread overview: 47+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-09 16:51 [PATCH 00/12] PF: Improve VF control Michal Wajdeczko
2024-08-09 16:51 ` [PATCH 01/12] drm/xe/pf: Add function to sanitize VF resources Michal Wajdeczko
2024-08-16 12:58   ` Piotr Piórkowski
2024-08-19 20:47   ` Lucas De Marchi
2024-08-20  9:38     ` Michal Wajdeczko
2024-08-20 13:16       ` Lucas De Marchi
2024-09-05 18:07         ` Rodrigo Vivi
2024-08-09 16:51 ` [PATCH 02/12] drm/xe/pf: Fix documentation formatting Michal Wajdeczko
2024-08-16 12:59   ` Piotr Piórkowski
2024-08-09 16:51 ` [PATCH 03/12] drm/xe/pf: Drop GuC notifications for non-existing VF Michal Wajdeczko
2024-08-16 13:01   ` Piotr Piórkowski
2024-08-19 17:51     ` Michal Wajdeczko
2024-08-22 10:48       ` Piotr Piórkowski
2024-08-09 16:51 ` [PATCH 04/12] drm/xe/pf: Improve VF control Michal Wajdeczko
2024-08-16 13:06   ` Piotr Piórkowski
2024-08-19 17:52     ` Michal Wajdeczko
2024-08-20  7:56   ` Piotr Piórkowski
2024-08-20 10:04     ` Michal Wajdeczko
2024-08-09 16:51 ` [PATCH 05/12] drm/xe/tests: Allow deferred function call during KUnit test Michal Wajdeczko
2024-08-19 21:38   ` Lucas De Marchi
2024-08-20 10:23     ` Michal Wajdeczko
2024-08-20 13:21       ` Lucas De Marchi
2024-08-20 13:27       ` Lucas De Marchi
2024-08-09 16:51 ` [PATCH 06/12] drm/xe/tests: Add helper macro to detect if KUnit is running Michal Wajdeczko
2024-08-09 16:51 ` [PATCH 07/12] drm/xe/tests: Add helpers to call stubs out of KUnit context Michal Wajdeczko
2024-08-19 21:52   ` Lucas De Marchi
2024-08-20 10:31     ` Michal Wajdeczko
2024-08-09 16:51 ` [PATCH 08/12] drm/xe/guc: Define stub for xe_guc_ct_send_recv() Michal Wajdeczko
2024-08-09 16:51 ` [PATCH 09/12] drm/xe/pf: Define stub for pf_sanitize_vf_resources() Michal Wajdeczko
2024-08-09 16:51 ` [PATCH 10/12] drm/xe/pf: Define stub for pf_send_vf_control_cmd() Michal Wajdeczko
2024-08-09 16:51 ` [PATCH 11/12] drm/xe/tests: Add KUnit tests for VF control state machines Michal Wajdeczko
2024-08-09 17:23   ` [PATCH v2 " Michal Wajdeczko
2024-08-22 10:51     ` Piotr Piórkowski
2024-08-22 10:47   ` [PATCH " Piotr Piórkowski
2024-08-09 16:51 ` [PATCH 12/12] drm/xe/tests: Add KUnit tests for VF control GuC messages Michal Wajdeczko
2024-08-23 13:18   ` Piotr Piórkowski
2024-08-09 16:57 ` ✓ CI.Patch_applied: success for PF: Improve VF control Patchwork
2024-08-09 16:58 ` ✗ CI.checkpatch: warning " Patchwork
2024-08-09 16:58 ` ✗ CI.KUnit: failure " Patchwork
2024-08-09 17:28 ` ✓ CI.Patch_applied: success for PF: Improve VF control (rev2) Patchwork
2024-08-09 17:29 ` ✗ CI.checkpatch: warning " Patchwork
2024-08-09 17:30 ` ✓ CI.KUnit: success " Patchwork
2024-08-09 17:42 ` ✓ CI.Build: " Patchwork
2024-08-09 17:44 ` ✗ CI.Hooks: failure " Patchwork
2024-08-09 17:46 ` ✓ CI.checksparse: success " Patchwork
2024-08-09 18:06 ` ✓ CI.BAT: " Patchwork
2024-08-09 20:35 ` ✗ 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