Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 00/23] Allow configfs to disable specific GT type(s)
@ 2025-09-30 22:56 Matt Roper
  2025-09-30 22:56 ` [PATCH v3 01/23] drm/xe/huc: Adjust HuC check on primary GT Matt Roper
                   ` (26 more replies)
  0 siblings, 27 replies; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe
  Cc: matthew.d.roper, Gustavo Sousa, Michal Wajdeczko, Lucas De Marchi

During various debug or hardware bring-up activities, it is often useful
to completely disable one of the GTs to reduce the scope of the debug.
Add a configfs attribute to make this easy to do in a standard manner,
similar to the existing attribute we have to limit engines.

One of the changes in this series is that we reverse direction on the
placement of a few feature flags.  Previously we had moved things like
number of page table levels, size of the virtual address space, or
presence/absence of FlatCCS into the graphics descriptor to tie it to
the general architecture (Xe2, Xe3, etc.).  But upon further reflection,
these kind of flags and values are truly platform-specific
characteristics rather than being tied just to the graphics IP.  The
value of these winds up being platform-wide (as already evidenced by the
fact that we copied their values into xe->info rather than gt->info) and
all IP blocks in a hardware platform (graphics, media, and display) are
going to have a consistent understanding of these characteristics;
they're not just "graphics" values, and we need to be able to detect and
handle them properly even when "graphics" (in the form of the primary
GT) is absent.  So this series moves some of those flags back into the
platform-level descriptors and tries to keep the graphics descriptor's
fields focused on values that are truly tied to the primary GT.

Note that at the moment it's only possible to disable the media GT.
Although this series includes a number of patches aimed at reducing the
driver's reliance on the primary GT and assumptions that the primary GT
will always be present and non-NULL, we're not quite at the point where
the driver can actually run with primary GT disabled.  The main
remaining blocker for that is the reliance on the BCS engines (which
reside in the primary GT) for various VRAM and migration operations.
Additional work after this series will be required to eliminate those
dependencies.

v3:
 - Drop default values and set va_bits / vm_max_level on all descriptors
   (Michal, Lucas)
 - Use a specifically allocated GT to do SRIOV pre-init GT operations
   rather than filling tile0's primary GT with data for each tile & GT.
   This allows the primary GT's allocation to be moved to a more
   appropriate place (and skipped completely if the primary GT is
   disabled).
 - If primary GT is disabled, do PF->native demotion and VF probe failure
   in xe_info_init rather than SRIOV pre-init.  (Michal)

v2:
 - About 20 extra patches added to reduce dependencies on an
   always-present primary GT.
 - Kerneldoc and string parsing fixes to the configfs attribute handling
   (Gustavo)

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

Matt Roper (23):
  drm/xe/huc: Adjust HuC check on primary GT
  drm/xe: Drop GT parameter to xe_display_irq_postinstall()
  drm/xe: Move 'va_bits' flag back to platform descriptor
  drm/xe: Move 'vm_max_level' flag back to platform descriptor
  drm/xe: Move 'vram_flags' flag back to platform descriptor
  drm/xe: Move 'has_flatccs' flag back to platform descriptor
  drm/xe: Read VF GMD_ID with a specifically-allocated dummy GT
  drm/xe: Move primary GT allocation from xe_tile_init_early to
    xe_tile_init
  drm/xe: Skip L2 / TDF cache flushes if primary GT is disabled
  drm/xe/query: Report hwconfig size as 0 if primary GT is disabled
  drm/xe/pmu: Initialize PMU event types based on first available GT
  drm/xe: Check for primary GT before looking up Wa_22019338487
  drm/xe: Make display part of Wa_22019338487 a device workaround
  drm/xe/irq: Don't try to lookup engine masks for non-existent primary
    GT
  drm/xe: Handle Wa_22010954014 and Wa_14022085890 as device workarounds
  drm/xe/rtp: Pass xe_device parameter to FUNC matches
  drm/xe: Bypass Wa_14018094691 when primary GT is disabled
  drm/xe: Correct lineage for Wa_22014953428 and only check with valid
    GT
  drm/xe: Check that GT is not NULL before testing Wa_16023588340
  drm/xe: Don't check BIOS-disabled FlatCCS if primary GT is disabled
  drm/xe: Break GT setup out of xe_info_init()
  drm/xe/configfs: Add attribute to disable GT types
  drm/xe/sriov: Disable SR-IOV if primary GT is disabled via configfs

 drivers/gpu/drm/xe/display/intel_fbdev_fb.c   |   4 +-
 drivers/gpu/drm/xe/display/xe_display.c       |   5 +-
 drivers/gpu/drm/xe/display/xe_display.h       |   4 +-
 drivers/gpu/drm/xe/display/xe_display_wa.c    |   3 +-
 drivers/gpu/drm/xe/display/xe_plane_initial.c |   4 +-
 drivers/gpu/drm/xe/tests/xe_pci.c             |   6 +-
 drivers/gpu/drm/xe/tests/xe_rtp_test.c        |   6 +-
 drivers/gpu/drm/xe/xe_configfs.c              | 130 ++++++++++
 drivers/gpu/drm/xe/xe_configfs.h              |   2 +
 drivers/gpu/drm/xe/xe_device.c                |   7 +
 drivers/gpu/drm/xe/xe_device_wa_oob.rules     |   3 +
 drivers/gpu/drm/xe/xe_ggtt.c                  |  26 +-
 drivers/gpu/drm/xe/xe_gsc.c                   |   4 +-
 drivers/gpu/drm/xe/xe_guc_pc.c                |   3 +-
 drivers/gpu/drm/xe/xe_huc.c                   |  10 +-
 drivers/gpu/drm/xe/xe_hw_engine.c             |  10 +-
 drivers/gpu/drm/xe/xe_irq.c                   |  14 +-
 drivers/gpu/drm/xe/xe_pci.c                   | 242 ++++++++++++------
 drivers/gpu/drm/xe/xe_pci_types.h             |   9 +-
 drivers/gpu/drm/xe/xe_platform_types.h        |   1 +
 drivers/gpu/drm/xe/xe_pmu.c                   |  11 +-
 drivers/gpu/drm/xe/xe_query.c                 |   2 +-
 drivers/gpu/drm/xe/xe_reg_whitelist.c         |   3 +-
 drivers/gpu/drm/xe/xe_rtp.c                   |  24 +-
 drivers/gpu/drm/xe/xe_rtp.h                   |  18 +-
 drivers/gpu/drm/xe/xe_rtp_types.h             |   4 +-
 drivers/gpu/drm/xe/xe_tile.c                  |   4 -
 drivers/gpu/drm/xe/xe_vm.c                    |   3 +-
 drivers/gpu/drm/xe/xe_wa.c                    |   2 +-
 drivers/gpu/drm/xe/xe_wa_oob.rules            |   8 +-
 include/drm/intel/pciids.h                    |   7 +-
 31 files changed, 429 insertions(+), 150 deletions(-)

-- 
2.51.0


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

* [PATCH v3 01/23] drm/xe/huc: Adjust HuC check on primary GT
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-09-30 22:56 ` [PATCH v3 02/23] drm/xe: Drop GT parameter to xe_display_irq_postinstall() Matt Roper
                   ` (25 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Daniele Ceraolo Spurio, Tejas Upadhyay

The HuC initialization code determines whether a platform can have a HuC
on the primary GT by checking whether tile->media_gt is NULL; old Xe1
platforms that combined render+media into a single GT will always have a
NULL media_gt pointer.  However once we allow media to be disabled via
configfs, there will also be cases where tile->media_gt is NULL on more
modern platforms, causing this condition to behave incorrectly.

To handle cases where media gets disabled via configfs (or theoretical
cases where media is truly fused off in hardware), change the condition
to consider the graphics version of the primary GT; only the old Xe1
platforms with graphics versions 12.55 or earlier should try to
initialize a HuC on the primary GT.

Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Reviewed-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_huc.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_huc.c b/drivers/gpu/drm/xe/xe_huc.c
index 7e43b2dd6a32..0a70c8924582 100644
--- a/drivers/gpu/drm/xe/xe_huc.c
+++ b/drivers/gpu/drm/xe/xe_huc.c
@@ -66,14 +66,18 @@ static int huc_alloc_gsc_pkt(struct xe_huc *huc)
 int xe_huc_init(struct xe_huc *huc)
 {
 	struct xe_gt *gt = huc_to_gt(huc);
-	struct xe_tile *tile = gt_to_tile(gt);
 	struct xe_device *xe = gt_to_xe(gt);
 	int ret;
 
 	huc->fw.type = XE_UC_FW_TYPE_HUC;
 
-	/* On platforms with a media GT the HuC is only available there */
-	if (tile->media_gt && (gt != tile->media_gt)) {
+	/*
+	 * The HuC is only available on the media GT on most platforms.  The
+	 * exception to that rule are the old Xe1 platforms where there was
+	 * no separate GT for media IP, so the HuC was part of the primary
+	 * GT.  Such platforms have graphics versions 12.55 and earlier.
+	 */
+	if (!xe_gt_is_media_type(gt) && GRAPHICS_VERx100(xe) > 1255) {
 		xe_uc_fw_change_status(&huc->fw, XE_UC_FIRMWARE_NOT_SUPPORTED);
 		return 0;
 	}
-- 
2.51.0


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

* [PATCH v3 02/23] drm/xe: Drop GT parameter to xe_display_irq_postinstall()
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
  2025-09-30 22:56 ` [PATCH v3 01/23] drm/xe/huc: Adjust HuC check on primary GT Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-09-30 22:56 ` [PATCH v3 03/23] drm/xe: Move 'va_bits' flag back to platform descriptor Matt Roper
                   ` (24 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Lucas De Marchi

Display interrupt handling has no relation to GT(s) on the platforms
supported by the Xe driver.  We only call xe_display_irq_postinstall
with the first tile's primary GT, so the single condition that uses the
GT pointer within the function always evaluates to true.  Drop the
unnecessary parameter and the condition.

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
---
 drivers/gpu/drm/xe/display/xe_display.c | 5 ++---
 drivers/gpu/drm/xe/display/xe_display.h | 4 ++--
 drivers/gpu/drm/xe/xe_irq.c             | 2 +-
 3 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 5f4044e63185..47619bb8dc10 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -227,15 +227,14 @@ void xe_display_irq_reset(struct xe_device *xe)
 	gen11_display_irq_reset(display);
 }
 
-void xe_display_irq_postinstall(struct xe_device *xe, struct xe_gt *gt)
+void xe_display_irq_postinstall(struct xe_device *xe)
 {
 	struct intel_display *display = xe->display;
 
 	if (!xe->info.probe_display)
 		return;
 
-	if (gt->info.id == XE_GT0)
-		gen11_de_irq_postinstall(display);
+	gen11_de_irq_postinstall(display);
 }
 
 static bool suspend_to_idle(void)
diff --git a/drivers/gpu/drm/xe/display/xe_display.h b/drivers/gpu/drm/xe/display/xe_display.h
index e533aa4750bc..76db95c25f7e 100644
--- a/drivers/gpu/drm/xe/display/xe_display.h
+++ b/drivers/gpu/drm/xe/display/xe_display.h
@@ -26,7 +26,7 @@ void xe_display_unregister(struct xe_device *xe);
 void xe_display_irq_handler(struct xe_device *xe, u32 master_ctl);
 void xe_display_irq_enable(struct xe_device *xe, u32 gu_misc_iir);
 void xe_display_irq_reset(struct xe_device *xe);
-void xe_display_irq_postinstall(struct xe_device *xe, struct xe_gt *gt);
+void xe_display_irq_postinstall(struct xe_device *xe);
 
 void xe_display_pm_suspend(struct xe_device *xe);
 void xe_display_pm_shutdown(struct xe_device *xe);
@@ -55,7 +55,7 @@ static inline void xe_display_unregister(struct xe_device *xe) {}
 static inline void xe_display_irq_handler(struct xe_device *xe, u32 master_ctl) {}
 static inline void xe_display_irq_enable(struct xe_device *xe, u32 gu_misc_iir) {}
 static inline void xe_display_irq_reset(struct xe_device *xe) {}
-static inline void xe_display_irq_postinstall(struct xe_device *xe, struct xe_gt *gt) {}
+static inline void xe_display_irq_postinstall(struct xe_device *xe) {}
 
 static inline void xe_display_pm_suspend(struct xe_device *xe) {}
 static inline void xe_display_pm_shutdown(struct xe_device *xe) {}
diff --git a/drivers/gpu/drm/xe/xe_irq.c b/drivers/gpu/drm/xe/xe_irq.c
index 870edaf69388..5018a116852f 100644
--- a/drivers/gpu/drm/xe/xe_irq.c
+++ b/drivers/gpu/drm/xe/xe_irq.c
@@ -656,7 +656,7 @@ static void xe_irq_postinstall(struct xe_device *xe)
 			xe_memirq_postinstall(&tile->memirq);
 	}
 
-	xe_display_irq_postinstall(xe, xe_root_mmio_gt(xe));
+	xe_display_irq_postinstall(xe);
 
 	/*
 	 * ASLE backlight operations are reported via GUnit GSE interrupts
-- 
2.51.0


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

* [PATCH v3 03/23] drm/xe: Move 'va_bits' flag back to platform descriptor
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
  2025-09-30 22:56 ` [PATCH v3 01/23] drm/xe/huc: Adjust HuC check on primary GT Matt Roper
  2025-09-30 22:56 ` [PATCH v3 02/23] drm/xe: Drop GT parameter to xe_display_irq_postinstall() Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-10-01  9:44   ` Michal Wajdeczko
  2025-09-30 22:56 ` [PATCH v3 04/23] drm/xe: Move 'vm_max_level' " Matt Roper
                   ` (23 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Lucas De Marchi, Michal Wajdeczko

The number of virtual address bits is something that should be tracked
at the platform level rather than the IP level.  Even when mixing and
matching various graphics, media, and display IP blocks, the platform as
a whole has to have consistent page table handling.  This is also a
trait that should be tied to the platform even if the graphics IP itself
is not present (e.g., if we disable the primary GT via configfs).

v2:
 - Drop the default value of 48 and explicitly set it in each relevant
   descriptor.  (Lucas, Michal)

Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_pci.c       | 21 +++++++++++++++------
 drivers/gpu/drm/xe/xe_pci_types.h |  2 +-
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
index 3f42b91efa28..69ed987fef67 100644
--- a/drivers/gpu/drm/xe/xe_pci.c
+++ b/drivers/gpu/drm/xe/xe_pci.c
@@ -52,13 +52,11 @@ __diag_ignore_all("-Woverride-init", "Allow field overrides in table");
 static const struct xe_graphics_desc graphics_xelp = {
 	.hw_engine_mask = BIT(XE_HW_ENGINE_RCS0) | BIT(XE_HW_ENGINE_BCS0),
 
-	.va_bits = 48,
 	.vm_max_level = 3,
 };
 
 #define XE_HP_FEATURES \
 	.has_range_tlb_inval = true, \
-	.va_bits = 48, \
 	.vm_max_level = 3
 
 static const struct xe_graphics_desc graphics_xehpg = {
@@ -84,7 +82,6 @@ static const struct xe_graphics_desc graphics_xehpc = {
 		BIT(XE_HW_ENGINE_CCS2) | BIT(XE_HW_ENGINE_CCS3),
 
 	XE_HP_FEATURES,
-	.va_bits = 57,
 	.vm_max_level = 4,
 	.vram_flags = XE_VRAM_FLAGS_NEED64K,
 
@@ -108,7 +105,6 @@ static const struct xe_graphics_desc graphics_xelpg = {
 	.has_range_tlb_inval = 1, \
 	.has_usm = 1, \
 	.has_64bit_timestamp = 1, \
-	.va_bits = 48, \
 	.vm_max_level = 4, \
 	.hw_engine_mask = \
 		BIT(XE_HW_ENGINE_RCS0) | \
@@ -174,6 +170,7 @@ static const struct xe_device_desc tgl_desc = {
 	.has_sriov = true,
 	.max_gt_per_tile = 1,
 	.require_force_probe = true,
+	.va_bits = 48,
 };
 
 static const struct xe_device_desc rkl_desc = {
@@ -185,6 +182,7 @@ static const struct xe_device_desc rkl_desc = {
 	.has_llc = true,
 	.max_gt_per_tile = 1,
 	.require_force_probe = true,
+	.va_bits = 48,
 };
 
 static const u16 adls_rpls_ids[] = { INTEL_RPLS_IDS(NOP), 0 };
@@ -203,6 +201,7 @@ static const struct xe_device_desc adl_s_desc = {
 		{ XE_SUBPLATFORM_ALDERLAKE_S_RPLS, "RPLS", adls_rpls_ids },
 		{},
 	},
+	.va_bits = 48,
 };
 
 static const u16 adlp_rplu_ids[] = { INTEL_RPLU_IDS(NOP), 0 };
@@ -221,6 +220,7 @@ static const struct xe_device_desc adl_p_desc = {
 		{ XE_SUBPLATFORM_ALDERLAKE_P_RPLU, "RPLU", adlp_rplu_ids },
 		{},
 	},
+	.va_bits = 48,
 };
 
 static const struct xe_device_desc adl_n_desc = {
@@ -233,6 +233,7 @@ static const struct xe_device_desc adl_n_desc = {
 	.has_sriov = true,
 	.max_gt_per_tile = 1,
 	.require_force_probe = true,
+	.va_bits = 48,
 };
 
 #define DGFX_FEATURES \
@@ -249,6 +250,7 @@ static const struct xe_device_desc dg1_desc = {
 	.has_heci_gscfi = 1,
 	.max_gt_per_tile = 1,
 	.require_force_probe = true,
+	.va_bits = 48,
 };
 
 static const u16 dg2_g10_ids[] = { INTEL_DG2_G10_IDS(NOP), INTEL_ATS_M150_IDS(NOP), 0 };
@@ -265,7 +267,8 @@ static const u16 dg2_g12_ids[] = { INTEL_DG2_G12_IDS(NOP), 0 };
 		{ XE_SUBPLATFORM_DG2_G11, "G11", dg2_g11_ids }, \
 		{ XE_SUBPLATFORM_DG2_G12, "G12", dg2_g12_ids }, \
 		{ } \
-	}
+	}, \
+	.va_bits = 48
 
 static const struct xe_device_desc ats_m_desc = {
 	.pre_gmdid_graphics_ip = &graphics_ip_xehpg,
@@ -303,6 +306,7 @@ static const __maybe_unused struct xe_device_desc pvc_desc = {
 	.max_gt_per_tile = 1,
 	.max_remote_tiles = 1,
 	.require_force_probe = true,
+	.va_bits = 57,
 	.has_mbx_power_limits = false,
 };
 
@@ -314,6 +318,7 @@ static const struct xe_device_desc mtl_desc = {
 	.has_display = true,
 	.has_pxp = true,
 	.max_gt_per_tile = 2,
+	.va_bits = 48,
 };
 
 static const struct xe_device_desc lnl_desc = {
@@ -323,6 +328,7 @@ static const struct xe_device_desc lnl_desc = {
 	.has_pxp = true,
 	.max_gt_per_tile = 2,
 	.needs_scratch = true,
+	.va_bits = 48,
 };
 
 static const struct xe_device_desc bmg_desc = {
@@ -338,6 +344,7 @@ static const struct xe_device_desc bmg_desc = {
 	.has_sriov = true,
 	.max_gt_per_tile = 2,
 	.needs_scratch = true,
+	.va_bits = 48,
 };
 
 static const struct xe_device_desc ptl_desc = {
@@ -347,6 +354,7 @@ static const struct xe_device_desc ptl_desc = {
 	.has_sriov = true,
 	.max_gt_per_tile = 2,
 	.needs_scratch = true,
+	.va_bits = 48,
 };
 
 #undef PLATFORM
@@ -584,6 +592,8 @@ static int xe_info_init_early(struct xe_device *xe,
 		subplatform_desc->subplatform : XE_SUBPLATFORM_NONE;
 
 	xe->info.dma_mask_size = desc->dma_mask_size;
+	xe->info.va_bits = desc->va_bits;
+
 	xe->info.is_dgfx = desc->is_dgfx;
 	xe->info.has_fan_control = desc->has_fan_control;
 	xe->info.has_mbx_power_limits = desc->has_mbx_power_limits;
@@ -713,7 +723,6 @@ static int xe_info_init(struct xe_device *xe,
 	}
 
 	xe->info.vram_flags = graphics_desc->vram_flags;
-	xe->info.va_bits = graphics_desc->va_bits;
 	xe->info.vm_max_level = graphics_desc->vm_max_level;
 	xe->info.has_asid = graphics_desc->has_asid;
 	xe->info.has_atomic_enable_pte_bit = graphics_desc->has_atomic_enable_pte_bit;
diff --git a/drivers/gpu/drm/xe/xe_pci_types.h b/drivers/gpu/drm/xe/xe_pci_types.h
index 9b9766a3baa3..095133a1aa44 100644
--- a/drivers/gpu/drm/xe/xe_pci_types.h
+++ b/drivers/gpu/drm/xe/xe_pci_types.h
@@ -30,6 +30,7 @@ struct xe_device_desc {
 	u8 dma_mask_size;
 	u8 max_remote_tiles:2;
 	u8 max_gt_per_tile:2;
+	u8 va_bits;		/* default is 48 bits if not specified */
 
 	u8 require_force_probe:1;
 	u8 is_dgfx:1;
@@ -51,7 +52,6 @@ struct xe_device_desc {
 };
 
 struct xe_graphics_desc {
-	u8 va_bits;
 	u8 vm_max_level;
 	u8 vram_flags;
 
-- 
2.51.0


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

* [PATCH v3 04/23] drm/xe: Move 'vm_max_level' flag back to platform descriptor
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (2 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 03/23] drm/xe: Move 'va_bits' flag back to platform descriptor Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-10-01 21:51   ` Gustavo Sousa
  2025-09-30 22:56 ` [PATCH v3 05/23] drm/xe: Move 'vram_flags' " Matt Roper
                   ` (22 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Lucas De Marchi

The number of page table levels for PPGTT virtual addresses is something
that should be tracked at the platform level rather than the IP level.
Even when mixing and matching various graphics, media, and display IP
blocks, the platform as a whole has to have consistent page table
handling.  This is also a trait that should be tied to the platform even
if the graphics IP itself is not present (e.g., if we disable the
primary GT via configfs).

Since all platforms officially supported by the Xe driver use the same
value (4 levels) and only some old Xe1 platforms have a different value,
let's make this the default if a platform descriptor doesn't specify the
value.  If more platforms show up in the future with different numbers
of page table levels, we can go back to requiring this to be explicitly
specified for every platform at that time.

v2:
 - Drop default value of 4 and explicitly set the value in each platform
   desciptor.  (Lucas)

Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_pci.c       | 22 ++++++++++++++--------
 drivers/gpu/drm/xe/xe_pci_types.h |  2 +-
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
index 69ed987fef67..8688f40f55d8 100644
--- a/drivers/gpu/drm/xe/xe_pci.c
+++ b/drivers/gpu/drm/xe/xe_pci.c
@@ -51,13 +51,10 @@ __diag_ignore_all("-Woverride-init", "Allow field overrides in table");
 
 static const struct xe_graphics_desc graphics_xelp = {
 	.hw_engine_mask = BIT(XE_HW_ENGINE_RCS0) | BIT(XE_HW_ENGINE_BCS0),
-
-	.vm_max_level = 3,
 };
 
 #define XE_HP_FEATURES \
-	.has_range_tlb_inval = true, \
-	.vm_max_level = 3
+	.has_range_tlb_inval = true
 
 static const struct xe_graphics_desc graphics_xehpg = {
 	.hw_engine_mask =
@@ -82,7 +79,6 @@ static const struct xe_graphics_desc graphics_xehpc = {
 		BIT(XE_HW_ENGINE_CCS2) | BIT(XE_HW_ENGINE_CCS3),
 
 	XE_HP_FEATURES,
-	.vm_max_level = 4,
 	.vram_flags = XE_VRAM_FLAGS_NEED64K,
 
 	.has_asid = 1,
@@ -105,7 +101,6 @@ static const struct xe_graphics_desc graphics_xelpg = {
 	.has_range_tlb_inval = 1, \
 	.has_usm = 1, \
 	.has_64bit_timestamp = 1, \
-	.vm_max_level = 4, \
 	.hw_engine_mask = \
 		BIT(XE_HW_ENGINE_RCS0) | \
 		BIT(XE_HW_ENGINE_BCS8) | BIT(XE_HW_ENGINE_BCS0) | \
@@ -183,6 +178,7 @@ static const struct xe_device_desc rkl_desc = {
 	.max_gt_per_tile = 1,
 	.require_force_probe = true,
 	.va_bits = 48,
+	.vm_max_level = 3,
 };
 
 static const u16 adls_rpls_ids[] = { INTEL_RPLS_IDS(NOP), 0 };
@@ -202,6 +198,7 @@ static const struct xe_device_desc adl_s_desc = {
 		{},
 	},
 	.va_bits = 48,
+	.vm_max_level = 3,
 };
 
 static const u16 adlp_rplu_ids[] = { INTEL_RPLU_IDS(NOP), 0 };
@@ -221,6 +218,7 @@ static const struct xe_device_desc adl_p_desc = {
 		{},
 	},
 	.va_bits = 48,
+	.vm_max_level = 3,
 };
 
 static const struct xe_device_desc adl_n_desc = {
@@ -234,6 +232,7 @@ static const struct xe_device_desc adl_n_desc = {
 	.max_gt_per_tile = 1,
 	.require_force_probe = true,
 	.va_bits = 48,
+	.vm_max_level = 3,
 };
 
 #define DGFX_FEATURES \
@@ -251,6 +250,7 @@ static const struct xe_device_desc dg1_desc = {
 	.max_gt_per_tile = 1,
 	.require_force_probe = true,
 	.va_bits = 48,
+	.vm_max_level = 3,
 };
 
 static const u16 dg2_g10_ids[] = { INTEL_DG2_G10_IDS(NOP), INTEL_ATS_M150_IDS(NOP), 0 };
@@ -268,7 +268,8 @@ static const u16 dg2_g12_ids[] = { INTEL_DG2_G12_IDS(NOP), 0 };
 		{ XE_SUBPLATFORM_DG2_G12, "G12", dg2_g12_ids }, \
 		{ } \
 	}, \
-	.va_bits = 48
+	.va_bits = 48, \
+	.vm_max_level = 3
 
 static const struct xe_device_desc ats_m_desc = {
 	.pre_gmdid_graphics_ip = &graphics_ip_xehpg,
@@ -307,6 +308,7 @@ static const __maybe_unused struct xe_device_desc pvc_desc = {
 	.max_remote_tiles = 1,
 	.require_force_probe = true,
 	.va_bits = 57,
+	.vm_max_level = 4,
 	.has_mbx_power_limits = false,
 };
 
@@ -319,6 +321,7 @@ static const struct xe_device_desc mtl_desc = {
 	.has_pxp = true,
 	.max_gt_per_tile = 2,
 	.va_bits = 48,
+	.vm_max_level = 4,
 };
 
 static const struct xe_device_desc lnl_desc = {
@@ -329,6 +332,7 @@ static const struct xe_device_desc lnl_desc = {
 	.max_gt_per_tile = 2,
 	.needs_scratch = true,
 	.va_bits = 48,
+	.vm_max_level = 4,
 };
 
 static const struct xe_device_desc bmg_desc = {
@@ -345,6 +349,7 @@ static const struct xe_device_desc bmg_desc = {
 	.max_gt_per_tile = 2,
 	.needs_scratch = true,
 	.va_bits = 48,
+	.vm_max_level = 4,
 };
 
 static const struct xe_device_desc ptl_desc = {
@@ -355,6 +360,7 @@ static const struct xe_device_desc ptl_desc = {
 	.max_gt_per_tile = 2,
 	.needs_scratch = true,
 	.va_bits = 48,
+	.vm_max_level = 4,
 };
 
 #undef PLATFORM
@@ -593,6 +599,7 @@ static int xe_info_init_early(struct xe_device *xe,
 
 	xe->info.dma_mask_size = desc->dma_mask_size;
 	xe->info.va_bits = desc->va_bits;
+	xe->info.vm_max_level = desc->vm_max_level;
 
 	xe->info.is_dgfx = desc->is_dgfx;
 	xe->info.has_fan_control = desc->has_fan_control;
@@ -723,7 +730,6 @@ static int xe_info_init(struct xe_device *xe,
 	}
 
 	xe->info.vram_flags = graphics_desc->vram_flags;
-	xe->info.vm_max_level = graphics_desc->vm_max_level;
 	xe->info.has_asid = graphics_desc->has_asid;
 	xe->info.has_atomic_enable_pte_bit = graphics_desc->has_atomic_enable_pte_bit;
 	if (xe->info.platform != XE_PVC)
diff --git a/drivers/gpu/drm/xe/xe_pci_types.h b/drivers/gpu/drm/xe/xe_pci_types.h
index 095133a1aa44..f45b45a7f76a 100644
--- a/drivers/gpu/drm/xe/xe_pci_types.h
+++ b/drivers/gpu/drm/xe/xe_pci_types.h
@@ -31,6 +31,7 @@ struct xe_device_desc {
 	u8 max_remote_tiles:2;
 	u8 max_gt_per_tile:2;
 	u8 va_bits;		/* default is 48 bits if not specified */
+	u8 vm_max_level;	/* default is 4 if not specified */
 
 	u8 require_force_probe:1;
 	u8 is_dgfx:1;
@@ -52,7 +53,6 @@ struct xe_device_desc {
 };
 
 struct xe_graphics_desc {
-	u8 vm_max_level;
 	u8 vram_flags;
 
 	u64 hw_engine_mask;	/* hardware engines provided by graphics IP */
-- 
2.51.0


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

* [PATCH v3 05/23] drm/xe: Move 'vram_flags' flag back to platform descriptor
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (3 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 04/23] drm/xe: Move 'vm_max_level' " Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-09-30 22:56 ` [PATCH v3 06/23] drm/xe: Move 'has_flatccs' " Matt Roper
                   ` (21 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Lucas De Marchi

Restrictions and requirements on VRAM alignment are something that
should be tracked at the platform level rather than the IP level.  Even
when mixing and matching various graphics, media, and display IP blocks,
the platform as a whole has to have consistent memory allocation
handling.  This is also a trait that should be tied to the platform even
if the graphics IP itself is not present (e.g., if we disable the
primary GT via configfs).

Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_pci.c       | 8 ++++----
 drivers/gpu/drm/xe/xe_pci_types.h | 3 +--
 2 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
index 8688f40f55d8..e0a28276c60a 100644
--- a/drivers/gpu/drm/xe/xe_pci.c
+++ b/drivers/gpu/drm/xe/xe_pci.c
@@ -63,7 +63,6 @@ static const struct xe_graphics_desc graphics_xehpg = {
 		BIT(XE_HW_ENGINE_CCS2) | BIT(XE_HW_ENGINE_CCS3),
 
 	XE_HP_FEATURES,
-	.vram_flags = XE_VRAM_FLAGS_NEED64K,
 
 	.has_flat_ccs = 1,
 };
@@ -79,7 +78,6 @@ static const struct xe_graphics_desc graphics_xehpc = {
 		BIT(XE_HW_ENGINE_CCS2) | BIT(XE_HW_ENGINE_CCS3),
 
 	XE_HP_FEATURES,
-	.vram_flags = XE_VRAM_FLAGS_NEED64K,
 
 	.has_asid = 1,
 	.has_atomic_enable_pte_bit = 1,
@@ -269,7 +267,8 @@ static const u16 dg2_g12_ids[] = { INTEL_DG2_G12_IDS(NOP), 0 };
 		{ } \
 	}, \
 	.va_bits = 48, \
-	.vm_max_level = 3
+	.vm_max_level = 3, \
+	.vram_flags = XE_VRAM_FLAGS_NEED64K
 
 static const struct xe_device_desc ats_m_desc = {
 	.pre_gmdid_graphics_ip = &graphics_ip_xehpg,
@@ -309,6 +308,7 @@ static const __maybe_unused struct xe_device_desc pvc_desc = {
 	.require_force_probe = true,
 	.va_bits = 57,
 	.vm_max_level = 4,
+	.vram_flags = XE_VRAM_FLAGS_NEED64K,
 	.has_mbx_power_limits = false,
 };
 
@@ -600,6 +600,7 @@ static int xe_info_init_early(struct xe_device *xe,
 	xe->info.dma_mask_size = desc->dma_mask_size;
 	xe->info.va_bits = desc->va_bits;
 	xe->info.vm_max_level = desc->vm_max_level;
+	xe->info.vram_flags = desc->vram_flags;
 
 	xe->info.is_dgfx = desc->is_dgfx;
 	xe->info.has_fan_control = desc->has_fan_control;
@@ -729,7 +730,6 @@ static int xe_info_init(struct xe_device *xe,
 		media_desc = NULL;
 	}
 
-	xe->info.vram_flags = graphics_desc->vram_flags;
 	xe->info.has_asid = graphics_desc->has_asid;
 	xe->info.has_atomic_enable_pte_bit = graphics_desc->has_atomic_enable_pte_bit;
 	if (xe->info.platform != XE_PVC)
diff --git a/drivers/gpu/drm/xe/xe_pci_types.h b/drivers/gpu/drm/xe/xe_pci_types.h
index f45b45a7f76a..e7bc74f4b9b3 100644
--- a/drivers/gpu/drm/xe/xe_pci_types.h
+++ b/drivers/gpu/drm/xe/xe_pci_types.h
@@ -32,6 +32,7 @@ struct xe_device_desc {
 	u8 max_gt_per_tile:2;
 	u8 va_bits;		/* default is 48 bits if not specified */
 	u8 vm_max_level;	/* default is 4 if not specified */
+	u8 vram_flags;
 
 	u8 require_force_probe:1;
 	u8 is_dgfx:1;
@@ -53,8 +54,6 @@ struct xe_device_desc {
 };
 
 struct xe_graphics_desc {
-	u8 vram_flags;
-
 	u64 hw_engine_mask;	/* hardware engines provided by graphics IP */
 
 	u8 has_asid:1;
-- 
2.51.0


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

* [PATCH v3 06/23] drm/xe: Move 'has_flatccs' flag back to platform descriptor
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (4 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 05/23] drm/xe: Move 'vram_flags' " Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-09-30 22:56 ` [PATCH v3 07/23] drm/xe: Read VF GMD_ID with a specifically-allocated dummy GT Matt Roper
                   ` (20 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Lucas De Marchi

FlatCCS presence/absence is a flag that should be tracked at the
platform level rather than the IP level.  FlatCCS affects the
device-wide memory initialization and reservations so its effects are
not confined to a single IP block or GT.  This is also a trait that
should be tied to the platform even if the graphics IP itself is not
present (e.g., if we disable the primary GT via configfs).

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
---
 drivers/gpu/drm/xe/xe_pci.c       | 12 ++++++------
 drivers/gpu/drm/xe/xe_pci_types.h |  2 +-
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
index e0a28276c60a..37ae49f4b648 100644
--- a/drivers/gpu/drm/xe/xe_pci.c
+++ b/drivers/gpu/drm/xe/xe_pci.c
@@ -63,8 +63,6 @@ static const struct xe_graphics_desc graphics_xehpg = {
 		BIT(XE_HW_ENGINE_CCS2) | BIT(XE_HW_ENGINE_CCS3),
 
 	XE_HP_FEATURES,
-
-	.has_flat_ccs = 1,
 };
 
 static const struct xe_graphics_desc graphics_xehpc = {
@@ -95,7 +93,6 @@ static const struct xe_graphics_desc graphics_xelpg = {
 #define XE2_GFX_FEATURES \
 	.has_asid = 1, \
 	.has_atomic_enable_pte_bit = 1, \
-	.has_flat_ccs = 1, \
 	.has_range_tlb_inval = 1, \
 	.has_usm = 1, \
 	.has_64bit_timestamp = 1, \
@@ -258,6 +255,7 @@ static const u16 dg2_g12_ids[] = { INTEL_DG2_G12_IDS(NOP), 0 };
 #define DG2_FEATURES \
 	DGFX_FEATURES, \
 	PLATFORM(DG2), \
+	.has_flat_ccs = 1, \
 	.has_gsc_nvm = 1, \
 	.has_heci_gscfi = 1, \
 	.subplatforms = (const struct xe_subplatform_desc[]) { \
@@ -328,6 +326,7 @@ static const struct xe_device_desc lnl_desc = {
 	PLATFORM(LUNARLAKE),
 	.dma_mask_size = 46,
 	.has_display = true,
+	.has_flat_ccs = 1,
 	.has_pxp = true,
 	.max_gt_per_tile = 2,
 	.needs_scratch = true,
@@ -341,6 +340,7 @@ static const struct xe_device_desc bmg_desc = {
 	.dma_mask_size = 46,
 	.has_display = true,
 	.has_fan_control = true,
+	.has_flat_ccs = 1,
 	.has_mbx_power_limits = true,
 	.has_gsc_nvm = 1,
 	.has_heci_cscfi = 1,
@@ -356,6 +356,7 @@ static const struct xe_device_desc ptl_desc = {
 	PLATFORM(PANTHERLAKE),
 	.dma_mask_size = 46,
 	.has_display = true,
+	.has_flat_ccs = 1,
 	.has_sriov = true,
 	.max_gt_per_tile = 2,
 	.needs_scratch = true,
@@ -604,6 +605,8 @@ static int xe_info_init_early(struct xe_device *xe,
 
 	xe->info.is_dgfx = desc->is_dgfx;
 	xe->info.has_fan_control = desc->has_fan_control;
+	/* runtime fusing may force flat_ccs to disabled later */
+	xe->info.has_flat_ccs = desc->has_flat_ccs;
 	xe->info.has_mbx_power_limits = desc->has_mbx_power_limits;
 	xe->info.has_gsc_nvm = desc->has_gsc_nvm;
 	xe->info.has_heci_gscfi = desc->has_heci_gscfi;
@@ -735,9 +738,6 @@ static int xe_info_init(struct xe_device *xe,
 	if (xe->info.platform != XE_PVC)
 		xe->info.has_device_atomics_on_smem = 1;
 
-	/* Runtime detection may change this later */
-	xe->info.has_flat_ccs = graphics_desc->has_flat_ccs;
-
 	xe->info.has_range_tlb_inval = graphics_desc->has_range_tlb_inval;
 	xe->info.has_usm = graphics_desc->has_usm;
 	xe->info.has_64bit_timestamp = graphics_desc->has_64bit_timestamp;
diff --git a/drivers/gpu/drm/xe/xe_pci_types.h b/drivers/gpu/drm/xe/xe_pci_types.h
index e7bc74f4b9b3..6e2875ad2a41 100644
--- a/drivers/gpu/drm/xe/xe_pci_types.h
+++ b/drivers/gpu/drm/xe/xe_pci_types.h
@@ -39,6 +39,7 @@ struct xe_device_desc {
 
 	u8 has_display:1;
 	u8 has_fan_control:1;
+	u8 has_flat_ccs:1;
 	u8 has_gsc_nvm:1;
 	u8 has_heci_gscfi:1;
 	u8 has_heci_cscfi:1;
@@ -58,7 +59,6 @@ struct xe_graphics_desc {
 
 	u8 has_asid:1;
 	u8 has_atomic_enable_pte_bit:1;
-	u8 has_flat_ccs:1;
 	u8 has_indirect_ring_state:1;
 	u8 has_range_tlb_inval:1;
 	u8 has_usm:1;
-- 
2.51.0


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

* [PATCH v3 07/23] drm/xe: Read VF GMD_ID with a specifically-allocated dummy GT
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (5 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 06/23] drm/xe: Move 'has_flatccs' " Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-10-01 10:07   ` Michal Wajdeczko
  2025-09-30 22:56 ` [PATCH v3 08/23] drm/xe: Move primary GT allocation from xe_tile_init_early to xe_tile_init Matt Roper
                   ` (19 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Michal Wajdeczko

SRIOV VF initialization has a bit of a chicken and egg design problem.
Determining the IP version of the graphics and media IPs can't be done
via direct register reads as it is on PF or native and instead requires
querying the GuC.  However initialization of the GT, including its GuC,
needs to wait until after we know the IP versions so that the proper
initialization steps for the platform/IP are followed.

Currently the (somewhat hacky) solution is to manually fill out just
enough fields in tile 0's primary GT structure to make it look as if the
GT has been initialized so that the GuC can be partially initialized and
queried to obtain the GMD_ID values.  When the GT gets properly
initialized during the regular flows, the hacked-up values will get
overwritten as part of the general initialization flows.

Rather than using tile 0's primary GT structure to hold the hacked up
values for querying every GT on every tile, instead allocate a dedicated
dummy structure.  This will allow us to move the tile->primary_gt's
allocation to a more consistent place later in the initialization flow
in future patches (i.e., we shouldn't even allocate this GT structure if
the GT is disabled/unavailable).  It also helps ensure there can't be
any accidental leakage of initialization or state between the dummy
initialization for GMD_ID and the real driver initialization of the GT.

Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/tests/xe_pci.c |  6 ++-
 drivers/gpu/drm/xe/xe_pci.c       | 61 +++++++++++++++++--------------
 2 files changed, 38 insertions(+), 29 deletions(-)

diff --git a/drivers/gpu/drm/xe/tests/xe_pci.c b/drivers/gpu/drm/xe/tests/xe_pci.c
index 0f136bc85b76..969f1dacade8 100644
--- a/drivers/gpu/drm/xe/tests/xe_pci.c
+++ b/drivers/gpu/drm/xe/tests/xe_pci.c
@@ -307,8 +307,8 @@ const void *xe_pci_id_gen_param(const void *prev, char *desc)
 }
 EXPORT_SYMBOL_IF_KUNIT(xe_pci_id_gen_param);
 
-static void fake_read_gmdid(struct xe_device *xe, enum xe_gmdid_type type,
-			    u32 *ver, u32 *revid)
+static int fake_read_gmdid(struct xe_device *xe, enum xe_gmdid_type type,
+			   u32 *ver, u32 *revid)
 {
 	struct kunit *test = kunit_get_current_test();
 	struct xe_pci_fake_data *data = test->priv;
@@ -320,6 +320,8 @@ static void fake_read_gmdid(struct xe_device *xe, enum xe_gmdid_type type,
 		*ver = data->graphics_verx100;
 		*revid = xe_step_to_gmdid(data->step.graphics);
 	}
+
+	return 0;
 }
 
 static void fake_xe_info_probe_tile_count(struct xe_device *xe)
diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
index 37ae49f4b648..9fb5df10844d 100644
--- a/drivers/gpu/drm/xe/xe_pci.c
+++ b/drivers/gpu/drm/xe/xe_pci.c
@@ -464,7 +464,7 @@ enum xe_gmdid_type {
 	GMDID_MEDIA
 };
 
-static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver, u32 *revid)
+static int read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver, u32 *revid)
 {
 	struct xe_mmio *mmio = xe_root_tile_mmio(xe);
 	struct xe_reg gmdid_reg = GMD_ID;
@@ -473,21 +473,19 @@ static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver,
 	KUNIT_STATIC_STUB_REDIRECT(read_gmdid, xe, type, ver, revid);
 
 	if (IS_SRIOV_VF(xe)) {
-		struct xe_gt *gt = xe_root_mmio_gt(xe);
-
 		/*
 		 * To get the value of the GMDID register, VFs must obtain it
 		 * from the GuC using MMIO communication.
 		 *
-		 * Note that at this point the xe_gt is not fully uninitialized
-		 * and only basic access to MMIO registers is possible. To use
-		 * our existing GuC communication functions we must perform at
-		 * least basic xe_gt and xe_guc initialization.
-		 *
-		 * Since to obtain the value of GMDID_MEDIA we need to use the
-		 * media GuC, temporarily tweak the gt type.
+		 * Note that at this point the GTs are not initialized and only
+		 * tile-level access to MMIO registers is possible. To use our
+		 * existing GuC communication functions we must create a dummy
+		 * GT structure and perform at least basic xe_gt and xe_guc
+		 * initialization.
 		 */
-		xe_gt_assert(gt, gt->info.type == XE_GT_TYPE_UNINITIALIZED);
+		struct xe_gt *gt = kzalloc(sizeof(*gt), GFP_KERNEL);
+		if (!gt)
+			return -ENOMEM;
 
 		if (type == GMDID_MEDIA) {
 			gt->info.id = 1;
@@ -503,12 +501,7 @@ static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver,
 		/* Don't bother with GMDID if failed to negotiate the GuC ABI */
 		val = xe_gt_sriov_vf_bootstrap(gt) ? 0 : xe_gt_sriov_vf_gmdid(gt);
 
-		/*
-		 * Only undo xe_gt.info here, the remaining changes made above
-		 * will be overwritten as part of the regular initialization.
-		 */
-		gt->info.id = 0;
-		gt->info.type = XE_GT_TYPE_UNINITIALIZED;
+		kfree(gt);
 	} else {
 		/*
 		 * GMD_ID is a GT register, but at this point in the driver
@@ -526,6 +519,8 @@ static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver,
 
 	*ver = REG_FIELD_GET(GMD_ID_ARCH_MASK, val) * 100 + REG_FIELD_GET(GMD_ID_RELEASE_MASK, val);
 	*revid = REG_FIELD_GET(GMD_ID_REVID, val);
+
+	return 0;
 }
 
 static const struct xe_ip *find_graphics_ip(unsigned int verx100)
@@ -552,18 +547,21 @@ static const struct xe_ip *find_media_ip(unsigned int verx100)
  * Read IP version from hardware and select graphics/media IP descriptors
  * based on the result.
  */
-static void handle_gmdid(struct xe_device *xe,
-			 const struct xe_ip **graphics_ip,
-			 const struct xe_ip **media_ip,
-			 u32 *graphics_revid,
-			 u32 *media_revid)
+static int handle_gmdid(struct xe_device *xe,
+			const struct xe_ip **graphics_ip,
+			const struct xe_ip **media_ip,
+			u32 *graphics_revid,
+			u32 *media_revid)
 {
 	u32 ver;
+	int ret;
 
 	*graphics_ip = NULL;
 	*media_ip = NULL;
 
-	read_gmdid(xe, GMDID_GRAPHICS, &ver, graphics_revid);
+	ret = read_gmdid(xe, GMDID_GRAPHICS, &ver, graphics_revid);
+	if (ret)
+		return ret;
 
 	*graphics_ip = find_graphics_ip(ver);
 	if (!*graphics_ip) {
@@ -571,16 +569,21 @@ static void handle_gmdid(struct xe_device *xe,
 			ver / 100, ver % 100);
 	}
 
-	read_gmdid(xe, GMDID_MEDIA, &ver, media_revid);
+	ret = read_gmdid(xe, GMDID_MEDIA, &ver, media_revid);
+	if (ret)
+		return ret;
+
 	/* Media may legitimately be fused off / not present */
 	if (ver == 0)
-		return;
+		return 0;
 
 	*media_ip = find_media_ip(ver);
 	if (!*media_ip) {
 		drm_err(&xe->drm, "Hardware reports unknown media version %u.%02u\n",
 			ver / 100, ver % 100);
 	}
+
+	return 0;
 }
 
 /*
@@ -690,6 +693,7 @@ static int xe_info_init(struct xe_device *xe,
 	const struct xe_media_desc *media_desc;
 	struct xe_tile *tile;
 	struct xe_gt *gt;
+	int ret;
 	u8 id;
 
 	/*
@@ -705,8 +709,11 @@ static int xe_info_init(struct xe_device *xe,
 		xe->info.step = xe_step_pre_gmdid_get(xe);
 	} else {
 		xe_assert(xe, !desc->pre_gmdid_media_ip);
-		handle_gmdid(xe, &graphics_ip, &media_ip,
-			     &graphics_gmdid_revid, &media_gmdid_revid);
+		ret = handle_gmdid(xe, &graphics_ip, &media_ip,
+				   &graphics_gmdid_revid, &media_gmdid_revid);
+		if (ret)
+			return ret;
+
 		xe->info.step = xe_step_gmdid_get(xe,
 						  graphics_gmdid_revid,
 						  media_gmdid_revid);
-- 
2.51.0


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

* [PATCH v3 08/23] drm/xe: Move primary GT allocation from xe_tile_init_early to xe_tile_init
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (6 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 07/23] drm/xe: Read VF GMD_ID with a specifically-allocated dummy GT Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-09-30 22:56 ` [PATCH v3 09/23] drm/xe: Skip L2 / TDF cache flushes if primary GT is disabled Matt Roper
                   ` (18 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Michal Wajdeczko, Lucas De Marchi

During the early days of the Xe driver, there were cases where we
accessed some fields in the primary GT's xe_gt structure before the GT
itself was formally initialized; this required that the structure itself
be allocated during xe_tile_init_early().  A lot of refactoring of the
device probe has happened since that time and there's no longer a need
to allocate the primary GT early.  Move the allocation into
xe_info_init() where GT initialization happens and where we're doing the
allocation of the media GT.

v2:
 - Only make this change after a separate patch to perform VF GMD_ID
   lookup with a dummy GT instead of xe_root_mmio_gt().

Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
---
 drivers/gpu/drm/xe/xe_pci.c  | 4 ++++
 drivers/gpu/drm/xe/xe_tile.c | 4 ----
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
index 9fb5df10844d..13e8d379a1cd 100644
--- a/drivers/gpu/drm/xe/xe_pci.c
+++ b/drivers/gpu/drm/xe/xe_pci.c
@@ -768,6 +768,10 @@ static int xe_info_init(struct xe_device *xe,
 	for_each_tile(tile, xe, id) {
 		int err;
 
+		tile->primary_gt = xe_gt_alloc(tile);
+		if (IS_ERR(tile->primary_gt))
+			return PTR_ERR(tile->primary_gt);
+
 		gt = tile->primary_gt;
 		gt->info.type = XE_GT_TYPE_MAIN;
 		gt->info.id = tile->id * xe->info.max_gt_per_tile;
diff --git a/drivers/gpu/drm/xe/xe_tile.c b/drivers/gpu/drm/xe/xe_tile.c
index d49ba3401963..10545654f9eb 100644
--- a/drivers/gpu/drm/xe/xe_tile.c
+++ b/drivers/gpu/drm/xe/xe_tile.c
@@ -149,10 +149,6 @@ int xe_tile_init_early(struct xe_tile *tile, struct xe_device *xe, u8 id)
 	if (err)
 		return err;
 
-	tile->primary_gt = xe_gt_alloc(tile);
-	if (IS_ERR(tile->primary_gt))
-		return PTR_ERR(tile->primary_gt);
-
 	xe_pcode_init(tile);
 
 	return 0;
-- 
2.51.0


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

* [PATCH v3 09/23] drm/xe: Skip L2 / TDF cache flushes if primary GT is disabled
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (7 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 08/23] drm/xe: Move primary GT allocation from xe_tile_init_early to xe_tile_init Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-10-01  6:39   ` Upadhyay, Tejas
  2025-09-30 22:56 ` [PATCH v3 10/23] drm/xe/query: Report hwconfig size as 0 " Matt Roper
                   ` (17 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper

If the primary GT is disabled via configfs, GT-side L2 and TD cache
flushes are unnecessary since nothing is using/filling these caches.

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

diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index 386940323630..d42d03b8ab3a 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -1062,6 +1062,8 @@ void xe_device_l2_flush(struct xe_device *xe)
 	unsigned int fw_ref;
 
 	gt = xe_root_mmio_gt(xe);
+	if (!gt)
+		return;
 
 	if (!XE_GT_WA(gt, 16023588340))
 		return;
@@ -1107,6 +1109,9 @@ void xe_device_td_flush(struct xe_device *xe)
 		return;
 
 	root_gt = xe_root_mmio_gt(xe);
+	if (!root_gt)
+		return;
+
 	if (XE_GT_WA(root_gt, 16023588340)) {
 		/* A transient flush is not sufficient: flush the L2 */
 		xe_device_l2_flush(xe);
-- 
2.51.0


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

* [PATCH v3 10/23] drm/xe/query: Report hwconfig size as 0 if primary GT is disabled
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (8 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 09/23] drm/xe: Skip L2 / TDF cache flushes if primary GT is disabled Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-10-01  6:42   ` Upadhyay, Tejas
  2025-09-30 22:56 ` [PATCH v3 11/23] drm/xe/pmu: Initialize PMU event types based on first available GT Matt Roper
                   ` (16 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper

The hwconfig table is part of the primary GT's GuC firmware.  If the
primary GT is disabled, the hwconfig is unavailable and should be
reported to userspace as having size 0.

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_query.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/xe/xe_query.c b/drivers/gpu/drm/xe/xe_query.c
index 2e9ff33ed2fe..1c0915e2cc16 100644
--- a/drivers/gpu/drm/xe/xe_query.c
+++ b/drivers/gpu/drm/xe/xe_query.c
@@ -436,7 +436,7 @@ static int query_hwconfig(struct xe_device *xe,
 			  struct drm_xe_device_query *query)
 {
 	struct xe_gt *gt = xe_root_mmio_gt(xe);
-	size_t size = xe_guc_hwconfig_size(&gt->uc.guc);
+	size_t size = gt ? xe_guc_hwconfig_size(&gt->uc.guc) : 0;
 	void __user *query_ptr = u64_to_user_ptr(query->data);
 	void *hwconfig;
 
-- 
2.51.0


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

* [PATCH v3 11/23] drm/xe/pmu: Initialize PMU event types based on first available GT
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (9 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 10/23] drm/xe/query: Report hwconfig size as 0 " Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-10-01 20:59   ` Lucas De Marchi
  2025-09-30 22:56 ` [PATCH v3 12/23] drm/xe: Check for primary GT before looking up Wa_22019338487 Matt Roper
                   ` (15 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper

GT ID#0 (primary GT on tile 0) may not always be available if the
primary GT has been disabled via configfs.  Instead use the first
available GT when determining which PMU events are supported.  If there
are no GTs, then don't advertise any GT-related events.

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_pmu.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/xe/xe_pmu.c b/drivers/gpu/drm/xe/xe_pmu.c
index cab51d826345..c63335eb69e5 100644
--- a/drivers/gpu/drm/xe/xe_pmu.c
+++ b/drivers/gpu/drm/xe/xe_pmu.c
@@ -497,7 +497,12 @@ static const struct attribute_group *pmu_events_attr_update[] = {
 static void set_supported_events(struct xe_pmu *pmu)
 {
 	struct xe_device *xe = container_of(pmu, typeof(*xe), pmu);
-	struct xe_gt *gt = xe_device_get_gt(xe, 0);
+	struct xe_gt *gt;
+	int id;
+
+	/* If there are no GTs, don't support any GT-related events */
+	if (xe->info.gt_count == 0)
+		return;
 
 	if (!xe->info.skip_guc_pc) {
 		pmu->supported_events |= BIT_ULL(XE_PMU_EVENT_GT_C6_RESIDENCY);
@@ -505,6 +510,10 @@ static void set_supported_events(struct xe_pmu *pmu)
 		pmu->supported_events |= BIT_ULL(XE_PMU_EVENT_GT_REQUESTED_FREQUENCY);
 	}
 
+	/* Find the first available GT to query engine event capabilities */
+	for_each_gt(gt, xe, id)
+		break;
+
 	if (xe_guc_engine_activity_supported(&gt->uc.guc)) {
 		pmu->supported_events |= BIT_ULL(XE_PMU_EVENT_ENGINE_ACTIVE_TICKS);
 		pmu->supported_events |= BIT_ULL(XE_PMU_EVENT_ENGINE_TOTAL_TICKS);
-- 
2.51.0


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

* [PATCH v3 12/23] drm/xe: Check for primary GT before looking up Wa_22019338487
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (10 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 11/23] drm/xe/pmu: Initialize PMU event types based on first available GT Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-10-01 21:10   ` Lucas De Marchi
  2025-10-02 13:46   ` Gustavo Sousa
  2025-09-30 22:56 ` [PATCH v3 13/23] drm/xe: Make display part of Wa_22019338487 a device workaround Matt Roper
                   ` (14 subsequent siblings)
  26 siblings, 2 replies; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper

If the primary GT is disabled via configfs, we need to make sure that we
don't search for this workaround on a NULL xe_gt pointer.  Since we can
only disable the primary GT on igpu platforms, the media GT is the one
we'd want to check anyway for this workaround.

The ternary operators in ggtt_update_access_counter() were getting a bit
long/complicated, so rewrite them with regular if/else statements.
While we're at it, throw in a couple extra assertions to make sure that
we're truly picking the expected GT according to igpu/dgpu type.

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

diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
index 7fdd0a97a628..0ed9ffc3278d 100644
--- a/drivers/gpu/drm/xe/xe_ggtt.c
+++ b/drivers/gpu/drm/xe/xe_ggtt.c
@@ -107,10 +107,23 @@ static unsigned int probe_gsm_size(struct pci_dev *pdev)
 static void ggtt_update_access_counter(struct xe_ggtt *ggtt)
 {
 	struct xe_tile *tile = ggtt->tile;
-	struct xe_gt *affected_gt = XE_GT_WA(tile->primary_gt, 22019338487) ?
-		tile->primary_gt : tile->media_gt;
-	struct xe_mmio *mmio = &affected_gt->mmio;
-	u32 max_gtt_writes = XE_GT_WA(ggtt->tile->primary_gt, 22019338487) ? 1100 : 63;
+	struct xe_gt *affected_gt;
+	u32 max_gtt_writes;
+
+	if (tile->primary_gt && XE_GT_WA(tile->primary_gt, 22019338487)) {
+		affected_gt = tile->primary_gt;
+		max_gtt_writes = 1100;
+
+		/* Only expected to apply to primary GT on dgpu platforms */
+		xe_tile_assert(tile, IS_DGFX(tile_to_xe(tile)));
+	} else {
+		affected_gt = tile->media_gt;
+		max_gtt_writes = 63;
+
+		/* Only expected to apply to media GT on igpu platforms */
+		xe_tile_assert(tile, !IS_DGFX(tile_to_xe(tile)));
+	}
+
 	/*
 	 * Wa_22019338487: GMD_ID is a RO register, a dummy write forces gunit
 	 * to wait for completion of prior GTT writes before letting this through.
@@ -119,7 +132,7 @@ static void ggtt_update_access_counter(struct xe_ggtt *ggtt)
 	lockdep_assert_held(&ggtt->lock);
 
 	if ((++ggtt->access_count % max_gtt_writes) == 0) {
-		xe_mmio_write32(mmio, GMD_ID, 0x0);
+		xe_mmio_write32(&affected_gt->mmio, GMD_ID, 0x0);
 		ggtt->access_count = 0;
 	}
 }
@@ -286,7 +299,8 @@ int xe_ggtt_init_early(struct xe_ggtt *ggtt)
 	if (GRAPHICS_VERx100(xe) >= 1270)
 		ggtt->pt_ops = (ggtt->tile->media_gt &&
 			       XE_GT_WA(ggtt->tile->media_gt, 22019338487)) ||
-			       XE_GT_WA(ggtt->tile->primary_gt, 22019338487) ?
+			       (ggtt->tile->primary_gt &&
+				XE_GT_WA(ggtt->tile->primary_gt, 22019338487)) ?
 			       &xelpg_pt_wa_ops : &xelpg_pt_ops;
 	else
 		ggtt->pt_ops = &xelp_pt_ops;
-- 
2.51.0


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

* [PATCH v3 13/23] drm/xe: Make display part of Wa_22019338487 a device workaround
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (11 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 12/23] drm/xe: Check for primary GT before looking up Wa_22019338487 Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-10-02 14:26   ` Gustavo Sousa
  2025-09-30 22:56 ` [PATCH v3 14/23] drm/xe/irq: Don't try to lookup engine masks for non-existent primary GT Matt Roper
                   ` (13 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper

The display part of Wa_22019338487 (i.e., avoiding use of stolen memory)
is using a platform test rather than an graphics/media IP test.  Since
this workaround is focused on non-GT uses of stolen memory, it makes
sense that we'd want to still apply the workaround on affected platforms
even if the GTs themselves are disabled via configfs.

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/display/intel_fbdev_fb.c   | 4 ++--
 drivers/gpu/drm/xe/display/xe_plane_initial.c | 4 ++--
 drivers/gpu/drm/xe/xe_device_wa_oob.rules     | 1 +
 drivers/gpu/drm/xe/xe_wa_oob.rules            | 1 -
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c b/drivers/gpu/drm/xe/display/intel_fbdev_fb.c
index 35a5b07eeba4..af72f7305e5a 100644
--- a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c
+++ b/drivers/gpu/drm/xe/display/intel_fbdev_fb.c
@@ -10,7 +10,7 @@
 #include "xe_ttm_stolen_mgr.h"
 #include "xe_wa.h"
 
-#include <generated/xe_wa_oob.h>
+#include <generated/xe_device_wa_oob.h>
 
 struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size)
 {
@@ -19,7 +19,7 @@ struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size
 
 	obj = ERR_PTR(-ENODEV);
 
-	if (!IS_DGFX(xe) && !XE_GT_WA(xe_root_mmio_gt(xe), 22019338487_display)) {
+	if (!IS_DGFX(xe) && !XE_DEVICE_WA(xe, 22019338487_display)) {
 		obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe),
 						size,
 						ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT |
diff --git a/drivers/gpu/drm/xe/display/xe_plane_initial.c b/drivers/gpu/drm/xe/display/xe_plane_initial.c
index 94f00def811b..12d25c5290fd 100644
--- a/drivers/gpu/drm/xe/display/xe_plane_initial.c
+++ b/drivers/gpu/drm/xe/display/xe_plane_initial.c
@@ -25,7 +25,7 @@
 #include "xe_vram_types.h"
 #include "xe_wa.h"
 
-#include <generated/xe_wa_oob.h>
+#include <generated/xe_device_wa_oob.h>
 
 void intel_plane_initial_vblank_wait(struct intel_crtc *crtc)
 {
@@ -123,7 +123,7 @@ initial_plane_bo(struct xe_device *xe,
 		phys_base = base;
 		flags |= XE_BO_FLAG_STOLEN;
 
-		if (XE_GT_WA(xe_root_mmio_gt(xe), 22019338487_display))
+		if (XE_DEVICE_WA(xe, 22019338487_display))
 			return NULL;
 
 		/*
diff --git a/drivers/gpu/drm/xe/xe_device_wa_oob.rules b/drivers/gpu/drm/xe/xe_device_wa_oob.rules
index 3a0c4ccc4224..3cc93f0e77f8 100644
--- a/drivers/gpu/drm/xe/xe_device_wa_oob.rules
+++ b/drivers/gpu/drm/xe/xe_device_wa_oob.rules
@@ -1,2 +1,3 @@
 15015404425     PLATFORM(LUNARLAKE)
 		PLATFORM(PANTHERLAKE)
+22019338487_display	PLATFORM(LUNARLAKE)
diff --git a/drivers/gpu/drm/xe/xe_wa_oob.rules b/drivers/gpu/drm/xe/xe_wa_oob.rules
index f3a6d5d239ce..eb761d30e066 100644
--- a/drivers/gpu/drm/xe/xe_wa_oob.rules
+++ b/drivers/gpu/drm/xe/xe_wa_oob.rules
@@ -45,7 +45,6 @@
 22019338487	MEDIA_VERSION(2000)
 		GRAPHICS_VERSION(2001), FUNC(xe_rtp_match_not_sriov_vf)
 		MEDIA_VERSION(3000), MEDIA_STEP(A0, B0), FUNC(xe_rtp_match_not_sriov_vf)
-22019338487_display	PLATFORM(LUNARLAKE)
 16023588340	GRAPHICS_VERSION(2001), FUNC(xe_rtp_match_not_sriov_vf)
 14019789679	GRAPHICS_VERSION(1255)
 		GRAPHICS_VERSION_RANGE(1270, 2004)
-- 
2.51.0


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

* [PATCH v3 14/23] drm/xe/irq: Don't try to lookup engine masks for non-existent primary GT
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (12 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 13/23] drm/xe: Make display part of Wa_22019338487 a device workaround Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-09-30 22:56 ` [PATCH v3 15/23] drm/xe: Handle Wa_22010954014 and Wa_14022085890 as device workarounds Matt Roper
                   ` (12 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Tejas Upadhyay

If the primary GT is disabled via configfs, we shouldn't try to access
it to lookup BCS/CCS engine masks.  For the purposes of IRQ reset (which
masks & disables interrupts in an sgunit register), assume all possible
instances are present.

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_irq.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_irq.c b/drivers/gpu/drm/xe/xe_irq.c
index 5018a116852f..eaca56df08e4 100644
--- a/drivers/gpu/drm/xe/xe_irq.c
+++ b/drivers/gpu/drm/xe/xe_irq.c
@@ -494,11 +494,15 @@ static irqreturn_t dg1_irq_handler(int irq, void *arg)
 static void gt_irq_reset(struct xe_tile *tile)
 {
 	struct xe_mmio *mmio = &tile->mmio;
+	u32 ccs_mask = ~0;
+	u32 bcs_mask = ~0;
 
-	u32 ccs_mask = xe_hw_engine_mask_per_class(tile->primary_gt,
-						   XE_ENGINE_CLASS_COMPUTE);
-	u32 bcs_mask = xe_hw_engine_mask_per_class(tile->primary_gt,
-						   XE_ENGINE_CLASS_COPY);
+	if (tile->primary_gt) {
+		ccs_mask = xe_hw_engine_mask_per_class(tile->primary_gt,
+						       XE_ENGINE_CLASS_COMPUTE);
+		bcs_mask = xe_hw_engine_mask_per_class(tile->primary_gt,
+						       XE_ENGINE_CLASS_COPY);
+	}
 
 	/* Disable RCS, BCS, VCS and VECS class engines. */
 	xe_mmio_write32(mmio, RENDER_COPY_INTR_ENABLE, 0);
-- 
2.51.0


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

* [PATCH v3 15/23] drm/xe: Handle Wa_22010954014 and Wa_14022085890 as device workarounds
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (13 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 14/23] drm/xe/irq: Don't try to lookup engine masks for non-existent primary GT Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-10-02 17:49   ` Gustavo Sousa
  2025-09-30 22:56 ` [PATCH v3 16/23] drm/xe/rtp: Pass xe_device parameter to FUNC matches Matt Roper
                   ` (11 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper

When Wa_22010954014 and Wa_14022085890 were first implemented, we didn't
have a device workaround infrastructure so we hacked them into the GT
workaround list.  Now that we have proper device workaround support,
move them to the proper place.  Note that Wa_14022085890 specifically
applies to BMG-G21 platforms, so this requires defining a BMG
subplatform to capture the correct subset of device IDs.

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_device_wa_oob.rules | 2 ++
 drivers/gpu/drm/xe/xe_guc_pc.c            | 3 ++-
 drivers/gpu/drm/xe/xe_pci.c               | 6 ++++++
 drivers/gpu/drm/xe/xe_platform_types.h    | 1 +
 drivers/gpu/drm/xe/xe_wa.c                | 2 +-
 drivers/gpu/drm/xe/xe_wa_oob.rules        | 5 -----
 include/drm/intel/pciids.h                | 7 +++++--
 7 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_device_wa_oob.rules b/drivers/gpu/drm/xe/xe_device_wa_oob.rules
index 3cc93f0e77f8..55ba01bc8f38 100644
--- a/drivers/gpu/drm/xe/xe_device_wa_oob.rules
+++ b/drivers/gpu/drm/xe/xe_device_wa_oob.rules
@@ -1,3 +1,5 @@
+22010954014	PLATFORM(DG2)
 15015404425     PLATFORM(LUNARLAKE)
 		PLATFORM(PANTHERLAKE)
 22019338487_display	PLATFORM(LUNARLAKE)
+14022085890	SUBPLATFORM(BATTLEMAGE, G21)
diff --git a/drivers/gpu/drm/xe/xe_guc_pc.c b/drivers/gpu/drm/xe/xe_guc_pc.c
index 3c0feb50a1e2..ff22235857f8 100644
--- a/drivers/gpu/drm/xe/xe_guc_pc.c
+++ b/drivers/gpu/drm/xe/xe_guc_pc.c
@@ -14,6 +14,7 @@
 
 #include <drm/drm_managed.h>
 #include <drm/drm_print.h>
+#include <generated/xe_device_wa_oob.h>
 #include <generated/xe_wa_oob.h>
 
 #include "abi/guc_actions_slpc_abi.h"
@@ -886,7 +887,7 @@ static int pc_adjust_freq_bounds(struct xe_guc_pc *pc)
 	if (pc_get_min_freq(pc) > pc->rp0_freq)
 		ret = pc_set_min_freq(pc, pc->rp0_freq);
 
-	if (XE_GT_WA(tile->primary_gt, 14022085890))
+	if (XE_DEVICE_WA(tile_to_xe(tile), 14022085890))
 		ret = pc_set_min_freq(pc, max(BMG_MIN_FREQ, pc_get_min_freq(pc)));
 
 out:
diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
index 13e8d379a1cd..86e6dd751b1c 100644
--- a/drivers/gpu/drm/xe/xe_pci.c
+++ b/drivers/gpu/drm/xe/xe_pci.c
@@ -334,6 +334,8 @@ static const struct xe_device_desc lnl_desc = {
 	.vm_max_level = 4,
 };
 
+static const u16 bmg_g21_ids[] = { INTEL_BMG_G21_IDS(NOP), 0 };
+
 static const struct xe_device_desc bmg_desc = {
 	DGFX_FEATURES,
 	PLATFORM(BATTLEMAGE),
@@ -348,6 +350,10 @@ static const struct xe_device_desc bmg_desc = {
 	.has_sriov = true,
 	.max_gt_per_tile = 2,
 	.needs_scratch = true,
+	.subplatforms = (const struct xe_subplatform_desc[]) {
+		{ XE_SUBPLATFORM_BATTLEMAGE_G21, "G21", bmg_g21_ids },
+		{ }
+	},
 	.va_bits = 48,
 	.vm_max_level = 4,
 };
diff --git a/drivers/gpu/drm/xe/xe_platform_types.h b/drivers/gpu/drm/xe/xe_platform_types.h
index d08574c4cdb8..3e332214c7bb 100644
--- a/drivers/gpu/drm/xe/xe_platform_types.h
+++ b/drivers/gpu/drm/xe/xe_platform_types.h
@@ -34,6 +34,7 @@ enum xe_subplatform {
 	XE_SUBPLATFORM_DG2_G10,
 	XE_SUBPLATFORM_DG2_G11,
 	XE_SUBPLATFORM_DG2_G12,
+	XE_SUBPLATFORM_BATTLEMAGE_G21,
 };
 
 #endif
diff --git a/drivers/gpu/drm/xe/xe_wa.c b/drivers/gpu/drm/xe/xe_wa.c
index c60159a13001..aa1b69f48f6f 100644
--- a/drivers/gpu/drm/xe/xe_wa.c
+++ b/drivers/gpu/drm/xe/xe_wa.c
@@ -1138,6 +1138,6 @@ void xe_wa_apply_tile_workarounds(struct xe_tile *tile)
 	if (IS_SRIOV_VF(tile->xe))
 		return;
 
-	if (XE_GT_WA(tile->primary_gt, 22010954014))
+	if (XE_DEVICE_WA(tile->xe, 22010954014))
 		xe_mmio_rmw32(mmio, XEHP_CLOCK_GATE_DIS, 0, SGSI_SIDECLK_DIS);
 }
diff --git a/drivers/gpu/drm/xe/xe_wa_oob.rules b/drivers/gpu/drm/xe/xe_wa_oob.rules
index eb761d30e066..113a62f1b541 100644
--- a/drivers/gpu/drm/xe/xe_wa_oob.rules
+++ b/drivers/gpu/drm/xe/xe_wa_oob.rules
@@ -14,7 +14,6 @@
 14016763929	SUBPLATFORM(DG2, G10)
 		SUBPLATFORM(DG2, G12)
 16017236439	PLATFORM(PVC)
-22010954014	PLATFORM(DG2)
 14019821291	MEDIA_VERSION_RANGE(1300, 2000)
 14015076503	MEDIA_VERSION(1300)
 16020292621	GRAPHICS_VERSION(2004), GRAPHICS_STEP(A0, B0)
@@ -74,9 +73,5 @@
 16023683509	MEDIA_VERSION(2000), FUNC(xe_rtp_match_psmi_enabled)
 		MEDIA_VERSION(3000), MEDIA_STEP(A0, B0), FUNC(xe_rtp_match_psmi_enabled)
 
-# SoC workaround - currently applies to all platforms with the following
-# primary GT GMDID
-14022085890	GRAPHICS_VERSION(2001)
-
 15015404425_disable	PLATFORM(PANTHERLAKE), MEDIA_STEP(B0, FOREVER)
 16026007364    MEDIA_VERSION(3000)
diff --git a/include/drm/intel/pciids.h b/include/drm/intel/pciids.h
index 69d4ae92d822..452c1de606ff 100644
--- a/include/drm/intel/pciids.h
+++ b/include/drm/intel/pciids.h
@@ -849,7 +849,7 @@
 	MACRO__(0x64B0, ## __VA_ARGS__)
 
 /* BMG */
-#define INTEL_BMG_IDS(MACRO__, ...) \
+#define INTEL_BMG_G21_IDS(MACRO__, ...) \
 	MACRO__(0xE202, ## __VA_ARGS__), \
 	MACRO__(0xE209, ## __VA_ARGS__), \
 	MACRO__(0xE20B, ## __VA_ARGS__), \
@@ -858,7 +858,10 @@
 	MACRO__(0xE210, ## __VA_ARGS__), \
 	MACRO__(0xE211, ## __VA_ARGS__), \
 	MACRO__(0xE212, ## __VA_ARGS__), \
-	MACRO__(0xE216, ## __VA_ARGS__), \
+	MACRO__(0xE216, ## __VA_ARGS__)
+
+#define INTEL_BMG_IDS(MACRO__, ...) \
+	INTEL_BMG_G21_IDS(MACRO__, __VA_ARGS__), \
 	MACRO__(0xE220, ## __VA_ARGS__), \
 	MACRO__(0xE221, ## __VA_ARGS__), \
 	MACRO__(0xE222, ## __VA_ARGS__), \
-- 
2.51.0


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

* [PATCH v3 16/23] drm/xe/rtp: Pass xe_device parameter to FUNC matches
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (14 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 15/23] drm/xe: Handle Wa_22010954014 and Wa_14022085890 as device workarounds Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-10-02 18:24   ` Gustavo Sousa
  2025-09-30 22:56 ` [PATCH v3 17/23] drm/xe: Bypass Wa_14018094691 when primary GT is disabled Matt Roper
                   ` (10 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper

FUNC matches in RTP only pass the GT and hwe, preventing them from being
used effectively in device workarounds.  Add an additional xe_device
parameter so that we can use them in device workarounds where a GT may
not be available.

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/tests/xe_rtp_test.c |  6 ++++--
 drivers/gpu/drm/xe/xe_hw_engine.c      | 10 ++++++----
 drivers/gpu/drm/xe/xe_reg_whitelist.c  |  3 ++-
 drivers/gpu/drm/xe/xe_rtp.c            | 24 +++++++++++++-----------
 drivers/gpu/drm/xe/xe_rtp.h            | 18 +++++++++++++-----
 drivers/gpu/drm/xe/xe_rtp_types.h      |  4 +++-
 6 files changed, 41 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/xe/tests/xe_rtp_test.c b/drivers/gpu/drm/xe/tests/xe_rtp_test.c
index b0254b014fe4..d2255a59e58f 100644
--- a/drivers/gpu/drm/xe/tests/xe_rtp_test.c
+++ b/drivers/gpu/drm/xe/tests/xe_rtp_test.c
@@ -48,12 +48,14 @@ struct rtp_test_case {
 	const struct xe_rtp_entry *entries;
 };
 
-static bool match_yes(const struct xe_gt *gt, const struct xe_hw_engine *hwe)
+static bool match_yes(const struct xe_device *xe, const struct xe_gt *gt,
+		      const struct xe_hw_engine *hwe)
 {
 	return true;
 }
 
-static bool match_no(const struct xe_gt *gt, const struct xe_hw_engine *hwe)
+static bool match_no(const struct xe_device *xe, const struct xe_gt *gt,
+		     const struct xe_hw_engine *hwe)
 {
 	return false;
 }
diff --git a/drivers/gpu/drm/xe/xe_hw_engine.c b/drivers/gpu/drm/xe/xe_hw_engine.c
index 1cf623b4a5bc..cba4375525c7 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine.c
+++ b/drivers/gpu/drm/xe/xe_hw_engine.c
@@ -346,17 +346,19 @@ void xe_hw_engine_enable_ring(struct xe_hw_engine *hwe)
 	xe_hw_engine_mmio_read32(hwe, RING_MI_MODE(0));
 }
 
-static bool xe_hw_engine_match_fixed_cslice_mode(const struct xe_gt *gt,
+static bool xe_hw_engine_match_fixed_cslice_mode(const struct xe_device *xe,
+						 const struct xe_gt *gt,
 						 const struct xe_hw_engine *hwe)
 {
 	return xe_gt_ccs_mode_enabled(gt) &&
-	       xe_rtp_match_first_render_or_compute(gt, hwe);
+	       xe_rtp_match_first_render_or_compute(xe, gt, hwe);
 }
 
-static bool xe_rtp_cfeg_wmtp_disabled(const struct xe_gt *gt,
+static bool xe_rtp_cfeg_wmtp_disabled(const struct xe_device *xe,
+				      const struct xe_gt *gt,
 				      const struct xe_hw_engine *hwe)
 {
-	if (GRAPHICS_VER(gt_to_xe(gt)) < 20)
+	if (GRAPHICS_VER(xe) < 20)
 		return false;
 
 	if (hwe->class != XE_ENGINE_CLASS_COMPUTE &&
diff --git a/drivers/gpu/drm/xe/xe_reg_whitelist.c b/drivers/gpu/drm/xe/xe_reg_whitelist.c
index 23f6c81d9994..690bc327a363 100644
--- a/drivers/gpu/drm/xe/xe_reg_whitelist.c
+++ b/drivers/gpu/drm/xe/xe_reg_whitelist.c
@@ -19,7 +19,8 @@
 #undef XE_REG_MCR
 #define XE_REG_MCR(...)     XE_REG(__VA_ARGS__, .mcr = 1)
 
-static bool match_not_render(const struct xe_gt *gt,
+static bool match_not_render(const struct xe_device *xe,
+			     const struct xe_gt *gt,
 			     const struct xe_hw_engine *hwe)
 {
 	return hwe->class != XE_ENGINE_CLASS_RENDER;
diff --git a/drivers/gpu/drm/xe/xe_rtp.c b/drivers/gpu/drm/xe/xe_rtp.c
index b5f430d59f80..66707cc89ec9 100644
--- a/drivers/gpu/drm/xe/xe_rtp.c
+++ b/drivers/gpu/drm/xe/xe_rtp.c
@@ -133,10 +133,7 @@ static bool rule_matches(const struct xe_device *xe,
 			match = hwe->class != r->engine_class;
 			break;
 		case XE_RTP_MATCH_FUNC:
-			if (drm_WARN_ON(&xe->drm, !gt))
-				return false;
-
-			match = r->match_func(gt, hwe);
+			match = r->match_func(xe, gt, hwe);
 			break;
 		default:
 			drm_warn(&xe->drm, "Invalid RTP match %u\n",
@@ -343,13 +340,15 @@ void xe_rtp_process(struct xe_rtp_process_ctx *ctx,
 }
 EXPORT_SYMBOL_IF_KUNIT(xe_rtp_process);
 
-bool xe_rtp_match_even_instance(const struct xe_gt *gt,
+bool xe_rtp_match_even_instance(const struct xe_device *xe,
+				const struct xe_gt *gt,
 				const struct xe_hw_engine *hwe)
 {
 	return hwe->instance % 2 == 0;
 }
 
-bool xe_rtp_match_first_render_or_compute(const struct xe_gt *gt,
+bool xe_rtp_match_first_render_or_compute(const struct xe_device *xe,
+					  const struct xe_gt *gt,
 					  const struct xe_hw_engine *hwe)
 {
 	u64 render_compute_mask = gt->info.engine_mask &
@@ -359,19 +358,22 @@ bool xe_rtp_match_first_render_or_compute(const struct xe_gt *gt,
 		hwe->engine_id == __ffs(render_compute_mask);
 }
 
-bool xe_rtp_match_not_sriov_vf(const struct xe_gt *gt,
+bool xe_rtp_match_not_sriov_vf(const struct xe_device *xe,
+			       const struct xe_gt *gt,
 			       const struct xe_hw_engine *hwe)
 {
-	return !IS_SRIOV_VF(gt_to_xe(gt));
+	return !IS_SRIOV_VF(xe);
 }
 
-bool xe_rtp_match_psmi_enabled(const struct xe_gt *gt,
+bool xe_rtp_match_psmi_enabled(const struct xe_device *xe,
+			       const struct xe_gt *gt,
 			       const struct xe_hw_engine *hwe)
 {
-	return xe_configfs_get_psmi_enabled(to_pci_dev(gt_to_xe(gt)->drm.dev));
+	return xe_configfs_get_psmi_enabled(to_pci_dev(xe->drm.dev));
 }
 
-bool xe_rtp_match_gt_has_discontiguous_dss_groups(const struct xe_gt *gt,
+bool xe_rtp_match_gt_has_discontiguous_dss_groups(const struct xe_device *xe,
+						  const struct xe_gt *gt,
 						  const struct xe_hw_engine *hwe)
 {
 	return xe_gt_has_discontiguous_dss_groups(gt);
diff --git a/drivers/gpu/drm/xe/xe_rtp.h b/drivers/gpu/drm/xe/xe_rtp.h
index ac12ddf6cde6..e5b8a9452e29 100644
--- a/drivers/gpu/drm/xe/xe_rtp.h
+++ b/drivers/gpu/drm/xe/xe_rtp.h
@@ -440,18 +440,21 @@ void xe_rtp_process(struct xe_rtp_process_ctx *ctx,
 
 /**
  * xe_rtp_match_even_instance - Match if engine instance is even
+ * @xe: Device structure
  * @gt: GT structure
  * @hwe: Engine instance
  *
  * Returns: true if engine instance is even, false otherwise
  */
-bool xe_rtp_match_even_instance(const struct xe_gt *gt,
+bool xe_rtp_match_even_instance(const struct xe_device *xe,
+				const struct xe_gt *gt,
 				const struct xe_hw_engine *hwe);
 
 /*
  * xe_rtp_match_first_render_or_compute - Match if it's first render or compute
  * engine in the GT
  *
+ * @xe: Device structure
  * @gt: GT structure
  * @hwe: Engine instance
  *
@@ -463,24 +466,29 @@ bool xe_rtp_match_even_instance(const struct xe_gt *gt,
  * Returns: true if engine id is the first to match the render reset domain,
  * false otherwise.
  */
-bool xe_rtp_match_first_render_or_compute(const struct xe_gt *gt,
+bool xe_rtp_match_first_render_or_compute(const struct xe_device *xe,
+					  const struct xe_gt *gt,
 					  const struct xe_hw_engine *hwe);
 
 /*
  * xe_rtp_match_not_sriov_vf - Match when not on SR-IOV VF device
  *
+ * @xe: Device structure
  * @gt: GT structure
  * @hwe: Engine instance
  *
  * Returns: true if device is not VF, false otherwise.
  */
-bool xe_rtp_match_not_sriov_vf(const struct xe_gt *gt,
+bool xe_rtp_match_not_sriov_vf(const struct xe_device *xe,
+			       const struct xe_gt *gt,
 			       const struct xe_hw_engine *hwe);
 
-bool xe_rtp_match_psmi_enabled(const struct xe_gt *gt,
+bool xe_rtp_match_psmi_enabled(const struct xe_device *xe,
+			       const struct xe_gt *gt,
 			       const struct xe_hw_engine *hwe);
 
-bool xe_rtp_match_gt_has_discontiguous_dss_groups(const struct xe_gt *gt,
+bool xe_rtp_match_gt_has_discontiguous_dss_groups(const struct xe_device *xe,
+						  const struct xe_gt *gt,
 						  const struct xe_hw_engine *hwe);
 
 #endif
diff --git a/drivers/gpu/drm/xe/xe_rtp_types.h b/drivers/gpu/drm/xe/xe_rtp_types.h
index f4cf30e298cf..6ba7f226c227 100644
--- a/drivers/gpu/drm/xe/xe_rtp_types.h
+++ b/drivers/gpu/drm/xe/xe_rtp_types.h
@@ -10,6 +10,7 @@
 
 #include "regs/xe_reg_defs.h"
 
+struct xe_device;
 struct xe_hw_engine;
 struct xe_gt;
 
@@ -86,7 +87,8 @@ struct xe_rtp_rule {
 			u8 engine_class;
 		};
 		/* MATCH_FUNC */
-		bool (*match_func)(const struct xe_gt *gt,
+		bool (*match_func)(const struct xe_device *xe,
+				   const struct xe_gt *gt,
 				   const struct xe_hw_engine *hwe);
 	};
 };
-- 
2.51.0


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

* [PATCH v3 17/23] drm/xe: Bypass Wa_14018094691 when primary GT is disabled
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (15 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 16/23] drm/xe/rtp: Pass xe_device parameter to FUNC matches Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-10-03 12:44   ` Gustavo Sousa
  2025-09-30 22:56 ` [PATCH v3 18/23] drm/xe: Correct lineage for Wa_22014953428 and only check with valid GT Matt Roper
                   ` (9 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper

Don't try to lookup Wa_14018094691 on a NULL GT when the primary GT is
disabled.  If the primary GT is disabled, there's no mid-thread
preemption happening which would make this workaround relevant anyway.

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

diff --git a/drivers/gpu/drm/xe/xe_gsc.c b/drivers/gpu/drm/xe/xe_gsc.c
index 83d61bf8ec62..dd69cb834f8e 100644
--- a/drivers/gpu/drm/xe/xe_gsc.c
+++ b/drivers/gpu/drm/xe/xe_gsc.c
@@ -266,7 +266,7 @@ static int gsc_upload_and_init(struct xe_gsc *gsc)
 	unsigned int fw_ref;
 	int ret;
 
-	if (XE_GT_WA(tile->primary_gt, 14018094691)) {
+	if (tile->primary_gt && XE_GT_WA(tile->primary_gt, 14018094691)) {
 		fw_ref = xe_force_wake_get(gt_to_fw(tile->primary_gt), XE_FORCEWAKE_ALL);
 
 		/*
@@ -281,7 +281,7 @@ static int gsc_upload_and_init(struct xe_gsc *gsc)
 
 	ret = gsc_upload(gsc);
 
-	if (XE_GT_WA(tile->primary_gt, 14018094691))
+	if (tile->primary_gt && XE_GT_WA(tile->primary_gt, 14018094691))
 		xe_force_wake_put(gt_to_fw(tile->primary_gt), fw_ref);
 
 	if (ret)
-- 
2.51.0


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

* [PATCH v3 18/23] drm/xe: Correct lineage for Wa_22014953428 and only check with valid GT
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (16 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 17/23] drm/xe: Bypass Wa_14018094691 when primary GT is disabled Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-10-03 12:52   ` Gustavo Sousa
  2025-09-30 22:56 ` [PATCH v3 19/23] drm/xe: Check that GT is not NULL before testing Wa_16023588340 Matt Roper
                   ` (8 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper

Wa_22014953428 was incorrectly labelled with a release-specific ID
number rather than the cross-platform lineage number; fix that.
Also check that the GT is not NULL before trying to lookup the
workaround in it.  Since this workaround only applies to DG2 discrete
GPUs (where the primary GT cannot be disabled), no coverage is lost.

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_vm.c         | 3 ++-
 drivers/gpu/drm/xe/xe_wa_oob.rules | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index 80b7f13ecd80..1677ae729e85 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -1886,6 +1886,7 @@ int xe_vm_create_ioctl(struct drm_device *dev, void *data,
 	struct xe_device *xe = to_xe_device(dev);
 	struct xe_file *xef = to_xe_file(file);
 	struct drm_xe_vm_create *args = data;
+	struct xe_gt *wa_gt = xe_root_mmio_gt(xe);
 	struct xe_vm *vm;
 	u32 id;
 	int err;
@@ -1894,7 +1895,7 @@ int xe_vm_create_ioctl(struct drm_device *dev, void *data,
 	if (XE_IOCTL_DBG(xe, args->extensions))
 		return -EINVAL;
 
-	if (XE_GT_WA(xe_root_mmio_gt(xe), 14016763929))
+	if (wa_gt && XE_GT_WA(wa_gt, 22014953428))
 		args->flags |= DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE;
 
 	if (XE_IOCTL_DBG(xe, args->flags & DRM_XE_VM_CREATE_FLAG_FAULT_MODE &&
diff --git a/drivers/gpu/drm/xe/xe_wa_oob.rules b/drivers/gpu/drm/xe/xe_wa_oob.rules
index 113a62f1b541..4bb94e5799ed 100644
--- a/drivers/gpu/drm/xe/xe_wa_oob.rules
+++ b/drivers/gpu/drm/xe/xe_wa_oob.rules
@@ -11,7 +11,7 @@
 18020744125	PLATFORM(PVC)
 1509372804	PLATFORM(PVC), GRAPHICS_STEP(A0, C0)
 1409600907	GRAPHICS_VERSION_RANGE(1200, 1250)
-14016763929	SUBPLATFORM(DG2, G10)
+22014953428	SUBPLATFORM(DG2, G10)
 		SUBPLATFORM(DG2, G12)
 16017236439	PLATFORM(PVC)
 14019821291	MEDIA_VERSION_RANGE(1300, 2000)
-- 
2.51.0


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

* [PATCH v3 19/23] drm/xe: Check that GT is not NULL before testing Wa_16023588340
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (17 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 18/23] drm/xe: Correct lineage for Wa_22014953428 and only check with valid GT Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-09-30 22:56 ` [PATCH v3 20/23] drm/xe: Don't check BIOS-disabled FlatCCS if primary GT is disabled Matt Roper
                   ` (7 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Tejas Upadhyay

If the primary GT is disabled, skip the check for this workaround (which
only applies to dgpu platforms where the primary GT cannot be NULL).

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/display/xe_display_wa.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/xe/display/xe_display_wa.c b/drivers/gpu/drm/xe/display/xe_display_wa.c
index 8ada1cbcb16c..2aa1b8c03411 100644
--- a/drivers/gpu/drm/xe/display/xe_display_wa.c
+++ b/drivers/gpu/drm/xe/display/xe_display_wa.c
@@ -13,6 +13,7 @@
 bool intel_display_needs_wa_16023588340(struct intel_display *display)
 {
 	struct xe_device *xe = to_xe_device(display->drm);
+	struct xe_gt *wa_gt = xe_root_mmio_gt(xe);
 
-	return XE_GT_WA(xe_root_mmio_gt(xe), 16023588340);
+	return wa_gt && XE_GT_WA(wa_gt, 16023588340);
 }
-- 
2.51.0


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

* [PATCH v3 20/23] drm/xe: Don't check BIOS-disabled FlatCCS if primary GT is disabled
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (18 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 19/23] drm/xe: Check that GT is not NULL before testing Wa_16023588340 Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-10-03 13:17   ` Gustavo Sousa
  2025-09-30 22:56 ` [PATCH v3 21/23] drm/xe: Break GT setup out of xe_info_init() Matt Roper
                   ` (6 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper

If the primary is GT is disabled via configfs, we can't read the GT
registers that would tell us whether the BIOS has disabled FlatCCS on a
platform that would otherwise have it; we'll just proceed as if the
FlatCCS is still enabled.  This is similar to the situation seen by
SRIOV VFs and doesn't cause any functional problems since the hardware
will simply drop writes to the CCS region and reads will always come
back as 0 (indicating uncompressed data).  We'll simply miss out on the
chance to avoid some unnecessary overhead during BO creation and
migration.

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

diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index d42d03b8ab3a..82921d72ebfa 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -782,6 +782,8 @@ static int probe_has_flat_ccs(struct xe_device *xe)
 		return 0;
 
 	gt = xe_root_mmio_gt(xe);
+	if (!gt)
+		return 0;
 
 	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
 	if (!fw_ref)
-- 
2.51.0


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

* [PATCH v3 21/23] drm/xe: Break GT setup out of xe_info_init()
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (19 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 20/23] drm/xe: Don't check BIOS-disabled FlatCCS if primary GT is disabled Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-10-03 13:47   ` Gustavo Sousa
  2025-09-30 22:56 ` [PATCH v3 22/23] drm/xe/configfs: Add attribute to disable GT types Matt Roper
                   ` (5 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper

xe_info_init() is getting a bit long and hard to follow.  Break the
allocation and basic initialization of the xe_gt structures out to their
own functions.

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

diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
index 86e6dd751b1c..65312fe9b97b 100644
--- a/drivers/gpu/drm/xe/xe_pci.c
+++ b/drivers/gpu/drm/xe/xe_pci.c
@@ -683,6 +683,53 @@ static void xe_info_probe_tile_count(struct xe_device *xe)
 	}
 }
 
+static struct xe_gt *init_primary_gt(struct xe_tile *tile,
+				     const struct xe_graphics_desc *graphics_desc,
+				     const struct xe_media_desc *media_desc)
+{
+	struct xe_device *xe = tile_to_xe(tile);
+	struct xe_gt *gt;
+
+	gt = xe_gt_alloc(tile);
+	if (IS_ERR(gt))
+		return gt;
+
+	gt->info.type = XE_GT_TYPE_MAIN;
+	gt->info.id = tile->id * xe->info.max_gt_per_tile;
+	gt->info.has_indirect_ring_state = graphics_desc->has_indirect_ring_state;
+	gt->info.engine_mask = graphics_desc->hw_engine_mask;
+
+	/*
+	 * Before media version 13, the media IP was part of the primary GT
+	 * so we need to add the media engines to the primary GT's engine list.
+	 */
+	if (MEDIA_VER(xe) < 13 && media_desc)
+		gt->info.engine_mask |= media_desc->hw_engine_mask;
+
+	return gt;
+}
+
+static struct xe_gt *init_media_gt(struct xe_tile *tile,
+				   const struct xe_media_desc *media_desc)
+{
+	struct xe_device *xe = tile_to_xe(tile);
+	struct xe_gt *gt;
+
+	gt = xe_gt_alloc(tile);
+	if (IS_ERR(gt))
+		return gt;
+
+	if (MEDIA_VER(xe) < 13 || !media_desc)
+		return NULL;
+
+	gt->info.type = XE_GT_TYPE_MEDIA;
+	gt->info.id = tile->id * xe->info.max_gt_per_tile + 1;
+	gt->info.has_indirect_ring_state = media_desc->has_indirect_ring_state;
+	gt->info.engine_mask = media_desc->hw_engine_mask;
+
+	return gt;
+}
+
 /*
  * Initialize device info content that does require knowledge about
  * graphics / media IP version.
@@ -765,48 +812,21 @@ static int xe_info_init(struct xe_device *xe,
 			return err;
 	}
 
-	/*
-	 * All platforms have at least one primary GT.  Any platform with media
-	 * version 13 or higher has an additional dedicated media GT.  And
-	 * depending on the graphics IP there may be additional "remote tiles."
-	 * All of these together determine the overall GT count.
-	 */
+	/* Allocate any GT and VRAM structures necessary for the platform. */
 	for_each_tile(tile, xe, id) {
 		int err;
 
-		tile->primary_gt = xe_gt_alloc(tile);
+		err = xe_tile_alloc_vram(tile);
+		if (err)
+			return err;
+
+		tile->primary_gt = init_primary_gt(tile, graphics_desc, media_desc);
 		if (IS_ERR(tile->primary_gt))
 			return PTR_ERR(tile->primary_gt);
 
-		gt = tile->primary_gt;
-		gt->info.type = XE_GT_TYPE_MAIN;
-		gt->info.id = tile->id * xe->info.max_gt_per_tile;
-		gt->info.has_indirect_ring_state = graphics_desc->has_indirect_ring_state;
-		gt->info.engine_mask = graphics_desc->hw_engine_mask;
-
-		err = xe_tile_alloc_vram(tile);
-		if (err)
-			return err;
-
-		if (MEDIA_VER(xe) < 13 && media_desc)
-			gt->info.engine_mask |= media_desc->hw_engine_mask;
-
-		if (MEDIA_VER(xe) < 13 || !media_desc)
-			continue;
-
-		/*
-		 * Allocate and setup media GT for platforms with standalone
-		 * media.
-		 */
-		tile->media_gt = xe_gt_alloc(tile);
+		tile->media_gt = init_media_gt(tile, media_desc);
 		if (IS_ERR(tile->media_gt))
 			return PTR_ERR(tile->media_gt);
-
-		gt = tile->media_gt;
-		gt->info.type = XE_GT_TYPE_MEDIA;
-		gt->info.id = tile->id * xe->info.max_gt_per_tile + 1;
-		gt->info.has_indirect_ring_state = media_desc->has_indirect_ring_state;
-		gt->info.engine_mask = media_desc->hw_engine_mask;
 	}
 
 	/*
-- 
2.51.0


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

* [PATCH v3 22/23] drm/xe/configfs: Add attribute to disable GT types
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (20 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 21/23] drm/xe: Break GT setup out of xe_info_init() Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-10-03 18:05   ` Gustavo Sousa
  2025-09-30 22:56 ` [PATCH v3 23/23] drm/xe/sriov: Disable SR-IOV if primary GT is disabled via configfs Matt Roper
                   ` (4 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Gustavo Sousa

Preventing the driver from initializing GTs of specific type(s) can be
useful for debugging and early hardware bringup.  Add a configfs
attribute to allow this kind of control for debugging.

With today's platforms and software design, this configuration setting
is only effective for disabling the media GT since the driver currently
requires that there always be a primary GT to probe the device.  However
this might change in the future ---  in theory it should be possible
(with some additional driver work) to allow an igpu device to come up
with only the media GT and no primary GT.  Or to allow an igpu device to
come up with no GTs at all (for display-only usage).  A primary GT will
likely always be required on dgpu platforms because we rely on the BCS
engines inside the primary GT for various vram operations.

v2:
 - Expand/clarify kerneldoc for configfs attribute.  (Gustavo)
 - Tighten type usage in gt_types[] structure.  (Gustavo)
 - Adjust string parsing/name matching to match exact GT names and not
   accept partial names.  (Gustavo)

Cc: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_configfs.c | 130 +++++++++++++++++++++++++++++++
 drivers/gpu/drm/xe/xe_configfs.h |   2 +
 drivers/gpu/drm/xe/xe_pci.c      |  36 ++++++++-
 3 files changed, 164 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_configfs.c b/drivers/gpu/drm/xe/xe_configfs.c
index 139663423185..aaa98166f527 100644
--- a/drivers/gpu/drm/xe/xe_configfs.c
+++ b/drivers/gpu/drm/xe/xe_configfs.c
@@ -15,6 +15,7 @@
 
 #include "instructions/xe_mi_commands.h"
 #include "xe_configfs.h"
+#include "xe_gt_types.h"
 #include "xe_hw_engine_types.h"
 #include "xe_module.h"
 #include "xe_pci_types.h"
@@ -56,6 +57,7 @@
  *	:
  *	└── 0000:03:00.0
  *	    ├── survivability_mode
+ *	    ├── gt_types_allowed
  *	    ├── engines_allowed
  *	    └── enable_psmi
  *
@@ -79,6 +81,44 @@
  *
  * This attribute can only be set before binding to the device.
  *
+ * Allowed GT types:
+ * -----------------
+ *
+ * Allow only specific types of GTs to be detected and initialized by the
+ * driver.  Any combination of GT types can be enabled/disabled, although
+ * some settings will cause the device to fail to probe.
+ *
+ * Writes support both comma- and newline-separated input format. Reads
+ * will always return one GT type per line. "primary" and "media" are the
+ * GT type names supported by this interface.
+ *
+ * This attribute can only be set before binding to the device.
+ *
+ * Examples:
+ *
+ * Allow both primary and media GTs to be initialized and used.  This matches
+ * the driver's default behavior::
+ *
+ *	# echo 'primary,media' > /sys/kernel/config/xe/0000:03:00.0/gt_types_allowed
+ *
+ * Allow only the primary GT of each tile to be initialized and used,
+ * effectively disabling the media GT if it exists on the platform::
+ *
+ *	# echo 'primary' > /sys/kernel/config/xe/0000:03:00.0/gt_types_allowed
+ *
+ * Allow only the media GT of each tile to be initialized and used,
+ * effectively disabling the primary GT.  **This configuration will cause
+ * device probe failure on all current platforms, but may be allowed on
+ * igpu platforms in the future**::
+ *
+ *	# echo 'media' > /sys/kernel/config/xe/0000:03:00.0/gt_types_allowed
+ *
+ * Disable all GTs.  Only other GPU IP (such as display) is potentially usable.
+ * **This configuration will cause device probe failure on all current
+ * platforms, but may be allowed on igpu platforms in the future**::
+ *
+ *	# echo '' > /sys/kernel/config/xe/0000:03:00.0/gt_types_allowed
+ *
  * Allowed engines:
  * ----------------
  *
@@ -187,6 +227,7 @@ struct xe_config_group_device {
 	struct config_group group;
 
 	struct xe_config_device {
+		u64 gt_types_allowed;
 		u64 engines_allowed;
 		struct wa_bb ctx_restore_post_bb[XE_ENGINE_CLASS_MAX];
 		struct wa_bb ctx_restore_mid_bb[XE_ENGINE_CLASS_MAX];
@@ -201,6 +242,7 @@ struct xe_config_group_device {
 };
 
 static const struct xe_config_device device_defaults = {
+	.gt_types_allowed = U64_MAX,
 	.engines_allowed = U64_MAX,
 	.survivability_mode = false,
 	.enable_psmi = false,
@@ -220,6 +262,7 @@ struct engine_info {
 /* Some helpful macros to aid on the sizing of buffer allocation when parsing */
 #define MAX_ENGINE_CLASS_CHARS 5
 #define MAX_ENGINE_INSTANCE_CHARS 2
+#define MAX_GT_TYPE_CHARS 7
 
 static const struct engine_info engine_info[] = {
 	{ .cls = "rcs", .mask = XE_HW_ENGINE_RCS_MASK, .engine_class = XE_ENGINE_CLASS_RENDER },
@@ -230,6 +273,14 @@ static const struct engine_info engine_info[] = {
 	{ .cls = "gsccs", .mask = XE_HW_ENGINE_GSCCS_MASK, .engine_class = XE_ENGINE_CLASS_OTHER },
 };
 
+static const struct {
+	const char name[MAX_GT_TYPE_CHARS + 1];
+	enum xe_gt_type type;
+} gt_types[] = {
+	{ .name = "primary", .type = XE_GT_TYPE_MAIN },
+	{ .name = "media", .type = XE_GT_TYPE_MEDIA },
+};
+
 static struct xe_config_group_device *to_xe_config_group_device(struct config_item *item)
 {
 	return container_of(to_config_group(item), struct xe_config_group_device, group);
@@ -292,6 +343,62 @@ static ssize_t survivability_mode_store(struct config_item *item, const char *pa
 	return len;
 }
 
+static ssize_t gt_types_allowed_show(struct config_item *item, char *page)
+{
+	struct xe_config_device *dev = to_xe_config_device(item);
+	char *p = page;
+
+	for (size_t i = 0; i < ARRAY_SIZE(gt_types); i++)
+		if (dev->gt_types_allowed & BIT_ULL(gt_types[i].type))
+			p += sprintf(p, "%s\n", gt_types[i].name);
+
+	return p - page;
+}
+
+static ssize_t gt_types_allowed_store(struct config_item *item, const char *page,
+				      size_t len)
+{
+	struct xe_config_group_device *dev = to_xe_config_group_device(item);
+	char *buf = kstrdup(page, GFP_KERNEL);
+	char *p = buf;
+	u64 typemask = 0;
+
+	if (!buf)
+		return -ENOMEM;
+
+	while (p) {
+		char *typename = strsep(&p, ",\n");
+		bool matched = false;
+
+		if (typename[0] == '\0')
+			continue;
+
+		for (size_t i = 0; i < ARRAY_SIZE(gt_types); i++) {
+			if (strcmp(typename, gt_types[i].name) == 0) {
+				typemask |= BIT(gt_types[i].type);
+				matched = true;
+				break;
+			}
+		}
+
+		if (!matched) {
+			len = -EINVAL;
+			goto out;
+		}
+	}
+
+	scoped_guard(mutex, &dev->lock) {
+		if (is_bound(dev))
+			return -EBUSY;
+
+		dev->config.gt_types_allowed = typemask;
+	}
+
+out:
+	kfree(buf);
+	return len;
+}
+
 static ssize_t engines_allowed_show(struct config_item *item, char *page)
 {
 	struct xe_config_device *dev = to_xe_config_device(item);
@@ -672,6 +779,7 @@ CONFIGFS_ATTR(, ctx_restore_mid_bb);
 CONFIGFS_ATTR(, ctx_restore_post_bb);
 CONFIGFS_ATTR(, enable_psmi);
 CONFIGFS_ATTR(, engines_allowed);
+CONFIGFS_ATTR(, gt_types_allowed);
 CONFIGFS_ATTR(, survivability_mode);
 
 static struct configfs_attribute *xe_config_device_attrs[] = {
@@ -679,6 +787,7 @@ static struct configfs_attribute *xe_config_device_attrs[] = {
 	&attr_ctx_restore_post_bb,
 	&attr_enable_psmi,
 	&attr_engines_allowed,
+	&attr_gt_types_allowed,
 	&attr_survivability_mode,
 	NULL,
 };
@@ -846,6 +955,7 @@ static void dump_custom_dev_config(struct pci_dev *pdev,
 				 dev->config.attr_); \
 	} while (0)
 
+	PRI_CUSTOM_ATTR("%llx", gt_types_allowed);
 	PRI_CUSTOM_ATTR("%llx", engines_allowed);
 	PRI_CUSTOM_ATTR("%d", enable_psmi);
 	PRI_CUSTOM_ATTR("%d", survivability_mode);
@@ -896,6 +1006,26 @@ bool xe_configfs_get_survivability_mode(struct pci_dev *pdev)
 	return mode;
 }
 
+/**
+ * xe_configfs_get_gt_types_allowed - get GT type allowed mask from configfs
+ * @pdev: pci device
+ *
+ * Return: GT type mask set in configfs
+ */
+u64 xe_configfs_get_gt_types_allowed(struct pci_dev *pdev)
+{
+	struct xe_config_group_device *dev = find_xe_config_group_device(pdev);
+	u64 mask;
+
+	if (!dev)
+		return device_defaults.gt_types_allowed;
+
+	mask = dev->config.gt_types_allowed;
+	config_group_put(&dev->group);
+
+	return mask;
+}
+
 /**
  * xe_configfs_get_engines_allowed - get engine allowed mask from configfs
  * @pdev: pci device
diff --git a/drivers/gpu/drm/xe/xe_configfs.h b/drivers/gpu/drm/xe/xe_configfs.h
index c61e0e47ed94..c6ad8df9e913 100644
--- a/drivers/gpu/drm/xe/xe_configfs.h
+++ b/drivers/gpu/drm/xe/xe_configfs.h
@@ -17,6 +17,7 @@ int xe_configfs_init(void);
 void xe_configfs_exit(void);
 void xe_configfs_check_device(struct pci_dev *pdev);
 bool xe_configfs_get_survivability_mode(struct pci_dev *pdev);
+u64 xe_configfs_get_gt_types_allowed(struct pci_dev *pdev);
 u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
 bool xe_configfs_get_psmi_enabled(struct pci_dev *pdev);
 u32 xe_configfs_get_ctx_restore_mid_bb(struct pci_dev *pdev, enum xe_engine_class,
@@ -28,6 +29,7 @@ static inline int xe_configfs_init(void) { return 0; }
 static inline void xe_configfs_exit(void) { }
 static inline void xe_configfs_check_device(struct pci_dev *pdev) { }
 static inline bool xe_configfs_get_survivability_mode(struct pci_dev *pdev) { return false; }
+static inline u64 xe_configfs_get_gt_types_allowed(struct pci_dev *pdev) { return U64_MAX; }
 static inline u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev) { return U64_MAX; }
 static inline bool xe_configfs_get_psmi_enabled(struct pci_dev *pdev) { return false; }
 static inline u32 xe_configfs_get_ctx_restore_mid_bb(struct pci_dev *pdev, enum xe_engine_class,
diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
index 65312fe9b97b..4a792e1037d5 100644
--- a/drivers/gpu/drm/xe/xe_pci.c
+++ b/drivers/gpu/drm/xe/xe_pci.c
@@ -685,11 +685,17 @@ static void xe_info_probe_tile_count(struct xe_device *xe)
 
 static struct xe_gt *init_primary_gt(struct xe_tile *tile,
 				     const struct xe_graphics_desc *graphics_desc,
-				     const struct xe_media_desc *media_desc)
+				     const struct xe_media_desc *media_desc,
+				     u64 gt_types_allowed)
 {
 	struct xe_device *xe = tile_to_xe(tile);
 	struct xe_gt *gt;
 
+	if ((gt_types_allowed & BIT_ULL(XE_GT_TYPE_MAIN)) == 0) {
+		drm_info(&xe->drm, "Primary GT disabled via configfs\n");
+		return NULL;
+	}
+
 	gt = xe_gt_alloc(tile);
 	if (IS_ERR(gt))
 		return gt;
@@ -710,11 +716,17 @@ static struct xe_gt *init_primary_gt(struct xe_tile *tile,
 }
 
 static struct xe_gt *init_media_gt(struct xe_tile *tile,
-				   const struct xe_media_desc *media_desc)
+				   const struct xe_media_desc *media_desc,
+				   u64 gt_types_allowed)
 {
 	struct xe_device *xe = tile_to_xe(tile);
 	struct xe_gt *gt;
 
+	if ((gt_types_allowed & BIT_ULL(XE_GT_TYPE_MEDIA)) == 0) {
+		drm_info(&xe->drm, "Media GT disabled via configfs\n");
+		return NULL;
+	}
+
 	gt = xe_gt_alloc(tile);
 	if (IS_ERR(gt))
 		return gt;
@@ -739,6 +751,8 @@ static struct xe_gt *init_media_gt(struct xe_tile *tile,
 static int xe_info_init(struct xe_device *xe,
 			const struct xe_device_desc *desc)
 {
+	struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
+	u64 gt_types_allowed = xe_configfs_get_gt_types_allowed(pdev);
 	u32 graphics_gmdid_revid = 0, media_gmdid_revid = 0;
 	const struct xe_ip *graphics_ip;
 	const struct xe_ip *media_ip;
@@ -820,11 +834,25 @@ static int xe_info_init(struct xe_device *xe,
 		if (err)
 			return err;
 
-		tile->primary_gt = init_primary_gt(tile, graphics_desc, media_desc);
+		tile->primary_gt = init_primary_gt(tile, graphics_desc, media_desc,
+						   gt_types_allowed);
 		if (IS_ERR(tile->primary_gt))
 			return PTR_ERR(tile->primary_gt);
 
-		tile->media_gt = init_media_gt(tile, media_desc);
+		/*
+		 * It's not currently possible to probe a device with the
+		 * primary GT disabled.  With some work, this may be future in
+		 * the possible for igpu platforms (although probably not for
+		 * dgpu's since access to the primary GT's BCS engines is
+		 * required for VRAM management).
+		 */
+		if (!tile->primary_gt) {
+			drm_err(&xe->drm, "Cannot probe device with without a primary GT\n");
+			return -ENODEV;
+		}
+
+		tile->media_gt = init_media_gt(tile, media_desc,
+					       gt_types_allowed);
 		if (IS_ERR(tile->media_gt))
 			return PTR_ERR(tile->media_gt);
 	}
-- 
2.51.0


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

* [PATCH v3 23/23] drm/xe/sriov: Disable SR-IOV if primary GT is disabled via configfs
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (21 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 22/23] drm/xe/configfs: Add attribute to disable GT types Matt Roper
@ 2025-09-30 22:56 ` Matt Roper
  2025-10-01 11:51   ` Michal Wajdeczko
  2025-09-30 23:19 ` ✗ CI.checkpatch: warning for Allow configfs to disable specific GT type(s) (rev3) Patchwork
                   ` (3 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Matt Roper @ 2025-09-30 22:56 UTC (permalink / raw)
  To: intel-xe; +Cc: matthew.d.roper, Michal Wajdeczko

SR-IOV operation relies on the primary GT's GuC to operate (in both PF
and VF mode).  If the primary GT is disabled in VF mode, fail the probe.
If the primary GT is disabled in PF mode, force the device back to
native (non-sriov) mode.

v2:
 - Move handling to xe_info_init().  (Michal)

Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/xe/xe_pci.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
index 4a792e1037d5..44f99c1a39e0 100644
--- a/drivers/gpu/drm/xe/xe_pci.c
+++ b/drivers/gpu/drm/xe/xe_pci.c
@@ -763,6 +763,18 @@ static int xe_info_init(struct xe_device *xe,
 	int ret;
 	u8 id;
 
+	/* SR-IOV (both PF and VF) relies on the primary GT's GuC */
+	if ((gt_types_allowed & BIT_ULL(XE_GT_TYPE_MAIN)) == 0) {
+		if (IS_SRIOV_PF(xe)) {
+			drm_info(&xe->drm, "Disabling SR-IOV because primary GT is disabled.\n");
+			pci_sriov_set_totalvfs(pdev, 0);
+			xe->sriov.__mode = XE_SRIOV_MODE_NONE;
+		} else if (IS_SRIOV_VF(xe)) {
+			drm_err(&xe->drm, "Cannot probe device in SR-IOV VF without primary GT enabled.\n");
+			return -ENODEV;
+		}
+	}
+
 	/*
 	 * If this platform supports GMD_ID, we'll detect the proper IP
 	 * descriptor to use from hardware registers.
-- 
2.51.0


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

* ✗ CI.checkpatch: warning for Allow configfs to disable specific GT type(s) (rev3)
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (22 preceding siblings ...)
  2025-09-30 22:56 ` [PATCH v3 23/23] drm/xe/sriov: Disable SR-IOV if primary GT is disabled via configfs Matt Roper
@ 2025-09-30 23:19 ` Patchwork
  2025-09-30 23:21 ` ✓ CI.KUnit: success " Patchwork
                   ` (2 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Patchwork @ 2025-09-30 23:19 UTC (permalink / raw)
  To: Matt Roper; +Cc: intel-xe

== Series Details ==

Series: Allow configfs to disable specific GT type(s) (rev3)
URL   : https://patchwork.freedesktop.org/series/154739/
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
fbd08a78c3a3bb17964db2a326514c69c1dca660
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit e7286c68bfcb6eae1949c528a9e9f8a9d0b3ba7a
Author: Matt Roper <matthew.d.roper@intel.com>
Date:   Tue Sep 30 15:56:40 2025 -0700

    drm/xe/sriov: Disable SR-IOV if primary GT is disabled via configfs
    
    SR-IOV operation relies on the primary GT's GuC to operate (in both PF
    and VF mode).  If the primary GT is disabled in VF mode, fail the probe.
    If the primary GT is disabled in PF mode, force the device back to
    native (non-sriov) mode.
    
    v2:
     - Move handling to xe_info_init().  (Michal)
    
    Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
    Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
+ /mt/dim checkpatch 23f8be57505c80e5b57dec249df8a3cc053eb947 drm-intel
f1e963961a7b drm/xe/huc: Adjust HuC check on primary GT
f676bef49564 drm/xe: Drop GT parameter to xe_display_irq_postinstall()
66d6a4c31894 drm/xe: Move 'va_bits' flag back to platform descriptor
37031cb534ba drm/xe: Move 'vm_max_level' flag back to platform descriptor
-:23: WARNING:TYPO_SPELLING: 'desciptor' may be misspelled - perhaps 'descriptor'?
#23: 
   desciptor.  (Lucas)
   ^^^^^^^^^

total: 0 errors, 1 warnings, 0 checks, 135 lines checked
62f00a63a307 drm/xe: Move 'vram_flags' flag back to platform descriptor
28db2ca57744 drm/xe: Move 'has_flatccs' flag back to platform descriptor
326ed08c3c6a drm/xe: Read VF GMD_ID with a specifically-allocated dummy GT
-:94: WARNING:LINE_SPACING: Missing a blank line after declarations
#94: FILE: drivers/gpu/drm/xe/xe_pci.c:487:
+		struct xe_gt *gt = kzalloc(sizeof(*gt), GFP_KERNEL);
+		if (!gt)

total: 0 errors, 1 warnings, 0 checks, 146 lines checked
51d2864f8575 drm/xe: Move primary GT allocation from xe_tile_init_early to xe_tile_init
a915770225c3 drm/xe: Skip L2 / TDF cache flushes if primary GT is disabled
6c323e6e60d9 drm/xe/query: Report hwconfig size as 0 if primary GT is disabled
2d86fffe9600 drm/xe/pmu: Initialize PMU event types based on first available GT
92c2e2dc9dd2 drm/xe: Check for primary GT before looking up Wa_22019338487
fdadc16d3cb2 drm/xe: Make display part of Wa_22019338487 a device workaround
9acd082eb3f0 drm/xe/irq: Don't try to lookup engine masks for non-existent primary GT
f989add3acaa drm/xe: Handle Wa_22010954014 and Wa_14022085890 as device workarounds
-:126: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#126: FILE: include/drm/intel/pciids.h:852:
+#define INTEL_BMG_G21_IDS(MACRO__, ...) \
 	MACRO__(0xE202, ## __VA_ARGS__), \
 	MACRO__(0xE209, ## __VA_ARGS__), \
 	MACRO__(0xE20B, ## __VA_ARGS__), \

BUT SEE:

   do {} while (0) advice is over-stated in a few situations:

   The more obvious case is macros, like MODULE_PARM_DESC, invoked at
   file-scope, where C disallows code (it must be in functions).  See
   $exceptions if you have one to add by name.

   More troublesome is declarative macros used at top of new scope,
   like DECLARE_PER_CPU.  These might just compile with a do-while-0
   wrapper, but would be incorrect.  Most of these are handled by
   detecting struct,union,etc declaration primitives in $exceptions.

   Theres also macros called inside an if (block), which "return" an
   expression.  These cannot do-while, and need a ({}) wrapper.

   Enjoy this qualification while we work to improve our heuristics.

-:126: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'MACRO__' - possible side-effects?
#126: FILE: include/drm/intel/pciids.h:852:
+#define INTEL_BMG_G21_IDS(MACRO__, ...) \
 	MACRO__(0xE202, ## __VA_ARGS__), \
 	MACRO__(0xE209, ## __VA_ARGS__), \
 	MACRO__(0xE20B, ## __VA_ARGS__), \

-:137: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#137: FILE: include/drm/intel/pciids.h:863:
+#define INTEL_BMG_IDS(MACRO__, ...) \
+	INTEL_BMG_G21_IDS(MACRO__, __VA_ARGS__), \
 	MACRO__(0xE220, ## __VA_ARGS__), \
 	MACRO__(0xE221, ## __VA_ARGS__), \
 	MACRO__(0xE222, ## __VA_ARGS__), \

BUT SEE:

   do {} while (0) advice is over-stated in a few situations:

   The more obvious case is macros, like MODULE_PARM_DESC, invoked at
   file-scope, where C disallows code (it must be in functions).  See
   $exceptions if you have one to add by name.

   More troublesome is declarative macros used at top of new scope,
   like DECLARE_PER_CPU.  These might just compile with a do-while-0
   wrapper, but would be incorrect.  Most of these are handled by
   detecting struct,union,etc declaration primitives in $exceptions.

   Theres also macros called inside an if (block), which "return" an
   expression.  These cannot do-while, and need a ({}) wrapper.

   Enjoy this qualification while we work to improve our heuristics.

-:137: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'MACRO__' - possible side-effects?
#137: FILE: include/drm/intel/pciids.h:863:
+#define INTEL_BMG_IDS(MACRO__, ...) \
+	INTEL_BMG_G21_IDS(MACRO__, __VA_ARGS__), \
 	MACRO__(0xE220, ## __VA_ARGS__), \
 	MACRO__(0xE221, ## __VA_ARGS__), \
 	MACRO__(0xE222, ## __VA_ARGS__), \

total: 2 errors, 0 warnings, 2 checks, 87 lines checked
109aa8e04979 drm/xe/rtp: Pass xe_device parameter to FUNC matches
2a2273d825c0 drm/xe: Bypass Wa_14018094691 when primary GT is disabled
5c9557b9bb69 drm/xe: Correct lineage for Wa_22014953428 and only check with valid GT
7f9546f4142a drm/xe: Check that GT is not NULL before testing Wa_16023588340
4e6d3a98f709 drm/xe: Don't check BIOS-disabled FlatCCS if primary GT is disabled
4e3fbf75822d drm/xe: Break GT setup out of xe_info_init()
488150a098fb drm/xe/configfs: Add attribute to disable GT types
e7286c68bfcb drm/xe/sriov: Disable SR-IOV if primary GT is disabled via configfs



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

* ✓ CI.KUnit: success for Allow configfs to disable specific GT type(s) (rev3)
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (23 preceding siblings ...)
  2025-09-30 23:19 ` ✗ CI.checkpatch: warning for Allow configfs to disable specific GT type(s) (rev3) Patchwork
@ 2025-09-30 23:21 ` Patchwork
  2025-10-01  0:07 ` ✗ Xe.CI.BAT: failure " Patchwork
  2025-10-01  2:30 ` ✗ Xe.CI.Full: " Patchwork
  26 siblings, 0 replies; 49+ messages in thread
From: Patchwork @ 2025-09-30 23:21 UTC (permalink / raw)
  To: Matt Roper; +Cc: intel-xe

== Series Details ==

Series: Allow configfs to disable specific GT type(s) (rev3)
URL   : https://patchwork.freedesktop.org/series/154739/
State : success

== Summary ==

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

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

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

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



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

* ✗ Xe.CI.BAT: failure for Allow configfs to disable specific GT type(s) (rev3)
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (24 preceding siblings ...)
  2025-09-30 23:21 ` ✓ CI.KUnit: success " Patchwork
@ 2025-10-01  0:07 ` Patchwork
  2025-10-01  2:30 ` ✗ Xe.CI.Full: " Patchwork
  26 siblings, 0 replies; 49+ messages in thread
From: Patchwork @ 2025-10-01  0:07 UTC (permalink / raw)
  To: Matt Roper; +Cc: intel-xe

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

== Series Details ==

Series: Allow configfs to disable specific GT type(s) (rev3)
URL   : https://patchwork.freedesktop.org/series/154739/
State : failure

== Summary ==

CI Bug Log - changes from xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947_BAT -> xe-pw-154739v3_BAT
====================================================

Summary
-------

  **FAILURE**

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

  No changes in participating hosts

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

  Here are the unknown changes that may have been introduced in xe-pw-154739v3_BAT:

### IGT changes ###

#### Possible regressions ####

  * igt@sriov_basic@enable-vfs-autoprobe-on:
    - bat-bmg-2:          [PASS][1] -> [ABORT][2] +1 other test abort
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/bat-bmg-2/igt@sriov_basic@enable-vfs-autoprobe-on.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/bat-bmg-2/igt@sriov_basic@enable-vfs-autoprobe-on.html

  * igt@sriov_basic@enable-vfs-autoprobe-on@numvfs-1:
    - bat-bmg-1:          [PASS][3] -> [ABORT][4] +1 other test abort
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/bat-bmg-1/igt@sriov_basic@enable-vfs-autoprobe-on@numvfs-1.html
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/bat-bmg-1/igt@sriov_basic@enable-vfs-autoprobe-on@numvfs-1.html

  
#### Suppressed ####

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

  * igt@sriov_basic@enable-vfs-autoprobe-on:
    - {bat-ptl-1}:        [PASS][5] -> [ABORT][6] +1 other test abort
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/bat-ptl-1/igt@sriov_basic@enable-vfs-autoprobe-on.html
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/bat-ptl-1/igt@sriov_basic@enable-vfs-autoprobe-on.html

  * igt@sriov_basic@enable-vfs-autoprobe-on@numvfs-1:
    - {bat-ptl-2}:        [PASS][7] -> [ABORT][8] +1 other test abort
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/bat-ptl-2/igt@sriov_basic@enable-vfs-autoprobe-on@numvfs-1.html
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/bat-ptl-2/igt@sriov_basic@enable-vfs-autoprobe-on@numvfs-1.html

  * igt@xe_module_load@load:
    - {bat-ptl-vm}:       [PASS][9] -> [ABORT][10]
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/bat-ptl-vm/igt@xe_module_load@load.html
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/bat-ptl-vm/igt@xe_module_load@load.html

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



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

  * Linux: xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947 -> xe-pw-154739v3

  IGT_8564: fd0f7b3639b26971567b7a9d64ba5174d5d3db5a @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947: 23f8be57505c80e5b57dec249df8a3cc053eb947
  xe-pw-154739v3: 154739v3

== Logs ==

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

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

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

* ✗ Xe.CI.Full: failure for Allow configfs to disable specific GT type(s) (rev3)
  2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
                   ` (25 preceding siblings ...)
  2025-10-01  0:07 ` ✗ Xe.CI.BAT: failure " Patchwork
@ 2025-10-01  2:30 ` Patchwork
  26 siblings, 0 replies; 49+ messages in thread
From: Patchwork @ 2025-10-01  2:30 UTC (permalink / raw)
  To: Matt Roper; +Cc: intel-xe

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

== Series Details ==

Series: Allow configfs to disable specific GT type(s) (rev3)
URL   : https://patchwork.freedesktop.org/series/154739/
State : failure

== Summary ==

CI Bug Log - changes from xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947_FULL -> xe-pw-154739v3_FULL
====================================================

Summary
-------

  **FAILURE**

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

### IGT changes ###

#### Possible regressions ####

  * igt@xe_pmu@engine-activity-most-load-idle:
    - shard-bmg:          [PASS][1] -> [ABORT][2] +22 other tests abort
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-8/igt@xe_pmu@engine-activity-most-load-idle.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-2/igt@xe_pmu@engine-activity-most-load-idle.html

  
#### Warnings ####

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-d-hdmi-a-6:
    - shard-dg2-set2:     [INCOMPLETE][3] ([Intel XE#1727] / [Intel XE#3113]) -> [INCOMPLETE][4]
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-dg2-435/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-d-hdmi-a-6.html
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-433/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-d-hdmi-a-6.html

  * igt@xe_pmu@fn-engine-activity-sched-if-idle:
    - shard-bmg:          [DMESG-WARN][5] ([Intel XE#3876]) -> [ABORT][6]
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-3/igt@xe_pmu@fn-engine-activity-sched-if-idle.html
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-3/igt@xe_pmu@fn-engine-activity-sched-if-idle.html

  
#### Suppressed ####

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

  * {igt@xe_pmu@engine-activity-multi-client@engine-drm_xe_engine_class_video_enhance1}:
    - shard-bmg:          [PASS][7] -> [ABORT][8] +14 other tests abort
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-8/igt@xe_pmu@engine-activity-multi-client@engine-drm_xe_engine_class_video_enhance1.html
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-4/igt@xe_pmu@engine-activity-multi-client@engine-drm_xe_engine_class_video_enhance1.html

  
New tests
---------

  New tests have been introduced between xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947_FULL and xe-pw-154739v3_FULL:

### New IGT tests (55) ###

  * igt@kms_joiner@basic-big-joiner:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_joiner@basic-force-big-joiner:
    - Statuses : 3 pass(s) 1 skip(s)
    - Exec time: [0.0, 2.29] s

  * igt@kms_joiner@basic-force-big-joiner@single:
    - Statuses : 3 pass(s)
    - Exec time: [0.67, 2.29] s

  * igt@kms_joiner@basic-force-ultra-joiner:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_joiner@basic-ultra-joiner:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_joiner@invalid-modeset-big-joiner:
    - Statuses :
    - Exec time: [None] s

  * igt@kms_joiner@invalid-modeset-force-big-joiner:
    - Statuses : 2 pass(s) 1 skip(s)
    - Exec time: [0.0, 0.41] s

  * igt@kms_joiner@invalid-modeset-force-big-joiner@big_joiner_on_last_pipe:
    - Statuses : 2 pass(s)
    - Exec time: [0.34, 0.41] s

  * igt@kms_joiner@invalid-modeset-force-ultra-joiner:
    - Statuses : 4 skip(s)
    - Exec time: [0.0] s

  * igt@kms_joiner@invalid-modeset-ultra-joiner:
    - Statuses : 4 skip(s)
    - Exec time: [0.0] s

  * igt@kms_lease@cursor-implicit-plane@pipe-a-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.24] s

  * igt@kms_lease@cursor-implicit-plane@pipe-b-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.24] s

  * igt@kms_lease@cursor-implicit-plane@pipe-c-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.24] s

  * igt@kms_lease@cursor-implicit-plane@pipe-d-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.25] s

  * igt@kms_lease@setcrtc-implicit-plane@pipe-a-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.25] s

  * igt@kms_lease@setcrtc-implicit-plane@pipe-b-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.26] s

  * igt@kms_lease@setcrtc-implicit-plane@pipe-c-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.24] s

  * igt@kms_lease@setcrtc-implicit-plane@pipe-d-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.27] s

  * igt@kms_plane_alpha_blend@alpha-7efc@pipe-a-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.42] s

  * igt@kms_plane_alpha_blend@alpha-7efc@pipe-c-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.39] s

  * igt@kms_plane_alpha_blend@alpha-7efc@pipe-d-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.46] s

  * igt@kms_plane_alpha_blend@alpha-basic@pipe-a-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [2.46] s

  * igt@kms_plane_alpha_blend@alpha-basic@pipe-c-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [3.55] s

  * igt@kms_plane_alpha_blend@alpha-opaque-fb@pipe-a-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.84] s

  * igt@kms_plane_alpha_blend@alpha-opaque-fb@pipe-a-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.45] s

  * igt@kms_plane_alpha_blend@alpha-opaque-fb@pipe-c-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.59] s

  * igt@kms_plane_alpha_blend@alpha-opaque-fb@pipe-d-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.46] s

  * igt@kms_plane_alpha_blend@alpha-transparent-fb@pipe-a-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.74] s

  * igt@kms_plane_alpha_blend@alpha-transparent-fb@pipe-a-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.46] s

  * igt@kms_plane_alpha_blend@alpha-transparent-fb@pipe-c-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.55] s

  * igt@kms_plane_alpha_blend@alpha-transparent-fb@pipe-d-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.46] s

  * igt@kms_plane_alpha_blend@constant-alpha-max@pipe-a-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.86] s

  * igt@kms_plane_alpha_blend@constant-alpha-max@pipe-c-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [2.08] s

  * igt@kms_plane_alpha_blend@constant-alpha-max@pipe-d-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.85] s

  * igt@kms_plane_alpha_blend@constant-alpha-mid@pipe-a-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.67] s

  * igt@kms_plane_alpha_blend@constant-alpha-mid@pipe-c-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.85] s

  * igt@kms_plane_alpha_blend@constant-alpha-min@pipe-a-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.64] s

  * igt@kms_plane_alpha_blend@constant-alpha-min@pipe-c-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.77] s

  * igt@kms_plane_alpha_blend@constant-alpha-min@pipe-d-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.66] s

  * igt@kms_plane_alpha_blend@coverage-7efc@pipe-a-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.72] s

  * igt@kms_plane_alpha_blend@coverage-7efc@pipe-a-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.42] s

  * igt@kms_plane_alpha_blend@coverage-7efc@pipe-c-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.44] s

  * igt@kms_plane_alpha_blend@coverage-7efc@pipe-d-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.47] s

  * igt@kms_plane_alpha_blend@coverage-vs-premult-vs-constant@pipe-a-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.73] s

  * igt@kms_plane_alpha_blend@coverage-vs-premult-vs-constant@pipe-a-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.39] s

  * igt@kms_plane_alpha_blend@coverage-vs-premult-vs-constant@pipe-c-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.48] s

  * igt@kms_plane_alpha_blend@coverage-vs-premult-vs-constant@pipe-d-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.37] s

  * igt@kms_pm_backlight@brightness-with-dpms:
    - Statuses : 1 pass(s) 2 skip(s)
    - Exec time: [0.0, 2.40] s

  * igt@kms_pm_backlight@brightness-with-dpms@edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [2.37] s

  * igt@xe_sysfs_timeslice_duration@timeslice_duration_us-timeout:
    - Statuses : 3 pass(s)
    - Exec time: [2.69, 3.46] s

  * igt@xe_sysfs_timeslice_duration@timeslice_duration_us-timeout@bcs:
    - Statuses : 3 pass(s)
    - Exec time: [0.67, 0.69] s

  * igt@xe_sysfs_timeslice_duration@timeslice_duration_us-timeout@ccs:
    - Statuses : 2 pass(s)
    - Exec time: [0.70] s

  * igt@xe_sysfs_timeslice_duration@timeslice_duration_us-timeout@rcs:
    - Statuses : 3 pass(s)
    - Exec time: [0.67, 0.69] s

  * igt@xe_sysfs_timeslice_duration@timeslice_duration_us-timeout@vcs:
    - Statuses : 3 pass(s)
    - Exec time: [0.67, 0.69] s

  * igt@xe_sysfs_timeslice_duration@timeslice_duration_us-timeout@vecs:
    - Statuses : 3 pass(s)
    - Exec time: [0.67, 0.69] s

  

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

  Here are the changes found in xe-pw-154739v3_FULL that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_big_fb@yf-tiled-16bpp-rotate-0:
    - shard-dg2-set2:     NOTRUN -> [SKIP][9] ([Intel XE#1124]) +1 other test skip
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-463/igt@kms_big_fb@yf-tiled-16bpp-rotate-0.html

  * igt@kms_ccs@bad-aux-stride-4-tiled-mtl-rc-ccs@pipe-a-dp-2:
    - shard-dg2-set2:     NOTRUN -> [SKIP][10] ([Intel XE#787]) +118 other tests skip
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-432/igt@kms_ccs@bad-aux-stride-4-tiled-mtl-rc-ccs@pipe-a-dp-2.html

  * igt@kms_ccs@crc-primary-basic-yf-tiled-ccs@pipe-d-dp-4:
    - shard-dg2-set2:     NOTRUN -> [SKIP][11] ([Intel XE#455] / [Intel XE#787]) +17 other tests skip
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-464/igt@kms_ccs@crc-primary-basic-yf-tiled-ccs@pipe-d-dp-4.html

  * igt@kms_ccs@crc-sprite-planes-basic-4-tiled-bmg-ccs:
    - shard-dg2-set2:     NOTRUN -> [SKIP][12] ([Intel XE#2907])
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-463/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-bmg-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-c-hdmi-a-6:
    - shard-dg2-set2:     [PASS][13] -> [DMESG-WARN][14] ([Intel XE#1727] / [Intel XE#3113]) +1 other test dmesg-warn
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-dg2-433/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-c-hdmi-a-6.html
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-c-hdmi-a-6.html

  * igt@kms_chamelium_color@degamma:
    - shard-dg2-set2:     NOTRUN -> [SKIP][15] ([Intel XE#306])
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-463/igt@kms_chamelium_color@degamma.html

  * igt@kms_content_protection@atomic-dpms@pipe-a-dp-2:
    - shard-dg2-set2:     NOTRUN -> [FAIL][16] ([Intel XE#1178])
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-432/igt@kms_content_protection@atomic-dpms@pipe-a-dp-2.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-varying-size:
    - shard-bmg:          [PASS][17] -> [SKIP][18] ([Intel XE#2291]) +1 other test skip
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-3/igt@kms_cursor_legacy@cursorb-vs-flipa-varying-size.html
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-6/igt@kms_cursor_legacy@cursorb-vs-flipa-varying-size.html

  * igt@kms_dsc@dsc-basic:
    - shard-dg2-set2:     NOTRUN -> [SKIP][19] ([Intel XE#455]) +2 other tests skip
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-463/igt@kms_dsc@dsc-basic.html

  * igt@kms_flip@2x-flip-vs-absolute-wf_vblank:
    - shard-dg2-set2:     [PASS][20] -> [FAIL][21] ([Intel XE#3098])
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-dg2-432/igt@kms_flip@2x-flip-vs-absolute-wf_vblank.html
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-464/igt@kms_flip@2x-flip-vs-absolute-wf_vblank.html

  * igt@kms_flip@2x-flip-vs-absolute-wf_vblank@bc-hdmi-a6-dp4:
    - shard-dg2-set2:     NOTRUN -> [FAIL][22] ([Intel XE#3098])
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-464/igt@kms_flip@2x-flip-vs-absolute-wf_vblank@bc-hdmi-a6-dp4.html

  * igt@kms_flip@2x-flip-vs-dpms-on-nop:
    - shard-bmg:          [PASS][23] -> [SKIP][24] ([Intel XE#2316]) +2 other tests skip
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-3/igt@kms_flip@2x-flip-vs-dpms-on-nop.html
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-6/igt@kms_flip@2x-flip-vs-dpms-on-nop.html

  * igt@kms_flip@flip-vs-expired-vblank@a-edp1:
    - shard-lnl:          [PASS][25] -> [FAIL][26] ([Intel XE#301])
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank@a-edp1.html
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-lnl-2/igt@kms_flip@flip-vs-expired-vblank@a-edp1.html

  * igt@kms_flip@flip-vs-expired-vblank@c-edp1:
    - shard-lnl:          [PASS][27] -> [FAIL][28] ([Intel XE#301] / [Intel XE#3149])
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-lnl-2/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html

  * igt@kms_flip@flip-vs-suspend@b-hdmi-a1:
    - shard-adlp:         [PASS][29] -> [DMESG-WARN][30] ([Intel XE#4543]) +6 other tests dmesg-warn
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-9/igt@kms_flip@flip-vs-suspend@b-hdmi-a1.html
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-8/igt@kms_flip@flip-vs-suspend@b-hdmi-a1.html

  * igt@kms_flip_tiling@flip-change-tiling@pipe-b-hdmi-a-1-x-to-y:
    - shard-adlp:         [PASS][31] -> [DMESG-FAIL][32] ([Intel XE#4543])
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-6/igt@kms_flip_tiling@flip-change-tiling@pipe-b-hdmi-a-1-x-to-y.html
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-9/igt@kms_flip_tiling@flip-change-tiling@pipe-b-hdmi-a-1-x-to-y.html

  * igt@kms_flip_tiling@flip-change-tiling@pipe-d-hdmi-a-1-x-to-y:
    - shard-adlp:         [PASS][33] -> [FAIL][34] ([Intel XE#1874])
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-6/igt@kms_flip_tiling@flip-change-tiling@pipe-d-hdmi-a-1-x-to-y.html
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-9/igt@kms_flip_tiling@flip-change-tiling@pipe-d-hdmi-a-1-x-to-y.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-indfb-pgflip-blt:
    - shard-dg2-set2:     NOTRUN -> [SKIP][35] ([Intel XE#651]) +2 other tests skip
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-463/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-blt:
    - shard-dg2-set2:     NOTRUN -> [SKIP][36] ([Intel XE#653]) +6 other tests skip
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-463/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-blt.html

  * igt@kms_plane_cursor@primary@pipe-a-hdmi-a-6-size-256:
    - shard-dg2-set2:     NOTRUN -> [FAIL][37] ([Intel XE#616]) +2 other tests fail
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-466/igt@kms_plane_cursor@primary@pipe-a-hdmi-a-6-size-256.html

  * igt@kms_plane_scaling@plane-upscale-factor-0-25-with-rotation@pipe-d:
    - shard-adlp:         [PASS][38] -> [DMESG-WARN][39] ([Intel XE#2953] / [Intel XE#4173]) +4 other tests dmesg-warn
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-2/igt@kms_plane_scaling@plane-upscale-factor-0-25-with-rotation@pipe-d.html
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-4/igt@kms_plane_scaling@plane-upscale-factor-0-25-with-rotation@pipe-d.html

  * igt@kms_pm_backlight@brightness-with-dpms (NEW):
    - shard-dg2-set2:     NOTRUN -> [SKIP][40] ([Intel XE#2938])
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-463/igt@kms_pm_backlight@brightness-with-dpms.html

  * igt@kms_psr@fbc-psr-sprite-plane-move:
    - shard-dg2-set2:     NOTRUN -> [SKIP][41] ([Intel XE#1406] / [Intel XE#2850] / [Intel XE#929])
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-463/igt@kms_psr@fbc-psr-sprite-plane-move.html

  * igt@kms_setmode@invalid-clone-single-crtc:
    - shard-bmg:          [PASS][42] -> [SKIP][43] ([Intel XE#1435])
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-7/igt@kms_setmode@invalid-clone-single-crtc.html
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-6/igt@kms_setmode@invalid-clone-single-crtc.html

  * igt@kms_vblank@ts-continuation-dpms-suspend@pipe-d-dp-4:
    - shard-dg2-set2:     [PASS][44] -> [INCOMPLETE][45] ([Intel XE#4488]) +1 other test incomplete
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-dg2-436/igt@kms_vblank@ts-continuation-dpms-suspend@pipe-d-dp-4.html
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-464/igt@kms_vblank@ts-continuation-dpms-suspend@pipe-d-dp-4.html

  * igt@xe_drm_fdinfo@parallel-utilization-single-full-load:
    - shard-adlp:         [PASS][46] -> [TIMEOUT][47] ([Intel XE#3876])
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-1/igt@xe_drm_fdinfo@parallel-utilization-single-full-load.html
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-4/igt@xe_drm_fdinfo@parallel-utilization-single-full-load.html

  * igt@xe_exec_basic@multigpu-no-exec-null-defer-mmap:
    - shard-dg2-set2:     [PASS][48] -> [SKIP][49] ([Intel XE#1392]) +4 other tests skip
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-dg2-463/igt@xe_exec_basic@multigpu-no-exec-null-defer-mmap.html
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-432/igt@xe_exec_basic@multigpu-no-exec-null-defer-mmap.html

  * igt@xe_exec_fault_mode@many-bindexecqueue-userptr-rebind-imm:
    - shard-dg2-set2:     NOTRUN -> [SKIP][50] ([Intel XE#288]) +4 other tests skip
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-463/igt@xe_exec_fault_mode@many-bindexecqueue-userptr-rebind-imm.html

  * igt@xe_exec_mix_modes@exec-simple-batch-store-lr:
    - shard-dg2-set2:     NOTRUN -> [SKIP][51] ([Intel XE#2360])
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-463/igt@xe_exec_mix_modes@exec-simple-batch-store-lr.html

  * igt@xe_exec_reset@parallel-gt-reset:
    - shard-adlp:         [PASS][52] -> [DMESG-WARN][53] ([Intel XE#3876])
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-1/igt@xe_exec_reset@parallel-gt-reset.html
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-4/igt@xe_exec_reset@parallel-gt-reset.html

  * igt@xe_exec_system_allocator@threads-shared-vm-many-large-execqueues-new-busy-nomemset:
    - shard-dg2-set2:     NOTRUN -> [SKIP][54] ([Intel XE#4915]) +30 other tests skip
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-463/igt@xe_exec_system_allocator@threads-shared-vm-many-large-execqueues-new-busy-nomemset.html

  * igt@xe_exec_threads@threads-rebind:
    - shard-adlp:         [PASS][55] -> [DMESG-FAIL][56] ([Intel XE#3876]) +1 other test dmesg-fail
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-1/igt@xe_exec_threads@threads-rebind.html
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-4/igt@xe_exec_threads@threads-rebind.html

  * igt@xe_fault_injection@probe-fail-guc-xe_guc_mmio_send_recv:
    - shard-dg2-set2:     [PASS][57] -> [DMESG-WARN][58] ([Intel XE#5893])
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-dg2-464/igt@xe_fault_injection@probe-fail-guc-xe_guc_mmio_send_recv.html
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-436/igt@xe_fault_injection@probe-fail-guc-xe_guc_mmio_send_recv.html

  * igt@xe_oa@invalid-oa-format-id:
    - shard-dg2-set2:     NOTRUN -> [SKIP][59] ([Intel XE#3573])
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-463/igt@xe_oa@invalid-oa-format-id.html

  * igt@xe_pm@s2idle-vm-bind-unbind-all:
    - shard-adlp:         [PASS][60] -> [DMESG-WARN][61] ([Intel XE#2953] / [Intel XE#4173] / [Intel XE#4504])
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-4/igt@xe_pm@s2idle-vm-bind-unbind-all.html
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-8/igt@xe_pm@s2idle-vm-bind-unbind-all.html

  * igt@xe_pxp@pxp-stale-queue-post-suspend:
    - shard-dg2-set2:     NOTRUN -> [SKIP][62] ([Intel XE#4733])
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-463/igt@xe_pxp@pxp-stale-queue-post-suspend.html

  * igt@xe_render_copy@render-stress-4-copies:
    - shard-dg2-set2:     NOTRUN -> [SKIP][63] ([Intel XE#4814])
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-463/igt@xe_render_copy@render-stress-4-copies.html

  
#### Possible fixes ####

  * igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-hdmi-a-1:
    - shard-adlp:         [FAIL][64] ([Intel XE#3908]) -> [PASS][65] +1 other test pass
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-6/igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-hdmi-a-1.html
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-1/igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-hdmi-a-1.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs:
    - shard-dg2-set2:     [INCOMPLETE][66] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#4212] / [Intel XE#4345] / [Intel XE#4522]) -> [PASS][67]
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-dg2-466/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-463/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-b-dp-4:
    - shard-dg2-set2:     [INCOMPLETE][68] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#4212] / [Intel XE#4522]) -> [PASS][69]
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-dg2-466/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-b-dp-4.html
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-463/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-b-dp-4.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions:
    - shard-bmg:          [SKIP][70] ([Intel XE#2291]) -> [PASS][71] +1 other test pass
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-6/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions.html
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-5/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions.html

  * igt@kms_flip@2x-plain-flip:
    - shard-bmg:          [SKIP][72] ([Intel XE#2316]) -> [PASS][73] +3 other tests pass
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-6/igt@kms_flip@2x-plain-flip.html
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-4/igt@kms_flip@2x-plain-flip.html

  * igt@kms_flip@flip-vs-expired-vblank@b-edp1:
    - shard-lnl:          [FAIL][74] ([Intel XE#301]) -> [PASS][75]
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank@b-edp1.html
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-lnl-2/igt@kms_flip@flip-vs-expired-vblank@b-edp1.html

  * igt@kms_flip@plain-flip-interruptible@b-hdmi-a1:
    - shard-adlp:         [DMESG-WARN][76] ([Intel XE#4543]) -> [PASS][77] +5 other tests pass
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-2/igt@kms_flip@plain-flip-interruptible@b-hdmi-a1.html
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-6/igt@kms_flip@plain-flip-interruptible@b-hdmi-a1.html

  * igt@kms_flip_tiling@flip-change-tiling@pipe-c-hdmi-a-1-y-to-y:
    - shard-adlp:         [DMESG-FAIL][78] ([Intel XE#4543]) -> [PASS][79]
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-6/igt@kms_flip_tiling@flip-change-tiling@pipe-c-hdmi-a-1-y-to-y.html
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-9/igt@kms_flip_tiling@flip-change-tiling@pipe-c-hdmi-a-1-y-to-y.html

  * igt@kms_flip_tiling@flip-change-tiling@pipe-d-hdmi-a-1-y-to-y:
    - shard-adlp:         [FAIL][80] ([Intel XE#1874]) -> [PASS][81]
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-6/igt@kms_flip_tiling@flip-change-tiling@pipe-d-hdmi-a-1-y-to-y.html
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-9/igt@kms_flip_tiling@flip-change-tiling@pipe-d-hdmi-a-1-y-to-y.html

  * igt@kms_hdr@static-toggle-suspend:
    - shard-bmg:          [SKIP][82] ([Intel XE#1503]) -> [PASS][83]
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-6/igt@kms_hdr@static-toggle-suspend.html
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-4/igt@kms_hdr@static-toggle-suspend.html

  * igt@xe_exec_basic@multigpu-no-exec-userptr-invalidate-race:
    - shard-dg2-set2:     [SKIP][84] ([Intel XE#1392]) -> [PASS][85] +3 other tests pass
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-dg2-432/igt@xe_exec_basic@multigpu-no-exec-userptr-invalidate-race.html
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-466/igt@xe_exec_basic@multigpu-no-exec-userptr-invalidate-race.html

  * igt@xe_exec_reset@cm-close-fd:
    - shard-adlp:         [DMESG-WARN][86] -> [PASS][87]
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-3/igt@xe_exec_reset@cm-close-fd.html
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-2/igt@xe_exec_reset@cm-close-fd.html

  * {igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-single-vma}:
    - shard-lnl:          [FAIL][88] -> [PASS][89]
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-lnl-4/igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-single-vma.html
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-lnl-7/igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-single-vma.html

  * {igt@xe_exec_system_allocator@prefetch-sys-benchmark}:
    - shard-bmg:          [CRASH][90] ([Intel XE#6192]) -> [PASS][91] +4 other tests pass
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-8/igt@xe_exec_system_allocator@prefetch-sys-benchmark.html
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-1/igt@xe_exec_system_allocator@prefetch-sys-benchmark.html

  * {igt@xe_exec_system_allocator@twice-malloc-prefetch}:
    - shard-lnl:          [CRASH][92] ([Intel XE#6192]) -> [PASS][93] +8 other tests pass
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-lnl-4/igt@xe_exec_system_allocator@twice-malloc-prefetch.html
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-lnl-7/igt@xe_exec_system_allocator@twice-malloc-prefetch.html

  * igt@xe_pm@s3-vm-bind-prefetch:
    - shard-adlp:         [DMESG-WARN][94] ([Intel XE#2953] / [Intel XE#4173]) -> [PASS][95] +2 other tests pass
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-6/igt@xe_pm@s3-vm-bind-prefetch.html
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-3/igt@xe_pm@s3-vm-bind-prefetch.html

  
#### Warnings ####

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc:
    - shard-dg2-set2:     [INCOMPLETE][96] ([Intel XE#1727] / [Intel XE#2705] / [Intel XE#3113] / [Intel XE#4212] / [Intel XE#4345] / [Intel XE#4522]) -> [INCOMPLETE][97] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#4345])
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-dg2-433/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html
   [97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-c-dp-4:
    - shard-dg2-set2:     [INCOMPLETE][98] ([Intel XE#1727] / [Intel XE#2705] / [Intel XE#3113] / [Intel XE#4212] / [Intel XE#4522] / [Intel XE#6014]) -> [INCOMPLETE][99] ([Intel XE#6014])
   [98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-dg2-433/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-c-dp-4.html
   [99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-c-dp-4.html

  * igt@kms_flip@flip-vs-expired-vblank:
    - shard-lnl:          [FAIL][100] ([Intel XE#301]) -> [FAIL][101] ([Intel XE#301] / [Intel XE#3149])
   [100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank.html
   [101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-lnl-2/igt@kms_flip@flip-vs-expired-vblank.html

  * igt@kms_flip@flip-vs-panning-vs-hang@d-hdmi-a1:
    - shard-adlp:         [TIMEOUT][102] ([Intel XE#4543]) -> [DMESG-WARN][103] ([Intel XE#4543]) +1 other test dmesg-warn
   [102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-1/igt@kms_flip@flip-vs-panning-vs-hang@d-hdmi-a1.html
   [103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-4/igt@kms_flip@flip-vs-panning-vs-hang@d-hdmi-a1.html

  * igt@kms_flip@flip-vs-rmfb-interruptible:
    - shard-adlp:         [DMESG-WARN][104] ([Intel XE#5208]) -> [DMESG-WARN][105] ([Intel XE#4543] / [Intel XE#5208]) +1 other test dmesg-warn
   [104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-9/igt@kms_flip@flip-vs-rmfb-interruptible.html
   [105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-3/igt@kms_flip@flip-vs-rmfb-interruptible.html

  * igt@kms_flip@flip-vs-suspend:
    - shard-adlp:         [DMESG-WARN][106] ([Intel XE#2953] / [Intel XE#4173]) -> [DMESG-WARN][107] ([Intel XE#4543])
   [106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-9/igt@kms_flip@flip-vs-suspend.html
   [107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-8/igt@kms_flip@flip-vs-suspend.html

  * igt@kms_frontbuffer_tracking@drrs-2p-pri-indfb-multidraw:
    - shard-bmg:          [SKIP][108] ([Intel XE#2312]) -> [SKIP][109] ([Intel XE#2311]) +7 other tests skip
   [108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-pri-indfb-multidraw.html
   [109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-5/igt@kms_frontbuffer_tracking@drrs-2p-pri-indfb-multidraw.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][110] ([Intel XE#2311]) -> [SKIP][111] ([Intel XE#2312]) +6 other tests skip
   [110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-7/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-mmap-wc.html
   [111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][112] ([Intel XE#5390]) -> [SKIP][113] ([Intel XE#2312]) +1 other test skip
   [112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-7/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-mmap-wc.html
   [113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-blt:
    - shard-bmg:          [SKIP][114] ([Intel XE#2312]) -> [SKIP][115] ([Intel XE#2313]) +7 other tests skip
   [114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-blt.html
   [115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-5/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][116] ([Intel XE#2313]) -> [SKIP][117] ([Intel XE#2312]) +1 other test skip
   [116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-3/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-wc.html
   [117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-wc.html

  * igt@kms_hdr@brightness-with-hdr:
    - shard-bmg:          [SKIP][118] ([Intel XE#3544]) -> [SKIP][119] ([Intel XE#3374] / [Intel XE#3544])
   [118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-1/igt@kms_hdr@brightness-with-hdr.html
   [119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-7/igt@kms_hdr@brightness-with-hdr.html

  * igt@kms_plane_multiple@2x-tiling-y:
    - shard-bmg:          [SKIP][120] ([Intel XE#5021]) -> [SKIP][121] ([Intel XE#4596])
   [120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-bmg-5/igt@kms_plane_multiple@2x-tiling-y.html
   [121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-bmg-6/igt@kms_plane_multiple@2x-tiling-y.html

  * igt@kms_pm_dc@dc9-dpms:
    - shard-adlp:         [FAIL][122] ([Intel XE#3325]) -> [SKIP][123] ([Intel XE#734])
   [122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-adlp-8/igt@kms_pm_dc@dc9-dpms.html
   [123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-adlp-6/igt@kms_pm_dc@dc9-dpms.html

  * igt@xe_peer2peer@write:
    - shard-dg2-set2:     [FAIL][124] ([Intel XE#1173]) -> [SKIP][125] ([Intel XE#1061])
   [124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947/shard-dg2-463/igt@xe_peer2peer@write.html
   [125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-154739v3/shard-dg2-432/igt@xe_peer2peer@write.html

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

  [Intel XE#1061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1061
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [Intel XE#1173]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1173
  [Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
  [Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
  [Intel XE#1406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1406
  [Intel XE#1435]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1435
  [Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
  [Intel XE#1727]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1727
  [Intel XE#1874]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1874
  [Intel XE#2291]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2291
  [Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
  [Intel XE#2312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2312
  [Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
  [Intel XE#2316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2316
  [Intel XE#2360]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2360
  [Intel XE#2705]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2705
  [Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
  [Intel XE#288]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/288
  [Intel XE#2907]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2907
  [Intel XE#2938]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2938
  [Intel XE#2953]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2953
  [Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
  [Intel XE#306]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/306
  [Intel XE#3098]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3098
  [Intel XE#3113]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3113
  [Intel XE#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
  [Intel XE#3325]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3325
  [Intel XE#3374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3374
  [Intel XE#3544]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3544
  [Intel XE#3573]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3573
  [Intel XE#3876]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3876
  [Intel XE#3908]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3908
  [Intel XE#4173]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4173
  [Intel XE#4212]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4212
  [Intel XE#4345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4345
  [Intel XE#4488]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4488
  [Intel XE#4504]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4504
  [Intel XE#4522]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4522
  [Intel XE#4543]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4543
  [Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
  [Intel XE#4596]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4596
  [Intel XE#4733]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4733
  [Intel XE#4814]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4814
  [Intel XE#4915]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4915
  [Intel XE#5021]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5021
  [Intel XE#5208]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5208
  [Intel XE#5390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5390
  [Intel XE#5893]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5893
  [Intel XE#6014]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6014
  [Intel XE#616]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/616
  [Intel XE#6192]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6192
  [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#734]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/734
  [Intel XE#787]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/787
  [Intel XE#929]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/929


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

  * Linux: xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947 -> xe-pw-154739v3

  IGT_8564: fd0f7b3639b26971567b7a9d64ba5174d5d3db5a @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-3850-23f8be57505c80e5b57dec249df8a3cc053eb947: 23f8be57505c80e5b57dec249df8a3cc053eb947
  xe-pw-154739v3: 154739v3

== Logs ==

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

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

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

* RE: [PATCH v3 09/23] drm/xe: Skip L2 / TDF cache flushes if primary GT is disabled
  2025-09-30 22:56 ` [PATCH v3 09/23] drm/xe: Skip L2 / TDF cache flushes if primary GT is disabled Matt Roper
@ 2025-10-01  6:39   ` Upadhyay, Tejas
  0 siblings, 0 replies; 49+ messages in thread
From: Upadhyay, Tejas @ 2025-10-01  6:39 UTC (permalink / raw)
  To: Roper, Matthew D, intel-xe@lists.freedesktop.org; +Cc: Roper, Matthew D



> -----Original Message-----
> From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Matt
> Roper
> Sent: 01 October 2025 04:26
> To: intel-xe@lists.freedesktop.org
> Cc: Roper, Matthew D <matthew.d.roper@intel.com>
> Subject: [PATCH v3 09/23] drm/xe: Skip L2 / TDF cache flushes if primary GT is
> disabled
> 
> If the primary GT is disabled via configfs, GT-side L2 and TD cache flushes are
> unnecessary since nothing is using/filling these caches.
> 
> Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_device.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> index 386940323630..d42d03b8ab3a 100644
> --- a/drivers/gpu/drm/xe/xe_device.c
> +++ b/drivers/gpu/drm/xe/xe_device.c
> @@ -1062,6 +1062,8 @@ void xe_device_l2_flush(struct xe_device *xe)
>  	unsigned int fw_ref;
> 
>  	gt = xe_root_mmio_gt(xe);
> +	if (!gt)
> +		return;
> 
>  	if (!XE_GT_WA(gt, 16023588340))
>  		return;
> @@ -1107,6 +1109,9 @@ void xe_device_td_flush(struct xe_device *xe)
>  		return;
> 
>  	root_gt = xe_root_mmio_gt(xe);
> +	if (!root_gt)
> +		return;
> +

LGTM,
Reviewed-by: Tejas Upadhyay <tejas.upadhyay@intel.com>

Tejas
>  	if (XE_GT_WA(root_gt, 16023588340)) {
>  		/* A transient flush is not sufficient: flush the L2 */
>  		xe_device_l2_flush(xe);
> --
> 2.51.0


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

* RE: [PATCH v3 10/23] drm/xe/query: Report hwconfig size as 0 if primary GT is disabled
  2025-09-30 22:56 ` [PATCH v3 10/23] drm/xe/query: Report hwconfig size as 0 " Matt Roper
@ 2025-10-01  6:42   ` Upadhyay, Tejas
  0 siblings, 0 replies; 49+ messages in thread
From: Upadhyay, Tejas @ 2025-10-01  6:42 UTC (permalink / raw)
  To: Roper, Matthew D, intel-xe@lists.freedesktop.org; +Cc: Roper, Matthew D



> -----Original Message-----
> From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Matt
> Roper
> Sent: 01 October 2025 04:26
> To: intel-xe@lists.freedesktop.org
> Cc: Roper, Matthew D <matthew.d.roper@intel.com>
> Subject: [PATCH v3 10/23] drm/xe/query: Report hwconfig size as 0 if primary
> GT is disabled
> 
> The hwconfig table is part of the primary GT's GuC firmware.  If the primary GT
> is disabled, the hwconfig is unavailable and should be reported to userspace as
> having size 0.
> 
> Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_query.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_query.c b/drivers/gpu/drm/xe/xe_query.c
> index 2e9ff33ed2fe..1c0915e2cc16 100644
> --- a/drivers/gpu/drm/xe/xe_query.c
> +++ b/drivers/gpu/drm/xe/xe_query.c
> @@ -436,7 +436,7 @@ static int query_hwconfig(struct xe_device *xe,
>  			  struct drm_xe_device_query *query)  {
>  	struct xe_gt *gt = xe_root_mmio_gt(xe);
> -	size_t size = xe_guc_hwconfig_size(&gt->uc.guc);
> +	size_t size = gt ? xe_guc_hwconfig_size(&gt->uc.guc) : 0;

LGTM,
Reviewed-by: Tejas Upadhyay <tejas.upadhyay@intel.com>

Tejas
>  	void __user *query_ptr = u64_to_user_ptr(query->data);
>  	void *hwconfig;
> 
> --
> 2.51.0


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

* Re: [PATCH v3 03/23] drm/xe: Move 'va_bits' flag back to platform descriptor
  2025-09-30 22:56 ` [PATCH v3 03/23] drm/xe: Move 'va_bits' flag back to platform descriptor Matt Roper
@ 2025-10-01  9:44   ` Michal Wajdeczko
  0 siblings, 0 replies; 49+ messages in thread
From: Michal Wajdeczko @ 2025-10-01  9:44 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: Lucas De Marchi



On 10/1/2025 12:56 AM, Matt Roper wrote:
> The number of virtual address bits is something that should be tracked
> at the platform level rather than the IP level.  Even when mixing and
> matching various graphics, media, and display IP blocks, the platform as
> a whole has to have consistent page table handling.  This is also a
> trait that should be tied to the platform even if the graphics IP itself
> is not present (e.g., if we disable the primary GT via configfs).
> 
> v2:
>  - Drop the default value of 48 and explicitly set it in each relevant
>    descriptor.  (Lucas, Michal)
> 
> Cc: Lucas De Marchi <lucas.demarchi@intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_pci.c       | 21 +++++++++++++++------
>  drivers/gpu/drm/xe/xe_pci_types.h |  2 +-
>  2 files changed, 16 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
> index 3f42b91efa28..69ed987fef67 100644
> --- a/drivers/gpu/drm/xe/xe_pci.c
> +++ b/drivers/gpu/drm/xe/xe_pci.c
> @@ -52,13 +52,11 @@ __diag_ignore_all("-Woverride-init", "Allow field overrides in table");
>  static const struct xe_graphics_desc graphics_xelp = {
>  	.hw_engine_mask = BIT(XE_HW_ENGINE_RCS0) | BIT(XE_HW_ENGINE_BCS0),
>  
> -	.va_bits = 48,
>  	.vm_max_level = 3,
>  };
>  
>  #define XE_HP_FEATURES \
>  	.has_range_tlb_inval = true, \
> -	.va_bits = 48, \
>  	.vm_max_level = 3
>  
>  static const struct xe_graphics_desc graphics_xehpg = {
> @@ -84,7 +82,6 @@ static const struct xe_graphics_desc graphics_xehpc = {
>  		BIT(XE_HW_ENGINE_CCS2) | BIT(XE_HW_ENGINE_CCS3),
>  
>  	XE_HP_FEATURES,
> -	.va_bits = 57,
>  	.vm_max_level = 4,
>  	.vram_flags = XE_VRAM_FLAGS_NEED64K,
>  
> @@ -108,7 +105,6 @@ static const struct xe_graphics_desc graphics_xelpg = {
>  	.has_range_tlb_inval = 1, \
>  	.has_usm = 1, \
>  	.has_64bit_timestamp = 1, \
> -	.va_bits = 48, \
>  	.vm_max_level = 4, \
>  	.hw_engine_mask = \
>  		BIT(XE_HW_ENGINE_RCS0) | \
> @@ -174,6 +170,7 @@ static const struct xe_device_desc tgl_desc = {
>  	.has_sriov = true,
>  	.max_gt_per_tile = 1,
>  	.require_force_probe = true,
> +	.va_bits = 48,
>  };
>  
>  static const struct xe_device_desc rkl_desc = {
> @@ -185,6 +182,7 @@ static const struct xe_device_desc rkl_desc = {
>  	.has_llc = true,
>  	.max_gt_per_tile = 1,
>  	.require_force_probe = true,
> +	.va_bits = 48,
>  };
>  
>  static const u16 adls_rpls_ids[] = { INTEL_RPLS_IDS(NOP), 0 };
> @@ -203,6 +201,7 @@ static const struct xe_device_desc adl_s_desc = {
>  		{ XE_SUBPLATFORM_ALDERLAKE_S_RPLS, "RPLS", adls_rpls_ids },
>  		{},
>  	},
> +	.va_bits = 48,
>  };
>  
>  static const u16 adlp_rplu_ids[] = { INTEL_RPLU_IDS(NOP), 0 };
> @@ -221,6 +220,7 @@ static const struct xe_device_desc adl_p_desc = {
>  		{ XE_SUBPLATFORM_ALDERLAKE_P_RPLU, "RPLU", adlp_rplu_ids },
>  		{},
>  	},
> +	.va_bits = 48,
>  };
>  
>  static const struct xe_device_desc adl_n_desc = {
> @@ -233,6 +233,7 @@ static const struct xe_device_desc adl_n_desc = {
>  	.has_sriov = true,
>  	.max_gt_per_tile = 1,
>  	.require_force_probe = true,
> +	.va_bits = 48,
>  };
>  
>  #define DGFX_FEATURES \
> @@ -249,6 +250,7 @@ static const struct xe_device_desc dg1_desc = {
>  	.has_heci_gscfi = 1,
>  	.max_gt_per_tile = 1,
>  	.require_force_probe = true,
> +	.va_bits = 48,
>  };
>  
>  static const u16 dg2_g10_ids[] = { INTEL_DG2_G10_IDS(NOP), INTEL_ATS_M150_IDS(NOP), 0 };
> @@ -265,7 +267,8 @@ static const u16 dg2_g12_ids[] = { INTEL_DG2_G12_IDS(NOP), 0 };
>  		{ XE_SUBPLATFORM_DG2_G11, "G11", dg2_g11_ids }, \
>  		{ XE_SUBPLATFORM_DG2_G12, "G12", dg2_g12_ids }, \
>  		{ } \
> -	}
> +	}, \
> +	.va_bits = 48
>  
>  static const struct xe_device_desc ats_m_desc = {
>  	.pre_gmdid_graphics_ip = &graphics_ip_xehpg,
> @@ -303,6 +306,7 @@ static const __maybe_unused struct xe_device_desc pvc_desc = {
>  	.max_gt_per_tile = 1,
>  	.max_remote_tiles = 1,
>  	.require_force_probe = true,
> +	.va_bits = 57,
>  	.has_mbx_power_limits = false,
>  };
>  
> @@ -314,6 +318,7 @@ static const struct xe_device_desc mtl_desc = {
>  	.has_display = true,
>  	.has_pxp = true,
>  	.max_gt_per_tile = 2,
> +	.va_bits = 48,
>  };
>  
>  static const struct xe_device_desc lnl_desc = {
> @@ -323,6 +328,7 @@ static const struct xe_device_desc lnl_desc = {
>  	.has_pxp = true,
>  	.max_gt_per_tile = 2,
>  	.needs_scratch = true,
> +	.va_bits = 48,
>  };
>  
>  static const struct xe_device_desc bmg_desc = {
> @@ -338,6 +344,7 @@ static const struct xe_device_desc bmg_desc = {
>  	.has_sriov = true,
>  	.max_gt_per_tile = 2,
>  	.needs_scratch = true,
> +	.va_bits = 48,
>  };
>  
>  static const struct xe_device_desc ptl_desc = {
> @@ -347,6 +354,7 @@ static const struct xe_device_desc ptl_desc = {
>  	.has_sriov = true,
>  	.max_gt_per_tile = 2,
>  	.needs_scratch = true,
> +	.va_bits = 48,
>  };
>  
>  #undef PLATFORM
> @@ -584,6 +592,8 @@ static int xe_info_init_early(struct xe_device *xe,
>  		subplatform_desc->subplatform : XE_SUBPLATFORM_NONE;
>  
>  	xe->info.dma_mask_size = desc->dma_mask_size;
> +	xe->info.va_bits = desc->va_bits;
> +
>  	xe->info.is_dgfx = desc->is_dgfx;
>  	xe->info.has_fan_control = desc->has_fan_control;
>  	xe->info.has_mbx_power_limits = desc->has_mbx_power_limits;
> @@ -713,7 +723,6 @@ static int xe_info_init(struct xe_device *xe,
>  	}
>  
>  	xe->info.vram_flags = graphics_desc->vram_flags;
> -	xe->info.va_bits = graphics_desc->va_bits;
>  	xe->info.vm_max_level = graphics_desc->vm_max_level;
>  	xe->info.has_asid = graphics_desc->has_asid;
>  	xe->info.has_atomic_enable_pte_bit = graphics_desc->has_atomic_enable_pte_bit;
> diff --git a/drivers/gpu/drm/xe/xe_pci_types.h b/drivers/gpu/drm/xe/xe_pci_types.h
> index 9b9766a3baa3..095133a1aa44 100644
> --- a/drivers/gpu/drm/xe/xe_pci_types.h
> +++ b/drivers/gpu/drm/xe/xe_pci_types.h
> @@ -30,6 +30,7 @@ struct xe_device_desc {
>  	u8 dma_mask_size;
>  	u8 max_remote_tiles:2;
>  	u8 max_gt_per_tile:2;
> +	u8 va_bits;		/* default is 48 bits if not specified */

this comment is n/a anymore in this ver3

btw, maybe we want to add kunit test to make sure all descriptors
have va_bits defined ? or other mandatory fields ?

otherwise LGTM

>  
>  	u8 require_force_probe:1;
>  	u8 is_dgfx:1;
> @@ -51,7 +52,6 @@ struct xe_device_desc {
>  };
>  
>  struct xe_graphics_desc {
> -	u8 va_bits;
>  	u8 vm_max_level;
>  	u8 vram_flags;
>  


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

* Re: [PATCH v3 07/23] drm/xe: Read VF GMD_ID with a specifically-allocated dummy GT
  2025-09-30 22:56 ` [PATCH v3 07/23] drm/xe: Read VF GMD_ID with a specifically-allocated dummy GT Matt Roper
@ 2025-10-01 10:07   ` Michal Wajdeczko
  2025-10-02 12:43     ` Gustavo Sousa
  0 siblings, 1 reply; 49+ messages in thread
From: Michal Wajdeczko @ 2025-10-01 10:07 UTC (permalink / raw)
  To: Matt Roper, intel-xe



On 10/1/2025 12:56 AM, Matt Roper wrote:
> SRIOV VF initialization has a bit of a chicken and egg design problem.
> Determining the IP version of the graphics and media IPs can't be done
> via direct register reads as it is on PF or native and instead requires
> querying the GuC.  However initialization of the GT, including its GuC,
> needs to wait until after we know the IP versions so that the proper
> initialization steps for the platform/IP are followed.
> 
> Currently the (somewhat hacky) solution is to manually fill out just
> enough fields in tile 0's primary GT structure to make it look as if the
> GT has been initialized so that the GuC can be partially initialized and
> queried to obtain the GMD_ID values.  When the GT gets properly
> initialized during the regular flows, the hacked-up values will get
> overwritten as part of the general initialization flows.
> 
> Rather than using tile 0's primary GT structure to hold the hacked up
> values for querying every GT on every tile, instead allocate a dedicated
> dummy structure.  This will allow us to move the tile->primary_gt's
> allocation to a more consistent place later in the initialization flow
> in future patches (i.e., we shouldn't even allocate this GT structure if
> the GT is disabled/unavailable).  It also helps ensure there can't be
> any accidental leakage of initialization or state between the dummy
> initialization for GMD_ID and the real driver initialization of the GT.
> 
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
> ---
>  drivers/gpu/drm/xe/tests/xe_pci.c |  6 ++-
>  drivers/gpu/drm/xe/xe_pci.c       | 61 +++++++++++++++++--------------
>  2 files changed, 38 insertions(+), 29 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/tests/xe_pci.c b/drivers/gpu/drm/xe/tests/xe_pci.c
> index 0f136bc85b76..969f1dacade8 100644
> --- a/drivers/gpu/drm/xe/tests/xe_pci.c
> +++ b/drivers/gpu/drm/xe/tests/xe_pci.c
> @@ -307,8 +307,8 @@ const void *xe_pci_id_gen_param(const void *prev, char *desc)
>  }
>  EXPORT_SYMBOL_IF_KUNIT(xe_pci_id_gen_param);
>  
> -static void fake_read_gmdid(struct xe_device *xe, enum xe_gmdid_type type,
> -			    u32 *ver, u32 *revid)
> +static int fake_read_gmdid(struct xe_device *xe, enum xe_gmdid_type type,
> +			   u32 *ver, u32 *revid)
>  {
>  	struct kunit *test = kunit_get_current_test();
>  	struct xe_pci_fake_data *data = test->priv;
> @@ -320,6 +320,8 @@ static void fake_read_gmdid(struct xe_device *xe, enum xe_gmdid_type type,
>  		*ver = data->graphics_verx100;
>  		*revid = xe_step_to_gmdid(data->step.graphics);
>  	}
> +
> +	return 0;
>  }
>  
>  static void fake_xe_info_probe_tile_count(struct xe_device *xe)
> diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
> index 37ae49f4b648..9fb5df10844d 100644
> --- a/drivers/gpu/drm/xe/xe_pci.c
> +++ b/drivers/gpu/drm/xe/xe_pci.c
> @@ -464,7 +464,7 @@ enum xe_gmdid_type {
>  	GMDID_MEDIA
>  };
>  
> -static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver, u32 *revid)
> +static int read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver, u32 *revid)
>  {
>  	struct xe_mmio *mmio = xe_root_tile_mmio(xe);
>  	struct xe_reg gmdid_reg = GMD_ID;
> @@ -473,21 +473,19 @@ static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver,
>  	KUNIT_STATIC_STUB_REDIRECT(read_gmdid, xe, type, ver, revid);
>  
>  	if (IS_SRIOV_VF(xe)) {
> -		struct xe_gt *gt = xe_root_mmio_gt(xe);
> -
>  		/*
>  		 * To get the value of the GMDID register, VFs must obtain it
>  		 * from the GuC using MMIO communication.
>  		 *
> -		 * Note that at this point the xe_gt is not fully uninitialized
> -		 * and only basic access to MMIO registers is possible. To use
> -		 * our existing GuC communication functions we must perform at
> -		 * least basic xe_gt and xe_guc initialization.
> -		 *
> -		 * Since to obtain the value of GMDID_MEDIA we need to use the
> -		 * media GuC, temporarily tweak the gt type.
> +		 * Note that at this point the GTs are not initialized and only
> +		 * tile-level access to MMIO registers is possible. To use our
> +		 * existing GuC communication functions we must create a dummy
> +		 * GT structure and perform at least basic xe_gt and xe_guc
> +		 * initialization.
>  		 */
> -		xe_gt_assert(gt, gt->info.type == XE_GT_TYPE_UNINITIALIZED);
> +		struct xe_gt *gt = kzalloc(sizeof(*gt), GFP_KERNEL);

nit: we can use __free(kfree) here ...

> +		if (!gt)
> +			return -ENOMEM;
>  
>  		if (type == GMDID_MEDIA) {
>  			gt->info.id = 1;

it looks that it is still crashing in xe_gt_mmio_init() called from below

<1> [146.543510] BUG: kernel NULL pointer dereference, address: 0000000000000028
<1> [146.543528] #PF: supervisor read access in kernel mode
<1> [146.543538] #PF: error_code(0x0000) - not-present page
<4> [146.543611] RIP: 0010:xe_gt_mmio_init+0x27/0x1b0 [xe]
<4> [146.544175] Call Trace:
<4> [146.544182]  <TASK>
<4> [146.544196]  read_gmdid+0x12b/0x2a0 [xe]
<4> [146.544601]  xe_info_init+0x50e/0xc90 [xe]
<4> [146.544948]  ? drmm_kmalloc+0x87/0x100
<4> [146.544968]  ? xe_device_probe_early+0xdf/0x230 [xe]
<4> [146.545253]  ? pci_write_config_word+0x27/0x50
<4> [146.545274]  xe_pci_probe+0x163/0x600 [xe]

likely due to NULL gt->tile

> @@ -503,12 +501,7 @@ static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver,
>  		/* Don't bother with GMDID if failed to negotiate the GuC ABI */
>  		val = xe_gt_sriov_vf_bootstrap(gt) ? 0 : xe_gt_sriov_vf_gmdid(gt);

... so in case of bootstrap error we can easily return actual error,
instead of returning plain 0.00 version

>  
> -		/*
> -		 * Only undo xe_gt.info here, the remaining changes made above
> -		 * will be overwritten as part of the regular initialization.
> -		 */
> -		gt->info.id = 0;
> -		gt->info.type = XE_GT_TYPE_UNINITIALIZED;
> +		kfree(gt);
>  	} else {
>  		/*
>  		 * GMD_ID is a GT register, but at this point in the driver
> @@ -526,6 +519,8 @@ static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver,
>  
>  	*ver = REG_FIELD_GET(GMD_ID_ARCH_MASK, val) * 100 + REG_FIELD_GET(GMD_ID_RELEASE_MASK, val);
>  	*revid = REG_FIELD_GET(GMD_ID_REVID, val);
> +
> +	return 0;
>  }
>  
>  static const struct xe_ip *find_graphics_ip(unsigned int verx100)
> @@ -552,18 +547,21 @@ static const struct xe_ip *find_media_ip(unsigned int verx100)
>   * Read IP version from hardware and select graphics/media IP descriptors
>   * based on the result.
>   */
> -static void handle_gmdid(struct xe_device *xe,
> -			 const struct xe_ip **graphics_ip,
> -			 const struct xe_ip **media_ip,
> -			 u32 *graphics_revid,
> -			 u32 *media_revid)
> +static int handle_gmdid(struct xe_device *xe,
> +			const struct xe_ip **graphics_ip,
> +			const struct xe_ip **media_ip,
> +			u32 *graphics_revid,
> +			u32 *media_revid)
>  {
>  	u32 ver;
> +	int ret;
>  
>  	*graphics_ip = NULL;
>  	*media_ip = NULL;
>  
> -	read_gmdid(xe, GMDID_GRAPHICS, &ver, graphics_revid);
> +	ret = read_gmdid(xe, GMDID_GRAPHICS, &ver, graphics_revid);
> +	if (ret)
> +		return ret;
>  
>  	*graphics_ip = find_graphics_ip(ver);
>  	if (!*graphics_ip) {
> @@ -571,16 +569,21 @@ static void handle_gmdid(struct xe_device *xe,
>  			ver / 100, ver % 100);
>  	}
>  
> -	read_gmdid(xe, GMDID_MEDIA, &ver, media_revid);
> +	ret = read_gmdid(xe, GMDID_MEDIA, &ver, media_revid);
> +	if (ret)
> +		return ret;
> +
>  	/* Media may legitimately be fused off / not present */
>  	if (ver == 0)
> -		return;
> +		return 0;
>  
>  	*media_ip = find_media_ip(ver);
>  	if (!*media_ip) {
>  		drm_err(&xe->drm, "Hardware reports unknown media version %u.%02u\n",
>  			ver / 100, ver % 100);
>  	}
> +
> +	return 0;
>  }
>  
>  /*
> @@ -690,6 +693,7 @@ static int xe_info_init(struct xe_device *xe,
>  	const struct xe_media_desc *media_desc;
>  	struct xe_tile *tile;
>  	struct xe_gt *gt;
> +	int ret;
>  	u8 id;
>  
>  	/*
> @@ -705,8 +709,11 @@ static int xe_info_init(struct xe_device *xe,
>  		xe->info.step = xe_step_pre_gmdid_get(xe);
>  	} else {
>  		xe_assert(xe, !desc->pre_gmdid_media_ip);
> -		handle_gmdid(xe, &graphics_ip, &media_ip,
> -			     &graphics_gmdid_revid, &media_gmdid_revid);
> +		ret = handle_gmdid(xe, &graphics_ip, &media_ip,
> +				   &graphics_gmdid_revid, &media_gmdid_revid);
> +		if (ret)
> +			return ret;
> +
>  		xe->info.step = xe_step_gmdid_get(xe,
>  						  graphics_gmdid_revid,
>  						  media_gmdid_revid);


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

* Re: [PATCH v3 23/23] drm/xe/sriov: Disable SR-IOV if primary GT is disabled via configfs
  2025-09-30 22:56 ` [PATCH v3 23/23] drm/xe/sriov: Disable SR-IOV if primary GT is disabled via configfs Matt Roper
@ 2025-10-01 11:51   ` Michal Wajdeczko
  0 siblings, 0 replies; 49+ messages in thread
From: Michal Wajdeczko @ 2025-10-01 11:51 UTC (permalink / raw)
  To: Matt Roper, intel-xe



On 10/1/2025 12:56 AM, Matt Roper wrote:
> SR-IOV operation relies on the primary GT's GuC to operate (in both PF
> and VF mode).  If the primary GT is disabled in VF mode, fail the probe.
> If the primary GT is disabled in PF mode, force the device back to
> native (non-sriov) mode.

can we split this into PF and VF specific patch?
> 
> v2:
>  - Move handling to xe_info_init().  (Michal)

oops, I meant _early variant, see below

> 
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_pci.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
> index 4a792e1037d5..44f99c1a39e0 100644
> --- a/drivers/gpu/drm/xe/xe_pci.c
> +++ b/drivers/gpu/drm/xe/xe_pci.c
> @@ -763,6 +763,18 @@ static int xe_info_init(struct xe_device *xe,
>  	int ret;
>  	u8 id;
>  
> +	/* SR-IOV (both PF and VF) relies on the primary GT's GuC */
> +	if ((gt_types_allowed & BIT_ULL(XE_GT_TYPE_MAIN)) == 0) {
> +		if (IS_SRIOV_PF(xe)) {
> +			drm_info(&xe->drm, "Disabling SR-IOV because primary GT is disabled.\n");
> +			pci_sriov_set_totalvfs(pdev, 0);
> +			xe->sriov.__mode = XE_SRIOV_MODE_NONE;

I was thinking about clearing .has_sriov flag somewhere in the
xe_info_init_early() like:

+ 	xe->info.allowed_gt_types = xe_configfs_allowed_gt_types();
+ 	xe->info.has_primary_gt = xe_configfs_primary_gt_supported();
- 	xe->info.has_sriov = desc->has_sriov;
+ 	xe->info.has_sriov = xe->info.has_primary_gt ? desc->has_sriov : 0;

then during SRIOV probe PF will always return as native


alternatively, we can add new condition in xe_sriov_pf_readiness():

+ 	if (!xe_configfs_primary_gt_supported())
+ 		return pf_continue_as_native(xe, "No primary GT");


> +		} else if (IS_SRIOV_VF(xe)) {
> +			drm_err(&xe->drm, "Cannot probe device in SR-IOV VF without primary GT enabled.\n");
> +			return -ENODEV;

and for the VF case, maybe it is sufficient to properly abort
from the read_gmdid(), which now returns an error ?

nit: we can now use: xe_err(xe, "Cannot probe ...");

> +		}
> +	}
> +
>  	/*
>  	 * If this platform supports GMD_ID, we'll detect the proper IP
>  	 * descriptor to use from hardware registers.


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

* Re: [PATCH v3 11/23] drm/xe/pmu: Initialize PMU event types based on first available GT
  2025-09-30 22:56 ` [PATCH v3 11/23] drm/xe/pmu: Initialize PMU event types based on first available GT Matt Roper
@ 2025-10-01 20:59   ` Lucas De Marchi
  0 siblings, 0 replies; 49+ messages in thread
From: Lucas De Marchi @ 2025-10-01 20:59 UTC (permalink / raw)
  To: Matt Roper; +Cc: intel-xe

On Tue, Sep 30, 2025 at 03:56:28PM -0700, Matt Roper wrote:
>GT ID#0 (primary GT on tile 0) may not always be available if the
>primary GT has been disabled via configfs.  Instead use the first
>available GT when determining which PMU events are supported.  If there
>are no GTs, then don't advertise any GT-related events.
>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>


Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>

thanks
Lucas De Marchi

>---
> drivers/gpu/drm/xe/xe_pmu.c | 11 ++++++++++-
> 1 file changed, 10 insertions(+), 1 deletion(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_pmu.c b/drivers/gpu/drm/xe/xe_pmu.c
>index cab51d826345..c63335eb69e5 100644
>--- a/drivers/gpu/drm/xe/xe_pmu.c
>+++ b/drivers/gpu/drm/xe/xe_pmu.c
>@@ -497,7 +497,12 @@ static const struct attribute_group *pmu_events_attr_update[] = {
> static void set_supported_events(struct xe_pmu *pmu)
> {
> 	struct xe_device *xe = container_of(pmu, typeof(*xe), pmu);
>-	struct xe_gt *gt = xe_device_get_gt(xe, 0);
>+	struct xe_gt *gt;
>+	int id;
>+
>+	/* If there are no GTs, don't support any GT-related events */
>+	if (xe->info.gt_count == 0)
>+		return;
>
> 	if (!xe->info.skip_guc_pc) {
> 		pmu->supported_events |= BIT_ULL(XE_PMU_EVENT_GT_C6_RESIDENCY);
>@@ -505,6 +510,10 @@ static void set_supported_events(struct xe_pmu *pmu)
> 		pmu->supported_events |= BIT_ULL(XE_PMU_EVENT_GT_REQUESTED_FREQUENCY);
> 	}
>
>+	/* Find the first available GT to query engine event capabilities */
>+	for_each_gt(gt, xe, id)
>+		break;
>+
> 	if (xe_guc_engine_activity_supported(&gt->uc.guc)) {
> 		pmu->supported_events |= BIT_ULL(XE_PMU_EVENT_ENGINE_ACTIVE_TICKS);
> 		pmu->supported_events |= BIT_ULL(XE_PMU_EVENT_ENGINE_TOTAL_TICKS);
>-- 
>2.51.0
>

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

* Re: [PATCH v3 12/23] drm/xe: Check for primary GT before looking up Wa_22019338487
  2025-09-30 22:56 ` [PATCH v3 12/23] drm/xe: Check for primary GT before looking up Wa_22019338487 Matt Roper
@ 2025-10-01 21:10   ` Lucas De Marchi
  2025-10-02 13:46   ` Gustavo Sousa
  1 sibling, 0 replies; 49+ messages in thread
From: Lucas De Marchi @ 2025-10-01 21:10 UTC (permalink / raw)
  To: Matt Roper; +Cc: intel-xe

On Tue, Sep 30, 2025 at 03:56:29PM -0700, Matt Roper wrote:
>If the primary GT is disabled via configfs, we need to make sure that we
>don't search for this workaround on a NULL xe_gt pointer.  Since we can
>only disable the primary GT on igpu platforms, the media GT is the one
>we'd want to check anyway for this workaround.
>
>The ternary operators in ggtt_update_access_counter() were getting a bit
>long/complicated, so rewrite them with regular if/else statements.
>While we're at it, throw in a couple extra assertions to make sure that
>we're truly picking the expected GT according to igpu/dgpu type.
>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
>---
> drivers/gpu/drm/xe/xe_ggtt.c | 26 ++++++++++++++++++++------
> 1 file changed, 20 insertions(+), 6 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
>index 7fdd0a97a628..0ed9ffc3278d 100644
>--- a/drivers/gpu/drm/xe/xe_ggtt.c
>+++ b/drivers/gpu/drm/xe/xe_ggtt.c
>@@ -107,10 +107,23 @@ static unsigned int probe_gsm_size(struct pci_dev *pdev)
> static void ggtt_update_access_counter(struct xe_ggtt *ggtt)
> {
> 	struct xe_tile *tile = ggtt->tile;
>-	struct xe_gt *affected_gt = XE_GT_WA(tile->primary_gt, 22019338487) ?
>-		tile->primary_gt : tile->media_gt;
>-	struct xe_mmio *mmio = &affected_gt->mmio;
>-	u32 max_gtt_writes = XE_GT_WA(ggtt->tile->primary_gt, 22019338487) ? 1100 : 63;
>+	struct xe_gt *affected_gt;
>+	u32 max_gtt_writes;
>+
>+	if (tile->primary_gt && XE_GT_WA(tile->primary_gt, 22019338487)) {
>+		affected_gt = tile->primary_gt;
>+		max_gtt_writes = 1100;
>+
>+		/* Only expected to apply to primary GT on dgpu platforms */
>+		xe_tile_assert(tile, IS_DGFX(tile_to_xe(tile)));
>+	} else {
>+		affected_gt = tile->media_gt;
>+		max_gtt_writes = 63;
>+
>+		/* Only expected to apply to media GT on igpu platforms */
>+		xe_tile_assert(tile, !IS_DGFX(tile_to_xe(tile)));
>+	}
>+
> 	/*
> 	 * Wa_22019338487: GMD_ID is a RO register, a dummy write forces gunit
> 	 * to wait for completion of prior GTT writes before letting this through.
>@@ -119,7 +132,7 @@ static void ggtt_update_access_counter(struct xe_ggtt *ggtt)
> 	lockdep_assert_held(&ggtt->lock);
>
> 	if ((++ggtt->access_count % max_gtt_writes) == 0) {
>-		xe_mmio_write32(mmio, GMD_ID, 0x0);
>+		xe_mmio_write32(&affected_gt->mmio, GMD_ID, 0x0);
> 		ggtt->access_count = 0;
> 	}
> }
>@@ -286,7 +299,8 @@ int xe_ggtt_init_early(struct xe_ggtt *ggtt)
> 	if (GRAPHICS_VERx100(xe) >= 1270)
> 		ggtt->pt_ops = (ggtt->tile->media_gt &&
> 			       XE_GT_WA(ggtt->tile->media_gt, 22019338487)) ||

while at it, maybe fix this indentation? The line break is actually not
buying us anything and I'd rather read the long line.

anyway,


Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>

Lucas De Marchi

>-			       XE_GT_WA(ggtt->tile->primary_gt, 22019338487) ?
>+			       (ggtt->tile->primary_gt &&
>+				XE_GT_WA(ggtt->tile->primary_gt, 22019338487)) ?
> 			       &xelpg_pt_wa_ops : &xelpg_pt_ops;
> 	else
> 		ggtt->pt_ops = &xelp_pt_ops;
>-- 
>2.51.0
>

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

* Re: [PATCH v3 04/23] drm/xe: Move 'vm_max_level' flag back to platform descriptor
  2025-09-30 22:56 ` [PATCH v3 04/23] drm/xe: Move 'vm_max_level' " Matt Roper
@ 2025-10-01 21:51   ` Gustavo Sousa
  0 siblings, 0 replies; 49+ messages in thread
From: Gustavo Sousa @ 2025-10-01 21:51 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper, Lucas De Marchi

Quoting Matt Roper (2025-09-30 19:56:21-03:00)
>The number of page table levels for PPGTT virtual addresses is something
>that should be tracked at the platform level rather than the IP level.
>Even when mixing and matching various graphics, media, and display IP
>blocks, the platform as a whole has to have consistent page table
>handling.  This is also a trait that should be tied to the platform even
>if the graphics IP itself is not present (e.g., if we disable the
>primary GT via configfs).
>
>Since all platforms officially supported by the Xe driver use the same
>value (4 levels) and only some old Xe1 platforms have a different value,
>let's make this the default if a platform descriptor doesn't specify the
>value.  If more platforms show up in the future with different numbers
>of page table levels, we can go back to requiring this to be explicitly
>specified for every platform at that time.

I guess this paragraph does not apply anymore, right?

>
>v2:
> - Drop default value of 4 and explicitly set the value in each platform
>   desciptor.  (Lucas)
>
>Cc: Lucas De Marchi <lucas.demarchi@intel.com>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
>---
> drivers/gpu/drm/xe/xe_pci.c       | 22 ++++++++++++++--------
> drivers/gpu/drm/xe/xe_pci_types.h |  2 +-
> 2 files changed, 15 insertions(+), 9 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
>index 69ed987fef67..8688f40f55d8 100644
>--- a/drivers/gpu/drm/xe/xe_pci.c
>+++ b/drivers/gpu/drm/xe/xe_pci.c
>@@ -51,13 +51,10 @@ __diag_ignore_all("-Woverride-init", "Allow field overrides in table");
> 
> static const struct xe_graphics_desc graphics_xelp = {
>         .hw_engine_mask = BIT(XE_HW_ENGINE_RCS0) | BIT(XE_HW_ENGINE_BCS0),
>-
>-        .vm_max_level = 3,
> };
> 
> #define XE_HP_FEATURES \
>-        .has_range_tlb_inval = true, \
>-        .vm_max_level = 3
>+        .has_range_tlb_inval = true
> 
> static const struct xe_graphics_desc graphics_xehpg = {
>         .hw_engine_mask =
>@@ -82,7 +79,6 @@ static const struct xe_graphics_desc graphics_xehpc = {
>                 BIT(XE_HW_ENGINE_CCS2) | BIT(XE_HW_ENGINE_CCS3),
> 
>         XE_HP_FEATURES,
>-        .vm_max_level = 4,
>         .vram_flags = XE_VRAM_FLAGS_NEED64K,
> 
>         .has_asid = 1,
>@@ -105,7 +101,6 @@ static const struct xe_graphics_desc graphics_xelpg = {
>         .has_range_tlb_inval = 1, \
>         .has_usm = 1, \
>         .has_64bit_timestamp = 1, \
>-        .vm_max_level = 4, \
>         .hw_engine_mask = \
>                 BIT(XE_HW_ENGINE_RCS0) | \
>                 BIT(XE_HW_ENGINE_BCS8) | BIT(XE_HW_ENGINE_BCS0) | \
>@@ -183,6 +178,7 @@ static const struct xe_device_desc rkl_desc = {
>         .max_gt_per_tile = 1,
>         .require_force_probe = true,
>         .va_bits = 48,
>+        .vm_max_level = 3,
> };
> 
> static const u16 adls_rpls_ids[] = { INTEL_RPLS_IDS(NOP), 0 };
>@@ -202,6 +198,7 @@ static const struct xe_device_desc adl_s_desc = {
>                 {},
>         },
>         .va_bits = 48,
>+        .vm_max_level = 3,
> };
> 
> static const u16 adlp_rplu_ids[] = { INTEL_RPLU_IDS(NOP), 0 };
>@@ -221,6 +218,7 @@ static const struct xe_device_desc adl_p_desc = {
>                 {},
>         },
>         .va_bits = 48,
>+        .vm_max_level = 3,
> };
> 
> static const struct xe_device_desc adl_n_desc = {
>@@ -234,6 +232,7 @@ static const struct xe_device_desc adl_n_desc = {
>         .max_gt_per_tile = 1,
>         .require_force_probe = true,
>         .va_bits = 48,
>+        .vm_max_level = 3,
> };
> 
> #define DGFX_FEATURES \
>@@ -251,6 +250,7 @@ static const struct xe_device_desc dg1_desc = {
>         .max_gt_per_tile = 1,
>         .require_force_probe = true,
>         .va_bits = 48,
>+        .vm_max_level = 3,
> };
> 
> static const u16 dg2_g10_ids[] = { INTEL_DG2_G10_IDS(NOP), INTEL_ATS_M150_IDS(NOP), 0 };
>@@ -268,7 +268,8 @@ static const u16 dg2_g12_ids[] = { INTEL_DG2_G12_IDS(NOP), 0 };
>                 { XE_SUBPLATFORM_DG2_G12, "G12", dg2_g12_ids }, \
>                 { } \
>         }, \
>-        .va_bits = 48
>+        .va_bits = 48, \
>+        .vm_max_level = 3
> 
> static const struct xe_device_desc ats_m_desc = {
>         .pre_gmdid_graphics_ip = &graphics_ip_xehpg,
>@@ -307,6 +308,7 @@ static const __maybe_unused struct xe_device_desc pvc_desc = {
>         .max_remote_tiles = 1,
>         .require_force_probe = true,
>         .va_bits = 57,
>+        .vm_max_level = 4,
>         .has_mbx_power_limits = false,
> };
> 
>@@ -319,6 +321,7 @@ static const struct xe_device_desc mtl_desc = {
>         .has_pxp = true,
>         .max_gt_per_tile = 2,
>         .va_bits = 48,
>+        .vm_max_level = 4,
> };
> 
> static const struct xe_device_desc lnl_desc = {
>@@ -329,6 +332,7 @@ static const struct xe_device_desc lnl_desc = {
>         .max_gt_per_tile = 2,
>         .needs_scratch = true,
>         .va_bits = 48,
>+        .vm_max_level = 4,
> };
> 
> static const struct xe_device_desc bmg_desc = {
>@@ -345,6 +349,7 @@ static const struct xe_device_desc bmg_desc = {
>         .max_gt_per_tile = 2,
>         .needs_scratch = true,
>         .va_bits = 48,
>+        .vm_max_level = 4,
> };
> 
> static const struct xe_device_desc ptl_desc = {
>@@ -355,6 +360,7 @@ static const struct xe_device_desc ptl_desc = {
>         .max_gt_per_tile = 2,
>         .needs_scratch = true,
>         .va_bits = 48,
>+        .vm_max_level = 4,
> };
> 
> #undef PLATFORM
>@@ -593,6 +599,7 @@ static int xe_info_init_early(struct xe_device *xe,
> 
>         xe->info.dma_mask_size = desc->dma_mask_size;
>         xe->info.va_bits = desc->va_bits;
>+        xe->info.vm_max_level = desc->vm_max_level;
> 
>         xe->info.is_dgfx = desc->is_dgfx;
>         xe->info.has_fan_control = desc->has_fan_control;
>@@ -723,7 +730,6 @@ static int xe_info_init(struct xe_device *xe,
>         }
> 
>         xe->info.vram_flags = graphics_desc->vram_flags;
>-        xe->info.vm_max_level = graphics_desc->vm_max_level;
>         xe->info.has_asid = graphics_desc->has_asid;
>         xe->info.has_atomic_enable_pte_bit = graphics_desc->has_atomic_enable_pte_bit;
>         if (xe->info.platform != XE_PVC)
>diff --git a/drivers/gpu/drm/xe/xe_pci_types.h b/drivers/gpu/drm/xe/xe_pci_types.h
>index 095133a1aa44..f45b45a7f76a 100644
>--- a/drivers/gpu/drm/xe/xe_pci_types.h
>+++ b/drivers/gpu/drm/xe/xe_pci_types.h
>@@ -31,6 +31,7 @@ struct xe_device_desc {
>         u8 max_remote_tiles:2;
>         u8 max_gt_per_tile:2;
>         u8 va_bits;                /* default is 48 bits if not specified */
>+        u8 vm_max_level;        /* default is 4 if not specified */

Ditto for the comment.

--
Gustavo Sousa

> 
>         u8 require_force_probe:1;
>         u8 is_dgfx:1;
>@@ -52,7 +53,6 @@ struct xe_device_desc {
> };
> 
> struct xe_graphics_desc {
>-        u8 vm_max_level;
>         u8 vram_flags;
> 
>         u64 hw_engine_mask;        /* hardware engines provided by graphics IP */
>-- 
>2.51.0
>

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

* Re: [PATCH v3 07/23] drm/xe: Read VF GMD_ID with a specifically-allocated dummy GT
  2025-10-01 10:07   ` Michal Wajdeczko
@ 2025-10-02 12:43     ` Gustavo Sousa
  2025-10-07 17:07       ` Matt Roper
  0 siblings, 1 reply; 49+ messages in thread
From: Gustavo Sousa @ 2025-10-02 12:43 UTC (permalink / raw)
  To: Matt Roper, Michal Wajdeczko, intel-xe

Quoting Michal Wajdeczko (2025-10-01 07:07:04-03:00)
>
>
>On 10/1/2025 12:56 AM, Matt Roper wrote:
>> SRIOV VF initialization has a bit of a chicken and egg design problem.
>> Determining the IP version of the graphics and media IPs can't be done
>> via direct register reads as it is on PF or native and instead requires
>> querying the GuC.  However initialization of the GT, including its GuC,
>> needs to wait until after we know the IP versions so that the proper
>> initialization steps for the platform/IP are followed.
>> 
>> Currently the (somewhat hacky) solution is to manually fill out just
>> enough fields in tile 0's primary GT structure to make it look as if the
>> GT has been initialized so that the GuC can be partially initialized and
>> queried to obtain the GMD_ID values.  When the GT gets properly
>> initialized during the regular flows, the hacked-up values will get
>> overwritten as part of the general initialization flows.
>> 
>> Rather than using tile 0's primary GT structure to hold the hacked up
>> values for querying every GT on every tile, instead allocate a dedicated
>> dummy structure.  This will allow us to move the tile->primary_gt's
>> allocation to a more consistent place later in the initialization flow
>> in future patches (i.e., we shouldn't even allocate this GT structure if
>> the GT is disabled/unavailable).  It also helps ensure there can't be
>> any accidental leakage of initialization or state between the dummy
>> initialization for GMD_ID and the real driver initialization of the GT.
>> 
>> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
>> Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
>> ---
>>  drivers/gpu/drm/xe/tests/xe_pci.c |  6 ++-
>>  drivers/gpu/drm/xe/xe_pci.c       | 61 +++++++++++++++++--------------
>>  2 files changed, 38 insertions(+), 29 deletions(-)
>> 
>> diff --git a/drivers/gpu/drm/xe/tests/xe_pci.c b/drivers/gpu/drm/xe/tests/xe_pci.c
>> index 0f136bc85b76..969f1dacade8 100644
>> --- a/drivers/gpu/drm/xe/tests/xe_pci.c
>> +++ b/drivers/gpu/drm/xe/tests/xe_pci.c
>> @@ -307,8 +307,8 @@ const void *xe_pci_id_gen_param(const void *prev, char *desc)
>>  }
>>  EXPORT_SYMBOL_IF_KUNIT(xe_pci_id_gen_param);
>>  
>> -static void fake_read_gmdid(struct xe_device *xe, enum xe_gmdid_type type,
>> -                            u32 *ver, u32 *revid)
>> +static int fake_read_gmdid(struct xe_device *xe, enum xe_gmdid_type type,
>> +                           u32 *ver, u32 *revid)
>>  {
>>          struct kunit *test = kunit_get_current_test();
>>          struct xe_pci_fake_data *data = test->priv;
>> @@ -320,6 +320,8 @@ static void fake_read_gmdid(struct xe_device *xe, enum xe_gmdid_type type,
>>                  *ver = data->graphics_verx100;
>>                  *revid = xe_step_to_gmdid(data->step.graphics);
>>          }
>> +
>> +        return 0;
>>  }
>>  
>>  static void fake_xe_info_probe_tile_count(struct xe_device *xe)
>> diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
>> index 37ae49f4b648..9fb5df10844d 100644
>> --- a/drivers/gpu/drm/xe/xe_pci.c
>> +++ b/drivers/gpu/drm/xe/xe_pci.c
>> @@ -464,7 +464,7 @@ enum xe_gmdid_type {
>>          GMDID_MEDIA
>>  };
>>  
>> -static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver, u32 *revid)
>> +static int read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver, u32 *revid)
>>  {
>>          struct xe_mmio *mmio = xe_root_tile_mmio(xe);
>>          struct xe_reg gmdid_reg = GMD_ID;
>> @@ -473,21 +473,19 @@ static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver,
>>          KUNIT_STATIC_STUB_REDIRECT(read_gmdid, xe, type, ver, revid);
>>  
>>          if (IS_SRIOV_VF(xe)) {
>> -                struct xe_gt *gt = xe_root_mmio_gt(xe);
>> -
>>                  /*
>>                   * To get the value of the GMDID register, VFs must obtain it
>>                   * from the GuC using MMIO communication.
>>                   *
>> -                 * Note that at this point the xe_gt is not fully uninitialized
>> -                 * and only basic access to MMIO registers is possible. To use
>> -                 * our existing GuC communication functions we must perform at
>> -                 * least basic xe_gt and xe_guc initialization.
>> -                 *
>> -                 * Since to obtain the value of GMDID_MEDIA we need to use the
>> -                 * media GuC, temporarily tweak the gt type.
>> +                 * Note that at this point the GTs are not initialized and only
>> +                 * tile-level access to MMIO registers is possible. To use our
>> +                 * existing GuC communication functions we must create a dummy
>> +                 * GT structure and perform at least basic xe_gt and xe_guc
>> +                 * initialization.
>>                   */
>> -                xe_gt_assert(gt, gt->info.type == XE_GT_TYPE_UNINITIALIZED);
>> +                struct xe_gt *gt = kzalloc(sizeof(*gt), GFP_KERNEL);
>
>nit: we can use __free(kfree) here ...

Taking a step back, do we really need to allocate this? I get the
impression that keeping the dummy gt on the stack should be fine since
we are keeping its lifetime constrained within this function.

--
Gustavo Sousa

>
>> +                if (!gt)
>> +                        return -ENOMEM;
>>  
>>                  if (type == GMDID_MEDIA) {
>>                          gt->info.id = 1;
>
>it looks that it is still crashing in xe_gt_mmio_init() called from below
>
><1> [146.543510] BUG: kernel NULL pointer dereference, address: 0000000000000028
><1> [146.543528] #PF: supervisor read access in kernel mode
><1> [146.543538] #PF: error_code(0x0000) - not-present page
><4> [146.543611] RIP: 0010:xe_gt_mmio_init+0x27/0x1b0 [xe]
><4> [146.544175] Call Trace:
><4> [146.544182]  <TASK>
><4> [146.544196]  read_gmdid+0x12b/0x2a0 [xe]
><4> [146.544601]  xe_info_init+0x50e/0xc90 [xe]
><4> [146.544948]  ? drmm_kmalloc+0x87/0x100
><4> [146.544968]  ? xe_device_probe_early+0xdf/0x230 [xe]
><4> [146.545253]  ? pci_write_config_word+0x27/0x50
><4> [146.545274]  xe_pci_probe+0x163/0x600 [xe]
>
>likely due to NULL gt->tile
>
>> @@ -503,12 +501,7 @@ static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver,
>>                  /* Don't bother with GMDID if failed to negotiate the GuC ABI */
>>                  val = xe_gt_sriov_vf_bootstrap(gt) ? 0 : xe_gt_sriov_vf_gmdid(gt);
>
>... so in case of bootstrap error we can easily return actual error,
>instead of returning plain 0.00 version
>
>>  
>> -                /*
>> -                 * Only undo xe_gt.info here, the remaining changes made above
>> -                 * will be overwritten as part of the regular initialization.
>> -                 */
>> -                gt->info.id = 0;
>> -                gt->info.type = XE_GT_TYPE_UNINITIALIZED;
>> +                kfree(gt);
>>          } else {
>>                  /*
>>                   * GMD_ID is a GT register, but at this point in the driver
>> @@ -526,6 +519,8 @@ static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver,
>>  
>>          *ver = REG_FIELD_GET(GMD_ID_ARCH_MASK, val) * 100 + REG_FIELD_GET(GMD_ID_RELEASE_MASK, val);
>>          *revid = REG_FIELD_GET(GMD_ID_REVID, val);
>> +
>> +        return 0;
>>  }
>>  
>>  static const struct xe_ip *find_graphics_ip(unsigned int verx100)
>> @@ -552,18 +547,21 @@ static const struct xe_ip *find_media_ip(unsigned int verx100)
>>   * Read IP version from hardware and select graphics/media IP descriptors
>>   * based on the result.
>>   */
>> -static void handle_gmdid(struct xe_device *xe,
>> -                         const struct xe_ip **graphics_ip,
>> -                         const struct xe_ip **media_ip,
>> -                         u32 *graphics_revid,
>> -                         u32 *media_revid)
>> +static int handle_gmdid(struct xe_device *xe,
>> +                        const struct xe_ip **graphics_ip,
>> +                        const struct xe_ip **media_ip,
>> +                        u32 *graphics_revid,
>> +                        u32 *media_revid)
>>  {
>>          u32 ver;
>> +        int ret;
>>  
>>          *graphics_ip = NULL;
>>          *media_ip = NULL;
>>  
>> -        read_gmdid(xe, GMDID_GRAPHICS, &ver, graphics_revid);
>> +        ret = read_gmdid(xe, GMDID_GRAPHICS, &ver, graphics_revid);
>> +        if (ret)
>> +                return ret;
>>  
>>          *graphics_ip = find_graphics_ip(ver);
>>          if (!*graphics_ip) {
>> @@ -571,16 +569,21 @@ static void handle_gmdid(struct xe_device *xe,
>>                          ver / 100, ver % 100);
>>          }
>>  
>> -        read_gmdid(xe, GMDID_MEDIA, &ver, media_revid);
>> +        ret = read_gmdid(xe, GMDID_MEDIA, &ver, media_revid);
>> +        if (ret)
>> +                return ret;
>> +
>>          /* Media may legitimately be fused off / not present */
>>          if (ver == 0)
>> -                return;
>> +                return 0;
>>  
>>          *media_ip = find_media_ip(ver);
>>          if (!*media_ip) {
>>                  drm_err(&xe->drm, "Hardware reports unknown media version %u.%02u\n",
>>                          ver / 100, ver % 100);
>>          }
>> +
>> +        return 0;
>>  }
>>  
>>  /*
>> @@ -690,6 +693,7 @@ static int xe_info_init(struct xe_device *xe,
>>          const struct xe_media_desc *media_desc;
>>          struct xe_tile *tile;
>>          struct xe_gt *gt;
>> +        int ret;
>>          u8 id;
>>  
>>          /*
>> @@ -705,8 +709,11 @@ static int xe_info_init(struct xe_device *xe,
>>                  xe->info.step = xe_step_pre_gmdid_get(xe);
>>          } else {
>>                  xe_assert(xe, !desc->pre_gmdid_media_ip);
>> -                handle_gmdid(xe, &graphics_ip, &media_ip,
>> -                             &graphics_gmdid_revid, &media_gmdid_revid);
>> +                ret = handle_gmdid(xe, &graphics_ip, &media_ip,
>> +                                   &graphics_gmdid_revid, &media_gmdid_revid);
>> +                if (ret)
>> +                        return ret;
>> +
>>                  xe->info.step = xe_step_gmdid_get(xe,
>>                                                    graphics_gmdid_revid,
>>                                                    media_gmdid_revid);
>

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

* Re: [PATCH v3 12/23] drm/xe: Check for primary GT before looking up Wa_22019338487
  2025-09-30 22:56 ` [PATCH v3 12/23] drm/xe: Check for primary GT before looking up Wa_22019338487 Matt Roper
  2025-10-01 21:10   ` Lucas De Marchi
@ 2025-10-02 13:46   ` Gustavo Sousa
  1 sibling, 0 replies; 49+ messages in thread
From: Gustavo Sousa @ 2025-10-02 13:46 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper

Quoting Matt Roper (2025-09-30 19:56:29-03:00)
>If the primary GT is disabled via configfs, we need to make sure that we
>don't search for this workaround on a NULL xe_gt pointer.  Since we can
>only disable the primary GT on igpu platforms, the media GT is the one

I was a bit confused with this statement: "we can only disable the
primary GT on igpu platforms".

Possible meanings that come to my head this when I read it are:

  (1) we can disable only the primary GT on igpu platforms;
  (2) we can disable the primary GT only on igpu platforms.

Perhaps we could change the placement of the word "only" like above to
remove any possible ambiguity?

Given the body message for patch "drm/xe/configfs: Add attribute to
disable GT types", I would assume that (2) would be the correct
interpretation...

--
Gustavo Sousa

>we'd want to check anyway for this workaround.
>
>The ternary operators in ggtt_update_access_counter() were getting a bit
>long/complicated, so rewrite them with regular if/else statements.
>While we're at it, throw in a couple extra assertions to make sure that
>we're truly picking the expected GT according to igpu/dgpu type.
>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
>---
> drivers/gpu/drm/xe/xe_ggtt.c | 26 ++++++++++++++++++++------
> 1 file changed, 20 insertions(+), 6 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
>index 7fdd0a97a628..0ed9ffc3278d 100644
>--- a/drivers/gpu/drm/xe/xe_ggtt.c
>+++ b/drivers/gpu/drm/xe/xe_ggtt.c
>@@ -107,10 +107,23 @@ static unsigned int probe_gsm_size(struct pci_dev *pdev)
> static void ggtt_update_access_counter(struct xe_ggtt *ggtt)
> {
>         struct xe_tile *tile = ggtt->tile;
>-        struct xe_gt *affected_gt = XE_GT_WA(tile->primary_gt, 22019338487) ?
>-                tile->primary_gt : tile->media_gt;
>-        struct xe_mmio *mmio = &affected_gt->mmio;
>-        u32 max_gtt_writes = XE_GT_WA(ggtt->tile->primary_gt, 22019338487) ? 1100 : 63;
>+        struct xe_gt *affected_gt;
>+        u32 max_gtt_writes;
>+
>+        if (tile->primary_gt && XE_GT_WA(tile->primary_gt, 22019338487)) {
>+                affected_gt = tile->primary_gt;
>+                max_gtt_writes = 1100;
>+
>+                /* Only expected to apply to primary GT on dgpu platforms */
>+                xe_tile_assert(tile, IS_DGFX(tile_to_xe(tile)));
>+        } else {
>+                affected_gt = tile->media_gt;
>+                max_gtt_writes = 63;
>+
>+                /* Only expected to apply to media GT on igpu platforms */
>+                xe_tile_assert(tile, !IS_DGFX(tile_to_xe(tile)));
>+        }
>+
>         /*
>          * Wa_22019338487: GMD_ID is a RO register, a dummy write forces gunit
>          * to wait for completion of prior GTT writes before letting this through.
>@@ -119,7 +132,7 @@ static void ggtt_update_access_counter(struct xe_ggtt *ggtt)
>         lockdep_assert_held(&ggtt->lock);
> 
>         if ((++ggtt->access_count % max_gtt_writes) == 0) {
>-                xe_mmio_write32(mmio, GMD_ID, 0x0);
>+                xe_mmio_write32(&affected_gt->mmio, GMD_ID, 0x0);
>                 ggtt->access_count = 0;
>         }
> }
>@@ -286,7 +299,8 @@ int xe_ggtt_init_early(struct xe_ggtt *ggtt)
>         if (GRAPHICS_VERx100(xe) >= 1270)
>                 ggtt->pt_ops = (ggtt->tile->media_gt &&
>                                XE_GT_WA(ggtt->tile->media_gt, 22019338487)) ||
>-                               XE_GT_WA(ggtt->tile->primary_gt, 22019338487) ?
>+                               (ggtt->tile->primary_gt &&
>+                                XE_GT_WA(ggtt->tile->primary_gt, 22019338487)) ?
>                                &xelpg_pt_wa_ops : &xelpg_pt_ops;
>         else
>                 ggtt->pt_ops = &xelp_pt_ops;
>-- 
>2.51.0
>

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

* Re: [PATCH v3 13/23] drm/xe: Make display part of Wa_22019338487 a device workaround
  2025-09-30 22:56 ` [PATCH v3 13/23] drm/xe: Make display part of Wa_22019338487 a device workaround Matt Roper
@ 2025-10-02 14:26   ` Gustavo Sousa
  0 siblings, 0 replies; 49+ messages in thread
From: Gustavo Sousa @ 2025-10-02 14:26 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper

Quoting Matt Roper (2025-09-30 19:56:30-03:00)
>The display part of Wa_22019338487 (i.e., avoiding use of stolen memory)
>is using a platform test rather than an graphics/media IP test.  Since
>this workaround is focused on non-GT uses of stolen memory, it makes
>sense that we'd want to still apply the workaround on affected platforms
>even if the GTs themselves are disabled via configfs.
>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>

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

>---
> drivers/gpu/drm/xe/display/intel_fbdev_fb.c   | 4 ++--
> drivers/gpu/drm/xe/display/xe_plane_initial.c | 4 ++--
> drivers/gpu/drm/xe/xe_device_wa_oob.rules     | 1 +
> drivers/gpu/drm/xe/xe_wa_oob.rules            | 1 -
> 4 files changed, 5 insertions(+), 5 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c b/drivers/gpu/drm/xe/display/intel_fbdev_fb.c
>index 35a5b07eeba4..af72f7305e5a 100644
>--- a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c
>+++ b/drivers/gpu/drm/xe/display/intel_fbdev_fb.c
>@@ -10,7 +10,7 @@
> #include "xe_ttm_stolen_mgr.h"
> #include "xe_wa.h"
> 
>-#include <generated/xe_wa_oob.h>
>+#include <generated/xe_device_wa_oob.h>
> 
> struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size)
> {
>@@ -19,7 +19,7 @@ struct drm_gem_object *intel_fbdev_fb_bo_create(struct drm_device *drm, int size
> 
>         obj = ERR_PTR(-ENODEV);
> 
>-        if (!IS_DGFX(xe) && !XE_GT_WA(xe_root_mmio_gt(xe), 22019338487_display)) {
>+        if (!IS_DGFX(xe) && !XE_DEVICE_WA(xe, 22019338487_display)) {
>                 obj = xe_bo_create_pin_map_novm(xe, xe_device_get_root_tile(xe),
>                                                 size,
>                                                 ttm_bo_type_kernel, XE_BO_FLAG_SCANOUT |
>diff --git a/drivers/gpu/drm/xe/display/xe_plane_initial.c b/drivers/gpu/drm/xe/display/xe_plane_initial.c
>index 94f00def811b..12d25c5290fd 100644
>--- a/drivers/gpu/drm/xe/display/xe_plane_initial.c
>+++ b/drivers/gpu/drm/xe/display/xe_plane_initial.c
>@@ -25,7 +25,7 @@
> #include "xe_vram_types.h"
> #include "xe_wa.h"
> 
>-#include <generated/xe_wa_oob.h>
>+#include <generated/xe_device_wa_oob.h>
> 
> void intel_plane_initial_vblank_wait(struct intel_crtc *crtc)
> {
>@@ -123,7 +123,7 @@ initial_plane_bo(struct xe_device *xe,
>                 phys_base = base;
>                 flags |= XE_BO_FLAG_STOLEN;
> 
>-                if (XE_GT_WA(xe_root_mmio_gt(xe), 22019338487_display))
>+                if (XE_DEVICE_WA(xe, 22019338487_display))
>                         return NULL;
> 
>                 /*
>diff --git a/drivers/gpu/drm/xe/xe_device_wa_oob.rules b/drivers/gpu/drm/xe/xe_device_wa_oob.rules
>index 3a0c4ccc4224..3cc93f0e77f8 100644
>--- a/drivers/gpu/drm/xe/xe_device_wa_oob.rules
>+++ b/drivers/gpu/drm/xe/xe_device_wa_oob.rules
>@@ -1,2 +1,3 @@
> 15015404425     PLATFORM(LUNARLAKE)
>                 PLATFORM(PANTHERLAKE)
>+22019338487_display        PLATFORM(LUNARLAKE)
>diff --git a/drivers/gpu/drm/xe/xe_wa_oob.rules b/drivers/gpu/drm/xe/xe_wa_oob.rules
>index f3a6d5d239ce..eb761d30e066 100644
>--- a/drivers/gpu/drm/xe/xe_wa_oob.rules
>+++ b/drivers/gpu/drm/xe/xe_wa_oob.rules
>@@ -45,7 +45,6 @@
> 22019338487        MEDIA_VERSION(2000)
>                 GRAPHICS_VERSION(2001), FUNC(xe_rtp_match_not_sriov_vf)
>                 MEDIA_VERSION(3000), MEDIA_STEP(A0, B0), FUNC(xe_rtp_match_not_sriov_vf)
>-22019338487_display        PLATFORM(LUNARLAKE)
> 16023588340        GRAPHICS_VERSION(2001), FUNC(xe_rtp_match_not_sriov_vf)
> 14019789679        GRAPHICS_VERSION(1255)
>                 GRAPHICS_VERSION_RANGE(1270, 2004)
>-- 
>2.51.0
>

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

* Re: [PATCH v3 15/23] drm/xe: Handle Wa_22010954014 and Wa_14022085890 as device workarounds
  2025-09-30 22:56 ` [PATCH v3 15/23] drm/xe: Handle Wa_22010954014 and Wa_14022085890 as device workarounds Matt Roper
@ 2025-10-02 17:49   ` Gustavo Sousa
  0 siblings, 0 replies; 49+ messages in thread
From: Gustavo Sousa @ 2025-10-02 17:49 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper

Quoting Matt Roper (2025-09-30 19:56:32-03:00)
>When Wa_22010954014 and Wa_14022085890 were first implemented, we didn't
>have a device workaround infrastructure so we hacked them into the GT
>workaround list.  Now that we have proper device workaround support,
>move them to the proper place.  Note that Wa_14022085890 specifically
>applies to BMG-G21 platforms, so this requires defining a BMG
>subplatform to capture the correct subset of device IDs.
>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>

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

>---
> drivers/gpu/drm/xe/xe_device_wa_oob.rules | 2 ++
> drivers/gpu/drm/xe/xe_guc_pc.c            | 3 ++-
> drivers/gpu/drm/xe/xe_pci.c               | 6 ++++++
> drivers/gpu/drm/xe/xe_platform_types.h    | 1 +
> drivers/gpu/drm/xe/xe_wa.c                | 2 +-
> drivers/gpu/drm/xe/xe_wa_oob.rules        | 5 -----
> include/drm/intel/pciids.h                | 7 +++++--
> 7 files changed, 17 insertions(+), 9 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_device_wa_oob.rules b/drivers/gpu/drm/xe/xe_device_wa_oob.rules
>index 3cc93f0e77f8..55ba01bc8f38 100644
>--- a/drivers/gpu/drm/xe/xe_device_wa_oob.rules
>+++ b/drivers/gpu/drm/xe/xe_device_wa_oob.rules
>@@ -1,3 +1,5 @@
>+22010954014        PLATFORM(DG2)
> 15015404425     PLATFORM(LUNARLAKE)
>                 PLATFORM(PANTHERLAKE)
> 22019338487_display        PLATFORM(LUNARLAKE)
>+14022085890        SUBPLATFORM(BATTLEMAGE, G21)
>diff --git a/drivers/gpu/drm/xe/xe_guc_pc.c b/drivers/gpu/drm/xe/xe_guc_pc.c
>index 3c0feb50a1e2..ff22235857f8 100644
>--- a/drivers/gpu/drm/xe/xe_guc_pc.c
>+++ b/drivers/gpu/drm/xe/xe_guc_pc.c
>@@ -14,6 +14,7 @@
> 
> #include <drm/drm_managed.h>
> #include <drm/drm_print.h>
>+#include <generated/xe_device_wa_oob.h>
> #include <generated/xe_wa_oob.h>
> 
> #include "abi/guc_actions_slpc_abi.h"
>@@ -886,7 +887,7 @@ static int pc_adjust_freq_bounds(struct xe_guc_pc *pc)
>         if (pc_get_min_freq(pc) > pc->rp0_freq)
>                 ret = pc_set_min_freq(pc, pc->rp0_freq);
> 
>-        if (XE_GT_WA(tile->primary_gt, 14022085890))
>+        if (XE_DEVICE_WA(tile_to_xe(tile), 14022085890))
>                 ret = pc_set_min_freq(pc, max(BMG_MIN_FREQ, pc_get_min_freq(pc)));
> 
> out:
>diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
>index 13e8d379a1cd..86e6dd751b1c 100644
>--- a/drivers/gpu/drm/xe/xe_pci.c
>+++ b/drivers/gpu/drm/xe/xe_pci.c
>@@ -334,6 +334,8 @@ static const struct xe_device_desc lnl_desc = {
>         .vm_max_level = 4,
> };
> 
>+static const u16 bmg_g21_ids[] = { INTEL_BMG_G21_IDS(NOP), 0 };
>+
> static const struct xe_device_desc bmg_desc = {
>         DGFX_FEATURES,
>         PLATFORM(BATTLEMAGE),
>@@ -348,6 +350,10 @@ static const struct xe_device_desc bmg_desc = {
>         .has_sriov = true,
>         .max_gt_per_tile = 2,
>         .needs_scratch = true,
>+        .subplatforms = (const struct xe_subplatform_desc[]) {
>+                { XE_SUBPLATFORM_BATTLEMAGE_G21, "G21", bmg_g21_ids },
>+                { }
>+        },
>         .va_bits = 48,
>         .vm_max_level = 4,
> };
>diff --git a/drivers/gpu/drm/xe/xe_platform_types.h b/drivers/gpu/drm/xe/xe_platform_types.h
>index d08574c4cdb8..3e332214c7bb 100644
>--- a/drivers/gpu/drm/xe/xe_platform_types.h
>+++ b/drivers/gpu/drm/xe/xe_platform_types.h
>@@ -34,6 +34,7 @@ enum xe_subplatform {
>         XE_SUBPLATFORM_DG2_G10,
>         XE_SUBPLATFORM_DG2_G11,
>         XE_SUBPLATFORM_DG2_G12,
>+        XE_SUBPLATFORM_BATTLEMAGE_G21,
> };
> 
> #endif
>diff --git a/drivers/gpu/drm/xe/xe_wa.c b/drivers/gpu/drm/xe/xe_wa.c
>index c60159a13001..aa1b69f48f6f 100644
>--- a/drivers/gpu/drm/xe/xe_wa.c
>+++ b/drivers/gpu/drm/xe/xe_wa.c
>@@ -1138,6 +1138,6 @@ void xe_wa_apply_tile_workarounds(struct xe_tile *tile)
>         if (IS_SRIOV_VF(tile->xe))
>                 return;
> 
>-        if (XE_GT_WA(tile->primary_gt, 22010954014))
>+        if (XE_DEVICE_WA(tile->xe, 22010954014))
>                 xe_mmio_rmw32(mmio, XEHP_CLOCK_GATE_DIS, 0, SGSI_SIDECLK_DIS);
> }
>diff --git a/drivers/gpu/drm/xe/xe_wa_oob.rules b/drivers/gpu/drm/xe/xe_wa_oob.rules
>index eb761d30e066..113a62f1b541 100644
>--- a/drivers/gpu/drm/xe/xe_wa_oob.rules
>+++ b/drivers/gpu/drm/xe/xe_wa_oob.rules
>@@ -14,7 +14,6 @@
> 14016763929        SUBPLATFORM(DG2, G10)
>                 SUBPLATFORM(DG2, G12)
> 16017236439        PLATFORM(PVC)
>-22010954014        PLATFORM(DG2)
> 14019821291        MEDIA_VERSION_RANGE(1300, 2000)
> 14015076503        MEDIA_VERSION(1300)
> 16020292621        GRAPHICS_VERSION(2004), GRAPHICS_STEP(A0, B0)
>@@ -74,9 +73,5 @@
> 16023683509        MEDIA_VERSION(2000), FUNC(xe_rtp_match_psmi_enabled)
>                 MEDIA_VERSION(3000), MEDIA_STEP(A0, B0), FUNC(xe_rtp_match_psmi_enabled)
> 
>-# SoC workaround - currently applies to all platforms with the following
>-# primary GT GMDID
>-14022085890        GRAPHICS_VERSION(2001)
>-
> 15015404425_disable        PLATFORM(PANTHERLAKE), MEDIA_STEP(B0, FOREVER)
> 16026007364    MEDIA_VERSION(3000)
>diff --git a/include/drm/intel/pciids.h b/include/drm/intel/pciids.h
>index 69d4ae92d822..452c1de606ff 100644
>--- a/include/drm/intel/pciids.h
>+++ b/include/drm/intel/pciids.h
>@@ -849,7 +849,7 @@
>         MACRO__(0x64B0, ## __VA_ARGS__)
> 
> /* BMG */
>-#define INTEL_BMG_IDS(MACRO__, ...) \
>+#define INTEL_BMG_G21_IDS(MACRO__, ...) \
>         MACRO__(0xE202, ## __VA_ARGS__), \
>         MACRO__(0xE209, ## __VA_ARGS__), \
>         MACRO__(0xE20B, ## __VA_ARGS__), \
>@@ -858,7 +858,10 @@
>         MACRO__(0xE210, ## __VA_ARGS__), \
>         MACRO__(0xE211, ## __VA_ARGS__), \
>         MACRO__(0xE212, ## __VA_ARGS__), \
>-        MACRO__(0xE216, ## __VA_ARGS__), \
>+        MACRO__(0xE216, ## __VA_ARGS__)
>+
>+#define INTEL_BMG_IDS(MACRO__, ...) \
>+        INTEL_BMG_G21_IDS(MACRO__, __VA_ARGS__), \
>         MACRO__(0xE220, ## __VA_ARGS__), \
>         MACRO__(0xE221, ## __VA_ARGS__), \
>         MACRO__(0xE222, ## __VA_ARGS__), \
>-- 
>2.51.0
>

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

* Re: [PATCH v3 16/23] drm/xe/rtp: Pass xe_device parameter to FUNC matches
  2025-09-30 22:56 ` [PATCH v3 16/23] drm/xe/rtp: Pass xe_device parameter to FUNC matches Matt Roper
@ 2025-10-02 18:24   ` Gustavo Sousa
  0 siblings, 0 replies; 49+ messages in thread
From: Gustavo Sousa @ 2025-10-02 18:24 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper

Quoting Matt Roper (2025-09-30 19:56:33-03:00)
>FUNC matches in RTP only pass the GT and hwe, preventing them from being
>used effectively in device workarounds.  Add an additional xe_device
>parameter so that we can use them in device workarounds where a GT may
>not be available.
>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>

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

>---
> drivers/gpu/drm/xe/tests/xe_rtp_test.c |  6 ++++--
> drivers/gpu/drm/xe/xe_hw_engine.c      | 10 ++++++----
> drivers/gpu/drm/xe/xe_reg_whitelist.c  |  3 ++-
> drivers/gpu/drm/xe/xe_rtp.c            | 24 +++++++++++++-----------
> drivers/gpu/drm/xe/xe_rtp.h            | 18 +++++++++++++-----
> drivers/gpu/drm/xe/xe_rtp_types.h      |  4 +++-
> 6 files changed, 41 insertions(+), 24 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/tests/xe_rtp_test.c b/drivers/gpu/drm/xe/tests/xe_rtp_test.c
>index b0254b014fe4..d2255a59e58f 100644
>--- a/drivers/gpu/drm/xe/tests/xe_rtp_test.c
>+++ b/drivers/gpu/drm/xe/tests/xe_rtp_test.c
>@@ -48,12 +48,14 @@ struct rtp_test_case {
>         const struct xe_rtp_entry *entries;
> };
> 
>-static bool match_yes(const struct xe_gt *gt, const struct xe_hw_engine *hwe)
>+static bool match_yes(const struct xe_device *xe, const struct xe_gt *gt,
>+                      const struct xe_hw_engine *hwe)
> {
>         return true;
> }
> 
>-static bool match_no(const struct xe_gt *gt, const struct xe_hw_engine *hwe)
>+static bool match_no(const struct xe_device *xe, const struct xe_gt *gt,
>+                     const struct xe_hw_engine *hwe)
> {
>         return false;
> }
>diff --git a/drivers/gpu/drm/xe/xe_hw_engine.c b/drivers/gpu/drm/xe/xe_hw_engine.c
>index 1cf623b4a5bc..cba4375525c7 100644
>--- a/drivers/gpu/drm/xe/xe_hw_engine.c
>+++ b/drivers/gpu/drm/xe/xe_hw_engine.c
>@@ -346,17 +346,19 @@ void xe_hw_engine_enable_ring(struct xe_hw_engine *hwe)
>         xe_hw_engine_mmio_read32(hwe, RING_MI_MODE(0));
> }
> 
>-static bool xe_hw_engine_match_fixed_cslice_mode(const struct xe_gt *gt,
>+static bool xe_hw_engine_match_fixed_cslice_mode(const struct xe_device *xe,
>+                                                 const struct xe_gt *gt,
>                                                  const struct xe_hw_engine *hwe)
> {
>         return xe_gt_ccs_mode_enabled(gt) &&
>-               xe_rtp_match_first_render_or_compute(gt, hwe);
>+               xe_rtp_match_first_render_or_compute(xe, gt, hwe);
> }
> 
>-static bool xe_rtp_cfeg_wmtp_disabled(const struct xe_gt *gt,
>+static bool xe_rtp_cfeg_wmtp_disabled(const struct xe_device *xe,
>+                                      const struct xe_gt *gt,
>                                       const struct xe_hw_engine *hwe)
> {
>-        if (GRAPHICS_VER(gt_to_xe(gt)) < 20)
>+        if (GRAPHICS_VER(xe) < 20)
>                 return false;
> 
>         if (hwe->class != XE_ENGINE_CLASS_COMPUTE &&
>diff --git a/drivers/gpu/drm/xe/xe_reg_whitelist.c b/drivers/gpu/drm/xe/xe_reg_whitelist.c
>index 23f6c81d9994..690bc327a363 100644
>--- a/drivers/gpu/drm/xe/xe_reg_whitelist.c
>+++ b/drivers/gpu/drm/xe/xe_reg_whitelist.c
>@@ -19,7 +19,8 @@
> #undef XE_REG_MCR
> #define XE_REG_MCR(...)     XE_REG(__VA_ARGS__, .mcr = 1)
> 
>-static bool match_not_render(const struct xe_gt *gt,
>+static bool match_not_render(const struct xe_device *xe,
>+                             const struct xe_gt *gt,
>                              const struct xe_hw_engine *hwe)
> {
>         return hwe->class != XE_ENGINE_CLASS_RENDER;
>diff --git a/drivers/gpu/drm/xe/xe_rtp.c b/drivers/gpu/drm/xe/xe_rtp.c
>index b5f430d59f80..66707cc89ec9 100644
>--- a/drivers/gpu/drm/xe/xe_rtp.c
>+++ b/drivers/gpu/drm/xe/xe_rtp.c
>@@ -133,10 +133,7 @@ static bool rule_matches(const struct xe_device *xe,
>                         match = hwe->class != r->engine_class;
>                         break;
>                 case XE_RTP_MATCH_FUNC:
>-                        if (drm_WARN_ON(&xe->drm, !gt))
>-                                return false;
>-
>-                        match = r->match_func(gt, hwe);
>+                        match = r->match_func(xe, gt, hwe);
>                         break;
>                 default:
>                         drm_warn(&xe->drm, "Invalid RTP match %u\n",
>@@ -343,13 +340,15 @@ void xe_rtp_process(struct xe_rtp_process_ctx *ctx,
> }
> EXPORT_SYMBOL_IF_KUNIT(xe_rtp_process);
> 
>-bool xe_rtp_match_even_instance(const struct xe_gt *gt,
>+bool xe_rtp_match_even_instance(const struct xe_device *xe,
>+                                const struct xe_gt *gt,
>                                 const struct xe_hw_engine *hwe)
> {
>         return hwe->instance % 2 == 0;
> }
> 
>-bool xe_rtp_match_first_render_or_compute(const struct xe_gt *gt,
>+bool xe_rtp_match_first_render_or_compute(const struct xe_device *xe,
>+                                          const struct xe_gt *gt,
>                                           const struct xe_hw_engine *hwe)
> {
>         u64 render_compute_mask = gt->info.engine_mask &
>@@ -359,19 +358,22 @@ bool xe_rtp_match_first_render_or_compute(const struct xe_gt *gt,
>                 hwe->engine_id == __ffs(render_compute_mask);
> }
> 
>-bool xe_rtp_match_not_sriov_vf(const struct xe_gt *gt,
>+bool xe_rtp_match_not_sriov_vf(const struct xe_device *xe,
>+                               const struct xe_gt *gt,
>                                const struct xe_hw_engine *hwe)
> {
>-        return !IS_SRIOV_VF(gt_to_xe(gt));
>+        return !IS_SRIOV_VF(xe);
> }
> 
>-bool xe_rtp_match_psmi_enabled(const struct xe_gt *gt,
>+bool xe_rtp_match_psmi_enabled(const struct xe_device *xe,
>+                               const struct xe_gt *gt,
>                                const struct xe_hw_engine *hwe)
> {
>-        return xe_configfs_get_psmi_enabled(to_pci_dev(gt_to_xe(gt)->drm.dev));
>+        return xe_configfs_get_psmi_enabled(to_pci_dev(xe->drm.dev));
> }
> 
>-bool xe_rtp_match_gt_has_discontiguous_dss_groups(const struct xe_gt *gt,
>+bool xe_rtp_match_gt_has_discontiguous_dss_groups(const struct xe_device *xe,
>+                                                  const struct xe_gt *gt,
>                                                   const struct xe_hw_engine *hwe)
> {
>         return xe_gt_has_discontiguous_dss_groups(gt);
>diff --git a/drivers/gpu/drm/xe/xe_rtp.h b/drivers/gpu/drm/xe/xe_rtp.h
>index ac12ddf6cde6..e5b8a9452e29 100644
>--- a/drivers/gpu/drm/xe/xe_rtp.h
>+++ b/drivers/gpu/drm/xe/xe_rtp.h
>@@ -440,18 +440,21 @@ void xe_rtp_process(struct xe_rtp_process_ctx *ctx,
> 
> /**
>  * xe_rtp_match_even_instance - Match if engine instance is even
>+ * @xe: Device structure
>  * @gt: GT structure
>  * @hwe: Engine instance
>  *
>  * Returns: true if engine instance is even, false otherwise
>  */
>-bool xe_rtp_match_even_instance(const struct xe_gt *gt,
>+bool xe_rtp_match_even_instance(const struct xe_device *xe,
>+                                const struct xe_gt *gt,
>                                 const struct xe_hw_engine *hwe);
> 
> /*
>  * xe_rtp_match_first_render_or_compute - Match if it's first render or compute
>  * engine in the GT
>  *
>+ * @xe: Device structure
>  * @gt: GT structure
>  * @hwe: Engine instance
>  *
>@@ -463,24 +466,29 @@ bool xe_rtp_match_even_instance(const struct xe_gt *gt,
>  * Returns: true if engine id is the first to match the render reset domain,
>  * false otherwise.
>  */
>-bool xe_rtp_match_first_render_or_compute(const struct xe_gt *gt,
>+bool xe_rtp_match_first_render_or_compute(const struct xe_device *xe,
>+                                          const struct xe_gt *gt,
>                                           const struct xe_hw_engine *hwe);
> 
> /*
>  * xe_rtp_match_not_sriov_vf - Match when not on SR-IOV VF device
>  *
>+ * @xe: Device structure
>  * @gt: GT structure
>  * @hwe: Engine instance
>  *
>  * Returns: true if device is not VF, false otherwise.
>  */
>-bool xe_rtp_match_not_sriov_vf(const struct xe_gt *gt,
>+bool xe_rtp_match_not_sriov_vf(const struct xe_device *xe,
>+                               const struct xe_gt *gt,
>                                const struct xe_hw_engine *hwe);
> 
>-bool xe_rtp_match_psmi_enabled(const struct xe_gt *gt,
>+bool xe_rtp_match_psmi_enabled(const struct xe_device *xe,
>+                               const struct xe_gt *gt,
>                                const struct xe_hw_engine *hwe);
> 
>-bool xe_rtp_match_gt_has_discontiguous_dss_groups(const struct xe_gt *gt,
>+bool xe_rtp_match_gt_has_discontiguous_dss_groups(const struct xe_device *xe,
>+                                                  const struct xe_gt *gt,
>                                                   const struct xe_hw_engine *hwe);
> 
> #endif
>diff --git a/drivers/gpu/drm/xe/xe_rtp_types.h b/drivers/gpu/drm/xe/xe_rtp_types.h
>index f4cf30e298cf..6ba7f226c227 100644
>--- a/drivers/gpu/drm/xe/xe_rtp_types.h
>+++ b/drivers/gpu/drm/xe/xe_rtp_types.h
>@@ -10,6 +10,7 @@
> 
> #include "regs/xe_reg_defs.h"
> 
>+struct xe_device;
> struct xe_hw_engine;
> struct xe_gt;
> 
>@@ -86,7 +87,8 @@ struct xe_rtp_rule {
>                         u8 engine_class;
>                 };
>                 /* MATCH_FUNC */
>-                bool (*match_func)(const struct xe_gt *gt,
>+                bool (*match_func)(const struct xe_device *xe,
>+                                   const struct xe_gt *gt,
>                                    const struct xe_hw_engine *hwe);
>         };
> };
>-- 
>2.51.0
>

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

* Re: [PATCH v3 17/23] drm/xe: Bypass Wa_14018094691 when primary GT is disabled
  2025-09-30 22:56 ` [PATCH v3 17/23] drm/xe: Bypass Wa_14018094691 when primary GT is disabled Matt Roper
@ 2025-10-03 12:44   ` Gustavo Sousa
  2025-10-07 17:39     ` Matt Roper
  0 siblings, 1 reply; 49+ messages in thread
From: Gustavo Sousa @ 2025-10-03 12:44 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper

Quoting Matt Roper (2025-09-30 19:56:34-03:00)
>Don't try to lookup Wa_14018094691 on a NULL GT when the primary GT is
>disabled.  If the primary GT is disabled, there's no mid-thread
>preemption happening which would make this workaround relevant anyway.

s/relevant/irrelevant/?

>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>

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

>---
> drivers/gpu/drm/xe/xe_gsc.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_gsc.c b/drivers/gpu/drm/xe/xe_gsc.c
>index 83d61bf8ec62..dd69cb834f8e 100644
>--- a/drivers/gpu/drm/xe/xe_gsc.c
>+++ b/drivers/gpu/drm/xe/xe_gsc.c
>@@ -266,7 +266,7 @@ static int gsc_upload_and_init(struct xe_gsc *gsc)
>         unsigned int fw_ref;
>         int ret;
> 
>-        if (XE_GT_WA(tile->primary_gt, 14018094691)) {
>+        if (tile->primary_gt && XE_GT_WA(tile->primary_gt, 14018094691)) {
>                 fw_ref = xe_force_wake_get(gt_to_fw(tile->primary_gt), XE_FORCEWAKE_ALL);
> 
>                 /*
>@@ -281,7 +281,7 @@ static int gsc_upload_and_init(struct xe_gsc *gsc)
> 
>         ret = gsc_upload(gsc);
> 
>-        if (XE_GT_WA(tile->primary_gt, 14018094691))
>+        if (tile->primary_gt && XE_GT_WA(tile->primary_gt, 14018094691))
>                 xe_force_wake_put(gt_to_fw(tile->primary_gt), fw_ref);
> 
>         if (ret)
>-- 
>2.51.0
>

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

* Re: [PATCH v3 18/23] drm/xe: Correct lineage for Wa_22014953428 and only check with valid GT
  2025-09-30 22:56 ` [PATCH v3 18/23] drm/xe: Correct lineage for Wa_22014953428 and only check with valid GT Matt Roper
@ 2025-10-03 12:52   ` Gustavo Sousa
  0 siblings, 0 replies; 49+ messages in thread
From: Gustavo Sousa @ 2025-10-03 12:52 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper

Quoting Matt Roper (2025-09-30 19:56:35-03:00)
>Wa_22014953428 was incorrectly labelled with a release-specific ID
>number rather than the cross-platform lineage number; fix that.
>Also check that the GT is not NULL before trying to lookup the
>workaround in it.  Since this workaround only applies to DG2 discrete
>GPUs (where the primary GT cannot be disabled), no coverage is lost.
>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>

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

>---
> drivers/gpu/drm/xe/xe_vm.c         | 3 ++-
> drivers/gpu/drm/xe/xe_wa_oob.rules | 2 +-
> 2 files changed, 3 insertions(+), 2 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
>index 80b7f13ecd80..1677ae729e85 100644
>--- a/drivers/gpu/drm/xe/xe_vm.c
>+++ b/drivers/gpu/drm/xe/xe_vm.c
>@@ -1886,6 +1886,7 @@ int xe_vm_create_ioctl(struct drm_device *dev, void *data,
>         struct xe_device *xe = to_xe_device(dev);
>         struct xe_file *xef = to_xe_file(file);
>         struct drm_xe_vm_create *args = data;
>+        struct xe_gt *wa_gt = xe_root_mmio_gt(xe);
>         struct xe_vm *vm;
>         u32 id;
>         int err;
>@@ -1894,7 +1895,7 @@ int xe_vm_create_ioctl(struct drm_device *dev, void *data,
>         if (XE_IOCTL_DBG(xe, args->extensions))
>                 return -EINVAL;
> 
>-        if (XE_GT_WA(xe_root_mmio_gt(xe), 14016763929))
>+        if (wa_gt && XE_GT_WA(wa_gt, 22014953428))
>                 args->flags |= DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE;
> 
>         if (XE_IOCTL_DBG(xe, args->flags & DRM_XE_VM_CREATE_FLAG_FAULT_MODE &&
>diff --git a/drivers/gpu/drm/xe/xe_wa_oob.rules b/drivers/gpu/drm/xe/xe_wa_oob.rules
>index 113a62f1b541..4bb94e5799ed 100644
>--- a/drivers/gpu/drm/xe/xe_wa_oob.rules
>+++ b/drivers/gpu/drm/xe/xe_wa_oob.rules
>@@ -11,7 +11,7 @@
> 18020744125        PLATFORM(PVC)
> 1509372804        PLATFORM(PVC), GRAPHICS_STEP(A0, C0)
> 1409600907        GRAPHICS_VERSION_RANGE(1200, 1250)
>-14016763929        SUBPLATFORM(DG2, G10)
>+22014953428        SUBPLATFORM(DG2, G10)
>                 SUBPLATFORM(DG2, G12)
> 16017236439        PLATFORM(PVC)
> 14019821291        MEDIA_VERSION_RANGE(1300, 2000)
>-- 
>2.51.0
>

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

* Re: [PATCH v3 20/23] drm/xe: Don't check BIOS-disabled FlatCCS if primary GT is disabled
  2025-09-30 22:56 ` [PATCH v3 20/23] drm/xe: Don't check BIOS-disabled FlatCCS if primary GT is disabled Matt Roper
@ 2025-10-03 13:17   ` Gustavo Sousa
  0 siblings, 0 replies; 49+ messages in thread
From: Gustavo Sousa @ 2025-10-03 13:17 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper

Quoting Matt Roper (2025-09-30 19:56:37-03:00)
>If the primary is GT is disabled via configfs, we can't read the GT
>registers that would tell us whether the BIOS has disabled FlatCCS on a
>platform that would otherwise have it; we'll just proceed as if the
>FlatCCS is still enabled.  This is similar to the situation seen by
>SRIOV VFs and doesn't cause any functional problems since the hardware
>will simply drop writes to the CCS region and reads will always come
>back as 0 (indicating uncompressed data).  We'll simply miss out on the
>chance to avoid some unnecessary overhead during BO creation and
>migration.

It appears that media also has this register, right? I wonder if we
could have a function that returns any available gt for this type of
case.

That said, the patch itsel looks right to me, so

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

>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
>---
> drivers/gpu/drm/xe/xe_device.c | 2 ++
> 1 file changed, 2 insertions(+)
>
>diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
>index d42d03b8ab3a..82921d72ebfa 100644
>--- a/drivers/gpu/drm/xe/xe_device.c
>+++ b/drivers/gpu/drm/xe/xe_device.c
>@@ -782,6 +782,8 @@ static int probe_has_flat_ccs(struct xe_device *xe)
>                 return 0;
> 
>         gt = xe_root_mmio_gt(xe);
>+        if (!gt)
>+                return 0;
> 
>         fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
>         if (!fw_ref)
>-- 
>2.51.0
>

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

* Re: [PATCH v3 21/23] drm/xe: Break GT setup out of xe_info_init()
  2025-09-30 22:56 ` [PATCH v3 21/23] drm/xe: Break GT setup out of xe_info_init() Matt Roper
@ 2025-10-03 13:47   ` Gustavo Sousa
  0 siblings, 0 replies; 49+ messages in thread
From: Gustavo Sousa @ 2025-10-03 13:47 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper

Quoting Matt Roper (2025-09-30 19:56:38-03:00)
>xe_info_init() is getting a bit long and hard to follow.  Break the
>allocation and basic initialization of the xe_gt structures out to their
>own functions.
>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
>---
> drivers/gpu/drm/xe/xe_pci.c | 88 +++++++++++++++++++++++--------------
> 1 file changed, 54 insertions(+), 34 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
>index 86e6dd751b1c..65312fe9b97b 100644
>--- a/drivers/gpu/drm/xe/xe_pci.c
>+++ b/drivers/gpu/drm/xe/xe_pci.c
>@@ -683,6 +683,53 @@ static void xe_info_probe_tile_count(struct xe_device *xe)
>         }
> }
> 
>+static struct xe_gt *init_primary_gt(struct xe_tile *tile,

I ususally read "init_something()" as a function that initializes an
object that already has its storage defined. Since here we are
allocating and initializing, I would prefer that we call this
alloc_primary_gt().  Just a personal preference, feel free to ignore.
:-)

>+                                     const struct xe_graphics_desc *graphics_desc,
>+                                     const struct xe_media_desc *media_desc)
>+{
>+        struct xe_device *xe = tile_to_xe(tile);
>+        struct xe_gt *gt;
>+
>+        gt = xe_gt_alloc(tile);
>+        if (IS_ERR(gt))
>+                return gt;
>+
>+        gt->info.type = XE_GT_TYPE_MAIN;
>+        gt->info.id = tile->id * xe->info.max_gt_per_tile;
>+        gt->info.has_indirect_ring_state = graphics_desc->has_indirect_ring_state;
>+        gt->info.engine_mask = graphics_desc->hw_engine_mask;
>+
>+        /*
>+         * Before media version 13, the media IP was part of the primary GT
>+         * so we need to add the media engines to the primary GT's engine list.
>+         */
>+        if (MEDIA_VER(xe) < 13 && media_desc)
>+                gt->info.engine_mask |= media_desc->hw_engine_mask;
>+
>+        return gt;
>+}
>+
>+static struct xe_gt *init_media_gt(struct xe_tile *tile,
>+                                   const struct xe_media_desc *media_desc)
>+{
>+        struct xe_device *xe = tile_to_xe(tile);
>+        struct xe_gt *gt;
>+
>+        gt = xe_gt_alloc(tile);
>+        if (IS_ERR(gt))
>+                return gt;
>+
>+        if (MEDIA_VER(xe) < 13 || !media_desc)
>+                return NULL;

I think we need to return NULL before we do xe_gt_alloc().

--
Gustavo Sousa

>+
>+        gt->info.type = XE_GT_TYPE_MEDIA;
>+        gt->info.id = tile->id * xe->info.max_gt_per_tile + 1;
>+        gt->info.has_indirect_ring_state = media_desc->has_indirect_ring_state;
>+        gt->info.engine_mask = media_desc->hw_engine_mask;
>+
>+        return gt;
>+}
>+
> /*
>  * Initialize device info content that does require knowledge about
>  * graphics / media IP version.
>@@ -765,48 +812,21 @@ static int xe_info_init(struct xe_device *xe,
>                         return err;
>         }
> 
>-        /*
>-         * All platforms have at least one primary GT.  Any platform with media
>-         * version 13 or higher has an additional dedicated media GT.  And
>-         * depending on the graphics IP there may be additional "remote tiles."
>-         * All of these together determine the overall GT count.
>-         */
>+        /* Allocate any GT and VRAM structures necessary for the platform. */
>         for_each_tile(tile, xe, id) {
>                 int err;
> 
>-                tile->primary_gt = xe_gt_alloc(tile);
>+                err = xe_tile_alloc_vram(tile);
>+                if (err)
>+                        return err;
>+
>+                tile->primary_gt = init_primary_gt(tile, graphics_desc, media_desc);
>                 if (IS_ERR(tile->primary_gt))
>                         return PTR_ERR(tile->primary_gt);
> 
>-                gt = tile->primary_gt;
>-                gt->info.type = XE_GT_TYPE_MAIN;
>-                gt->info.id = tile->id * xe->info.max_gt_per_tile;
>-                gt->info.has_indirect_ring_state = graphics_desc->has_indirect_ring_state;
>-                gt->info.engine_mask = graphics_desc->hw_engine_mask;
>-
>-                err = xe_tile_alloc_vram(tile);
>-                if (err)
>-                        return err;
>-
>-                if (MEDIA_VER(xe) < 13 && media_desc)
>-                        gt->info.engine_mask |= media_desc->hw_engine_mask;
>-
>-                if (MEDIA_VER(xe) < 13 || !media_desc)
>-                        continue;
>-
>-                /*
>-                 * Allocate and setup media GT for platforms with standalone
>-                 * media.
>-                 */
>-                tile->media_gt = xe_gt_alloc(tile);
>+                tile->media_gt = init_media_gt(tile, media_desc);
>                 if (IS_ERR(tile->media_gt))
>                         return PTR_ERR(tile->media_gt);
>-
>-                gt = tile->media_gt;
>-                gt->info.type = XE_GT_TYPE_MEDIA;
>-                gt->info.id = tile->id * xe->info.max_gt_per_tile + 1;
>-                gt->info.has_indirect_ring_state = media_desc->has_indirect_ring_state;
>-                gt->info.engine_mask = media_desc->hw_engine_mask;
>         }
> 
>         /*
>-- 
>2.51.0
>

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

* Re: [PATCH v3 22/23] drm/xe/configfs: Add attribute to disable GT types
  2025-09-30 22:56 ` [PATCH v3 22/23] drm/xe/configfs: Add attribute to disable GT types Matt Roper
@ 2025-10-03 18:05   ` Gustavo Sousa
  0 siblings, 0 replies; 49+ messages in thread
From: Gustavo Sousa @ 2025-10-03 18:05 UTC (permalink / raw)
  To: Matt Roper, intel-xe; +Cc: matthew.d.roper

Quoting Matt Roper (2025-09-30 19:56:39-03:00)
>Preventing the driver from initializing GTs of specific type(s) can be
>useful for debugging and early hardware bringup.  Add a configfs
>attribute to allow this kind of control for debugging.
>
>With today's platforms and software design, this configuration setting
>is only effective for disabling the media GT since the driver currently
>requires that there always be a primary GT to probe the device.  However
>this might change in the future ---  in theory it should be possible
>(with some additional driver work) to allow an igpu device to come up
>with only the media GT and no primary GT.  Or to allow an igpu device to
>come up with no GTs at all (for display-only usage).  A primary GT will
>likely always be required on dgpu platforms because we rely on the BCS
>engines inside the primary GT for various vram operations.
>
>v2:
> - Expand/clarify kerneldoc for configfs attribute.  (Gustavo)
> - Tighten type usage in gt_types[] structure.  (Gustavo)
> - Adjust string parsing/name matching to match exact GT names and not
>   accept partial names.  (Gustavo)
>
>Cc: Gustavo Sousa <gustavo.sousa@intel.com>
>Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
>---
> drivers/gpu/drm/xe/xe_configfs.c | 130 +++++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_configfs.h |   2 +
> drivers/gpu/drm/xe/xe_pci.c      |  36 ++++++++-
> 3 files changed, 164 insertions(+), 4 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_configfs.c b/drivers/gpu/drm/xe/xe_configfs.c
>index 139663423185..aaa98166f527 100644
>--- a/drivers/gpu/drm/xe/xe_configfs.c
>+++ b/drivers/gpu/drm/xe/xe_configfs.c
>@@ -15,6 +15,7 @@
> 
> #include "instructions/xe_mi_commands.h"
> #include "xe_configfs.h"
>+#include "xe_gt_types.h"
> #include "xe_hw_engine_types.h"
> #include "xe_module.h"
> #include "xe_pci_types.h"
>@@ -56,6 +57,7 @@
>  *        :
>  *        └── 0000:03:00.0
>  *            ├── survivability_mode
>+ *            ├── gt_types_allowed
>  *            ├── engines_allowed
>  *            └── enable_psmi
>  *
>@@ -79,6 +81,44 @@
>  *
>  * This attribute can only be set before binding to the device.
>  *
>+ * Allowed GT types:
>+ * -----------------
>+ *
>+ * Allow only specific types of GTs to be detected and initialized by the
>+ * driver.  Any combination of GT types can be enabled/disabled, although
>+ * some settings will cause the device to fail to probe.
>+ *
>+ * Writes support both comma- and newline-separated input format. Reads
>+ * will always return one GT type per line. "primary" and "media" are the
>+ * GT type names supported by this interface.
>+ *
>+ * This attribute can only be set before binding to the device.
>+ *
>+ * Examples:
>+ *
>+ * Allow both primary and media GTs to be initialized and used.  This matches
>+ * the driver's default behavior::
>+ *
>+ *        # echo 'primary,media' > /sys/kernel/config/xe/0000:03:00.0/gt_types_allowed
>+ *
>+ * Allow only the primary GT of each tile to be initialized and used,
>+ * effectively disabling the media GT if it exists on the platform::
>+ *
>+ *        # echo 'primary' > /sys/kernel/config/xe/0000:03:00.0/gt_types_allowed
>+ *
>+ * Allow only the media GT of each tile to be initialized and used,
>+ * effectively disabling the primary GT.  **This configuration will cause
>+ * device probe failure on all current platforms, but may be allowed on
>+ * igpu platforms in the future**::
>+ *
>+ *        # echo 'media' > /sys/kernel/config/xe/0000:03:00.0/gt_types_allowed
>+ *
>+ * Disable all GTs.  Only other GPU IP (such as display) is potentially usable.
>+ * **This configuration will cause device probe failure on all current
>+ * platforms, but may be allowed on igpu platforms in the future**::
>+ *
>+ *        # echo '' > /sys/kernel/config/xe/0000:03:00.0/gt_types_allowed
>+ *
>  * Allowed engines:
>  * ----------------
>  *
>@@ -187,6 +227,7 @@ struct xe_config_group_device {
>         struct config_group group;
> 
>         struct xe_config_device {
>+                u64 gt_types_allowed;
>                 u64 engines_allowed;
>                 struct wa_bb ctx_restore_post_bb[XE_ENGINE_CLASS_MAX];
>                 struct wa_bb ctx_restore_mid_bb[XE_ENGINE_CLASS_MAX];
>@@ -201,6 +242,7 @@ struct xe_config_group_device {
> };
> 
> static const struct xe_config_device device_defaults = {
>+        .gt_types_allowed = U64_MAX,
>         .engines_allowed = U64_MAX,
>         .survivability_mode = false,
>         .enable_psmi = false,
>@@ -220,6 +262,7 @@ struct engine_info {
> /* Some helpful macros to aid on the sizing of buffer allocation when parsing */
> #define MAX_ENGINE_CLASS_CHARS 5
> #define MAX_ENGINE_INSTANCE_CHARS 2
>+#define MAX_GT_TYPE_CHARS 7
> 
> static const struct engine_info engine_info[] = {
>         { .cls = "rcs", .mask = XE_HW_ENGINE_RCS_MASK, .engine_class = XE_ENGINE_CLASS_RENDER },
>@@ -230,6 +273,14 @@ static const struct engine_info engine_info[] = {
>         { .cls = "gsccs", .mask = XE_HW_ENGINE_GSCCS_MASK, .engine_class = XE_ENGINE_CLASS_OTHER },
> };
> 
>+static const struct {
>+        const char name[MAX_GT_TYPE_CHARS + 1];
>+        enum xe_gt_type type;
>+} gt_types[] = {
>+        { .name = "primary", .type = XE_GT_TYPE_MAIN },
>+        { .name = "media", .type = XE_GT_TYPE_MEDIA },
>+};
>+
> static struct xe_config_group_device *to_xe_config_group_device(struct config_item *item)
> {
>         return container_of(to_config_group(item), struct xe_config_group_device, group);
>@@ -292,6 +343,62 @@ static ssize_t survivability_mode_store(struct config_item *item, const char *pa
>         return len;
> }
> 
>+static ssize_t gt_types_allowed_show(struct config_item *item, char *page)
>+{
>+        struct xe_config_device *dev = to_xe_config_device(item);
>+        char *p = page;
>+
>+        for (size_t i = 0; i < ARRAY_SIZE(gt_types); i++)
>+                if (dev->gt_types_allowed & BIT_ULL(gt_types[i].type))
>+                        p += sprintf(p, "%s\n", gt_types[i].name);
>+
>+        return p - page;
>+}
>+
>+static ssize_t gt_types_allowed_store(struct config_item *item, const char *page,
>+                                      size_t len)
>+{
>+        struct xe_config_group_device *dev = to_xe_config_group_device(item);
>+        char *buf = kstrdup(page, GFP_KERNEL);
>+        char *p = buf;
>+        u64 typemask = 0;
>+
>+        if (!buf)
>+                return -ENOMEM;
>+
>+        while (p) {
>+                char *typename = strsep(&p, ",\n");
>+                bool matched = false;
>+
>+                if (typename[0] == '\0')
>+                        continue;
>+
>+                for (size_t i = 0; i < ARRAY_SIZE(gt_types); i++) {
>+                        if (strcmp(typename, gt_types[i].name) == 0) {
>+                                typemask |= BIT(gt_types[i].type);
>+                                matched = true;
>+                                break;
>+                        }
>+                }
>+
>+                if (!matched) {
>+                        len = -EINVAL;
>+                        goto out;
>+                }
>+        }
>+
>+        scoped_guard(mutex, &dev->lock) {
>+                if (is_bound(dev))
>+                        return -EBUSY;

I think we need to have a "goto out" instead of "return" here, because
of the allocated buf.

Alternatively, I believe we could also declare buf with __free(kfree).

--
Gustavo Sousa

>+
>+                dev->config.gt_types_allowed = typemask;
>+        }
>+
>+out:
>+        kfree(buf);
>+        return len;
>+}
>+
> static ssize_t engines_allowed_show(struct config_item *item, char *page)
> {
>         struct xe_config_device *dev = to_xe_config_device(item);
>@@ -672,6 +779,7 @@ CONFIGFS_ATTR(, ctx_restore_mid_bb);
> CONFIGFS_ATTR(, ctx_restore_post_bb);
> CONFIGFS_ATTR(, enable_psmi);
> CONFIGFS_ATTR(, engines_allowed);
>+CONFIGFS_ATTR(, gt_types_allowed);
> CONFIGFS_ATTR(, survivability_mode);
> 
> static struct configfs_attribute *xe_config_device_attrs[] = {
>@@ -679,6 +787,7 @@ static struct configfs_attribute *xe_config_device_attrs[] = {
>         &attr_ctx_restore_post_bb,
>         &attr_enable_psmi,
>         &attr_engines_allowed,
>+        &attr_gt_types_allowed,
>         &attr_survivability_mode,
>         NULL,
> };
>@@ -846,6 +955,7 @@ static void dump_custom_dev_config(struct pci_dev *pdev,
>                                  dev->config.attr_); \
>         } while (0)
> 
>+        PRI_CUSTOM_ATTR("%llx", gt_types_allowed);
>         PRI_CUSTOM_ATTR("%llx", engines_allowed);
>         PRI_CUSTOM_ATTR("%d", enable_psmi);
>         PRI_CUSTOM_ATTR("%d", survivability_mode);
>@@ -896,6 +1006,26 @@ bool xe_configfs_get_survivability_mode(struct pci_dev *pdev)
>         return mode;
> }
> 
>+/**
>+ * xe_configfs_get_gt_types_allowed - get GT type allowed mask from configfs
>+ * @pdev: pci device
>+ *
>+ * Return: GT type mask set in configfs
>+ */
>+u64 xe_configfs_get_gt_types_allowed(struct pci_dev *pdev)
>+{
>+        struct xe_config_group_device *dev = find_xe_config_group_device(pdev);
>+        u64 mask;
>+
>+        if (!dev)
>+                return device_defaults.gt_types_allowed;
>+
>+        mask = dev->config.gt_types_allowed;
>+        config_group_put(&dev->group);
>+
>+        return mask;
>+}
>+
> /**
>  * xe_configfs_get_engines_allowed - get engine allowed mask from configfs
>  * @pdev: pci device
>diff --git a/drivers/gpu/drm/xe/xe_configfs.h b/drivers/gpu/drm/xe/xe_configfs.h
>index c61e0e47ed94..c6ad8df9e913 100644
>--- a/drivers/gpu/drm/xe/xe_configfs.h
>+++ b/drivers/gpu/drm/xe/xe_configfs.h
>@@ -17,6 +17,7 @@ int xe_configfs_init(void);
> void xe_configfs_exit(void);
> void xe_configfs_check_device(struct pci_dev *pdev);
> bool xe_configfs_get_survivability_mode(struct pci_dev *pdev);
>+u64 xe_configfs_get_gt_types_allowed(struct pci_dev *pdev);
> u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev);
> bool xe_configfs_get_psmi_enabled(struct pci_dev *pdev);
> u32 xe_configfs_get_ctx_restore_mid_bb(struct pci_dev *pdev, enum xe_engine_class,
>@@ -28,6 +29,7 @@ static inline int xe_configfs_init(void) { return 0; }
> static inline void xe_configfs_exit(void) { }
> static inline void xe_configfs_check_device(struct pci_dev *pdev) { }
> static inline bool xe_configfs_get_survivability_mode(struct pci_dev *pdev) { return false; }
>+static inline u64 xe_configfs_get_gt_types_allowed(struct pci_dev *pdev) { return U64_MAX; }
> static inline u64 xe_configfs_get_engines_allowed(struct pci_dev *pdev) { return U64_MAX; }
> static inline bool xe_configfs_get_psmi_enabled(struct pci_dev *pdev) { return false; }
> static inline u32 xe_configfs_get_ctx_restore_mid_bb(struct pci_dev *pdev, enum xe_engine_class,
>diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
>index 65312fe9b97b..4a792e1037d5 100644
>--- a/drivers/gpu/drm/xe/xe_pci.c
>+++ b/drivers/gpu/drm/xe/xe_pci.c
>@@ -685,11 +685,17 @@ static void xe_info_probe_tile_count(struct xe_device *xe)
> 
> static struct xe_gt *init_primary_gt(struct xe_tile *tile,
>                                      const struct xe_graphics_desc *graphics_desc,
>-                                     const struct xe_media_desc *media_desc)
>+                                     const struct xe_media_desc *media_desc,
>+                                     u64 gt_types_allowed)
> {
>         struct xe_device *xe = tile_to_xe(tile);
>         struct xe_gt *gt;
> 
>+        if ((gt_types_allowed & BIT_ULL(XE_GT_TYPE_MAIN)) == 0) {
>+                drm_info(&xe->drm, "Primary GT disabled via configfs\n");
>+                return NULL;
>+        }
>+
>         gt = xe_gt_alloc(tile);
>         if (IS_ERR(gt))
>                 return gt;
>@@ -710,11 +716,17 @@ static struct xe_gt *init_primary_gt(struct xe_tile *tile,
> }
> 
> static struct xe_gt *init_media_gt(struct xe_tile *tile,
>-                                   const struct xe_media_desc *media_desc)
>+                                   const struct xe_media_desc *media_desc,
>+                                   u64 gt_types_allowed)
> {
>         struct xe_device *xe = tile_to_xe(tile);
>         struct xe_gt *gt;
> 
>+        if ((gt_types_allowed & BIT_ULL(XE_GT_TYPE_MEDIA)) == 0) {
>+                drm_info(&xe->drm, "Media GT disabled via configfs\n");
>+                return NULL;
>+        }
>+
>         gt = xe_gt_alloc(tile);
>         if (IS_ERR(gt))
>                 return gt;
>@@ -739,6 +751,8 @@ static struct xe_gt *init_media_gt(struct xe_tile *tile,
> static int xe_info_init(struct xe_device *xe,
>                         const struct xe_device_desc *desc)
> {
>+        struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
>+        u64 gt_types_allowed = xe_configfs_get_gt_types_allowed(pdev);
>         u32 graphics_gmdid_revid = 0, media_gmdid_revid = 0;
>         const struct xe_ip *graphics_ip;
>         const struct xe_ip *media_ip;
>@@ -820,11 +834,25 @@ static int xe_info_init(struct xe_device *xe,
>                 if (err)
>                         return err;
> 
>-                tile->primary_gt = init_primary_gt(tile, graphics_desc, media_desc);
>+                tile->primary_gt = init_primary_gt(tile, graphics_desc, media_desc,
>+                                                   gt_types_allowed);
>                 if (IS_ERR(tile->primary_gt))
>                         return PTR_ERR(tile->primary_gt);
> 
>-                tile->media_gt = init_media_gt(tile, media_desc);
>+                /*
>+                 * It's not currently possible to probe a device with the
>+                 * primary GT disabled.  With some work, this may be future in
>+                 * the possible for igpu platforms (although probably not for
>+                 * dgpu's since access to the primary GT's BCS engines is
>+                 * required for VRAM management).
>+                 */
>+                if (!tile->primary_gt) {
>+                        drm_err(&xe->drm, "Cannot probe device with without a primary GT\n");
>+                        return -ENODEV;
>+                }
>+
>+                tile->media_gt = init_media_gt(tile, media_desc,
>+                                               gt_types_allowed);
>                 if (IS_ERR(tile->media_gt))
>                         return PTR_ERR(tile->media_gt);
>         }
>-- 
>2.51.0
>

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

* Re: [PATCH v3 07/23] drm/xe: Read VF GMD_ID with a specifically-allocated dummy GT
  2025-10-02 12:43     ` Gustavo Sousa
@ 2025-10-07 17:07       ` Matt Roper
  2025-10-07 17:14         ` Gustavo Sousa
  0 siblings, 1 reply; 49+ messages in thread
From: Matt Roper @ 2025-10-07 17:07 UTC (permalink / raw)
  To: Gustavo Sousa; +Cc: Michal Wajdeczko, intel-xe

On Thu, Oct 02, 2025 at 09:43:32AM -0300, Gustavo Sousa wrote:
> Quoting Michal Wajdeczko (2025-10-01 07:07:04-03:00)
> >
> >
> >On 10/1/2025 12:56 AM, Matt Roper wrote:
> >> SRIOV VF initialization has a bit of a chicken and egg design problem.
> >> Determining the IP version of the graphics and media IPs can't be done
> >> via direct register reads as it is on PF or native and instead requires
> >> querying the GuC.  However initialization of the GT, including its GuC,
> >> needs to wait until after we know the IP versions so that the proper
> >> initialization steps for the platform/IP are followed.
> >> 
> >> Currently the (somewhat hacky) solution is to manually fill out just
> >> enough fields in tile 0's primary GT structure to make it look as if the
> >> GT has been initialized so that the GuC can be partially initialized and
> >> queried to obtain the GMD_ID values.  When the GT gets properly
> >> initialized during the regular flows, the hacked-up values will get
> >> overwritten as part of the general initialization flows.
> >> 
> >> Rather than using tile 0's primary GT structure to hold the hacked up
> >> values for querying every GT on every tile, instead allocate a dedicated
> >> dummy structure.  This will allow us to move the tile->primary_gt's
> >> allocation to a more consistent place later in the initialization flow
> >> in future patches (i.e., we shouldn't even allocate this GT structure if
> >> the GT is disabled/unavailable).  It also helps ensure there can't be
> >> any accidental leakage of initialization or state between the dummy
> >> initialization for GMD_ID and the real driver initialization of the GT.
> >> 
> >> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> >> Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
> >> ---
> >>  drivers/gpu/drm/xe/tests/xe_pci.c |  6 ++-
> >>  drivers/gpu/drm/xe/xe_pci.c       | 61 +++++++++++++++++--------------
> >>  2 files changed, 38 insertions(+), 29 deletions(-)
> >> 
> >> diff --git a/drivers/gpu/drm/xe/tests/xe_pci.c b/drivers/gpu/drm/xe/tests/xe_pci.c
> >> index 0f136bc85b76..969f1dacade8 100644
> >> --- a/drivers/gpu/drm/xe/tests/xe_pci.c
> >> +++ b/drivers/gpu/drm/xe/tests/xe_pci.c
> >> @@ -307,8 +307,8 @@ const void *xe_pci_id_gen_param(const void *prev, char *desc)
> >>  }
> >>  EXPORT_SYMBOL_IF_KUNIT(xe_pci_id_gen_param);
> >>  
> >> -static void fake_read_gmdid(struct xe_device *xe, enum xe_gmdid_type type,
> >> -                            u32 *ver, u32 *revid)
> >> +static int fake_read_gmdid(struct xe_device *xe, enum xe_gmdid_type type,
> >> +                           u32 *ver, u32 *revid)
> >>  {
> >>          struct kunit *test = kunit_get_current_test();
> >>          struct xe_pci_fake_data *data = test->priv;
> >> @@ -320,6 +320,8 @@ static void fake_read_gmdid(struct xe_device *xe, enum xe_gmdid_type type,
> >>                  *ver = data->graphics_verx100;
> >>                  *revid = xe_step_to_gmdid(data->step.graphics);
> >>          }
> >> +
> >> +        return 0;
> >>  }
> >>  
> >>  static void fake_xe_info_probe_tile_count(struct xe_device *xe)
> >> diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
> >> index 37ae49f4b648..9fb5df10844d 100644
> >> --- a/drivers/gpu/drm/xe/xe_pci.c
> >> +++ b/drivers/gpu/drm/xe/xe_pci.c
> >> @@ -464,7 +464,7 @@ enum xe_gmdid_type {
> >>          GMDID_MEDIA
> >>  };
> >>  
> >> -static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver, u32 *revid)
> >> +static int read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver, u32 *revid)
> >>  {
> >>          struct xe_mmio *mmio = xe_root_tile_mmio(xe);
> >>          struct xe_reg gmdid_reg = GMD_ID;
> >> @@ -473,21 +473,19 @@ static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver,
> >>          KUNIT_STATIC_STUB_REDIRECT(read_gmdid, xe, type, ver, revid);
> >>  
> >>          if (IS_SRIOV_VF(xe)) {
> >> -                struct xe_gt *gt = xe_root_mmio_gt(xe);
> >> -
> >>                  /*
> >>                   * To get the value of the GMDID register, VFs must obtain it
> >>                   * from the GuC using MMIO communication.
> >>                   *
> >> -                 * Note that at this point the xe_gt is not fully uninitialized
> >> -                 * and only basic access to MMIO registers is possible. To use
> >> -                 * our existing GuC communication functions we must perform at
> >> -                 * least basic xe_gt and xe_guc initialization.
> >> -                 *
> >> -                 * Since to obtain the value of GMDID_MEDIA we need to use the
> >> -                 * media GuC, temporarily tweak the gt type.
> >> +                 * Note that at this point the GTs are not initialized and only
> >> +                 * tile-level access to MMIO registers is possible. To use our
> >> +                 * existing GuC communication functions we must create a dummy
> >> +                 * GT structure and perform at least basic xe_gt and xe_guc
> >> +                 * initialization.
> >>                   */
> >> -                xe_gt_assert(gt, gt->info.type == XE_GT_TYPE_UNINITIALIZED);
> >> +                struct xe_gt *gt = kzalloc(sizeof(*gt), GFP_KERNEL);
> >
> >nit: we can use __free(kfree) here ...
> 
> Taking a step back, do we really need to allocate this? I get the
> impression that keeping the dummy gt on the stack should be fine since
> we are keeping its lifetime constrained within this function.

xe_gt is a really massive structure; I don't think it can fit on the
stack.  I'm having trouble getting pahole to give me an exact size, but
it looks like it's somewhere around 23K.


Matt

> 
> --
> Gustavo Sousa
> 
> >
> >> +                if (!gt)
> >> +                        return -ENOMEM;
> >>  
> >>                  if (type == GMDID_MEDIA) {
> >>                          gt->info.id = 1;
> >
> >it looks that it is still crashing in xe_gt_mmio_init() called from below
> >
> ><1> [146.543510] BUG: kernel NULL pointer dereference, address: 0000000000000028
> ><1> [146.543528] #PF: supervisor read access in kernel mode
> ><1> [146.543538] #PF: error_code(0x0000) - not-present page
> ><4> [146.543611] RIP: 0010:xe_gt_mmio_init+0x27/0x1b0 [xe]
> ><4> [146.544175] Call Trace:
> ><4> [146.544182]  <TASK>
> ><4> [146.544196]  read_gmdid+0x12b/0x2a0 [xe]
> ><4> [146.544601]  xe_info_init+0x50e/0xc90 [xe]
> ><4> [146.544948]  ? drmm_kmalloc+0x87/0x100
> ><4> [146.544968]  ? xe_device_probe_early+0xdf/0x230 [xe]
> ><4> [146.545253]  ? pci_write_config_word+0x27/0x50
> ><4> [146.545274]  xe_pci_probe+0x163/0x600 [xe]
> >
> >likely due to NULL gt->tile
> >
> >> @@ -503,12 +501,7 @@ static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver,
> >>                  /* Don't bother with GMDID if failed to negotiate the GuC ABI */
> >>                  val = xe_gt_sriov_vf_bootstrap(gt) ? 0 : xe_gt_sriov_vf_gmdid(gt);
> >
> >... so in case of bootstrap error we can easily return actual error,
> >instead of returning plain 0.00 version
> >
> >>  
> >> -                /*
> >> -                 * Only undo xe_gt.info here, the remaining changes made above
> >> -                 * will be overwritten as part of the regular initialization.
> >> -                 */
> >> -                gt->info.id = 0;
> >> -                gt->info.type = XE_GT_TYPE_UNINITIALIZED;
> >> +                kfree(gt);
> >>          } else {
> >>                  /*
> >>                   * GMD_ID is a GT register, but at this point in the driver
> >> @@ -526,6 +519,8 @@ static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver,
> >>  
> >>          *ver = REG_FIELD_GET(GMD_ID_ARCH_MASK, val) * 100 + REG_FIELD_GET(GMD_ID_RELEASE_MASK, val);
> >>          *revid = REG_FIELD_GET(GMD_ID_REVID, val);
> >> +
> >> +        return 0;
> >>  }
> >>  
> >>  static const struct xe_ip *find_graphics_ip(unsigned int verx100)
> >> @@ -552,18 +547,21 @@ static const struct xe_ip *find_media_ip(unsigned int verx100)
> >>   * Read IP version from hardware and select graphics/media IP descriptors
> >>   * based on the result.
> >>   */
> >> -static void handle_gmdid(struct xe_device *xe,
> >> -                         const struct xe_ip **graphics_ip,
> >> -                         const struct xe_ip **media_ip,
> >> -                         u32 *graphics_revid,
> >> -                         u32 *media_revid)
> >> +static int handle_gmdid(struct xe_device *xe,
> >> +                        const struct xe_ip **graphics_ip,
> >> +                        const struct xe_ip **media_ip,
> >> +                        u32 *graphics_revid,
> >> +                        u32 *media_revid)
> >>  {
> >>          u32 ver;
> >> +        int ret;
> >>  
> >>          *graphics_ip = NULL;
> >>          *media_ip = NULL;
> >>  
> >> -        read_gmdid(xe, GMDID_GRAPHICS, &ver, graphics_revid);
> >> +        ret = read_gmdid(xe, GMDID_GRAPHICS, &ver, graphics_revid);
> >> +        if (ret)
> >> +                return ret;
> >>  
> >>          *graphics_ip = find_graphics_ip(ver);
> >>          if (!*graphics_ip) {
> >> @@ -571,16 +569,21 @@ static void handle_gmdid(struct xe_device *xe,
> >>                          ver / 100, ver % 100);
> >>          }
> >>  
> >> -        read_gmdid(xe, GMDID_MEDIA, &ver, media_revid);
> >> +        ret = read_gmdid(xe, GMDID_MEDIA, &ver, media_revid);
> >> +        if (ret)
> >> +                return ret;
> >> +
> >>          /* Media may legitimately be fused off / not present */
> >>          if (ver == 0)
> >> -                return;
> >> +                return 0;
> >>  
> >>          *media_ip = find_media_ip(ver);
> >>          if (!*media_ip) {
> >>                  drm_err(&xe->drm, "Hardware reports unknown media version %u.%02u\n",
> >>                          ver / 100, ver % 100);
> >>          }
> >> +
> >> +        return 0;
> >>  }
> >>  
> >>  /*
> >> @@ -690,6 +693,7 @@ static int xe_info_init(struct xe_device *xe,
> >>          const struct xe_media_desc *media_desc;
> >>          struct xe_tile *tile;
> >>          struct xe_gt *gt;
> >> +        int ret;
> >>          u8 id;
> >>  
> >>          /*
> >> @@ -705,8 +709,11 @@ static int xe_info_init(struct xe_device *xe,
> >>                  xe->info.step = xe_step_pre_gmdid_get(xe);
> >>          } else {
> >>                  xe_assert(xe, !desc->pre_gmdid_media_ip);
> >> -                handle_gmdid(xe, &graphics_ip, &media_ip,
> >> -                             &graphics_gmdid_revid, &media_gmdid_revid);
> >> +                ret = handle_gmdid(xe, &graphics_ip, &media_ip,
> >> +                                   &graphics_gmdid_revid, &media_gmdid_revid);
> >> +                if (ret)
> >> +                        return ret;
> >> +
> >>                  xe->info.step = xe_step_gmdid_get(xe,
> >>                                                    graphics_gmdid_revid,
> >>                                                    media_gmdid_revid);
> >

-- 
Matt Roper
Graphics Software Engineer
Linux GPU Platform Enablement
Intel Corporation

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

* Re: [PATCH v3 07/23] drm/xe: Read VF GMD_ID with a specifically-allocated dummy GT
  2025-10-07 17:07       ` Matt Roper
@ 2025-10-07 17:14         ` Gustavo Sousa
  0 siblings, 0 replies; 49+ messages in thread
From: Gustavo Sousa @ 2025-10-07 17:14 UTC (permalink / raw)
  To: Matt Roper; +Cc: Michal Wajdeczko, intel-xe

Quoting Matt Roper (2025-10-07 14:07:20-03:00)
>On Thu, Oct 02, 2025 at 09:43:32AM -0300, Gustavo Sousa wrote:
>> Quoting Michal Wajdeczko (2025-10-01 07:07:04-03:00)
>> >
>> >
>> >On 10/1/2025 12:56 AM, Matt Roper wrote:
>> >> SRIOV VF initialization has a bit of a chicken and egg design problem.
>> >> Determining the IP version of the graphics and media IPs can't be done
>> >> via direct register reads as it is on PF or native and instead requires
>> >> querying the GuC.  However initialization of the GT, including its GuC,
>> >> needs to wait until after we know the IP versions so that the proper
>> >> initialization steps for the platform/IP are followed.
>> >> 
>> >> Currently the (somewhat hacky) solution is to manually fill out just
>> >> enough fields in tile 0's primary GT structure to make it look as if the
>> >> GT has been initialized so that the GuC can be partially initialized and
>> >> queried to obtain the GMD_ID values.  When the GT gets properly
>> >> initialized during the regular flows, the hacked-up values will get
>> >> overwritten as part of the general initialization flows.
>> >> 
>> >> Rather than using tile 0's primary GT structure to hold the hacked up
>> >> values for querying every GT on every tile, instead allocate a dedicated
>> >> dummy structure.  This will allow us to move the tile->primary_gt's
>> >> allocation to a more consistent place later in the initialization flow
>> >> in future patches (i.e., we shouldn't even allocate this GT structure if
>> >> the GT is disabled/unavailable).  It also helps ensure there can't be
>> >> any accidental leakage of initialization or state between the dummy
>> >> initialization for GMD_ID and the real driver initialization of the GT.
>> >> 
>> >> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
>> >> Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
>> >> ---
>> >>  drivers/gpu/drm/xe/tests/xe_pci.c |  6 ++-
>> >>  drivers/gpu/drm/xe/xe_pci.c       | 61 +++++++++++++++++--------------
>> >>  2 files changed, 38 insertions(+), 29 deletions(-)
>> >> 
>> >> diff --git a/drivers/gpu/drm/xe/tests/xe_pci.c b/drivers/gpu/drm/xe/tests/xe_pci.c
>> >> index 0f136bc85b76..969f1dacade8 100644
>> >> --- a/drivers/gpu/drm/xe/tests/xe_pci.c
>> >> +++ b/drivers/gpu/drm/xe/tests/xe_pci.c
>> >> @@ -307,8 +307,8 @@ const void *xe_pci_id_gen_param(const void *prev, char *desc)
>> >>  }
>> >>  EXPORT_SYMBOL_IF_KUNIT(xe_pci_id_gen_param);
>> >>  
>> >> -static void fake_read_gmdid(struct xe_device *xe, enum xe_gmdid_type type,
>> >> -                            u32 *ver, u32 *revid)
>> >> +static int fake_read_gmdid(struct xe_device *xe, enum xe_gmdid_type type,
>> >> +                           u32 *ver, u32 *revid)
>> >>  {
>> >>          struct kunit *test = kunit_get_current_test();
>> >>          struct xe_pci_fake_data *data = test->priv;
>> >> @@ -320,6 +320,8 @@ static void fake_read_gmdid(struct xe_device *xe, enum xe_gmdid_type type,
>> >>                  *ver = data->graphics_verx100;
>> >>                  *revid = xe_step_to_gmdid(data->step.graphics);
>> >>          }
>> >> +
>> >> +        return 0;
>> >>  }
>> >>  
>> >>  static void fake_xe_info_probe_tile_count(struct xe_device *xe)
>> >> diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
>> >> index 37ae49f4b648..9fb5df10844d 100644
>> >> --- a/drivers/gpu/drm/xe/xe_pci.c
>> >> +++ b/drivers/gpu/drm/xe/xe_pci.c
>> >> @@ -464,7 +464,7 @@ enum xe_gmdid_type {
>> >>          GMDID_MEDIA
>> >>  };
>> >>  
>> >> -static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver, u32 *revid)
>> >> +static int read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver, u32 *revid)
>> >>  {
>> >>          struct xe_mmio *mmio = xe_root_tile_mmio(xe);
>> >>          struct xe_reg gmdid_reg = GMD_ID;
>> >> @@ -473,21 +473,19 @@ static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver,
>> >>          KUNIT_STATIC_STUB_REDIRECT(read_gmdid, xe, type, ver, revid);
>> >>  
>> >>          if (IS_SRIOV_VF(xe)) {
>> >> -                struct xe_gt *gt = xe_root_mmio_gt(xe);
>> >> -
>> >>                  /*
>> >>                   * To get the value of the GMDID register, VFs must obtain it
>> >>                   * from the GuC using MMIO communication.
>> >>                   *
>> >> -                 * Note that at this point the xe_gt is not fully uninitialized
>> >> -                 * and only basic access to MMIO registers is possible. To use
>> >> -                 * our existing GuC communication functions we must perform at
>> >> -                 * least basic xe_gt and xe_guc initialization.
>> >> -                 *
>> >> -                 * Since to obtain the value of GMDID_MEDIA we need to use the
>> >> -                 * media GuC, temporarily tweak the gt type.
>> >> +                 * Note that at this point the GTs are not initialized and only
>> >> +                 * tile-level access to MMIO registers is possible. To use our
>> >> +                 * existing GuC communication functions we must create a dummy
>> >> +                 * GT structure and perform at least basic xe_gt and xe_guc
>> >> +                 * initialization.
>> >>                   */
>> >> -                xe_gt_assert(gt, gt->info.type == XE_GT_TYPE_UNINITIALIZED);
>> >> +                struct xe_gt *gt = kzalloc(sizeof(*gt), GFP_KERNEL);
>> >
>> >nit: we can use __free(kfree) here ...
>> 
>> Taking a step back, do we really need to allocate this? I get the
>> impression that keeping the dummy gt on the stack should be fine since
>> we are keeping its lifetime constrained within this function.
>
>xe_gt is a really massive structure; I don't think it can fit on the
>stack.  I'm having trouble getting pahole to give me an exact size, but
>it looks like it's somewhere around 23K.

Ah, okay.  Thanks.  I didn't pay attention to this detail. :-)

--
Gustavo Sousa

>
>
>Matt
>
>> 
>> --
>> Gustavo Sousa
>> 
>> >
>> >> +                if (!gt)
>> >> +                        return -ENOMEM;
>> >>  
>> >>                  if (type == GMDID_MEDIA) {
>> >>                          gt->info.id = 1;
>> >
>> >it looks that it is still crashing in xe_gt_mmio_init() called from below
>> >
>> ><1> [146.543510] BUG: kernel NULL pointer dereference, address: 0000000000000028
>> ><1> [146.543528] #PF: supervisor read access in kernel mode
>> ><1> [146.543538] #PF: error_code(0x0000) - not-present page
>> ><4> [146.543611] RIP: 0010:xe_gt_mmio_init+0x27/0x1b0 [xe]
>> ><4> [146.544175] Call Trace:
>> ><4> [146.544182]  <TASK>
>> ><4> [146.544196]  read_gmdid+0x12b/0x2a0 [xe]
>> ><4> [146.544601]  xe_info_init+0x50e/0xc90 [xe]
>> ><4> [146.544948]  ? drmm_kmalloc+0x87/0x100
>> ><4> [146.544968]  ? xe_device_probe_early+0xdf/0x230 [xe]
>> ><4> [146.545253]  ? pci_write_config_word+0x27/0x50
>> ><4> [146.545274]  xe_pci_probe+0x163/0x600 [xe]
>> >
>> >likely due to NULL gt->tile
>> >
>> >> @@ -503,12 +501,7 @@ static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver,
>> >>                  /* Don't bother with GMDID if failed to negotiate the GuC ABI */
>> >>                  val = xe_gt_sriov_vf_bootstrap(gt) ? 0 : xe_gt_sriov_vf_gmdid(gt);
>> >
>> >... so in case of bootstrap error we can easily return actual error,
>> >instead of returning plain 0.00 version
>> >
>> >>  
>> >> -                /*
>> >> -                 * Only undo xe_gt.info here, the remaining changes made above
>> >> -                 * will be overwritten as part of the regular initialization.
>> >> -                 */
>> >> -                gt->info.id = 0;
>> >> -                gt->info.type = XE_GT_TYPE_UNINITIALIZED;
>> >> +                kfree(gt);
>> >>          } else {
>> >>                  /*
>> >>                   * GMD_ID is a GT register, but at this point in the driver
>> >> @@ -526,6 +519,8 @@ static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver,
>> >>  
>> >>          *ver = REG_FIELD_GET(GMD_ID_ARCH_MASK, val) * 100 + REG_FIELD_GET(GMD_ID_RELEASE_MASK, val);
>> >>          *revid = REG_FIELD_GET(GMD_ID_REVID, val);
>> >> +
>> >> +        return 0;
>> >>  }
>> >>  
>> >>  static const struct xe_ip *find_graphics_ip(unsigned int verx100)
>> >> @@ -552,18 +547,21 @@ static const struct xe_ip *find_media_ip(unsigned int verx100)
>> >>   * Read IP version from hardware and select graphics/media IP descriptors
>> >>   * based on the result.
>> >>   */
>> >> -static void handle_gmdid(struct xe_device *xe,
>> >> -                         const struct xe_ip **graphics_ip,
>> >> -                         const struct xe_ip **media_ip,
>> >> -                         u32 *graphics_revid,
>> >> -                         u32 *media_revid)
>> >> +static int handle_gmdid(struct xe_device *xe,
>> >> +                        const struct xe_ip **graphics_ip,
>> >> +                        const struct xe_ip **media_ip,
>> >> +                        u32 *graphics_revid,
>> >> +                        u32 *media_revid)
>> >>  {
>> >>          u32 ver;
>> >> +        int ret;
>> >>  
>> >>          *graphics_ip = NULL;
>> >>          *media_ip = NULL;
>> >>  
>> >> -        read_gmdid(xe, GMDID_GRAPHICS, &ver, graphics_revid);
>> >> +        ret = read_gmdid(xe, GMDID_GRAPHICS, &ver, graphics_revid);
>> >> +        if (ret)
>> >> +                return ret;
>> >>  
>> >>          *graphics_ip = find_graphics_ip(ver);
>> >>          if (!*graphics_ip) {
>> >> @@ -571,16 +569,21 @@ static void handle_gmdid(struct xe_device *xe,
>> >>                          ver / 100, ver % 100);
>> >>          }
>> >>  
>> >> -        read_gmdid(xe, GMDID_MEDIA, &ver, media_revid);
>> >> +        ret = read_gmdid(xe, GMDID_MEDIA, &ver, media_revid);
>> >> +        if (ret)
>> >> +                return ret;
>> >> +
>> >>          /* Media may legitimately be fused off / not present */
>> >>          if (ver == 0)
>> >> -                return;
>> >> +                return 0;
>> >>  
>> >>          *media_ip = find_media_ip(ver);
>> >>          if (!*media_ip) {
>> >>                  drm_err(&xe->drm, "Hardware reports unknown media version %u.%02u\n",
>> >>                          ver / 100, ver % 100);
>> >>          }
>> >> +
>> >> +        return 0;
>> >>  }
>> >>  
>> >>  /*
>> >> @@ -690,6 +693,7 @@ static int xe_info_init(struct xe_device *xe,
>> >>          const struct xe_media_desc *media_desc;
>> >>          struct xe_tile *tile;
>> >>          struct xe_gt *gt;
>> >> +        int ret;
>> >>          u8 id;
>> >>  
>> >>          /*
>> >> @@ -705,8 +709,11 @@ static int xe_info_init(struct xe_device *xe,
>> >>                  xe->info.step = xe_step_pre_gmdid_get(xe);
>> >>          } else {
>> >>                  xe_assert(xe, !desc->pre_gmdid_media_ip);
>> >> -                handle_gmdid(xe, &graphics_ip, &media_ip,
>> >> -                             &graphics_gmdid_revid, &media_gmdid_revid);
>> >> +                ret = handle_gmdid(xe, &graphics_ip, &media_ip,
>> >> +                                   &graphics_gmdid_revid, &media_gmdid_revid);
>> >> +                if (ret)
>> >> +                        return ret;
>> >> +
>> >>                  xe->info.step = xe_step_gmdid_get(xe,
>> >>                                                    graphics_gmdid_revid,
>> >>                                                    media_gmdid_revid);
>> >
>
>-- 
>Matt Roper
>Graphics Software Engineer
>Linux GPU Platform Enablement
>Intel Corporation

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

* Re: [PATCH v3 17/23] drm/xe: Bypass Wa_14018094691 when primary GT is disabled
  2025-10-03 12:44   ` Gustavo Sousa
@ 2025-10-07 17:39     ` Matt Roper
  0 siblings, 0 replies; 49+ messages in thread
From: Matt Roper @ 2025-10-07 17:39 UTC (permalink / raw)
  To: Gustavo Sousa; +Cc: intel-xe

On Fri, Oct 03, 2025 at 09:44:42AM -0300, Gustavo Sousa wrote:
> Quoting Matt Roper (2025-09-30 19:56:34-03:00)
> >Don't try to lookup Wa_14018094691 on a NULL GT when the primary GT is
> >disabled.  If the primary GT is disabled, there's no mid-thread
> >preemption happening which would make this workaround relevant anyway.
> 
> s/relevant/irrelevant/?

I think the existing wording is correct.  "There's nothing which would
make the workaround relevant" basically means the same thing as "the
workaround is irrelevant."  But I'll reword the commit message in
general to make it more clear.


Matt

> 
> >
> >Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
> 
> Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
> 
> >---
> > drivers/gpu/drm/xe/xe_gsc.c | 4 ++--
> > 1 file changed, 2 insertions(+), 2 deletions(-)
> >
> >diff --git a/drivers/gpu/drm/xe/xe_gsc.c b/drivers/gpu/drm/xe/xe_gsc.c
> >index 83d61bf8ec62..dd69cb834f8e 100644
> >--- a/drivers/gpu/drm/xe/xe_gsc.c
> >+++ b/drivers/gpu/drm/xe/xe_gsc.c
> >@@ -266,7 +266,7 @@ static int gsc_upload_and_init(struct xe_gsc *gsc)
> >         unsigned int fw_ref;
> >         int ret;
> > 
> >-        if (XE_GT_WA(tile->primary_gt, 14018094691)) {
> >+        if (tile->primary_gt && XE_GT_WA(tile->primary_gt, 14018094691)) {
> >                 fw_ref = xe_force_wake_get(gt_to_fw(tile->primary_gt), XE_FORCEWAKE_ALL);
> > 
> >                 /*
> >@@ -281,7 +281,7 @@ static int gsc_upload_and_init(struct xe_gsc *gsc)
> > 
> >         ret = gsc_upload(gsc);
> > 
> >-        if (XE_GT_WA(tile->primary_gt, 14018094691))
> >+        if (tile->primary_gt && XE_GT_WA(tile->primary_gt, 14018094691))
> >                 xe_force_wake_put(gt_to_fw(tile->primary_gt), fw_ref);
> > 
> >         if (ret)
> >-- 
> >2.51.0
> >

-- 
Matt Roper
Graphics Software Engineer
Linux GPU Platform Enablement
Intel Corporation

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

end of thread, other threads:[~2025-10-07 17:39 UTC | newest]

Thread overview: 49+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-30 22:56 [PATCH v3 00/23] Allow configfs to disable specific GT type(s) Matt Roper
2025-09-30 22:56 ` [PATCH v3 01/23] drm/xe/huc: Adjust HuC check on primary GT Matt Roper
2025-09-30 22:56 ` [PATCH v3 02/23] drm/xe: Drop GT parameter to xe_display_irq_postinstall() Matt Roper
2025-09-30 22:56 ` [PATCH v3 03/23] drm/xe: Move 'va_bits' flag back to platform descriptor Matt Roper
2025-10-01  9:44   ` Michal Wajdeczko
2025-09-30 22:56 ` [PATCH v3 04/23] drm/xe: Move 'vm_max_level' " Matt Roper
2025-10-01 21:51   ` Gustavo Sousa
2025-09-30 22:56 ` [PATCH v3 05/23] drm/xe: Move 'vram_flags' " Matt Roper
2025-09-30 22:56 ` [PATCH v3 06/23] drm/xe: Move 'has_flatccs' " Matt Roper
2025-09-30 22:56 ` [PATCH v3 07/23] drm/xe: Read VF GMD_ID with a specifically-allocated dummy GT Matt Roper
2025-10-01 10:07   ` Michal Wajdeczko
2025-10-02 12:43     ` Gustavo Sousa
2025-10-07 17:07       ` Matt Roper
2025-10-07 17:14         ` Gustavo Sousa
2025-09-30 22:56 ` [PATCH v3 08/23] drm/xe: Move primary GT allocation from xe_tile_init_early to xe_tile_init Matt Roper
2025-09-30 22:56 ` [PATCH v3 09/23] drm/xe: Skip L2 / TDF cache flushes if primary GT is disabled Matt Roper
2025-10-01  6:39   ` Upadhyay, Tejas
2025-09-30 22:56 ` [PATCH v3 10/23] drm/xe/query: Report hwconfig size as 0 " Matt Roper
2025-10-01  6:42   ` Upadhyay, Tejas
2025-09-30 22:56 ` [PATCH v3 11/23] drm/xe/pmu: Initialize PMU event types based on first available GT Matt Roper
2025-10-01 20:59   ` Lucas De Marchi
2025-09-30 22:56 ` [PATCH v3 12/23] drm/xe: Check for primary GT before looking up Wa_22019338487 Matt Roper
2025-10-01 21:10   ` Lucas De Marchi
2025-10-02 13:46   ` Gustavo Sousa
2025-09-30 22:56 ` [PATCH v3 13/23] drm/xe: Make display part of Wa_22019338487 a device workaround Matt Roper
2025-10-02 14:26   ` Gustavo Sousa
2025-09-30 22:56 ` [PATCH v3 14/23] drm/xe/irq: Don't try to lookup engine masks for non-existent primary GT Matt Roper
2025-09-30 22:56 ` [PATCH v3 15/23] drm/xe: Handle Wa_22010954014 and Wa_14022085890 as device workarounds Matt Roper
2025-10-02 17:49   ` Gustavo Sousa
2025-09-30 22:56 ` [PATCH v3 16/23] drm/xe/rtp: Pass xe_device parameter to FUNC matches Matt Roper
2025-10-02 18:24   ` Gustavo Sousa
2025-09-30 22:56 ` [PATCH v3 17/23] drm/xe: Bypass Wa_14018094691 when primary GT is disabled Matt Roper
2025-10-03 12:44   ` Gustavo Sousa
2025-10-07 17:39     ` Matt Roper
2025-09-30 22:56 ` [PATCH v3 18/23] drm/xe: Correct lineage for Wa_22014953428 and only check with valid GT Matt Roper
2025-10-03 12:52   ` Gustavo Sousa
2025-09-30 22:56 ` [PATCH v3 19/23] drm/xe: Check that GT is not NULL before testing Wa_16023588340 Matt Roper
2025-09-30 22:56 ` [PATCH v3 20/23] drm/xe: Don't check BIOS-disabled FlatCCS if primary GT is disabled Matt Roper
2025-10-03 13:17   ` Gustavo Sousa
2025-09-30 22:56 ` [PATCH v3 21/23] drm/xe: Break GT setup out of xe_info_init() Matt Roper
2025-10-03 13:47   ` Gustavo Sousa
2025-09-30 22:56 ` [PATCH v3 22/23] drm/xe/configfs: Add attribute to disable GT types Matt Roper
2025-10-03 18:05   ` Gustavo Sousa
2025-09-30 22:56 ` [PATCH v3 23/23] drm/xe/sriov: Disable SR-IOV if primary GT is disabled via configfs Matt Roper
2025-10-01 11:51   ` Michal Wajdeczko
2025-09-30 23:19 ` ✗ CI.checkpatch: warning for Allow configfs to disable specific GT type(s) (rev3) Patchwork
2025-09-30 23:21 ` ✓ CI.KUnit: success " Patchwork
2025-10-01  0:07 ` ✗ Xe.CI.BAT: failure " Patchwork
2025-10-01  2:30 ` ✗ Xe.CI.Full: " Patchwork

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